diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 7f1bc9e58c..cda5ccce98 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -115,3 +115,26 @@ jobs:
- name: MLTestsNativeDeactivated
run: mvn -Dtest=MLTestsNativeDeactivated test
+ tests4:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Set up Java 11
+ uses: actions/setup-java@v3
+ with:
+ java-version: 11
+ distribution: adopt
+ - name: Cache Maven packages
+ uses: actions/cache@v3
+ with:
+ path: ~/.m2
+ key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+ restore-keys: ${{ runner.os }}-m2
+ - name: Install with Maven
+ run: mvn install -DskipTests -Dgpg.skip --quiet
+ - name: Compile with Maven
+ run: mvn clean compile assembly:single
+ - name: DeltaUpdateRuntimeTests
+ run: mvn -Dtest=DeltaUpdateRuntimeTests test
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fb9f08fd3a..e1d54fa72e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -79,8 +79,13 @@ NativeFLWORRuntimeTestsParallelismDeactivated:
script:
- mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test
-StaticTypingTest:
- stage: tests3
+updatedeltaruntime-test:
+ stage: test
+ script:
+ - mvn -Dtest=DeltaUpdateRuntimeTests test
+
+statictyping-test:
+ stage: test
script:
- mvn -Dtest=StaticTypeTests test
diff --git a/docs/Getting started.md b/docs/Getting started.md
index 64e878246f..a06278e1cd 100644
--- a/docs/Getting started.md
+++ b/docs/Getting started.md
@@ -78,11 +78,11 @@ If you use Linux, Florian Kellner also kindly contributed an [installation scrip
RumbleDB requires an Apache Spark installation on Linux, Mac or Windows.
-It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.2.2. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location).
+It is straightforward to directly [download it](https://spark.apache.org/downloads.html), unpack it and put it at a location of your choosing. We recommend to pick Spark 3.4.3. Let us call this location SPARK_HOME (it is a good idea, in fact to also define an environment variable SPARK_HOME pointing to the absolute path of this location).
What you need to do then is to add the subdirectory "bin" within the unpacked directory to the PATH variable. On macOS this is done by adding
- export SPARK_HOME=/path/to/spark-3.2.2-bin-hadoop3.2
+ export SPARK_HOME=/path/to/spark-3.4.3-bin-hadoop3.2
export PATH=$SPARK_HOME/bin:$PATH
(with SPARK_HOME appropriately set to match your unzipped Spark directory) to the file .zshrc in your home directory, then making sure to force the change with
@@ -111,9 +111,11 @@ Like Spark, RumbleDB is just a download and no installation is required.
In order to run RumbleDB, you simply need to download one of the small .jar files from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data.
-If you use Spark 3.2+, use rumbledb-1.22.0-for-spark-3.2.jar.
+If you use Spark 3.4+, use rumbledb-1.22.0-for-spark-3.4.jar.
-If you use Spark 3.3+, use rumbledb-1.22.0-for-spark-3.3.jar.
+If you use Spark 3.5+, use rumbledb-1.22.0-for-spark-3.5.jar.
+
+If you use Spark 4.0+ (preview), use rumbledb-1.22.0-for-spark-4.0.jar.
These jars do not embed Spark, since you chose to set it up separately. They will work with your Spark installation with the spark-submit command.
diff --git a/docs/install.md b/docs/install.md
index d3bc0bebd2..98f158a46e 100644
--- a/docs/install.md
+++ b/docs/install.md
@@ -7,9 +7,9 @@ We show here how to install RumbleDB from the github repository if you wish to d
The following software is required:
- [Java SE](http://www.oracle.com/technetwork/java/javase/downloads/index.html) 8 (last tested on OpenJDK 8u251). The version of Java is important, as Spark only works with Java 8 or java 11.
-- [Spark](https://spark.apache.org/), version 3.1.2 (for example)
+- [Spark](https://spark.apache.org/), version 3.4.3 (for example)
- [Ant](http://www.ant.org/), version 1.11.1
-- [ANTLR](http://www.ant.org/), version 4.8 (supplied in our repository)
+- [ANTLR](http://www.ant.org/), version 4.9.3 (supplied in our repository)
- [Maven](https://maven.apache.org/) 3.6.0
Important: the ANTLR version varies with the Spark version, because Spark is also shipped with an ANTLR runtime (example: Spark 3.0 and 3.1 is with ANTLR 4.7, Spark 3.2 with ANTLR 4.8). The ANTLR runtime MUST match the ANTLR generator used to generate the RumbleDB jar file.
diff --git a/pom.xml b/pom.xml
index f03343c3f5..d468b6ca87 100644
--- a/pom.xml
+++ b/pom.xml
@@ -197,6 +197,16 @@
+
+ org.openjdk.jmh
+ jmh-core
+ 1.37
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.37
+
org.apache.spark
spark-core_2.12
@@ -257,36 +267,46 @@
commons-lang3
3.12.0
-
+
+ commons-net
+ commons-net
+ 3.1
+
+
commons-io
commons-io
2.11.0
-
- org.apache.httpcomponents
- httpclient
- 4.5.13
-
-
-
- org.jgrapht
- jgrapht-core
- 1.4.0
-
-
- joda-time
- joda-time
- 2.10.6
-
-
- com.fasterxml.jackson.dataformat
- jackson-dataformat-yaml
- 2.13.4
-
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ org.jgrapht
+ jgrapht-core
+ 1.4.0
+
+
+ joda-time
+ joda-time
+ 2.10.6
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-yaml
+ 2.13.4
+
+
+ io.delta
+ delta-core_2.12
+ 2.4.0
+
diff --git a/src/main/java/org/rumbledb/api/Item.java b/src/main/java/org/rumbledb/api/Item.java
index ae0feeb357..27ef9d70be 100644
--- a/src/main/java/org/rumbledb/api/Item.java
+++ b/src/main/java/org/rumbledb/api/Item.java
@@ -692,17 +692,113 @@ default boolean isNaN() {
* @return an int representing nestedness of the item inside transform expressions.
*/
default int getMutabilityLevel() {
- return 0;
+ return -1;
}
/**
- * Sets the mutability level of the item.
+ * Sets the mutability level of the item to a supplied value.
*
- * @param mutabilityLevel the new mutability level.
+ * @param mutabilityLevel new mutability level.
*/
default void setMutabilityLevel(int mutabilityLevel) {
}
+ /**
+ * Returns the top level ID of the item.
+ *
+ * @return int representing the rowID of the item within a DeltaFile.
+ */
+ default long getTopLevelID() {
+ return -1;
+ }
+
+ /**
+ * Sets the top level ID of the item to a supplied value.
+ *
+ * @param topLevelID new top level ID.
+ */
+ default void setTopLevelID(long topLevelID) {
+ }
+
+ /**
+ * Returns the path from the top level object of a DeltaFile for the item.
+ *
+ * @return String representing the path of the item from the top level within a DeltaFile.
+ */
+ default String getPathIn() {
+ return "null";
+ }
+
+ /**
+ * Sets the path from the top level object of a DeltaFile for the item to a supplied value.
+ *
+ * @param pathIn new path from top level.
+ */
+ default void setPathIn(String pathIn) {
+ }
+
+ /**
+ * Returns the location of the DeltaFile for the item.
+ *
+ * @return String representing the location of the DeltaFile for the item.
+ */
+ default String getTableLocation() {
+ return null;
+ }
+
+
+ /**
+ * Sets the location of the DeltaFile for the item to a supplied value.
+ *
+ * @param location new location of the DeltaFile for the item.
+ */
+ default void setTableLocation(String location) {
+ }
+
+ /**
+ * Returns the SparkSQL value of the item for use in a query.
+ *
+ * @return String representing the SparkSQL value of the item.
+ */
+ default String getSparkSQLValue() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Returns the SparkSQL value of the item for use in a query.
+ *
+ * @return String representing the SparkSQL value of the item.
+ */
+ default String getSparkSQLValue(ItemType itemType) {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Returns the SparkSQL type of the item for use in a query.
+ *
+ * @return String representing the SparkSQL type of the item.
+ */
+ default String getSparkSQLType() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
+ }
+
+ /**
+ * Tests for physical equality. The semantics are that of the eq operator.
+ *
+ * @param other another item.
+ * @return true it is equal to other, false otherwise.
+ */
+ default boolean physicalEquals(Object other) {
+ if (!(other instanceof Item)) {
+ return false;
+ }
+ Item otherItem = (Item) other;
+ if (this.getTopLevelID() == -1 || otherItem.getTopLevelID() == -1) {
+ return System.identityHashCode(this) == System.identityHashCode(otherItem);
+ }
+ return this.getTopLevelID() == otherItem.getTopLevelID() && this.getPathIn().equals(otherItem.getPathIn());
+ }
+
/**
* Tests for logical equality. The semantics are that of the eq operator.
*
diff --git a/src/main/java/org/rumbledb/api/Rumble.java b/src/main/java/org/rumbledb/api/Rumble.java
index f0dba0f280..b30c4c53c8 100644
--- a/src/main/java/org/rumbledb/api/Rumble.java
+++ b/src/main/java/org/rumbledb/api/Rumble.java
@@ -5,7 +5,6 @@
import org.rumbledb.context.DynamicContext;
import org.rumbledb.expressions.module.MainModule;
import org.rumbledb.runtime.RuntimeIterator;
-import org.rumbledb.runtime.update.PendingUpdateList;
import sparksoniq.spark.SparkSessionManager;
import java.io.IOException;
@@ -52,11 +51,6 @@ public SequenceOfItems runQuery(String query) {
this.configuration
);
- if (iterator.isUpdating()) {
- PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext);
- pul.applyUpdates(iterator.getMetadata());
- }
-
return new SequenceOfItems(iterator, dynamicContext, this.configuration);
}
@@ -78,12 +72,6 @@ public SequenceOfItems runQuery(URI location) throws IOException {
this.configuration
);
- if (iterator.isUpdating()) {
- PendingUpdateList pul = iterator.getPendingUpdateList(dynamicContext);
- pul.applyUpdates(iterator.getMetadata());
- }
-
- System.err.println("final iterator is: " + iterator.isUpdating());
return new SequenceOfItems(iterator, dynamicContext, this.configuration);
}
diff --git a/src/main/java/org/rumbledb/api/SequenceOfItems.java b/src/main/java/org/rumbledb/api/SequenceOfItems.java
index c8cec7beca..7a32fde406 100644
--- a/src/main/java/org/rumbledb/api/SequenceOfItems.java
+++ b/src/main/java/org/rumbledb/api/SequenceOfItems.java
@@ -7,8 +7,10 @@
import org.apache.spark.sql.Row;
import org.rumbledb.config.RumbleRuntimeConfiguration;
import org.rumbledb.context.DynamicContext;
+import org.rumbledb.items.ItemFactory;
import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import sparksoniq.spark.SparkSessionManager;
/**
@@ -51,7 +53,9 @@ public SequenceOfItems(
* Opens the iterator.
*/
public void open() {
- this.iterator.open(this.dynamicContext);
+ if (this.isMaterialisable()) {
+ this.iterator.open(this.dynamicContext);
+ }
this.isOpen = true;
}
@@ -68,7 +72,9 @@ public boolean isOpen() {
* Closes the iterator.
*/
public void close() {
- this.iterator.close();
+ if (this.isOpen) {
+ this.iterator.close();
+ }
this.isOpen = false;
}
@@ -78,6 +84,9 @@ public void close() {
* @return true if there are more items, false otherwise.
*/
public boolean hasNext() {
+ if (!this.isMaterialisable()) {
+ return false;
+ }
return this.iterator.hasNext();
}
@@ -88,6 +97,9 @@ public boolean hasNext() {
* @return the next item.
*/
public Item next() {
+ if (!this.isMaterialisable()) {
+ return ItemFactory.getInstance().createNullItem();
+ }
return this.iterator.next();
}
@@ -109,6 +121,24 @@ public boolean availableAsDataFrame() {
return this.iterator.isDataFrame();
}
+ /**
+ * Returns whether the iterator is updating
+ *
+ * @return true if updating; otherwise false.
+ */
+ public boolean availableAsPUL() {
+ return this.iterator.isUpdating();
+ }
+
+ /**
+ * Return whether the iterator of the sequence should be evaluated to materialise the sequence of items.
+ *
+ * @return true if materialisable; otherwise false
+ */
+ private boolean isMaterialisable() {
+ return !(this.availableAsPUL() && !this.iterator.isSequential());
+ }
+
/**
* Returns the sequence of items as an RDD of Items rather than iterating over them locally.
* It is not possible to do so if the iterator is open.
@@ -116,6 +146,9 @@ public boolean availableAsDataFrame() {
* @return an RDD of Items.
*/
public JavaRDD- getAsRDD() {
+ if (!this.isMaterialisable()) {
+ return SparkSessionManager.getInstance().getJavaSparkContext().emptyRDD();
+ }
if (this.isOpen) {
throw new RuntimeException("Cannot obtain an RDD if the iterator is open.");
}
@@ -129,12 +162,23 @@ public JavaRDD
- getAsRDD() {
* @return a data frame.
*/
public Dataset
getAsDataFrame() {
+ if (!this.isMaterialisable()) {
+ return SparkSessionManager.getInstance().getOrCreateSession().emptyDataFrame();
+ }
if (this.isOpen) {
throw new RuntimeException("Cannot obtain an RDD if the iterator is open.");
}
return this.iterator.getDataFrame(this.dynamicContext).getDataFrame();
}
+ /**
+ * Applies the PUL available when the iterator is updating.
+ */
+ public void applyPUL() {
+ PendingUpdateList pul = this.iterator.getPendingUpdateList(this.dynamicContext);
+ pul.applyUpdates(this.iterator.getMetadata());
+ }
+
/*
* Populates a list of items with the output.
*
@@ -142,6 +186,9 @@ public Dataset getAsDataFrame() {
*/
public long populateList(List- resultList) {
resultList.clear();
+ if (!this.isMaterialisable()) {
+ return -1;
+ }
this.iterator.open(this.dynamicContext);
Item result = null;
if (this.iterator.hasNext()) {
@@ -176,6 +223,9 @@ public long populateList(List
- resultList) {
public long populateListWithWarningOnlyIfCapReached(List
- resultList) {
if (this.availableAsRDD()) {
+ if (!this.isMaterialisable()) {
+ return -1;
+ }
JavaRDD
- rdd = this.iterator.getRDD(this.dynamicContext);
return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList);
} else {
@@ -183,5 +233,4 @@ public long populateListWithWarningOnlyIfCapReached(List
- resultList) {
}
}
-
}
diff --git a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
index 9d6cbb99b9..25c350a557 100644
--- a/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
+++ b/src/main/java/org/rumbledb/cli/JsoniqQueryExecutor.java
@@ -118,7 +118,8 @@ public List
- runQuery() throws IOException {
!(this.configuration.getOutputFormat().equals("json")
|| this.configuration.getOutputFormat().equals("tyson")
|| this.configuration.getOutputFormat().equals("xml-json-hybrid")
- || this.configuration.getOutputFormat().equals("yaml"))
+ || this.configuration.getOutputFormat().equals("yaml")
+ || this.configuration.getOutputFormat().equals("delta"))
&&
!sequence.availableAsDataFrame()
) {
@@ -185,6 +186,10 @@ public List
- runQuery() throws IOException {
}
}
+ if (this.configuration.applyUpdates() && sequence.availableAsPUL() && outputPath != null) {
+ sequence.applyPUL();
+ }
+
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
if (logPath != null) {
@@ -225,6 +230,9 @@ public long runInteractive(String query, List
- resultList) throws IOExcepti
if (!sequence.availableAsRDD()) {
return sequence.populateList(resultList);
}
+ if (this.configuration.applyUpdates() && sequence.availableAsPUL()) {
+ sequence.applyPUL();
+ }
resultList.clear();
JavaRDD
- rdd = sequence.getAsRDD();
return SparkSessionManager.collectRDDwithLimitWarningOnly(rdd, resultList);
diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
index 546af9628d..d308ed9104 100644
--- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java
@@ -448,7 +448,7 @@ public Node visitInlineFunctionExpr(InlineFunctionExpression expression, Node ar
expression.getAnnotations(),
expression.getName(),
expression.getParams(),
- expression.getReturnType(),
+ expression.getActualReturnType(),
(StatementsAndOptionalExpr) visit(expression.getBody(), argument),
expression.getMetadata()
);
diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
index 5e8a7ccc2c..e96188dbc4 100644
--- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java
@@ -656,7 +656,11 @@ public StaticContext visitProlog(Prolog prolog, StaticContext argument) {
@Override
public StaticContext visitProgram(Program program, StaticContext argument) {
visitDescendants(program, argument);
- ExecutionMode mergedExecutionMode = getHighestExecutionModeFromStatements(exitStatementChildren);
+ ExecutionMode mergedExecutionMode = program.getStatementsAndOptionalExpr().getHighestExecutionMode();
+ for (Statement statement : exitStatementChildren) {
+ ExecutionMode statementExecMode = statement.getHighestExecutionMode(this.visitorConfig);
+ mergedExecutionMode = getHighestExecutionMode(mergedExecutionMode, statementExecMode);
+ }
program.setHighestExecutionMode(mergedExecutionMode);
return argument;
}
diff --git a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
index 7bcd53bdd1..7614931dc4 100644
--- a/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/ExpressionClassificationVisitor.java
@@ -1,5 +1,9 @@
package org.rumbledb.compiler;
+import org.rumbledb.context.BuiltinFunction;
+import org.rumbledb.context.BuiltinFunctionCatalogue;
+import org.rumbledb.context.FunctionIdentifier;
+import org.rumbledb.context.StaticContext;
import org.rumbledb.exceptions.InvalidUpdatingExpressionPositionException;
import org.rumbledb.exceptions.SimpleExpressionMustBeVacuousException;
import org.rumbledb.expressions.AbstractNodeVisitor;
@@ -7,6 +11,8 @@
import org.rumbledb.expressions.Expression;
import org.rumbledb.expressions.ExpressionClassification;
import org.rumbledb.expressions.Node;
+import org.rumbledb.exceptions.UnknownFunctionCallException;
+import org.rumbledb.exceptions.UpdatingFunctionHasReturnTypeException;
import org.rumbledb.expressions.control.ConditionalExpression;
import org.rumbledb.expressions.control.SwitchExpression;
import org.rumbledb.expressions.control.TypeSwitchExpression;
@@ -27,6 +33,7 @@
import org.rumbledb.expressions.scripting.loops.ReturnStatementClause;
import org.rumbledb.expressions.scripting.statement.StatementsAndExpr;
import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr;
+import org.rumbledb.expressions.typing.TreatExpression;
import org.rumbledb.expressions.update.AppendExpression;
import org.rumbledb.expressions.update.CopyDeclaration;
import org.rumbledb.expressions.update.DeleteExpression;
@@ -34,6 +41,7 @@
import org.rumbledb.expressions.update.RenameExpression;
import org.rumbledb.expressions.update.ReplaceExpression;
import org.rumbledb.expressions.update.TransformExpression;
+import org.rumbledb.types.FunctionSignature;
import java.util.ArrayList;
import java.util.List;
@@ -51,14 +59,6 @@ protected ExpressionClassification defaultAction(Node node, ExpressionClassifica
return expressionClassification;
}
- if (node instanceof StatementsAndExpr) {
- ((StatementsAndExpr) node).setExpressionClassification(expressionClassification);
- return expressionClassification;
- }
- if (node instanceof StatementsAndOptionalExpr) {
- ((StatementsAndOptionalExpr) node).setExpressionClassification(expressionClassification);
- return expressionClassification;
- }
if (node instanceof InlineFunctionExpression) {
((InlineFunctionExpression) node).setExpressionClassification(expressionClassification);
return expressionClassification;
@@ -88,6 +88,28 @@ public ExpressionClassification visitDescendants(Node node, ExpressionClassifica
return result;
}
+ @Override
+ public ExpressionClassification visitStatementsAndOptionalExpr(
+ StatementsAndOptionalExpr expression,
+ ExpressionClassification argument
+ ) {
+ this.visitDescendants(expression, argument);
+ Expression e = expression.getExpression();
+ expression.setExpressionClassification(e.getExpressionClassification());
+ return e.getExpressionClassification();
+ }
+
+ @Override
+ public ExpressionClassification visitStatementsAndExpr(
+ StatementsAndExpr expression,
+ ExpressionClassification argument
+ ) {
+ this.visitDescendants(expression, argument);
+ Expression e = expression.getExpression();
+ expression.setExpressionClassification(e.getExpressionClassification());
+ return e.getExpressionClassification();
+ }
+
@Override
public ExpressionClassification visitCommaExpression(
CommaExpression expression,
@@ -118,6 +140,21 @@ public ExpressionClassification visitCommaExpression(
return expression.getExpressionClassification();
}
+ // Region Typing
+
+ @Override
+ public ExpressionClassification visitTreatExpression(
+ TreatExpression expression,
+ ExpressionClassification argument
+ ) {
+ ExpressionClassification result = this.visit(expression.getMainExpression(), argument);
+ expression.setExpressionClassification(result);
+ return result;
+ }
+
+
+ // Endregion
+
// Region FLWOR
@Override
@@ -301,13 +338,88 @@ public ExpressionClassification visitTypeSwitchExpression(
// Region Primary
+ private FunctionSignature getSignature(FunctionIdentifier identifier, StaticContext staticContext) {
+ BuiltinFunction function;
+ FunctionSignature signature;
+ function = BuiltinFunctionCatalogue.getBuiltinFunction(identifier);
+ if (function != null) {
+ signature = function.getSignature();
+ } else {
+ signature = staticContext.getFunctionSignature(identifier);
+ }
+ return signature;
+ }
+
@Override
public ExpressionClassification visitFunctionCall(
FunctionCallExpression expression,
ExpressionClassification argument
) {
- // TODO: Make vacuous if call to fn:error?
- return super.visitFunctionCall(expression, argument);
+ ExpressionClassification currArgResult;
+ for (Expression argExpr : expression.getArguments()) {
+ if (argExpr == null) {
+ continue;
+ }
+ currArgResult = this.visit(argExpr, argument);
+ if (currArgResult.isUpdating()) {
+ throw new InvalidUpdatingExpressionPositionException(
+ "Arguments to function calls cannot be updating",
+ argExpr.getMetadata()
+ );
+ }
+ }
+ FunctionSignature funcSig;
+ try {
+ funcSig = getSignature(expression.getFunctionIdentifier(), expression.getStaticContext());
+ } catch (UnknownFunctionCallException e) {
+ throw new UnknownFunctionCallException(expression.getFunctionIdentifier(), expression.getMetadata());
+ }
+ ExpressionClassification result = funcSig.isUpdating()
+ ? ExpressionClassification.UPDATING
+ : ExpressionClassification.SIMPLE;
+ expression.setExpressionClassification(result);
+ // TODO: Make vacuous if call to fn:error? Not present!
+ return result;
+ }
+
+ @Override
+ public ExpressionClassification visitInlineFunctionExpr(
+ InlineFunctionExpression expression,
+ ExpressionClassification argument
+ ) {
+ ExpressionClassification bodyResult = this.visit(expression.getBody(), argument);
+
+ if (expression.isUpdating()) {
+ if (expression.getActualReturnType() != null) {
+ System.err.println(expression);
+ throw new UpdatingFunctionHasReturnTypeException(
+ "An updating function cannot have a return type. Return type "
+ + expression.getActualReturnType()
+ + " is specified.",
+ expression.getMetadata()
+ );
+ }
+ if (!expression.isExternal() && !(bodyResult.isUpdating() || bodyResult.isVacuous())) {
+ throw new SimpleExpressionMustBeVacuousException(
+ "Top level expression of updating function must be updating or vacuous",
+ expression.getMetadata()
+ );
+ }
+ // TODO CHECK IF EXTERNAL ERROR XUDY0019
+ expression.setExpressionClassification(ExpressionClassification.UPDATING);
+ } else {
+ if (!expression.isExternal() && !bodyResult.isSimple()) {
+ throw new InvalidUpdatingExpressionPositionException(
+ "Body of simple inline function must be simple",
+ expression.getMetadata()
+ );
+ }
+ // TODO CHECK IF EXTERNAL ERROR XUDY0018
+ expression.setExpressionClassification(ExpressionClassification.SIMPLE);
+ }
+
+
+ return expression.getExpressionClassification();
}
// Endregion
diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
index 9a8cb0d434..bb022d9548 100644
--- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java
@@ -402,7 +402,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression
returnType = expression.getBody().getExpression().getStaticSequenceType();
}
List params = new ArrayList<>(expression.getParams().values());
- FunctionSignature signature = new FunctionSignature(params, returnType);
+ FunctionSignature signature = new FunctionSignature(params, returnType, expression.isUpdating());
expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(signature)));
return argument;
}
@@ -474,6 +474,29 @@ private boolean tryAnnotateSpecificFunctions(FunctionCallExpression expression,
}
}
+ // handle 'delta-file' function
+ if (
+ functionName.equals(Name.createVariableInDefaultFunctionNamespace("delta-file"))
+ && args.size() > 0
+ && args.get(0) instanceof StringLiteralExpression
+ ) {
+ String path = ((StringLiteralExpression) args.get(0)).getValue();
+ URI uri = FileSystemUtil.resolveURI(staticContext.getStaticBaseURI(), path, expression.getMetadata());
+ if (!FileSystemUtil.exists(uri, this.rumbleRuntimeConfiguration, expression.getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", expression.getMetadata());
+ }
+ StructType s = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString())
+ .schema();
+ ItemType schemaItemType = ItemTypeFactory.createItemType(s);
+ // TODO : check if arity is correct
+ expression.setStaticSequenceType(new SequenceType(schemaItemType, SequenceType.Arity.ZeroOrMore));
+ return true;
+ }
+
// handle 'round' function
if (functionName.equals(Name.createVariableInDefaultFunctionNamespace("round"))) {
// set output type to the same of the first argument (special handling of numeric)
@@ -538,7 +561,11 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static
}
if (expression.isPartialApplication()) {
- FunctionSignature partialSignature = new FunctionSignature(partialParams, signature.getReturnType());
+ FunctionSignature partialSignature = new FunctionSignature(
+ partialParams,
+ signature.getReturnType(),
+ expression.isUpdating()
+ );
expression.setStaticSequenceType(
new SequenceType(ItemTypeFactory.createFunctionItemType(partialSignature))
);
@@ -766,8 +793,7 @@ public StaticContext visitTransformExpression(TransformExpression expression, St
}
visit(expression.getModifyExpression(), argument);
visit(expression.getReturnExpression(), argument);
-
- expression.setStaticSequenceType(SequenceType.EMPTY_SEQUENCE);
+ expression.setStaticSequenceType(expression.getReturnExpression().getStaticSequenceType());
return argument;
}
@@ -1781,7 +1807,8 @@ public StaticContext visitDynamicFunctionCallExpression(
if (isPartialApplication) {
FunctionSignature newSignature = new FunctionSignature(
partialFormalParameterTypes,
- signature.getReturnType()
+ signature.getReturnType(),
+ expression.isUpdating()
);
expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(newSignature)));
return argument;
diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
index 9d5354e400..0102eb79b7 100644
--- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java
@@ -486,9 +486,6 @@ public RuntimeIterator visitTransformExpression(TransformExpression expression,
for (CopyDeclaration copyDecl : expression.getCopyDeclarations()) {
copyDeclMap.put(copyDecl.getVariableName(), this.visit(copyDecl.getSourceExpression(), argument));
}
- for (Expression childExpr : expression.getCopySourceExpressions()) {
- copyDeclIterators.add(this.visit(childExpr, argument));
- }
RuntimeIterator modifyIterator = this.visit(expression.getModifyExpression(), argument);
RuntimeIterator returnIterator = this.visit(expression.getReturnExpression(), argument);
@@ -664,7 +661,8 @@ public RuntimeIterator visitInlineFunctionExpr(InlineFunctionExpression expressi
paramNameToSequenceTypes,
returnType,
bodyIterator,
- expression.getStaticContextForRuntime(this.config, this.visitorConfig)
+ expression.getStaticContextForRuntime(this.config, this.visitorConfig),
+ expression.isUpdating()
);
runtimeIterator.setStaticContext(expression.getStaticContext());
return runtimeIterator;
@@ -703,7 +701,8 @@ public RuntimeIterator visitFunctionCall(FunctionCallExpression expression, Runt
runtimeIterator = new StaticUserDefinedFunctionCallIterator(
identifier,
arguments,
- expression.getStaticContextForRuntime(this.config, this.visitorConfig)
+ expression.getStaticContextForRuntime(this.config, this.visitorConfig),
+ expression.isUpdating()
);
}
runtimeIterator.setStaticContext(expression.getStaticContext());
@@ -1005,6 +1004,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI
RuntimeIterator runtimeIterator = new TreatIterator(
childExpression,
expression.getSequenceType(),
+ expression.isUpdating(),
expression.errorCodeThatShouldBeThrown(),
expression.getStaticContextForRuntime(this.config, this.visitorConfig)
);
diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
index b192378c3d..b4e19efc8b 100644
--- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java
@@ -188,7 +188,8 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S
expression.getFunctionIdentifier(),
new FunctionSignature(
new ArrayList<>(expression.getParams().values()),
- expression.getReturnType()
+ expression.getReturnType(),
+ expression.isUpdating()
)
);
return argument;
diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
index f758f29134..8f2c77ffa1 100644
--- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
+++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java
@@ -426,7 +426,7 @@ public Node visitProlog(JsoniqParser.PrologContext ctx) {
return prolog;
}
- public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType) {
+ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean isType, boolean isAnnotation) {
String localName = null;
String prefix = null;
Name name = null;
@@ -445,6 +445,8 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean
name = Name.createVariableInDefaultFunctionNamespace(localName);
} else if (isType) {
name = Name.createVariableInDefaultTypeNamespace(localName);
+ } else if (isAnnotation) {
+ name = Name.createVariableInDefaultAnnotationsNamespace(localName);
} else {
name = Name.createVariableInNoNamespace(localName);
}
@@ -463,14 +465,14 @@ public Name parseName(JsoniqParser.QnameContext ctx, boolean isFunction, boolean
@Override
public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) {
List annotations = processAnnotations(ctx.annotations());
- Name name = parseName(ctx.qname(), true, false);
+ Name name = parseName(ctx.qname(), true, false, false);
LinkedHashMap fnParams = new LinkedHashMap<>();
SequenceType fnReturnType = null;
Name paramName;
SequenceType paramType;
if (ctx.paramList() != null) {
for (JsoniqParser.ParamContext param : ctx.paramList().param()) {
- paramName = parseName(param.qname(), false, false);
+ paramName = parseName(param.qname(), false, false, false);
paramType = ITEM_STAR;
if (fnParams.containsKey(paramName)) {
throw new DuplicateParamNameException(
@@ -495,12 +497,15 @@ public Node visitFunctionDecl(JsoniqParser.FunctionDeclContext ctx) {
StatementsAndOptionalExpr funcBody = (StatementsAndOptionalExpr) this
.visitStatementsAndOptionalExpr(ctx.fn_body);
+ boolean isExternal = ctx.is_external != null;
+
return new InlineFunctionExpression(
annotations,
name,
fnParams,
fnReturnType,
funcBody,
+ isExternal,
createMetadataFromContext(ctx)
);
}
@@ -531,7 +536,7 @@ public Node visitTypeDecl(JsoniqParser.TypeDeclContext ctx) {
pe.initCause(e);
throw pe;
}
- Name name = parseName(ctx.qname(), false, true);
+ Name name = parseName(ctx.qname(), false, true, false);
String schemaLanguage = null;
if (ctx.schema != null) {
schemaLanguage = ctx.schema.getText();
@@ -1132,7 +1137,7 @@ public Node visitArrowExpr(JsoniqParser.ArrowExprContext ctx) {
children.add(mainExpression);
children.addAll(getArgumentsFromArgumentListContext(ctx.arguments.get(i)));
if (functionCallContext.qname() != null) {
- Name name = parseName(functionCallContext.qname(), true, false);
+ Name name = parseName(functionCallContext.qname(), true, false, false);
mainExpression = processFunctionCall(name, children, createMetadataFromContext(functionCallContext));
continue;
} else if (functionCallContext.varRef() != null) {
@@ -1518,7 +1523,7 @@ public Node visitParenthesizedExpr(JsoniqParser.ParenthesizedExprContext ctx) {
@Override
public Node visitVarRef(JsoniqParser.VarRefContext ctx) {
- Name name = parseName(ctx.qname(), false, false);
+ Name name = parseName(ctx.qname(), false, false, false);
return new VariableReferenceExpression(name, createMetadataFromContext(ctx));
}
@@ -1589,7 +1594,7 @@ public ItemType processItemType(JsoniqParser.ItemTypeContext itemTypeContext) {
return BuiltinTypesCatalogue.anyFunctionItem;
}
}
- Name name = parseName(itemTypeContext.qname(), false, true);
+ Name name = parseName(itemTypeContext.qname(), false, true, false);
if (!BuiltinTypesCatalogue.typeExists(name)) {
return new ItemTypeReference(name);
}
@@ -1622,7 +1627,7 @@ private Expression processFunctionCall(Name name, List children, Exc
@Override
public Node visitFunctionCall(JsoniqParser.FunctionCallContext ctx) {
- Name name = parseName(ctx.fn_name, true, false);
+ Name name = parseName(ctx.fn_name, true, false, false);
return processFunctionCall(
name,
getArgumentsFromArgumentListContext(ctx.argumentList()),
@@ -1666,7 +1671,7 @@ public Node visitFunctionItemExpr(JsoniqParser.FunctionItemExprContext ctx) {
@Override
public Node visitNamedFunctionRef(JsoniqParser.NamedFunctionRefContext ctx) {
- Name name = parseName(ctx.fn_name, true, false);
+ Name name = parseName(ctx.fn_name, true, false, false);
int arity = 0;
try {
arity = Integer.parseInt(ctx.arity.getText());
@@ -1691,7 +1696,7 @@ public Node visitInlineFunctionExpr(JsoniqParser.InlineFunctionExprContext ctx)
SequenceType paramType;
if (ctx.paramList() != null) {
for (JsoniqParser.ParamContext param : ctx.paramList().param()) {
- paramName = parseName(param.qname(), false, false);
+ paramName = parseName(param.qname(), false, false, false);
paramType = SequenceType.ITEM_STAR;
if (fnParams.containsKey(paramName)) {
throw new DuplicateParamNameException(
@@ -1873,7 +1878,7 @@ public Node visitTryCatchExpr(JsoniqParser.TryCatchExprContext ctx) {
for (JsoniqParser.CatchClauseContext catchCtx : ctx.catches) {
Expression catchExpression = (Expression) this.visitExpr(catchCtx.catch_expression);
for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) {
- Name name = parseName(qnameCtx, false, false);
+ Name name = parseName(qnameCtx, false, false, false);
if (!catchExpressions.containsKey(name.getLocalName())) {
catchExpressions.put(name.getLocalName(), catchExpression);
}
@@ -2028,7 +2033,7 @@ public Node visitApplyStatement(JsoniqParser.ApplyStatementContext ctx) {
@Override
public Node visitAssignStatement(JsoniqParser.AssignStatementContext ctx) {
- Name paramName = parseName(ctx.qname(), false, false);
+ Name paramName = parseName(ctx.qname(), false, false, false);
Expression exprSingle = (Expression) this.visitExprSingle(ctx.exprSingle());
return new AssignStatement(exprSingle, paramName, createMetadataFromContext(ctx));
}
@@ -2170,7 +2175,7 @@ public Node visitTryCatchStatement(JsoniqParser.TryCatchStatementContext ctx) {
for (JsoniqParser.CatchCaseStatementContext catchCtx : ctx.catches) {
BlockStatement catchBlockStatement = (BlockStatement) this.visitBlockStatement(catchCtx.catch_block);
for (JsoniqParser.QnameContext qnameCtx : catchCtx.errors) {
- Name name = parseName(qnameCtx, false, false);
+ Name name = parseName(qnameCtx, false, false, false);
if (!catchBlockStatements.containsKey(name.getLocalName())) {
catchBlockStatements.put(name.getLocalName(), catchBlockStatement);
}
@@ -2380,20 +2385,20 @@ public ExceptionMetadata generateMetadata(Token token) {
private List processAnnotations(JsoniqParser.AnnotationsContext annotations) {
List parsedAnnotations = new ArrayList<>();
- annotations.annotation().forEach(annotationContext -> {
+ for (JsoniqParser.AnnotationContext annotationContext : annotations.annotation()) {
+ // for backwards compatibility, the specification allows for updating without % sign
+ if (annotationContext.updating != null) {
+ Name name = Name.createVariableInDefaultAnnotationsNamespace("updating");
+ parsedAnnotations.add(new Annotation(name, null));
+ continue;
+ }
JsoniqParser.QnameContext qnameContext = annotationContext.qname();
- Name name = parseName(qnameContext, false, false);
+ Name name = parseName(qnameContext, false, false, true);
if (!annotationContext.Literal().isEmpty()) {
throw new OurBadException("Literals are currently not supported in annotations!");
}
parsedAnnotations.add(new Annotation(name, null));
- // List literals = new ArrayList<>();
- // ExceptionMetadata metadata = createMetadataFromContext(annotationContext);
- // annotationContext.Literal().forEach(literal -> {
- // literals.add(getLiteralExpressionFromToken(literal.getText(), metadata));
- // });
- // parsedAnnotations.add(new Annotation(name, literals));
- });
+ }
return parsedAnnotations;
}
diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
index f63ed59f9f..7c78ec877b 100644
--- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
+++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java
@@ -154,16 +154,77 @@ public static MainModule parseJSONiqMainModule(
if (main == null) {
throw new ParsingException("A library module is not executable.", ExceptionMetadata.EMPTY_METADATA);
}
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************");
+ System.err.println("Parsing program");
+ System.err.println("***************");
+ }
MainModule mainModule = (MainModule) visitor.visit(main);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************");
+ System.err.println("Pruning modules");
+ System.err.println("***************");
+ }
pruneModules(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("**********************");
+ System.err.println("Resolving dependencies");
+ System.err.println("**********************");
+ }
resolveDependencies(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating sequential classifications");
+ System.err.println("*************************************");
+ }
populateSequentialClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************************************");
+ System.err.println("Applying type independent optimizations");
+ System.err.println("***************************************");
+ }
mainModule = applyTypeIndependentOptimizations(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************");
+ System.err.println("Populating static context");
+ System.err.println("*************************");
+ }
populateStaticContext(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating expression classifications");
+ System.err.println("*************************************");
+ }
+ populateExpressionClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("**************");
+ System.err.println("Infering types");
+ System.err.println("**************");
+ }
inferTypes(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("************************");
+ System.err.println("Applying type dependent optimizations");
+ System.err.println("************************");
+ }
mainModule = applyTypeDependentOptimizations(mainModule);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("***************************************");
+ System.err.println("Populating execution modes");
+ System.err.println("***************************************");
+ }
populateExecutionModes(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("*************************************");
+ System.err.println("Populating expression classifications");
+ System.err.println("*************************************");
+ }
populateExpressionClassifications(mainModule, configuration);
+ if (configuration.isPrintIteratorTree()) {
+ System.err.println("********************************");
+ System.err.println("Verify composability constraints");
+ System.err.println("********************************");
+ }
verifyComposabilityConstraints(mainModule, configuration);
return mainModule;
} catch (ParseCancellationException ex) {
diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
index c82b2df27f..593a5fcbcc 100644
--- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
+++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java
@@ -73,6 +73,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl
private boolean nativeExecution;
private boolean functionInlining;
private boolean thirdFeature;
+ private boolean applyUpdates;
private Map shortcutMap;
private Set yesNoShortcuts;
@@ -422,6 +423,12 @@ public void init() {
this.functionInlining = true;
}
+ if (this.arguments.containsKey("apply-updates")) {
+ this.applyUpdates = this.arguments.get("apply-updates").equals("yes");
+ } else {
+ this.applyUpdates = false;
+ }
+
if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) {
this.optimizeGeneralComparisonToValueComparison = this.arguments.get(
"optimize-general-comparison-to-value-comparison"
@@ -644,6 +651,14 @@ public void setFunctionInlining(boolean b) {
this.functionInlining = b;
}
+ public boolean applyUpdates() {
+ return this.applyUpdates;
+ }
+
+ public void setApplyUpdates(boolean b) {
+ this.applyUpdates = b;
+ }
+
public boolean optimizeGeneralComparisonToValueComparison() {
return this.optimizeGeneralComparisonToValueComparison;
}
diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
index 8ff2d1970d..afca459f9a 100644
--- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
+++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java
@@ -37,6 +37,8 @@
import org.rumbledb.runtime.functions.datetime.components.TimezoneFromTimeFunctionIterator;
import org.rumbledb.runtime.functions.datetime.components.YearFromDateFunctionIterator;
import org.rumbledb.runtime.functions.datetime.components.YearFromDateTimeFunctionIterator;
+import org.rumbledb.runtime.functions.delta_lake.CreateDeltaLakeTableFunctionIterator;
+import org.rumbledb.runtime.functions.delta_lake.DeleteDeltaLakeTableFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.DaysFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.HoursFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.durations.components.ImplicitTimezoneIterator;
@@ -46,6 +48,7 @@
import org.rumbledb.runtime.functions.durations.components.YearsFromDurationFunctionIterator;
import org.rumbledb.runtime.functions.input.AvroFileFunctionIterator;
import org.rumbledb.runtime.functions.input.CSVFileFunctionIterator;
+import org.rumbledb.runtime.functions.input.DeltaFileFunctionIterator;
import org.rumbledb.runtime.functions.input.JsonFileFunctionIterator;
import org.rumbledb.runtime.functions.input.LibSVMFileFunctionIterator;
import org.rumbledb.runtime.functions.input.ParallelizeFunctionIterator;
@@ -518,6 +521,16 @@ private static BuiltinFunction createBuiltinFunction(
BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME
);
+ /**
+ * function that parses a delta file
+ */
+ static final BuiltinFunction delta_file = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "delta-file"),
+ "string",
+ "item*",
+ DeltaFileFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME
+ );
/**
* function that parses a csv file
*/
@@ -2677,6 +2690,28 @@ private static BuiltinFunction createBuiltinFunction(
BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
);
+ /**
+ * function that creates a delta lake table at a given path location
+ */
+ static final BuiltinFunction create_delta_lake_table = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "create-delta-lake-table"),
+ "string",
+ "boolean",
+ CreateDeltaLakeTableFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
+ /**
+ * function that deletes a delta lake table at a given path location
+ */
+ static final BuiltinFunction delete_delta_lake_table = createBuiltinFunction(
+ new Name(Name.JN_NS, "jn", "delete-delta-lake-table"),
+ "string",
+ "boolean",
+ DeleteDeltaLakeTableFunctionIterator.class,
+ BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL
+ );
+
static {
builtinFunctions = new HashMap<>();
@@ -2698,6 +2733,7 @@ private static BuiltinFunction createBuiltinFunction(
builtinFunctions.put(parallelizeFunction2.getIdentifier(), parallelizeFunction2);
builtinFunctions.put(parquet_file1.getIdentifier(), parquet_file1);
builtinFunctions.put(parquet_file2.getIdentifier(), parquet_file2);
+ builtinFunctions.put(delta_file.getIdentifier(), delta_file);
builtinFunctions.put(csv_file1.getIdentifier(), csv_file1);
builtinFunctions.put(csv_file2.getIdentifier(), csv_file2);
builtinFunctions.put(root_file1.getIdentifier(), root_file1);
@@ -2706,6 +2742,9 @@ private static BuiltinFunction createBuiltinFunction(
builtinFunctions.put(avro_file2.getIdentifier(), avro_file2);
builtinFunctions.put(parse_json.getIdentifier(), parse_json);
+ builtinFunctions.put(create_delta_lake_table.getIdentifier(), create_delta_lake_table);
+ builtinFunctions.put(delete_delta_lake_table.getIdentifier(), delete_delta_lake_table);
+
builtinFunctions.put(count.getIdentifier(), count);
builtinFunctions.put(boolean_function.getIdentifier(), boolean_function);
builtinFunctions.put(not_function.getIdentifier(), not_function);
diff --git a/src/main/java/org/rumbledb/context/GlobalVariables.java b/src/main/java/org/rumbledb/context/GlobalVariables.java
index 7c3f87936f..ce93dec247 100644
--- a/src/main/java/org/rumbledb/context/GlobalVariables.java
+++ b/src/main/java/org/rumbledb/context/GlobalVariables.java
@@ -11,6 +11,7 @@
import java.util.Set;
public class GlobalVariables implements Serializable, KryoSerializable {
+ private static final long serialVersionUID = 1L;
private Set globalVariables;
public GlobalVariables() {
diff --git a/src/main/java/org/rumbledb/context/Name.java b/src/main/java/org/rumbledb/context/Name.java
index 45d377c517..687b3a6105 100644
--- a/src/main/java/org/rumbledb/context/Name.java
+++ b/src/main/java/org/rumbledb/context/Name.java
@@ -59,9 +59,9 @@ public class Name implements Comparable, Serializable, KryoSerializable {
public static final String XS_NS = "http://www.w3.org/2001/XMLSchema";
public static final String JS_NS = "http://jsoniq.org/types";
public static final String LOCAL_NS = "http://www.w3.org/2005/xquery-local-functions";
-
- public static final String AN_NS = "http://www.zorba-xquery.com/annotations";
+ public static final String AN_NS = "http://www.w3.org/2012/xquery";
public static final String DEFAULT_COLLATION_NS = "http://www.w3.org/2005/xpath-functions/collation/codepoint";
+
public static final Name CONTEXT_ITEM = createVariableInNoNamespace("$");
public static final Name CONTEXT_POSITION = createVariableInNoNamespace("$position");
public static final Name CONTEXT_COUNT = createVariableInNoNamespace("$count");
@@ -122,6 +122,18 @@ public static Name createVariableInDefaultFunctionNamespace(String localName) {
return new Name(JSONIQ_DEFAULT_FUNCTION_NS, "", localName);
}
+ /**
+ * Creates an expanded name that has the default annotations namespace. By default, in Rumble, unprefixed
+ * annotations live in this namespace. This namespace includes
+ * all builtin annotations.
+ *
+ * @param localName the name of the variable
+ * @return the expanded name
+ */
+ public static Name createVariableInDefaultAnnotationsNamespace(String localName) {
+ return new Name(AN_NS, "", localName);
+ }
+
public static Name createVariableInDefaultXQueryTypeNamespace(String localName) {
return new Name(FN_NS, "", localName);
}
diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java
index a322077bd0..979fd636e5 100644
--- a/src/main/java/org/rumbledb/context/StaticContext.java
+++ b/src/main/java/org/rumbledb/context/StaticContext.java
@@ -71,7 +71,7 @@ public class StaticContext implements Serializable, KryoSerializable {
defaultBindings.put("xs", Name.XS_NS);
defaultBindings.put("jn", Name.JN_NS);
defaultBindings.put("js", Name.JS_NS);
- defaultBindings.put("an", Name.AN_NS);
+ // defaultBindings.put("an", Name.AN_NS);
}
private RumbleRuntimeConfiguration configuration;
@@ -454,7 +454,7 @@ public InScopeSchemaTypes getInScopeSchemaTypes() {
}
public int getCurrentMutabilityLevel() {
- return currentMutabilityLevel;
+ return this.currentMutabilityLevel;
}
public void setCurrentMutabilityLevel(int currentMutabilityLevel) {
diff --git a/src/main/java/org/rumbledb/context/VariableValues.java b/src/main/java/org/rumbledb/context/VariableValues.java
index 61572b017f..e37bf4526c 100644
--- a/src/main/java/org/rumbledb/context/VariableValues.java
+++ b/src/main/java/org/rumbledb/context/VariableValues.java
@@ -366,6 +366,9 @@ public String toString() {
sb.append(" " + name + " (" + this.localVariableValues.get(name).size() + " items)\n");
if (this.localVariableValues.get(name).size() == 1) {
sb.append(" " + this.localVariableValues.get(name).get(0).serialize() + "\n");
+ sb.append(
+ " Mutability level: " + this.localVariableValues.get(name).get(0).getMutabilityLevel() + "\n"
+ );
}
}
sb.append(" Counts:\n");
diff --git a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
index c2f8621601..261f2c261a 100644
--- a/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
+++ b/src/main/java/org/rumbledb/errorcodes/ErrorCode.java
@@ -74,6 +74,7 @@ public enum ErrorCode {
OurBadErrorCode("RBST0004"),
ClusterConnectionErrorCode("RBDY0005"),
DatesWithTimezonesNotSupported("RBDY0006"),
+ CannotModifyImmutableValue("RBDY0007"),
UnexpectedStaticType("RBTY0001"),
@@ -131,6 +132,8 @@ public enum ErrorCode {
TransformModifiesNonCopiedValue("XUDY0014"),
UpdateTargetIsEmptySeqErrorCode("XUDY0027"),
+ UpdatingFunctionHasReturnTypeErrorCode("XUST0028"),
+
DuplicateObjectInsertSourceErrorCode("JNUP0005"),
DuplicateKeyOnUpdateApplyErrorCode("JNUP0006"),
CannotCastUpdateSelectorErrorCode("JNUP0007"),
diff --git a/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java
new file mode 100644
index 0000000000..2441383014
--- /dev/null
+++ b/src/main/java/org/rumbledb/exceptions/ModifiesImmutableValueException.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors: Stefan Irimescu, Can Berker Cikis
+ *
+ */
+
+package org.rumbledb.exceptions;
+
+import org.rumbledb.errorcodes.ErrorCode;
+
+public class ModifiesImmutableValueException extends RumbleException {
+
+ private static final long serialVersionUID = 1L;
+
+ public ModifiesImmutableValueException(String message, ExceptionMetadata metadata) {
+ super(message, ErrorCode.CannotModifyImmutableValue, metadata);
+ }
+}
diff --git a/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java
new file mode 100644
index 0000000000..2b8ebf47aa
--- /dev/null
+++ b/src/main/java/org/rumbledb/exceptions/UpdatingFunctionHasReturnTypeException.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors: Stefan Irimescu, Can Berker Cikis
+ *
+ */
+
+package org.rumbledb.exceptions;
+
+import org.rumbledb.errorcodes.ErrorCode;
+
+public class UpdatingFunctionHasReturnTypeException extends RumbleException {
+
+ private static final long serialVersionUID = 1L;
+
+ public UpdatingFunctionHasReturnTypeException(String message, ExceptionMetadata metadata) {
+ super(message, ErrorCode.UpdatingFunctionHasReturnTypeErrorCode, metadata);
+ }
+}
diff --git a/src/main/java/org/rumbledb/expressions/Expression.java b/src/main/java/org/rumbledb/expressions/Expression.java
index 5b1bf2f70e..2dc28b4a1e 100644
--- a/src/main/java/org/rumbledb/expressions/Expression.java
+++ b/src/main/java/org/rumbledb/expressions/Expression.java
@@ -126,7 +126,7 @@ public void setStaticSequenceType(SequenceType staticSequenceType) {
* @return Expression Classification of the expression.
*/
public ExpressionClassification getExpressionClassification() {
- return expressionClassification;
+ return this.expressionClassification;
}
/**
diff --git a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
index f852a1f3de..842478436e 100644
--- a/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
+++ b/src/main/java/org/rumbledb/expressions/ExpressionClassification.java
@@ -3,10 +3,11 @@
/**
* An ExpressionClassification classifies an expression under 4 possible classifications.
*
- * A BASIC_UPDATING expression is classified as 1 of 6 expressions in the update package, that can alter the state of
+ * A BASIC_UPDATING expression is classified as 1 of 5 expressions in the update package, that can alter the state of
* an existing node.
*
- * An UPDATING expression is classified as a BASIC_EXPRESSION or any expression (excluding a TransformExpression) that
+ * An UPDATING expression is classified as a BASIC_UPDATING expression or any expression (excluding a
+ * TransformExpression) that
* directly contains an UPDATING expression and that can alter the state of an existing node.
*
* A SIMPLE expression is classified as an expression that is not an updating expression.
diff --git a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
index 0740660311..95f05b5269 100644
--- a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
+++ b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java
@@ -30,6 +30,7 @@
import org.rumbledb.expressions.Expression;
import org.rumbledb.expressions.Node;
import org.rumbledb.expressions.scripting.annotations.Annotation;
+import org.rumbledb.expressions.scripting.annotations.AnnotationConstants;
import org.rumbledb.expressions.scripting.statement.StatementsAndOptionalExpr;
import org.rumbledb.types.SequenceType;
@@ -51,6 +52,7 @@ public class InlineFunctionExpression extends Expression {
private final List annotations;
private boolean hasSequentialPropertyAnnotation;
private boolean hasExitStatement;
+ private final boolean isExternal;
public InlineFunctionExpression(
List annotations,
@@ -58,6 +60,7 @@ public InlineFunctionExpression(
Map params,
SequenceType returnType,
StatementsAndOptionalExpr body,
+ boolean isExternal,
ExceptionMetadata metadata
) {
super(metadata);
@@ -67,6 +70,7 @@ public InlineFunctionExpression(
this.body = body;
this.annotations = annotations;
this.functionIdentifier = new FunctionIdentifier(name, params.size());
+ this.isExternal = isExternal;
this.hasExitStatement = false;
if (annotations != null) {
this.setSequentialFromAnnotations();
@@ -97,6 +101,17 @@ private void setSequentialFromAnnotations() {
this.setSequential(foundSeqAnnotation);
}
+ public InlineFunctionExpression(
+ List annotations,
+ Name name,
+ Map params,
+ SequenceType returnType,
+ StatementsAndOptionalExpr body,
+ ExceptionMetadata metadata
+ ) {
+ this(annotations, name, params, returnType, body, false, metadata);
+ }
+
public Name getName() {
return this.name;
}
@@ -126,6 +141,20 @@ public List getAnnotations() {
return annotations;
}
+ @Override
+ public boolean isUpdating() {
+ for (Annotation a : this.annotations) {
+ if (a.getAnnotationName().equals(AnnotationConstants.UPDATING)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isExternal() {
+ return this.isExternal;
+ }
+
@Override
public List getChildren() {
return Arrays.asList(this.body);
@@ -192,8 +221,9 @@ public void print(StringBuffer buffer, int indent) {
@Override
public void serializeToJSONiq(StringBuffer sb, int indent) {
indentIt(sb, indent);
+ String updating = isUpdating() ? "%an:updating" : "";
if (this.name != null) {
- sb.append("declare function " + this.name.toString() + "(");
+ sb.append("declare " + updating + " function " + this.name.toString() + "(");
} else {
sb.append("function (");
}
diff --git a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
index f5ec43ca51..0717a299ed 100644
--- a/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
+++ b/src/main/java/org/rumbledb/expressions/scripting/annotations/AnnotationConstants.java
@@ -5,6 +5,8 @@
public class AnnotationConstants {
public static final Name SEQUENTIAL = new Name(Name.AN_NS, "an", "sequential");
public static final Name NON_SEQUENTIAL = new Name(Name.AN_NS, "an", "nonsequential");
+ public static final Name UPDATING = new Name(Name.AN_NS, "an", "updating");
+ public static final Name SIMPLE = new Name(Name.AN_NS, "an", "simple");
public static final Name ASSIGNABLE = new Name(Name.AN_NS, "an", "assignable");
diff --git a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
index ae7702206d..78fc42429b 100644
--- a/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/AppendExpression.java
@@ -31,11 +31,11 @@ public AppendExpression(
}
public Expression getArrayExpression() {
- return arrayExpression;
+ return this.arrayExpression;
}
public Expression getToAppendExpression() {
- return toAppendExpression;
+ return this.toAppendExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
index f443f4ec8d..fe514e3b44 100644
--- a/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
+++ b/src/main/java/org/rumbledb/expressions/update/CopyDeclaration.java
@@ -21,11 +21,11 @@ public CopyDeclaration(
}
public Name getVariableName() {
- return variableName;
+ return this.variableName;
}
public Expression getSourceExpression() {
- return sourceExpression;
+ return this.sourceExpression;
}
public SequenceType getSourceSequenceType() {
diff --git a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
index 57e5368496..1f1c5f78c9 100644
--- a/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/DeleteExpression.java
@@ -36,11 +36,11 @@ public List getChildren() {
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getLocatorExpression() {
- return locatorExpression;
+ return this.locatorExpression;
}
diff --git a/src/main/java/org/rumbledb/expressions/update/InsertExpression.java b/src/main/java/org/rumbledb/expressions/update/InsertExpression.java
index b4edff096c..c569be308e 100644
--- a/src/main/java/org/rumbledb/expressions/update/InsertExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/InsertExpression.java
@@ -28,29 +28,29 @@ public InsertExpression(
}
public boolean hasPositionExpression() {
- return positionExpression != null;
+ return this.positionExpression != null;
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getToInsertExpression() {
- return toInsertExpression;
+ return this.toInsertExpression;
}
public Expression getPositionExpression() {
- if (positionExpression == null) {
+ if (this.positionExpression == null) {
throw new OurBadException("No position expression present in Insert Expression");
}
- return positionExpression;
+ return this.positionExpression;
}
@Override
public List getChildren() {
return this.positionExpression == null
- ? Arrays.asList(mainExpression, toInsertExpression)
- : Arrays.asList(mainExpression, toInsertExpression, positionExpression);
+ ? Arrays.asList(this.mainExpression, this.toInsertExpression)
+ : Arrays.asList(this.mainExpression, this.toInsertExpression, this.positionExpression);
}
@Override
@@ -62,12 +62,12 @@ public T accept(AbstractNodeVisitor visitor, T argument) {
public void serializeToJSONiq(StringBuffer sb, int indent) {
indentIt(sb, indent);
sb.append("insert json ");
- toInsertExpression.serializeToJSONiq(sb, 0);
+ this.toInsertExpression.serializeToJSONiq(sb, 0);
sb.append(" into ");
- mainExpression.serializeToJSONiq(sb, 0);
+ this.mainExpression.serializeToJSONiq(sb, 0);
if (this.hasPositionExpression()) {
sb.append(" at position ");
- positionExpression.serializeToJSONiq(sb, 0);
+ this.positionExpression.serializeToJSONiq(sb, 0);
}
sb.append("\n");
}
diff --git a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
index e50fea257b..3d5205eb23 100644
--- a/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/RenameExpression.java
@@ -42,15 +42,15 @@ public List getChildren() {
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getLocatorExpression() {
- return locatorExpression;
+ return this.locatorExpression;
}
public Expression getNameExpression() {
- return nameExpression;
+ return this.nameExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java b/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java
index c914f249b4..7655174d68 100644
--- a/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/ReplaceExpression.java
@@ -42,15 +42,15 @@ public List getChildren() {
}
public Expression getMainExpression() {
- return mainExpression;
+ return this.mainExpression;
}
public Expression getLocatorExpression() {
- return locatorExpression;
+ return this.locatorExpression;
}
public Expression getReplacerExpression() {
- return replacerExpression;
+ return this.replacerExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
index f4773ab769..aa06596a25 100644
--- a/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
+++ b/src/main/java/org/rumbledb/expressions/update/TransformExpression.java
@@ -32,7 +32,7 @@ public TransformExpression(
}
public List getCopyDeclarations() {
- return copyDeclarations;
+ return this.copyDeclarations;
}
public List getCopySourceExpressions() {
@@ -43,11 +43,11 @@ public List getCopySourceExpressions() {
}
public Expression getModifyExpression() {
- return modifyExpression;
+ return this.modifyExpression;
}
public Expression getReturnExpression() {
- return returnExpression;
+ return this.returnExpression;
}
@Override
diff --git a/src/main/java/org/rumbledb/items/AnnotatedItem.java b/src/main/java/org/rumbledb/items/AnnotatedItem.java
index 5d110a4014..16f790dd9e 100644
--- a/src/main/java/org/rumbledb/items/AnnotatedItem.java
+++ b/src/main/java/org/rumbledb/items/AnnotatedItem.java
@@ -371,4 +371,79 @@ public int castToIntValue() {
public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
return this.itemToAnnotate.generateNativeQuery(context);
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return this.itemToAnnotate.getSparkSQLValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return this.itemToAnnotate.getSparkSQLValue(itemType);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ return this.itemToAnnotate.getSparkSQLType();
+ }
+
+ @Override
+ public void putItemAt(Item item, int i) {
+ this.itemToAnnotate.putItemAt(item, i);
+ }
+
+ @Override
+ public void putItemsAt(List
- items, int i) {
+ this.itemToAnnotate.putItemsAt(items, i);
+ }
+
+ @Override
+ public void removeItemAt(int i) {
+ this.itemToAnnotate.removeItemAt(i);
+ }
+
+ @Override
+ public void removeItemByKey(String key) {
+ this.itemToAnnotate.removeItemByKey(key);
+ }
+
+ @Override
+ public int getMutabilityLevel() {
+ return this.itemToAnnotate.getMutabilityLevel();
+ }
+
+ @Override
+ public void setMutabilityLevel(int mutabilityLevel) {
+ this.itemToAnnotate.setMutabilityLevel(mutabilityLevel);
+ }
+
+ @Override
+ public long getTopLevelID() {
+ return this.itemToAnnotate.getTopLevelID();
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.itemToAnnotate.setTopLevelID(topLevelID);
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.itemToAnnotate.getPathIn();
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.itemToAnnotate.setPathIn(pathIn);
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.itemToAnnotate.getTableLocation();
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.itemToAnnotate.setTableLocation(location);
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ArrayItem.java b/src/main/java/org/rumbledb/items/ArrayItem.java
index ee8d7815c1..2ffab147b5 100644
--- a/src/main/java/org/rumbledb/items/ArrayItem.java
+++ b/src/main/java/org/rumbledb/items/ArrayItem.java
@@ -34,19 +34,27 @@ public class ArrayItem implements Item {
private static final long serialVersionUID = 1L;
private List
- arrayItems;
-
private int mutabilityLevel;
+ private long topLevelID;
+ private String pathIn;
+ private String location;
public ArrayItem() {
super();
this.arrayItems = new ArrayList<>();
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public ArrayItem(List
- arrayItems) {
super();
this.arrayItems = arrayItems;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public boolean equals(Object otherItem) {
@@ -115,12 +123,20 @@ public int getSize() {
@Override
public void write(Kryo kryo, Output output) {
kryo.writeObject(output, this.arrayItems);
+ output.writeInt(this.mutabilityLevel);
+ output.writeLong(this.topLevelID);
+ kryo.writeObject(output, this.pathIn);
+ kryo.writeObject(output, this.location);
}
@SuppressWarnings("unchecked")
@Override
public void read(Kryo kryo, Input input) {
this.arrayItems = kryo.readObject(input, ArrayList.class);
+ this.mutabilityLevel = input.readInt();
+ this.topLevelID = input.readLong();
+ this.pathIn = kryo.readObject(input, String.class);
+ this.location = kryo.readObject(input, String.class);
}
public int hashCode() {
@@ -150,8 +166,92 @@ public int getMutabilityLevel() {
@Override
public void setMutabilityLevel(int mutabilityLevel) {
this.mutabilityLevel = mutabilityLevel;
- for (Item item : arrayItems) {
+ for (Item item : this.arrayItems) {
item.setMutabilityLevel(mutabilityLevel);
}
}
+
+ @Override
+ public long getTopLevelID() {
+ return this.topLevelID;
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.topLevelID = topLevelID;
+ for (Item item : this.arrayItems) {
+ item.setTopLevelID(topLevelID);
+ }
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.pathIn;
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.pathIn = pathIn;
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ item.setPathIn(pathIn + "[" + i + "]");
+ }
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.location;
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.location = location;
+ for (Item item : this.arrayItems) {
+ item.setTableLocation(location);
+ }
+ }
+
+ @Override
+ public String getSparkSQLValue() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("array(");
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ sb.append(item.getSparkSQLValue());
+ if (i + 1 < this.arrayItems.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ StringBuilder sb = new StringBuilder();
+ ItemType elementType = itemType.getArrayContentFacet();
+ sb.append("array(");
+ for (int i = 0; i < this.arrayItems.size(); i++) {
+ Item item = this.arrayItems.get(i);
+ sb.append(item.getSparkSQLValue(elementType));
+ if (i + 1 < this.arrayItems.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Is it okay to assume first elem type is same as rest?
+ StringBuilder sb = new StringBuilder();
+ sb.append("ARRAY<");
+ if (this.getSize() <= 0) {
+ // TODO: Throw error? No empty arrays?
+ }
+ sb.append(this.getItemAt(0).getSparkSQLType());
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/items/BooleanItem.java b/src/main/java/org/rumbledb/items/BooleanItem.java
index 9348e31013..fa3d108dc6 100644
--- a/src/main/java/org/rumbledb/items/BooleanItem.java
+++ b/src/main/java/org/rumbledb/items/BooleanItem.java
@@ -100,4 +100,21 @@ public ItemType getDynamicType() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "BOOLEAN";
+ }
+
}
diff --git a/src/main/java/org/rumbledb/items/DateItem.java b/src/main/java/org/rumbledb/items/DateItem.java
index 6881e66052..edccd89479 100644
--- a/src/main/java/org/rumbledb/items/DateItem.java
+++ b/src/main/java/org/rumbledb/items/DateItem.java
@@ -116,4 +116,10 @@ public ItemType getDynamicType() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DATE";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/DecimalItem.java b/src/main/java/org/rumbledb/items/DecimalItem.java
index bc140b4110..8463fc29b6 100644
--- a/src/main/java/org/rumbledb/items/DecimalItem.java
+++ b/src/main/java/org/rumbledb/items/DecimalItem.java
@@ -144,4 +144,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return this.value.stripTrailingZeros().toPlainString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return this.value.stripTrailingZeros().toPlainString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DECIMAL";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/DoubleItem.java b/src/main/java/org/rumbledb/items/DoubleItem.java
index a82018813c..dd59e2a1f4 100644
--- a/src/main/java/org/rumbledb/items/DoubleItem.java
+++ b/src/main/java/org/rumbledb/items/DoubleItem.java
@@ -186,4 +186,32 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ if (Double.isInfinite(this.value) && this.value > 0) {
+ return "INF";
+ }
+ if (Double.isInfinite(this.value) && this.value < 0) {
+ return "-INF";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ if (Double.isInfinite(this.value) && this.value > 0) {
+ return "INF";
+ }
+ if (Double.isInfinite(this.value) && this.value < 0) {
+ return "-INF";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "DOUBLE";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/FloatItem.java b/src/main/java/org/rumbledb/items/FloatItem.java
index 62f6a2aaee..43b6da5f3d 100644
--- a/src/main/java/org/rumbledb/items/FloatItem.java
+++ b/src/main/java/org/rumbledb/items/FloatItem.java
@@ -190,4 +190,32 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
}
return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", SequenceType.FLOAT);
}
+
+ @Override
+ public String getSparkSQLValue() {
+ if (Float.isInfinite(this.value) && this.value > 0) {
+ return "Infinity";
+ }
+ if (Float.isInfinite(this.value) && this.value < 0) {
+ return "-Infinity";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ if (Float.isInfinite(this.value) && this.value > 0) {
+ return "Infinity";
+ }
+ if (Float.isInfinite(this.value) && this.value < 0) {
+ return "-Infinity";
+ }
+ return this.getStringValue();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "FLOAT";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/FunctionItem.java b/src/main/java/org/rumbledb/items/FunctionItem.java
index f6cd08add5..c767572114 100644
--- a/src/main/java/org/rumbledb/items/FunctionItem.java
+++ b/src/main/java/org/rumbledb/items/FunctionItem.java
@@ -114,7 +114,8 @@ public FunctionItem(
Map paramNameToSequenceTypes,
SequenceType returnType,
DynamicContext dynamicModuleContext,
- RuntimeIterator bodyIterator
+ RuntimeIterator bodyIterator,
+ boolean isUpdating
) {
List paramNames = new ArrayList<>();
List parameters = new ArrayList<>();
@@ -125,7 +126,7 @@ public FunctionItem(
this.identifier = new FunctionIdentifier(name, paramNames.size());
this.parameterNames = paramNames;
- this.signature = new FunctionSignature(parameters, returnType);
+ this.signature = new FunctionSignature(parameters, returnType, isUpdating);
this.bodyIterator = bodyIterator;
this.dynamicModuleContext = dynamicModuleContext;
this.localVariablesInClosure = new HashMap<>();
diff --git a/src/main/java/org/rumbledb/items/IntItem.java b/src/main/java/org/rumbledb/items/IntItem.java
index 1998a05216..3f496978dc 100644
--- a/src/main/java/org/rumbledb/items/IntItem.java
+++ b/src/main/java/org/rumbledb/items/IntItem.java
@@ -162,4 +162,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "INT";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/IntegerItem.java b/src/main/java/org/rumbledb/items/IntegerItem.java
index 0ca1de1822..a38122a040 100644
--- a/src/main/java/org/rumbledb/items/IntegerItem.java
+++ b/src/main/java/org/rumbledb/items/IntegerItem.java
@@ -151,4 +151,20 @@ public boolean isNumeric() {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return String.valueOf(this.value);
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ // TODO: Make enum?
+ return "INTEGER";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ItemFactory.java b/src/main/java/org/rumbledb/items/ItemFactory.java
index c81854cd47..6ce96711b2 100644
--- a/src/main/java/org/rumbledb/items/ItemFactory.java
+++ b/src/main/java/org/rumbledb/items/ItemFactory.java
@@ -209,16 +209,39 @@ public Item createArrayItem() {
return new ArrayItem();
}
- public Item createArrayItem(List
- items) {
- return new ArrayItem(items);
- }
-
- public Item createObjectItem(List keys, List
- values, ExceptionMetadata itemMetadata) {
- return new ObjectItem(keys, values, itemMetadata);
+ public Item createArrayItem(List
- items, boolean mutable) {
+ Item result = new ArrayItem(items);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
+ }
+
+ public Item createObjectItem(
+ List keys,
+ List
- values,
+ ExceptionMetadata itemMetadata,
+ boolean mutable
+ ) {
+ Item result = new ObjectItem(keys, values, itemMetadata);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
}
- public Item createObjectItem(Map> keyValuePairs) {
- return new ObjectItem(keyValuePairs);
+ public Item createObjectItem(Map> keyValuePairs, boolean mutable) {
+ Item result = new ObjectItem(keyValuePairs);
+ if (mutable) {
+ result.setMutabilityLevel(0);
+ } else {
+ result.setMutabilityLevel(-1);
+ }
+ return result;
}
}
diff --git a/src/main/java/org/rumbledb/items/LazyObjectItem.java b/src/main/java/org/rumbledb/items/LazyObjectItem.java
index 7b447fe94c..720f8af8b0 100644
--- a/src/main/java/org/rumbledb/items/LazyObjectItem.java
+++ b/src/main/java/org/rumbledb/items/LazyObjectItem.java
@@ -77,7 +77,7 @@ public Item getItem() {
return ItemFactory.getInstance().createNullItem();
}
}
- return ItemFactory.getInstance().createArrayItem(items);
+ return ItemFactory.getInstance().createArrayItem(items, true);
}
}
diff --git a/src/main/java/org/rumbledb/items/NullItem.java b/src/main/java/org/rumbledb/items/NullItem.java
index 250f2e17a9..f80bce34d6 100644
--- a/src/main/java/org/rumbledb/items/NullItem.java
+++ b/src/main/java/org/rumbledb/items/NullItem.java
@@ -93,4 +93,14 @@ public boolean isAtomic() {
public String getStringValue() {
return "null";
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return "NULL";
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return "NULL";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/ObjectItem.java b/src/main/java/org/rumbledb/items/ObjectItem.java
index c6f535ac53..cb174fb9a4 100644
--- a/src/main/java/org/rumbledb/items/ObjectItem.java
+++ b/src/main/java/org/rumbledb/items/ObjectItem.java
@@ -27,6 +27,7 @@
import org.rumbledb.exceptions.DuplicateObjectKeyException;
import org.rumbledb.exceptions.ExceptionMetadata;
import org.rumbledb.types.BuiltinTypesCatalogue;
+import org.rumbledb.types.FieldDescriptor;
import org.rumbledb.types.ItemType;
import java.util.*;
@@ -37,14 +38,19 @@ public class ObjectItem implements Item {
private static final long serialVersionUID = 1L;
private List
- values;
private List keys;
-
private int mutabilityLevel;
+ private long topLevelID;
+ private String pathIn;
+ private String location;
public ObjectItem() {
super();
this.keys = new ArrayList<>();
this.values = new ArrayList<>();
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public ObjectItem(List keys, List
- values, ExceptionMetadata itemMetadata) {
@@ -52,7 +58,10 @@ public ObjectItem(List keys, List
- values, ExceptionMetadata itemMe
checkForDuplicateKeys(keys, itemMetadata);
this.keys = keys;
this.values = values;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
public boolean equals(Object otherItem) {
@@ -103,7 +112,7 @@ public ObjectItem(Map> keyValuePairs) {
List
- values = keyValuePairs.get(key);
// for each key, convert the lists of values into arrayItems
if (values.size() > 1) {
- Item valuesArray = ItemFactory.getInstance().createArrayItem(values);
+ Item valuesArray = ItemFactory.getInstance().createArrayItem(values, false);
valueList.add(valuesArray);
} else if (values.size() == 1) {
Item value = values.get(0);
@@ -115,7 +124,10 @@ public ObjectItem(Map> keyValuePairs) {
this.keys = keyList;
this.values = valueList;
- this.mutabilityLevel = 0;
+ this.mutabilityLevel = -1;
+ this.topLevelID = -1;
+ this.pathIn = "null";
+ this.location = "null";
}
@Override
@@ -173,6 +185,10 @@ public boolean isObject() {
public void write(Kryo kryo, Output output) {
kryo.writeObject(output, this.keys);
kryo.writeObject(output, this.values);
+ output.writeInt(this.mutabilityLevel);
+ output.writeLong(this.topLevelID);
+ kryo.writeObject(output, this.pathIn);
+ kryo.writeObject(output, this.location);
}
@SuppressWarnings("unchecked")
@@ -180,6 +196,10 @@ public void write(Kryo kryo, Output output) {
public void read(Kryo kryo, Input input) {
this.keys = kryo.readObject(input, ArrayList.class);
this.values = kryo.readObject(input, ArrayList.class);
+ this.mutabilityLevel = input.readInt();
+ this.topLevelID = input.readLong();
+ this.pathIn = kryo.readObject(input, String.class);
+ this.location = kryo.readObject(input, String.class);
}
public int hashCode() {
@@ -209,8 +229,119 @@ public int getMutabilityLevel() {
@Override
public void setMutabilityLevel(int mutabilityLevel) {
this.mutabilityLevel = mutabilityLevel;
- for (Item item : values) {
+ for (Item item : this.values) {
item.setMutabilityLevel(mutabilityLevel);
}
}
+
+ @Override
+ public long getTopLevelID() {
+ return this.topLevelID;
+ }
+
+ @Override
+ public void setTopLevelID(long topLevelID) {
+ this.topLevelID = topLevelID;
+ for (Item item : this.values) {
+ item.setTopLevelID(topLevelID);
+ }
+ }
+
+ @Override
+ public String getPathIn() {
+ return this.pathIn;
+ }
+
+ @Override
+ public void setPathIn(String pathIn) {
+ this.pathIn = pathIn;
+ for (int i = 0; i < this.keys.size(); i++) {
+ String key = this.keys.get(i);
+ Item item = this.values.get(i);
+ item.setPathIn(pathIn + "." + key);
+ }
+ }
+
+ @Override
+ public String getTableLocation() {
+ return this.location;
+ }
+
+ @Override
+ public void setTableLocation(String location) {
+ this.location = location;
+ for (Item item : this.values) {
+ item.setTableLocation(location);
+ }
+ }
+
+ @Override
+ public String getSparkSQLValue() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("named_struct(");
+ for (int i = 0; i < this.keys.size(); i++) {
+ sb.append("\"");
+ sb.append(this.keys.get(i));
+ sb.append("\"");
+ sb.append(", ");
+ sb.append(this.values.get(i).getSparkSQLValue());
+ if (i + 1 < this.keys.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ StringBuilder sb = new StringBuilder();
+
+ Map content = itemType.getObjectContentFacet();
+ String[] keys = content.keySet().toArray(new String[0]);
+
+ sb.append("named_struct(");
+
+ for (int i = 0; i < keys.length; i++) {
+ String key = keys[i];
+ FieldDescriptor field = content.get(key);
+ int keyIndex = this.keys.indexOf(key);
+
+ sb.append("\"");
+ sb.append(key);
+ sb.append("\"");
+ sb.append(", ");
+
+ if (keyIndex == -1) {
+ if (!field.isRequired()) {
+ sb.append("NULL");
+ }
+ } else {
+ sb.append(this.values.get(keyIndex).getSparkSQLValue(field.getType()));
+ }
+
+ if (i + 1 < keys.length) {
+ sb.append(", ");
+ }
+ }
+
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("STRUCT<");
+ for (int i = 0; i < this.keys.size(); i++) {
+ sb.append(this.keys.get(i));
+ sb.append(": ");
+ sb.append(this.values.get(i).getSparkSQLType());
+ if (i + 1 < this.keys.size()) {
+ sb.append(", ");
+ }
+ }
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/items/StringItem.java b/src/main/java/org/rumbledb/items/StringItem.java
index 130a929bc0..fc19ea73c5 100644
--- a/src/main/java/org/rumbledb/items/StringItem.java
+++ b/src/main/java/org/rumbledb/items/StringItem.java
@@ -154,4 +154,19 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) {
public boolean isAtomic() {
return true;
}
+
+ @Override
+ public String getSparkSQLValue() {
+ return "\"" + this.value + "\"";
+ }
+
+ @Override
+ public String getSparkSQLValue(ItemType itemType) {
+ return "\"" + this.value + "\"";
+ }
+
+ @Override
+ public String getSparkSQLType() {
+ return "STRING";
+ }
}
diff --git a/src/main/java/org/rumbledb/items/parsing/ItemParser.java b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
index 0229a79551..434e9a43b4 100644
--- a/src/main/java/org/rumbledb/items/parsing/ItemParser.java
+++ b/src/main/java/org/rumbledb/items/parsing/ItemParser.java
@@ -116,7 +116,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada
values.add(getItemFromObject(object, metadata));
}
object.endArray();
- return ItemFactory.getInstance().createArrayItem(values);
+ return ItemFactory.getInstance().createArrayItem(values, false);
}
if (object.peek() == JsonToken.BEGIN_OBJECT) {
List keys = new ArrayList<>();
@@ -128,7 +128,7 @@ public static Item getItemFromObject(JsonReader object, ExceptionMetadata metada
}
object.endObject();
return ItemFactory.getInstance()
- .createObjectItem(keys, values, metadata);
+ .createObjectItem(keys, values, metadata, false);
}
if (object.peek() == JsonToken.NULL) {
object.nextNull();
@@ -203,7 +203,7 @@ public static Item getItemFromYAML(
// System.err.println("Next token (reading array): " + nt.toString());
}
// System.err.println("Finished reading array.");
- return ItemFactory.getInstance().createArrayItem(values);
+ return ItemFactory.getInstance().createArrayItem(values, false);
}
if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.START_OBJECT)) {
List keys = new ArrayList<>();
@@ -223,7 +223,7 @@ public static Item getItemFromYAML(
}
// System.err.println("Finished reading object.");
return ItemFactory.getInstance()
- .createObjectItem(keys, values, metadata);
+ .createObjectItem(keys, values, metadata, false);
}
if (lookahead.equals(com.fasterxml.jackson.core.JsonToken.VALUE_NULL)) {
return ItemFactory.getInstance().createNullItem();
@@ -261,6 +261,41 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
return convertValueToItem(row, 0, null, fields[0].dataType(), metadata, itemType);
}
+ if (
+ fields.length == 5
+ && fieldnames[0].equals(SparkSessionManager.atomicJSONiqItemColumnName)
+ && fieldnames[4].equals("tableLocation")
+ ) {
+ ItemType resType = null;
+ if (itemType != null) {
+ resType = itemType.getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ }
+ Item res = convertValueToItem(row, 0, null, fields[0].dataType(), metadata, resType);
+ // TODO: refactor to not need to loop and check strings -- Indexes perhaps?
+ for (int i = 0; i < fields.length; ++i) {
+ String fieldName = fields[i].name();
+
+ if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ res.setMutabilityLevel(row.getInt(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.rowIdColumnName)) {
+ res.setTopLevelID(row.getLong(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.pathInColumnName)) {
+ res.setPathIn(row.getString(i));
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) {
+ res.setTableLocation(row.getString(i));
+ }
+ }
+ return res;
+ }
+
Map content = null;
if (itemType != null && !itemType.equals(BuiltinTypesCatalogue.item)) {
@@ -272,11 +307,34 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
}
}
+ int mutabilityLevel = -1;
+ long topLevelID = -1;
+ String pathIn = "null";
+ String tableLocation = "null";
+
for (int i = 0; i < fields.length; ++i) {
StructField field = fields[i];
DataType fieldType = field.dataType();
String fieldName = field.name();
ItemType fieldItemType = null;
+
+ if (fieldName.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ mutabilityLevel = row.getInt(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.rowIdColumnName)) {
+ topLevelID = row.getLong(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.pathInColumnName)) {
+ pathIn = row.getString(i);
+ continue;
+ }
+ if (fieldName.equals(SparkSessionManager.tableLocationColumnName)) {
+ tableLocation = row.getString(i);
+ continue;
+ }
+
if (content != null) {
FieldDescriptor descriptor = content.get(fieldName);
if (descriptor != null) {
@@ -304,7 +362,13 @@ public static Item getItemFromRow(Row row, ExceptionMetadata metadata, ItemType
}
}
- return ItemFactory.getInstance().createObjectItem(keys, values, metadata);
+ Item res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false);
+ res.setMutabilityLevel(mutabilityLevel);
+ res.setTopLevelID(topLevelID);
+ res.setPathIn(pathIn);
+ res.setTableLocation(tableLocation);
+
+ return res;
}
public static Item convertValueToItem(
@@ -531,7 +595,7 @@ private static Item convertValueToItem(
members.add(convertValueToItem(value, dataType, metadata, memberType));
}
}
- Item item = ItemFactory.getInstance().createArrayItem(members);
+ Item item = ItemFactory.getInstance().createArrayItem(members, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) {
return item;
} else {
@@ -551,7 +615,7 @@ private static Item convertValueToItem(
for (double value : denseVector.values()) {
members.add(ItemFactory.getInstance().createDoubleItem(value));
}
- Item item = ItemFactory.getInstance().createArrayItem(members);
+ Item item = ItemFactory.getInstance().createArrayItem(members, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.arrayItem)) {
return item;
} else {
@@ -568,7 +632,7 @@ private static Item convertValueToItem(
objectKeyList.add(String.valueOf(vectorIndices[j]));
objectValueList.add(ItemFactory.getInstance().createDoubleItem(vectorValues[j]));
}
- Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata);
+ Item item = ItemFactory.getInstance().createObjectItem(objectKeyList, objectValueList, metadata, false);
if (itemType == null || itemType.equals(BuiltinTypesCatalogue.objectItem)) {
return item;
} else {
diff --git a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
index 3eebf78e81..24ba7000fa 100644
--- a/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
+++ b/src/main/java/org/rumbledb/items/parsing/RowToItemMapper.java
@@ -44,7 +44,6 @@ public RowToItemMapper(ExceptionMetadata metadata) {
@Override
public Item call(Row row) throws Exception {
- Item result = ItemParser.getItemFromRow(row, this.metadata, this.itemType);
- return result;
+ return ItemParser.getItemFromRow(row, this.metadata, this.itemType);
}
}
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4
index 34dedea4e8..ea2026fca4 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.g4
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4
@@ -76,7 +76,7 @@ typeSwitchStatement : Ktypeswitch '(' cond=expr ')' cases+=caseStatement
caseStatement : Kcase (var_ref=varRef Kas)? union+=sequenceType ('|' union+=sequenceType)* Kreturn ret=statement ;
-annotation : '%' name=qname ('(' Literal (',' Literal)* ')')? ;
+annotation : ('%' name=qname ('(' Literal (',' Literal)* ')')? | updating=Kupdating);
annotations : annotation* ;
@@ -133,7 +133,7 @@ contextItemDecl : Kdeclare Kcontext Kitem (Kas sequenceType)? ((':=' exp
functionDecl : Kdeclare annotations 'function' fn_name=qname '(' paramList? ')'
(Kas return_type=sequenceType)?
- ('{' (fn_body=statementsAndOptionalExpr) '}' | 'external');
+ ('{' (fn_body=statementsAndOptionalExpr) '}' | is_external='external');
typeDecl : Kdeclare Ktype type_name=qname 'as' (schema=schemaLanguage)? type_definition=exprSingle;
@@ -430,7 +430,6 @@ keyWords : Kjsoniq
| Kappend
| Kcopy
| Kmodify
- | Kjson
| Kinto
| Kvalue
| Kwith
@@ -443,6 +442,8 @@ keyWords : Kjsoniq
| Kexit
| Kreturning
| Kwhile
+ | Kjson
+ | Kupdating
;
///////////////////////// literals
@@ -573,12 +574,14 @@ Kinto : 'into';
Kvalue : 'value';
-Kjson : 'json';
-
Kwith : 'with';
Kposition : 'position';
+Kjson : 'json';
+
+Kupdating : 'updating';
+
///////////////////////// Scripting keywords
Kbreak : 'break' ;
Kloop : 'loop' ;
diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.interp b/src/main/java/org/rumbledb/parser/Jsoniq.interp
index 7f0f9de695..8686acf70e 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.interp
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.interp
@@ -123,9 +123,10 @@ null
'append'
'into'
'value'
-'json'
'with'
'position'
+'json'
+'updating'
'break'
'loop'
'continue'
@@ -270,9 +271,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -423,4 +425,4 @@ keyWords
atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 146, 1346, 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, 7, 113, 1238, 10, 113, 12, 113, 14, 113, 1241, 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, 1257, 10, 115, 13, 115, 14, 115, 1258, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1271, 10, 117, 5, 117, 1273, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1279, 10, 118, 12, 118, 14, 118, 1282, 11, 118, 5, 118, 1284, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1291, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1296, 10, 119, 3, 120, 3, 120, 5, 120, 1300, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1312, 10, 122, 12, 122, 14, 122, 1315, 11, 122, 5, 122, 1317, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1325, 10, 123, 3, 124, 3, 124, 5, 124, 1329, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1336, 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, 1411, 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, 1247, 3, 2, 2, 2, 228, 1253, 3, 2, 2, 2, 230, 1260, 3, 2, 2, 2, 232, 1272, 3, 2, 2, 2, 234, 1290, 3, 2, 2, 2, 236, 1295, 3, 2, 2, 2, 238, 1299, 3, 2, 2, 2, 240, 1301, 3, 2, 2, 2, 242, 1306, 3, 2, 2, 2, 244, 1322, 3, 2, 2, 2, 246, 1328, 3, 2, 2, 2, 248, 1333, 3, 2, 2, 2, 250, 1339, 3, 2, 2, 2, 252, 1341, 3, 2, 2, 2, 254, 1343, 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, 125, 2, 2, 1227, 1228, 7, 99, 2, 2, 1228, 1229, 7, 126, 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, 1239, 5, 230, 116, 2, 1235, 1236, 7, 16, 2, 2, 1236, 1238, 5, 230, 116, 2, 1237, 1235, 3, 2, 2, 2, 1238, 1241, 3, 2, 2, 2, 1239, 1237, 3, 2, 2, 2, 1239, 1240, 3, 2, 2, 2, 1240, 1242, 3, 2, 2, 2, 1241, 1239, 3, 2, 2, 2, 1242, 1243, 7, 122, 2, 2, 1243, 1244, 5, 96, 49, 2, 1244, 1245, 7, 69, 2, 2, 1245, 1246, 5, 96, 49, 2, 1246, 225, 3, 2, 2, 2, 1247, 1248, 7, 123, 2, 2, 1248, 1249, 7, 126, 2, 2, 1249, 1250, 5, 96, 49, 2, 1250, 1251, 7, 124, 2, 2, 1251, 1252, 5, 96, 49, 2, 1252, 227, 3, 2, 2, 2, 1253, 1256, 5, 190, 96, 2, 1254, 1257, 5, 182, 92, 2, 1255, 1257, 5, 188, 95, 2, 1256, 1254, 3, 2, 2, 2, 1256, 1255, 3, 2, 2, 2, 1257, 1258, 3, 2, 2, 2, 1258, 1256, 3, 2, 2, 2, 1258, 1259, 3, 2, 2, 2, 1259, 229, 3, 2, 2, 2, 1260, 1261, 5, 194, 98, 2, 1261, 1262, 7, 8, 2, 2, 1262, 1263, 5, 96, 49, 2, 1263, 231, 3, 2, 2, 2, 1264, 1265, 7, 11, 2, 2, 1265, 1273, 7, 12, 2, 2, 1266, 1270, 5, 236, 119, 2, 1267, 1271, 7, 136, 2, 2, 1268, 1271, 7, 13, 2, 2, 1269, 1271, 7, 50, 2, 2, 1270, 1267, 3, 2, 2, 2, 1270, 1268, 3, 2, 2, 2, 1270, 1269, 3, 2, 2, 2, 1270, 1271, 3, 2, 2, 2, 1271, 1273, 3, 2, 2, 2, 1272, 1264, 3, 2, 2, 2, 1272, 1266, 3, 2, 2, 2, 1273, 233, 3, 2, 2, 2, 1274, 1283, 7, 9, 2, 2, 1275, 1280, 5, 246, 124, 2, 1276, 1277, 7, 16, 2, 2, 1277, 1279, 5, 246, 124, 2, 1278, 1276, 3, 2, 2, 2, 1279, 1282, 3, 2, 2, 2, 1280, 1278, 3, 2, 2, 2, 1280, 1281, 3, 2, 2, 2, 1281, 1284, 3, 2, 2, 2, 1282, 1280, 3, 2, 2, 2, 1283, 1275, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1285, 3, 2, 2, 2, 1285, 1291, 7, 10, 2, 2, 1286, 1287, 7, 61, 2, 2, 1287, 1288, 5, 94, 48, 2, 1288, 1289, 7, 62, 2, 2, 1289, 1291, 3, 2, 2, 2, 1290, 1274, 3, 2, 2, 2, 1290, 1286, 3, 2, 2, 2, 1291, 235, 3, 2, 2, 2, 1292, 1296, 5, 74, 38, 2, 1293, 1296, 7, 137, 2, 2, 1294, 1296, 5, 238, 120, 2, 1295, 1292, 3, 2, 2, 2, 1295, 1293, 3, 2, 2, 2, 1295, 1294, 3, 2, 2, 2, 1296, 237, 3, 2, 2, 2, 1297, 1300, 5, 240, 121, 2, 1298, 1300, 5, 242, 122, 2, 1299, 1297, 3, 2, 2, 2, 1299, 1298, 3, 2, 2, 2, 1300, 239, 3, 2, 2, 2, 1301, 1302, 7, 33, 2, 2, 1302, 1303, 7, 11, 2, 2, 1303, 1304, 7, 13, 2, 2, 1304, 1305, 7, 12, 2, 2, 1305, 241, 3, 2, 2, 2, 1306, 1307, 7, 33, 2, 2, 1307, 1316, 7, 11, 2, 2, 1308, 1313, 5, 232, 117, 2, 1309, 1310, 7, 16, 2, 2, 1310, 1312, 5, 232, 117, 2, 1311, 1309, 3, 2, 2, 2, 1312, 1315, 3, 2, 2, 2, 1313, 1311, 3, 2, 2, 2, 1313, 1314, 3, 2, 2, 2, 1314, 1317, 3, 2, 2, 2, 1315, 1313, 3, 2, 2, 2, 1316, 1308, 3, 2, 2, 2, 1316, 1317, 3, 2, 2, 2, 1317, 1318, 3, 2, 2, 2, 1318, 1319, 7, 12, 2, 2, 1319, 1320, 7, 72, 2, 2, 1320, 1321, 5, 232, 117, 2, 1321, 243, 3, 2, 2, 2, 1322, 1324, 5, 236, 119, 2, 1323, 1325, 7, 136, 2, 2, 1324, 1323, 3, 2, 2, 2, 1324, 1325, 3, 2, 2, 2, 1325, 245, 3, 2, 2, 2, 1326, 1329, 5, 96, 49, 2, 1327, 1329, 7, 144, 2, 2, 1328, 1326, 3, 2, 2, 2, 1328, 1327, 3, 2, 2, 2, 1329, 1330, 3, 2, 2, 2, 1330, 1331, 9, 8, 2, 2, 1331, 1332, 5, 96, 49, 2, 1332, 247, 3, 2, 2, 2, 1333, 1335, 7, 56, 2, 2, 1334, 1336, 5, 94, 48, 2, 1335, 1334, 3, 2, 2, 2, 1335, 1336, 3, 2, 2, 2, 1336, 1337, 3, 2, 2, 2, 1337, 1338, 7, 57, 2, 2, 1338, 249, 3, 2, 2, 2, 1339, 1340, 5, 252, 127, 2, 1340, 251, 3, 2, 2, 2, 1341, 1342, 7, 135, 2, 2, 1342, 253, 3, 2, 2, 2, 1343, 1344, 9, 9, 2, 2, 1344, 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, 1239, 1256, 1258, 1270, 1272, 1280, 1283, 1290, 1295, 1299, 1313, 1316, 1324, 1328, 1335]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 147, 1349, 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, 26, 5, 26, 479, 10, 26, 3, 27, 7, 27, 482, 10, 27, 12, 27, 14, 27, 485, 11, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 492, 10, 28, 12, 28, 14, 28, 495, 11, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 5, 29, 502, 10, 29, 3, 29, 3, 29, 5, 29, 506, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 518, 10, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 530, 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, 552, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 7, 37, 558, 10, 37, 12, 37, 14, 37, 561, 11, 37, 3, 38, 3, 38, 5, 38, 565, 10, 38, 3, 38, 5, 38, 568, 10, 38, 3, 38, 3, 38, 5, 38, 572, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 5, 40, 581, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 588, 10, 40, 12, 40, 14, 40, 591, 11, 40, 5, 40, 593, 10, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 601, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 608, 10, 41, 5, 41, 610, 10, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 617, 10, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 624, 10, 42, 5, 42, 626, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 634, 10, 43, 3, 43, 3, 43, 3, 43, 5, 43, 639, 10, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 646, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 653, 10, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 663, 10, 45, 3, 46, 3, 46, 3, 46, 7, 46, 668, 10, 46, 12, 46, 14, 46, 671, 11, 46, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 677, 10, 47, 3, 48, 3, 48, 3, 48, 7, 48, 682, 10, 48, 12, 48, 14, 48, 685, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 693, 10, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 5, 50, 703, 10, 50, 3, 51, 3, 51, 5, 51, 707, 10, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 7, 51, 715, 10, 51, 12, 51, 14, 51, 718, 11, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 7, 52, 727, 10, 52, 12, 52, 14, 52, 730, 11, 52, 3, 53, 3, 53, 3, 53, 5, 53, 735, 10, 53, 3, 53, 3, 53, 5, 53, 739, 10, 53, 3, 53, 3, 53, 5, 53, 743, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 7, 54, 752, 10, 54, 12, 54, 14, 54, 755, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 760, 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, 773, 10, 57, 12, 57, 14, 57, 776, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 781, 10, 58, 3, 58, 3, 58, 5, 58, 785, 10, 58, 3, 58, 3, 58, 5, 58, 789, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 796, 10, 59, 3, 59, 3, 59, 3, 59, 7, 59, 801, 10, 59, 12, 59, 14, 59, 804, 11, 59, 3, 60, 3, 60, 3, 60, 5, 60, 809, 10, 60, 3, 60, 3, 60, 3, 60, 5, 60, 814, 10, 60, 5, 60, 816, 10, 60, 3, 60, 3, 60, 5, 60, 820, 10, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 5, 62, 827, 10, 62, 3, 62, 3, 62, 3, 62, 7, 62, 832, 10, 62, 12, 62, 14, 62, 835, 11, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 5, 63, 843, 10, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 6, 64, 853, 10, 64, 13, 64, 14, 64, 854, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 6, 65, 863, 10, 65, 13, 65, 14, 65, 864, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 6, 66, 875, 10, 66, 13, 66, 14, 66, 876, 3, 66, 3, 66, 5, 66, 881, 10, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 890, 10, 67, 3, 67, 3, 67, 3, 67, 7, 67, 895, 10, 67, 12, 67, 14, 67, 898, 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, 917, 10, 69, 13, 69, 14, 69, 918, 3, 70, 3, 70, 3, 70, 5, 70, 924, 10, 70, 3, 70, 3, 70, 3, 70, 5, 70, 929, 10, 70, 7, 70, 931, 10, 70, 12, 70, 14, 70, 934, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 7, 71, 943, 10, 71, 12, 71, 14, 71, 946, 11, 71, 3, 72, 3, 72, 3, 72, 7, 72, 951, 10, 72, 12, 72, 14, 72, 954, 11, 72, 3, 73, 5, 73, 957, 10, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 5, 74, 964, 10, 74, 3, 75, 3, 75, 3, 75, 7, 75, 969, 10, 75, 12, 75, 14, 75, 972, 11, 75, 3, 76, 3, 76, 3, 76, 5, 76, 977, 10, 76, 3, 77, 3, 77, 3, 77, 7, 77, 982, 10, 77, 12, 77, 14, 77, 985, 11, 77, 3, 78, 3, 78, 3, 78, 7, 78, 990, 10, 78, 12, 78, 14, 78, 993, 11, 78, 3, 79, 3, 79, 3, 79, 3, 79, 5, 79, 999, 10, 79, 3, 80, 3, 80, 3, 80, 3, 80, 5, 80, 1005, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1011, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 5, 82, 1017, 10, 82, 3, 83, 3, 83, 3, 83, 3, 83, 5, 83, 1023, 10, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 7, 84, 1032, 10, 84, 12, 84, 14, 84, 1035, 11, 84, 3, 85, 3, 85, 3, 85, 5, 85, 1040, 10, 85, 3, 86, 7, 86, 1043, 10, 86, 12, 86, 14, 86, 1046, 11, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 5, 87, 1053, 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, 1072, 10, 90, 12, 90, 14, 90, 1075, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 7, 91, 1083, 10, 91, 12, 91, 14, 91, 1086, 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, 1108, 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, 1125, 10, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1136, 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, 1158, 10, 104, 7, 104, 1160, 10, 104, 12, 104, 14, 104, 1163, 11, 104, 3, 104, 3, 104, 3, 105, 3, 105, 5, 105, 1169, 10, 105, 3, 106, 3, 106, 5, 106, 1173, 10, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1183, 10, 108, 3, 108, 3, 108, 3, 108, 5, 108, 1188, 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, 1202, 10, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 7, 109, 1209, 10, 109, 12, 109, 14, 109, 1212, 11, 109, 3, 109, 3, 109, 3, 109, 5, 109, 1217, 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, 1241, 10, 113, 12, 113, 14, 113, 1244, 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, 1260, 10, 115, 13, 115, 14, 115, 1261, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1274, 10, 117, 5, 117, 1276, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 7, 118, 1282, 10, 118, 12, 118, 14, 118, 1285, 11, 118, 5, 118, 1287, 10, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1294, 10, 118, 3, 119, 3, 119, 3, 119, 5, 119, 1299, 10, 119, 3, 120, 3, 120, 5, 120, 1303, 10, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1315, 10, 122, 12, 122, 14, 122, 1318, 11, 122, 5, 122, 1320, 10, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 5, 123, 1328, 10, 123, 3, 124, 3, 124, 5, 124, 1332, 10, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1339, 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, 137, 137, 4, 2, 63, 135, 138, 138, 2, 1415, 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, 478, 3, 2, 2, 2, 52, 483, 3, 2, 2, 2, 54, 486, 3, 2, 2, 2, 56, 498, 3, 2, 2, 2, 58, 507, 3, 2, 2, 2, 60, 517, 3, 2, 2, 2, 62, 519, 3, 2, 2, 2, 64, 529, 3, 2, 2, 2, 66, 531, 3, 2, 2, 2, 68, 536, 3, 2, 2, 2, 70, 540, 3, 2, 2, 2, 72, 546, 3, 2, 2, 2, 74, 567, 3, 2, 2, 2, 76, 573, 3, 2, 2, 2, 78, 575, 3, 2, 2, 2, 80, 594, 3, 2, 2, 2, 82, 611, 3, 2, 2, 2, 84, 627, 3, 2, 2, 2, 86, 647, 3, 2, 2, 2, 88, 662, 3, 2, 2, 2, 90, 664, 3, 2, 2, 2, 92, 672, 3, 2, 2, 2, 94, 678, 3, 2, 2, 2, 96, 692, 3, 2, 2, 2, 98, 702, 3, 2, 2, 2, 100, 706, 3, 2, 2, 2, 102, 722, 3, 2, 2, 2, 104, 731, 3, 2, 2, 2, 106, 747, 3, 2, 2, 2, 108, 756, 3, 2, 2, 2, 110, 764, 3, 2, 2, 2, 112, 767, 3, 2, 2, 2, 114, 777, 3, 2, 2, 2, 116, 795, 3, 2, 2, 2, 118, 805, 3, 2, 2, 2, 120, 821, 3, 2, 2, 2, 122, 826, 3, 2, 2, 2, 124, 839, 3, 2, 2, 2, 126, 847, 3, 2, 2, 2, 128, 862, 3, 2, 2, 2, 130, 869, 3, 2, 2, 2, 132, 885, 3, 2, 2, 2, 134, 902, 3, 2, 2, 2, 136, 911, 3, 2, 2, 2, 138, 920, 3, 2, 2, 2, 140, 939, 3, 2, 2, 2, 142, 947, 3, 2, 2, 2, 144, 956, 3, 2, 2, 2, 146, 960, 3, 2, 2, 2, 148, 965, 3, 2, 2, 2, 150, 973, 3, 2, 2, 2, 152, 978, 3, 2, 2, 2, 154, 986, 3, 2, 2, 2, 156, 994, 3, 2, 2, 2, 158, 1000, 3, 2, 2, 2, 160, 1006, 3, 2, 2, 2, 162, 1012, 3, 2, 2, 2, 164, 1018, 3, 2, 2, 2, 166, 1024, 3, 2, 2, 2, 168, 1039, 3, 2, 2, 2, 170, 1044, 3, 2, 2, 2, 172, 1052, 3, 2, 2, 2, 174, 1054, 3, 2, 2, 2, 176, 1061, 3, 2, 2, 2, 178, 1068, 3, 2, 2, 2, 180, 1076, 3, 2, 2, 2, 182, 1087, 3, 2, 2, 2, 184, 1093, 3, 2, 2, 2, 186, 1096, 3, 2, 2, 2, 188, 1100, 3, 2, 2, 2, 190, 1124, 3, 2, 2, 2, 192, 1126, 3, 2, 2, 2, 194, 1130, 3, 2, 2, 2, 196, 1133, 3, 2, 2, 2, 198, 1139, 3, 2, 2, 2, 200, 1141, 3, 2, 2, 2, 202, 1146, 3, 2, 2, 2, 204, 1151, 3, 2, 2, 2, 206, 1154, 3, 2, 2, 2, 208, 1168, 3, 2, 2, 2, 210, 1172, 3, 2, 2, 2, 212, 1174, 3, 2, 2, 2, 214, 1178, 3, 2, 2, 2, 216, 1216, 3, 2, 2, 2, 218, 1218, 3, 2, 2, 2, 220, 1222, 3, 2, 2, 2, 222, 1228, 3, 2, 2, 2, 224, 1236, 3, 2, 2, 2, 226, 1250, 3, 2, 2, 2, 228, 1256, 3, 2, 2, 2, 230, 1263, 3, 2, 2, 2, 232, 1275, 3, 2, 2, 2, 234, 1293, 3, 2, 2, 2, 236, 1298, 3, 2, 2, 2, 238, 1302, 3, 2, 2, 2, 240, 1304, 3, 2, 2, 2, 242, 1309, 3, 2, 2, 2, 244, 1325, 3, 2, 2, 2, 246, 1331, 3, 2, 2, 2, 248, 1336, 3, 2, 2, 2, 250, 1342, 3, 2, 2, 2, 252, 1344, 3, 2, 2, 2, 254, 1346, 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, 145, 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, 130, 2, 2, 345, 346, 7, 131, 2, 2, 346, 347, 7, 3, 2, 2, 347, 29, 3, 2, 2, 2, 348, 349, 7, 132, 2, 2, 349, 350, 7, 131, 2, 2, 350, 351, 7, 3, 2, 2, 351, 31, 3, 2, 2, 2, 352, 353, 7, 133, 2, 2, 353, 354, 7, 134, 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, 139, 2, 2, 467, 468, 7, 16, 2, 2, 468, 470, 7, 139, 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, 479, 3, 2, 2, 2, 477, 479, 7, 129, 2, 2, 478, 463, 3, 2, 2, 2, 478, 477, 3, 2, 2, 2, 479, 51, 3, 2, 2, 2, 480, 482, 5, 50, 26, 2, 481, 480, 3, 2, 2, 2, 482, 485, 3, 2, 2, 2, 483, 481, 3, 2, 2, 2, 483, 484, 3, 2, 2, 2, 484, 53, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 486, 487, 5, 52, 27, 2, 487, 488, 7, 116, 2, 2, 488, 493, 5, 56, 29, 2, 489, 490, 7, 16, 2, 2, 490, 492, 5, 56, 29, 2, 491, 489, 3, 2, 2, 2, 492, 495, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 496, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 496, 497, 7, 3, 2, 2, 497, 55, 3, 2, 2, 2, 498, 501, 5, 194, 98, 2, 499, 500, 7, 72, 2, 2, 500, 502, 5, 232, 117, 2, 501, 499, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 505, 3, 2, 2, 2, 503, 504, 7, 8, 2, 2, 504, 506, 5, 96, 49, 2, 505, 503, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 57, 3, 2, 2, 2, 507, 508, 7, 135, 2, 2, 508, 509, 7, 11, 2, 2, 509, 510, 5, 94, 48, 2, 510, 511, 7, 12, 2, 2, 511, 512, 5, 20, 11, 2, 512, 59, 3, 2, 2, 2, 513, 518, 5, 66, 34, 2, 514, 518, 5, 68, 35, 2, 515, 518, 5, 70, 36, 2, 516, 518, 5, 72, 37, 2, 517, 513, 3, 2, 2, 2, 517, 514, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 516, 3, 2, 2, 2, 518, 61, 3, 2, 2, 2, 519, 520, 7, 113, 2, 2, 520, 521, 7, 5, 2, 2, 521, 522, 7, 145, 2, 2, 522, 523, 7, 6, 2, 2, 523, 524, 5, 250, 126, 2, 524, 63, 3, 2, 2, 2, 525, 530, 5, 84, 43, 2, 526, 530, 5, 80, 41, 2, 527, 530, 5, 86, 44, 2, 528, 530, 5, 82, 42, 2, 529, 525, 3, 2, 2, 2, 529, 526, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 528, 3, 2, 2, 2, 530, 65, 3, 2, 2, 2, 531, 532, 7, 113, 2, 2, 532, 533, 7, 90, 2, 2, 533, 534, 7, 83, 2, 2, 534, 535, 5, 250, 126, 2, 535, 67, 3, 2, 2, 2, 536, 537, 7, 113, 2, 2, 537, 538, 7, 17, 2, 2, 538, 539, 9, 2, 2, 2, 539, 69, 3, 2, 2, 2, 540, 541, 7, 113, 2, 2, 541, 542, 7, 90, 2, 2, 542, 543, 7, 68, 2, 2, 543, 544, 7, 75, 2, 2, 544, 545, 9, 3, 2, 2, 545, 71, 3, 2, 2, 2, 546, 551, 7, 113, 2, 2, 547, 548, 7, 19, 2, 2, 548, 552, 5, 74, 38, 2, 549, 550, 7, 90, 2, 2, 550, 552, 7, 19, 2, 2, 551, 547, 3, 2, 2, 2, 551, 549, 3, 2, 2, 2, 552, 559, 3, 2, 2, 2, 553, 554, 5, 76, 39, 2, 554, 555, 7, 6, 2, 2, 555, 556, 5, 252, 127, 2, 556, 558, 3, 2, 2, 2, 557, 553, 3, 2, 2, 2, 558, 561, 3, 2, 2, 2, 559, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 73, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 562, 565, 7, 145, 2, 2, 563, 565, 5, 254, 128, 2, 564, 562, 3, 2, 2, 2, 564, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 568, 7, 20, 2, 2, 567, 564, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 572, 7, 145, 2, 2, 570, 572, 5, 254, 128, 2, 571, 569, 3, 2, 2, 2, 571, 570, 3, 2, 2, 2, 572, 75, 3, 2, 2, 2, 573, 574, 9, 4, 2, 2, 574, 77, 3, 2, 2, 2, 575, 576, 7, 31, 2, 2, 576, 580, 7, 4, 2, 2, 577, 578, 7, 5, 2, 2, 578, 579, 7, 145, 2, 2, 579, 581, 7, 6, 2, 2, 580, 577, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 582, 3, 2, 2, 2, 582, 592, 5, 250, 126, 2, 583, 584, 7, 73, 2, 2, 584, 589, 5, 250, 126, 2, 585, 586, 7, 16, 2, 2, 586, 588, 5, 250, 126, 2, 587, 585, 3, 2, 2, 2, 588, 591, 3, 2, 2, 2, 589, 587, 3, 2, 2, 2, 589, 590, 3, 2, 2, 2, 590, 593, 3, 2, 2, 2, 591, 589, 3, 2, 2, 2, 592, 583, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 79, 3, 2, 2, 2, 594, 595, 7, 113, 2, 2, 595, 596, 5, 52, 27, 2, 596, 597, 7, 116, 2, 2, 597, 600, 5, 194, 98, 2, 598, 599, 7, 72, 2, 2, 599, 601, 5, 232, 117, 2, 600, 598, 3, 2, 2, 2, 600, 601, 3, 2, 2, 2, 601, 609, 3, 2, 2, 2, 602, 603, 7, 8, 2, 2, 603, 610, 5, 96, 49, 2, 604, 607, 7, 32, 2, 2, 605, 606, 7, 8, 2, 2, 606, 608, 5, 96, 49, 2, 607, 605, 3, 2, 2, 2, 607, 608, 3, 2, 2, 2, 608, 610, 3, 2, 2, 2, 609, 602, 3, 2, 2, 2, 609, 604, 3, 2, 2, 2, 610, 81, 3, 2, 2, 2, 611, 612, 7, 113, 2, 2, 612, 613, 7, 114, 2, 2, 613, 616, 7, 115, 2, 2, 614, 615, 7, 72, 2, 2, 615, 617, 5, 232, 117, 2, 616, 614, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 625, 3, 2, 2, 2, 618, 619, 7, 8, 2, 2, 619, 626, 5, 96, 49, 2, 620, 623, 7, 32, 2, 2, 621, 622, 7, 8, 2, 2, 622, 624, 5, 96, 49, 2, 623, 621, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 3, 2, 2, 2, 625, 618, 3, 2, 2, 2, 625, 620, 3, 2, 2, 2, 626, 83, 3, 2, 2, 2, 627, 628, 7, 113, 2, 2, 628, 629, 5, 52, 27, 2, 629, 630, 7, 33, 2, 2, 630, 631, 5, 74, 38, 2, 631, 633, 7, 11, 2, 2, 632, 634, 5, 90, 46, 2, 633, 632, 3, 2, 2, 2, 633, 634, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 638, 7, 12, 2, 2, 636, 637, 7, 72, 2, 2, 637, 639, 5, 232, 117, 2, 638, 636, 3, 2, 2, 2, 638, 639, 3, 2, 2, 2, 639, 645, 3, 2, 2, 2, 640, 641, 7, 9, 2, 2, 641, 642, 5, 18, 10, 2, 642, 643, 7, 10, 2, 2, 643, 646, 3, 2, 2, 2, 644, 646, 7, 32, 2, 2, 645, 640, 3, 2, 2, 2, 645, 644, 3, 2, 2, 2, 646, 85, 3, 2, 2, 2, 647, 648, 7, 113, 2, 2, 648, 649, 7, 110, 2, 2, 649, 650, 5, 74, 38, 2, 650, 652, 7, 72, 2, 2, 651, 653, 5, 88, 45, 2, 652, 651, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 655, 5, 96, 49, 2, 655, 87, 3, 2, 2, 2, 656, 657, 7, 34, 2, 2, 657, 663, 7, 35, 2, 2, 658, 659, 7, 34, 2, 2, 659, 663, 7, 36, 2, 2, 660, 661, 7, 128, 2, 2, 661, 663, 7, 37, 2, 2, 662, 656, 3, 2, 2, 2, 662, 658, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 663, 89, 3, 2, 2, 2, 664, 669, 5, 92, 47, 2, 665, 666, 7, 16, 2, 2, 666, 668, 5, 92, 47, 2, 667, 665, 3, 2, 2, 2, 668, 671, 3, 2, 2, 2, 669, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 91, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 672, 673, 7, 7, 2, 2, 673, 676, 5, 74, 38, 2, 674, 675, 7, 72, 2, 2, 675, 677, 5, 232, 117, 2, 676, 674, 3, 2, 2, 2, 676, 677, 3, 2, 2, 2, 677, 93, 3, 2, 2, 2, 678, 683, 5, 96, 49, 2, 679, 680, 7, 16, 2, 2, 680, 682, 5, 96, 49, 2, 681, 679, 3, 2, 2, 2, 682, 685, 3, 2, 2, 2, 683, 681, 3, 2, 2, 2, 683, 684, 3, 2, 2, 2, 684, 95, 3, 2, 2, 2, 685, 683, 3, 2, 2, 2, 686, 693, 5, 98, 50, 2, 687, 693, 5, 100, 51, 2, 688, 693, 5, 126, 64, 2, 689, 693, 5, 130, 66, 2, 690, 693, 5, 134, 68, 2, 691, 693, 5, 136, 69, 2, 692, 686, 3, 2, 2, 2, 692, 687, 3, 2, 2, 2, 692, 688, 3, 2, 2, 2, 692, 689, 3, 2, 2, 2, 692, 690, 3, 2, 2, 2, 692, 691, 3, 2, 2, 2, 693, 97, 3, 2, 2, 2, 694, 703, 5, 122, 62, 2, 695, 703, 5, 140, 71, 2, 696, 703, 5, 216, 109, 2, 697, 703, 5, 218, 110, 2, 698, 703, 5, 220, 111, 2, 699, 703, 5, 222, 112, 2, 700, 703, 5, 224, 113, 2, 701, 703, 5, 226, 114, 2, 702, 694, 3, 2, 2, 2, 702, 695, 3, 2, 2, 2, 702, 696, 3, 2, 2, 2, 702, 697, 3, 2, 2, 2, 702, 698, 3, 2, 2, 2, 702, 699, 3, 2, 2, 2, 702, 700, 3, 2, 2, 2, 702, 701, 3, 2, 2, 2, 703, 99, 3, 2, 2, 2, 704, 707, 5, 102, 52, 2, 705, 707, 5, 106, 54, 2, 706, 704, 3, 2, 2, 2, 706, 705, 3, 2, 2, 2, 707, 716, 3, 2, 2, 2, 708, 715, 5, 102, 52, 2, 709, 715, 5, 106, 54, 2, 710, 715, 5, 110, 56, 2, 711, 715, 5, 112, 57, 2, 712, 715, 5, 116, 59, 2, 713, 715, 5, 120, 61, 2, 714, 708, 3, 2, 2, 2, 714, 709, 3, 2, 2, 2, 714, 710, 3, 2, 2, 2, 714, 711, 3, 2, 2, 2, 714, 712, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 718, 3, 2, 2, 2, 716, 714, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 719, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 720, 7, 69, 2, 2, 720, 721, 5, 96, 49, 2, 721, 101, 3, 2, 2, 2, 722, 723, 7, 63, 2, 2, 723, 728, 5, 104, 53, 2, 724, 725, 7, 16, 2, 2, 725, 727, 5, 104, 53, 2, 726, 724, 3, 2, 2, 2, 727, 730, 3, 2, 2, 2, 728, 726, 3, 2, 2, 2, 728, 729, 3, 2, 2, 2, 729, 103, 3, 2, 2, 2, 730, 728, 3, 2, 2, 2, 731, 734, 5, 194, 98, 2, 732, 733, 7, 72, 2, 2, 733, 735, 5, 232, 117, 2, 734, 732, 3, 2, 2, 2, 734, 735, 3, 2, 2, 2, 735, 738, 3, 2, 2, 2, 736, 737, 7, 74, 2, 2, 737, 739, 7, 75, 2, 2, 738, 736, 3, 2, 2, 2, 738, 739, 3, 2, 2, 2, 739, 742, 3, 2, 2, 2, 740, 741, 7, 73, 2, 2, 741, 743, 5, 194, 98, 2, 742, 740, 3, 2, 2, 2, 742, 743, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 745, 7, 71, 2, 2, 745, 746, 5, 96, 49, 2, 746, 105, 3, 2, 2, 2, 747, 748, 7, 64, 2, 2, 748, 753, 5, 108, 55, 2, 749, 750, 7, 16, 2, 2, 750, 752, 5, 108, 55, 2, 751, 749, 3, 2, 2, 2, 752, 755, 3, 2, 2, 2, 753, 751, 3, 2, 2, 2, 753, 754, 3, 2, 2, 2, 754, 107, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 756, 759, 5, 194, 98, 2, 757, 758, 7, 72, 2, 2, 758, 760, 5, 232, 117, 2, 759, 757, 3, 2, 2, 2, 759, 760, 3, 2, 2, 2, 760, 761, 3, 2, 2, 2, 761, 762, 7, 8, 2, 2, 762, 763, 5, 96, 49, 2, 763, 109, 3, 2, 2, 2, 764, 765, 7, 65, 2, 2, 765, 766, 5, 96, 49, 2, 766, 111, 3, 2, 2, 2, 767, 768, 7, 66, 2, 2, 768, 769, 7, 67, 2, 2, 769, 774, 5, 114, 58, 2, 770, 771, 7, 16, 2, 2, 771, 773, 5, 114, 58, 2, 772, 770, 3, 2, 2, 2, 773, 776, 3, 2, 2, 2, 774, 772, 3, 2, 2, 2, 774, 775, 3, 2, 2, 2, 775, 113, 3, 2, 2, 2, 776, 774, 3, 2, 2, 2, 777, 784, 5, 194, 98, 2, 778, 779, 7, 72, 2, 2, 779, 781, 5, 232, 117, 2, 780, 778, 3, 2, 2, 2, 780, 781, 3, 2, 2, 2, 781, 782, 3, 2, 2, 2, 782, 783, 7, 8, 2, 2, 783, 785, 5, 96, 49, 2, 784, 780, 3, 2, 2, 2, 784, 785, 3, 2, 2, 2, 785, 788, 3, 2, 2, 2, 786, 787, 7, 83, 2, 2, 787, 789, 5, 250, 126, 2, 788, 786, 3, 2, 2, 2, 788, 789, 3, 2, 2, 2, 789, 115, 3, 2, 2, 2, 790, 791, 7, 68, 2, 2, 791, 796, 7, 67, 2, 2, 792, 793, 7, 77, 2, 2, 793, 794, 7, 68, 2, 2, 794, 796, 7, 67, 2, 2, 795, 790, 3, 2, 2, 2, 795, 792, 3, 2, 2, 2, 796, 797, 3, 2, 2, 2, 797, 802, 5, 118, 60, 2, 798, 799, 7, 16, 2, 2, 799, 801, 5, 118, 60, 2, 800, 798, 3, 2, 2, 2, 801, 804, 3, 2, 2, 2, 802, 800, 3, 2, 2, 2, 802, 803, 3, 2, 2, 2, 803, 117, 3, 2, 2, 2, 804, 802, 3, 2, 2, 2, 805, 808, 5, 96, 49, 2, 806, 809, 7, 78, 2, 2, 807, 809, 7, 79, 2, 2, 808, 806, 3, 2, 2, 2, 808, 807, 3, 2, 2, 2, 808, 809, 3, 2, 2, 2, 809, 815, 3, 2, 2, 2, 810, 813, 7, 75, 2, 2, 811, 814, 7, 84, 2, 2, 812, 814, 7, 85, 2, 2, 813, 811, 3, 2, 2, 2, 813, 812, 3, 2, 2, 2, 814, 816, 3, 2, 2, 2, 815, 810, 3, 2, 2, 2, 815, 816, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 818, 7, 83, 2, 2, 818, 820, 5, 250, 126, 2, 819, 817, 3, 2, 2, 2, 819, 820, 3, 2, 2, 2, 820, 119, 3, 2, 2, 2, 821, 822, 7, 76, 2, 2, 822, 823, 5, 194, 98, 2, 823, 121, 3, 2, 2, 2, 824, 827, 7, 80, 2, 2, 825, 827, 7, 81, 2, 2, 826, 824, 3, 2, 2, 2, 826, 825, 3, 2, 2, 2, 827, 828, 3, 2, 2, 2, 828, 833, 5, 124, 63, 2, 829, 830, 7, 16, 2, 2, 830, 832, 5, 124, 63, 2, 831, 829, 3, 2, 2, 2, 832, 835, 3, 2, 2, 2, 833, 831, 3, 2, 2, 2, 833, 834, 3, 2, 2, 2, 834, 836, 3, 2, 2, 2, 835, 833, 3, 2, 2, 2, 836, 837, 7, 82, 2, 2, 837, 838, 5, 96, 49, 2, 838, 123, 3, 2, 2, 2, 839, 842, 5, 194, 98, 2, 840, 841, 7, 72, 2, 2, 841, 843, 5, 232, 117, 2, 842, 840, 3, 2, 2, 2, 842, 843, 3, 2, 2, 2, 843, 844, 3, 2, 2, 2, 844, 845, 7, 71, 2, 2, 845, 846, 5, 96, 49, 2, 846, 125, 3, 2, 2, 2, 847, 848, 7, 86, 2, 2, 848, 849, 7, 11, 2, 2, 849, 850, 5, 94, 48, 2, 850, 852, 7, 12, 2, 2, 851, 853, 5, 128, 65, 2, 852, 851, 3, 2, 2, 2, 853, 854, 3, 2, 2, 2, 854, 852, 3, 2, 2, 2, 854, 855, 3, 2, 2, 2, 855, 856, 3, 2, 2, 2, 856, 857, 7, 90, 2, 2, 857, 858, 7, 69, 2, 2, 858, 859, 5, 96, 49, 2, 859, 127, 3, 2, 2, 2, 860, 861, 7, 87, 2, 2, 861, 863, 5, 96, 49, 2, 862, 860, 3, 2, 2, 2, 863, 864, 3, 2, 2, 2, 864, 862, 3, 2, 2, 2, 864, 865, 3, 2, 2, 2, 865, 866, 3, 2, 2, 2, 866, 867, 7, 69, 2, 2, 867, 868, 5, 96, 49, 2, 868, 129, 3, 2, 2, 2, 869, 870, 7, 93, 2, 2, 870, 871, 7, 11, 2, 2, 871, 872, 5, 94, 48, 2, 872, 874, 7, 12, 2, 2, 873, 875, 5, 132, 67, 2, 874, 873, 3, 2, 2, 2, 875, 876, 3, 2, 2, 2, 876, 874, 3, 2, 2, 2, 876, 877, 3, 2, 2, 2, 877, 878, 3, 2, 2, 2, 878, 880, 7, 90, 2, 2, 879, 881, 5, 194, 98, 2, 880, 879, 3, 2, 2, 2, 880, 881, 3, 2, 2, 2, 881, 882, 3, 2, 2, 2, 882, 883, 7, 69, 2, 2, 883, 884, 5, 96, 49, 2, 884, 131, 3, 2, 2, 2, 885, 889, 7, 87, 2, 2, 886, 887, 5, 194, 98, 2, 887, 888, 7, 72, 2, 2, 888, 890, 3, 2, 2, 2, 889, 886, 3, 2, 2, 2, 889, 890, 3, 2, 2, 2, 890, 891, 3, 2, 2, 2, 891, 896, 5, 232, 117, 2, 892, 893, 7, 14, 2, 2, 893, 895, 5, 232, 117, 2, 894, 892, 3, 2, 2, 2, 895, 898, 3, 2, 2, 2, 896, 894, 3, 2, 2, 2, 896, 897, 3, 2, 2, 2, 897, 899, 3, 2, 2, 2, 898, 896, 3, 2, 2, 2, 899, 900, 7, 69, 2, 2, 900, 901, 5, 96, 49, 2, 901, 133, 3, 2, 2, 2, 902, 903, 7, 70, 2, 2, 903, 904, 7, 11, 2, 2, 904, 905, 5, 94, 48, 2, 905, 906, 7, 12, 2, 2, 906, 907, 7, 91, 2, 2, 907, 908, 5, 96, 49, 2, 908, 909, 7, 92, 2, 2, 909, 910, 5, 96, 49, 2, 910, 135, 3, 2, 2, 2, 911, 912, 7, 88, 2, 2, 912, 913, 7, 9, 2, 2, 913, 914, 5, 94, 48, 2, 914, 916, 7, 10, 2, 2, 915, 917, 5, 138, 70, 2, 916, 915, 3, 2, 2, 2, 917, 918, 3, 2, 2, 2, 918, 916, 3, 2, 2, 2, 918, 919, 3, 2, 2, 2, 919, 137, 3, 2, 2, 2, 920, 923, 7, 89, 2, 2, 921, 924, 7, 13, 2, 2, 922, 924, 5, 74, 38, 2, 923, 921, 3, 2, 2, 2, 923, 922, 3, 2, 2, 2, 924, 932, 3, 2, 2, 2, 925, 928, 7, 14, 2, 2, 926, 929, 7, 13, 2, 2, 927, 929, 5, 74, 38, 2, 928, 926, 3, 2, 2, 2, 928, 927, 3, 2, 2, 2, 929, 931, 3, 2, 2, 2, 930, 925, 3, 2, 2, 2, 931, 934, 3, 2, 2, 2, 932, 930, 3, 2, 2, 2, 932, 933, 3, 2, 2, 2, 933, 935, 3, 2, 2, 2, 934, 932, 3, 2, 2, 2, 935, 936, 7, 9, 2, 2, 936, 937, 5, 94, 48, 2, 937, 938, 7, 10, 2, 2, 938, 139, 3, 2, 2, 2, 939, 944, 5, 142, 72, 2, 940, 941, 7, 94, 2, 2, 941, 943, 5, 142, 72, 2, 942, 940, 3, 2, 2, 2, 943, 946, 3, 2, 2, 2, 944, 942, 3, 2, 2, 2, 944, 945, 3, 2, 2, 2, 945, 141, 3, 2, 2, 2, 946, 944, 3, 2, 2, 2, 947, 952, 5, 144, 73, 2, 948, 949, 7, 95, 2, 2, 949, 951, 5, 144, 73, 2, 950, 948, 3, 2, 2, 2, 951, 954, 3, 2, 2, 2, 952, 950, 3, 2, 2, 2, 952, 953, 3, 2, 2, 2, 953, 143, 3, 2, 2, 2, 954, 952, 3, 2, 2, 2, 955, 957, 7, 96, 2, 2, 956, 955, 3, 2, 2, 2, 956, 957, 3, 2, 2, 2, 957, 958, 3, 2, 2, 2, 958, 959, 5, 146, 74, 2, 959, 145, 3, 2, 2, 2, 960, 963, 5, 148, 75, 2, 961, 962, 9, 5, 2, 2, 962, 964, 5, 148, 75, 2, 963, 961, 3, 2, 2, 2, 963, 964, 3, 2, 2, 2, 964, 147, 3, 2, 2, 2, 965, 970, 5, 150, 76, 2, 966, 967, 7, 49, 2, 2, 967, 969, 5, 150, 76, 2, 968, 966, 3, 2, 2, 2, 969, 972, 3, 2, 2, 2, 970, 968, 3, 2, 2, 2, 970, 971, 3, 2, 2, 2, 971, 149, 3, 2, 2, 2, 972, 970, 3, 2, 2, 2, 973, 976, 5, 152, 77, 2, 974, 975, 7, 97, 2, 2, 975, 977, 5, 152, 77, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 151, 3, 2, 2, 2, 978, 983, 5, 154, 78, 2, 979, 980, 9, 6, 2, 2, 980, 982, 5, 154, 78, 2, 981, 979, 3, 2, 2, 2, 982, 985, 3, 2, 2, 2, 983, 981, 3, 2, 2, 2, 983, 984, 3, 2, 2, 2, 984, 153, 3, 2, 2, 2, 985, 983, 3, 2, 2, 2, 986, 991, 5, 156, 79, 2, 987, 988, 9, 7, 2, 2, 988, 990, 5, 156, 79, 2, 989, 987, 3, 2, 2, 2, 990, 993, 3, 2, 2, 2, 991, 989, 3, 2, 2, 2, 991, 992, 3, 2, 2, 2, 992, 155, 3, 2, 2, 2, 993, 991, 3, 2, 2, 2, 994, 998, 5, 158, 80, 2, 995, 996, 7, 98, 2, 2, 996, 997, 7, 99, 2, 2, 997, 999, 5, 232, 117, 2, 998, 995, 3, 2, 2, 2, 998, 999, 3, 2, 2, 2, 999, 157, 3, 2, 2, 2, 1000, 1004, 5, 160, 81, 2, 1001, 1002, 7, 101, 2, 2, 1002, 1003, 7, 100, 2, 2, 1003, 1005, 5, 232, 117, 2, 1004, 1001, 3, 2, 2, 2, 1004, 1005, 3, 2, 2, 2, 1005, 159, 3, 2, 2, 2, 1006, 1010, 5, 162, 82, 2, 1007, 1008, 7, 102, 2, 2, 1008, 1009, 7, 72, 2, 2, 1009, 1011, 5, 232, 117, 2, 1010, 1007, 3, 2, 2, 2, 1010, 1011, 3, 2, 2, 2, 1011, 161, 3, 2, 2, 2, 1012, 1016, 5, 164, 83, 2, 1013, 1014, 7, 104, 2, 2, 1014, 1015, 7, 72, 2, 2, 1015, 1017, 5, 244, 123, 2, 1016, 1013, 3, 2, 2, 2, 1016, 1017, 3, 2, 2, 2, 1017, 163, 3, 2, 2, 2, 1018, 1022, 5, 166, 84, 2, 1019, 1020, 7, 103, 2, 2, 1020, 1021, 7, 72, 2, 2, 1021, 1023, 5, 244, 123, 2, 1022, 1019, 3, 2, 2, 2, 1022, 1023, 3, 2, 2, 2, 1023, 165, 3, 2, 2, 2, 1024, 1033, 5, 170, 86, 2, 1025, 1026, 7, 6, 2, 2, 1026, 1027, 7, 47, 2, 2, 1027, 1028, 3, 2, 2, 2, 1028, 1029, 5, 168, 85, 2, 1029, 1030, 5, 206, 104, 2, 1030, 1032, 3, 2, 2, 2, 1031, 1025, 3, 2, 2, 2, 1032, 1035, 3, 2, 2, 2, 1033, 1031, 3, 2, 2, 2, 1033, 1034, 3, 2, 2, 2, 1034, 167, 3, 2, 2, 2, 1035, 1033, 3, 2, 2, 2, 1036, 1040, 5, 74, 38, 2, 1037, 1040, 5, 194, 98, 2, 1038, 1040, 5, 196, 99, 2, 1039, 1036, 3, 2, 2, 2, 1039, 1037, 3, 2, 2, 2, 1039, 1038, 3, 2, 2, 2, 1040, 169, 3, 2, 2, 2, 1041, 1043, 9, 6, 2, 2, 1042, 1041, 3, 2, 2, 2, 1043, 1046, 3, 2, 2, 2, 1044, 1042, 3, 2, 2, 2, 1044, 1045, 3, 2, 2, 2, 1045, 1047, 3, 2, 2, 2, 1046, 1044, 3, 2, 2, 2, 1047, 1048, 5, 172, 87, 2, 1048, 171, 3, 2, 2, 2, 1049, 1053, 5, 178, 90, 2, 1050, 1053, 5, 174, 88, 2, 1051, 1053, 5, 176, 89, 2, 1052, 1049, 3, 2, 2, 2, 1052, 1050, 3, 2, 2, 2, 1052, 1051, 3, 2, 2, 2, 1053, 173, 3, 2, 2, 2, 1054, 1055, 7, 111, 2, 2, 1055, 1056, 7, 110, 2, 2, 1056, 1057, 5, 232, 117, 2, 1057, 1058, 7, 9, 2, 2, 1058, 1059, 5, 94, 48, 2, 1059, 1060, 7, 10, 2, 2, 1060, 175, 3, 2, 2, 2, 1061, 1062, 7, 112, 2, 2, 1062, 1063, 7, 110, 2, 2, 1063, 1064, 5, 232, 117, 2, 1064, 1065, 7, 9, 2, 2, 1065, 1066, 5, 94, 48, 2, 1066, 1067, 7, 10, 2, 2, 1067, 177, 3, 2, 2, 2, 1068, 1073, 5, 180, 91, 2, 1069, 1070, 7, 55, 2, 2, 1070, 1072, 5, 180, 91, 2, 1071, 1069, 3, 2, 2, 2, 1072, 1075, 3, 2, 2, 2, 1073, 1071, 3, 2, 2, 2, 1073, 1074, 3, 2, 2, 2, 1074, 179, 3, 2, 2, 2, 1075, 1073, 3, 2, 2, 2, 1076, 1084, 5, 190, 96, 2, 1077, 1083, 5, 182, 92, 2, 1078, 1083, 5, 186, 94, 2, 1079, 1083, 5, 188, 95, 2, 1080, 1083, 5, 184, 93, 2, 1081, 1083, 5, 206, 104, 2, 1082, 1077, 3, 2, 2, 2, 1082, 1078, 3, 2, 2, 2, 1082, 1079, 3, 2, 2, 2, 1082, 1080, 3, 2, 2, 2, 1082, 1081, 3, 2, 2, 2, 1083, 1086, 3, 2, 2, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1085, 3, 2, 2, 2, 1085, 181, 3, 2, 2, 2, 1086, 1084, 3, 2, 2, 2, 1087, 1088, 7, 56, 2, 2, 1088, 1089, 7, 56, 2, 2, 1089, 1090, 5, 94, 48, 2, 1090, 1091, 7, 57, 2, 2, 1091, 1092, 7, 57, 2, 2, 1092, 183, 3, 2, 2, 2, 1093, 1094, 7, 56, 2, 2, 1094, 1095, 7, 57, 2, 2, 1095, 185, 3, 2, 2, 2, 1096, 1097, 7, 56, 2, 2, 1097, 1098, 5, 94, 48, 2, 1098, 1099, 7, 57, 2, 2, 1099, 187, 3, 2, 2, 2, 1100, 1107, 7, 58, 2, 2, 1101, 1108, 5, 254, 128, 2, 1102, 1108, 5, 252, 127, 2, 1103, 1108, 7, 145, 2, 2, 1104, 1108, 5, 196, 99, 2, 1105, 1108, 5, 194, 98, 2, 1106, 1108, 5, 198, 100, 2, 1107, 1101, 3, 2, 2, 2, 1107, 1102, 3, 2, 2, 2, 1107, 1103, 3, 2, 2, 2, 1107, 1104, 3, 2, 2, 2, 1107, 1105, 3, 2, 2, 2, 1107, 1106, 3, 2, 2, 2, 1108, 189, 3, 2, 2, 2, 1109, 1125, 7, 138, 2, 2, 1110, 1125, 7, 108, 2, 2, 1111, 1125, 7, 109, 2, 2, 1112, 1125, 7, 139, 2, 2, 1113, 1125, 5, 252, 127, 2, 1114, 1125, 5, 194, 98, 2, 1115, 1125, 5, 196, 99, 2, 1116, 1125, 5, 198, 100, 2, 1117, 1125, 5, 234, 118, 2, 1118, 1125, 5, 204, 103, 2, 1119, 1125, 5, 200, 101, 2, 1120, 1125, 5, 202, 102, 2, 1121, 1125, 5, 248, 125, 2, 1122, 1125, 5, 210, 106, 2, 1123, 1125, 5, 192, 97, 2, 1124, 1109, 3, 2, 2, 2, 1124, 1110, 3, 2, 2, 2, 1124, 1111, 3, 2, 2, 2, 1124, 1112, 3, 2, 2, 2, 1124, 1113, 3, 2, 2, 2, 1124, 1114, 3, 2, 2, 2, 1124, 1115, 3, 2, 2, 2, 1124, 1116, 3, 2, 2, 2, 1124, 1117, 3, 2, 2, 2, 1124, 1118, 3, 2, 2, 2, 1124, 1119, 3, 2, 2, 2, 1124, 1120, 3, 2, 2, 2, 1124, 1121, 3, 2, 2, 2, 1124, 1122, 3, 2, 2, 2, 1124, 1123, 3, 2, 2, 2, 1125, 191, 3, 2, 2, 2, 1126, 1127, 7, 9, 2, 2, 1127, 1128, 5, 16, 9, 2, 1128, 1129, 7, 10, 2, 2, 1129, 193, 3, 2, 2, 2, 1130, 1131, 7, 7, 2, 2, 1131, 1132, 5, 74, 38, 2, 1132, 195, 3, 2, 2, 2, 1133, 1135, 7, 11, 2, 2, 1134, 1136, 5, 94, 48, 2, 1135, 1134, 3, 2, 2, 2, 1135, 1136, 3, 2, 2, 2, 1136, 1137, 3, 2, 2, 2, 1137, 1138, 7, 12, 2, 2, 1138, 197, 3, 2, 2, 2, 1139, 1140, 7, 59, 2, 2, 1140, 199, 3, 2, 2, 2, 1141, 1142, 7, 18, 2, 2, 1142, 1143, 7, 9, 2, 2, 1143, 1144, 5, 94, 48, 2, 1144, 1145, 7, 10, 2, 2, 1145, 201, 3, 2, 2, 2, 1146, 1147, 7, 107, 2, 2, 1147, 1148, 7, 9, 2, 2, 1148, 1149, 5, 94, 48, 2, 1149, 1150, 7, 10, 2, 2, 1150, 203, 3, 2, 2, 2, 1151, 1152, 5, 74, 38, 2, 1152, 1153, 5, 206, 104, 2, 1153, 205, 3, 2, 2, 2, 1154, 1161, 7, 11, 2, 2, 1155, 1157, 5, 208, 105, 2, 1156, 1158, 7, 16, 2, 2, 1157, 1156, 3, 2, 2, 2, 1157, 1158, 3, 2, 2, 2, 1158, 1160, 3, 2, 2, 2, 1159, 1155, 3, 2, 2, 2, 1160, 1163, 3, 2, 2, 2, 1161, 1159, 3, 2, 2, 2, 1161, 1162, 3, 2, 2, 2, 1162, 1164, 3, 2, 2, 2, 1163, 1161, 3, 2, 2, 2, 1164, 1165, 7, 12, 2, 2, 1165, 207, 3, 2, 2, 2, 1166, 1169, 5, 96, 49, 2, 1167, 1169, 7, 137, 2, 2, 1168, 1166, 3, 2, 2, 2, 1168, 1167, 3, 2, 2, 2, 1169, 209, 3, 2, 2, 2, 1170, 1173, 5, 212, 107, 2, 1171, 1173, 5, 214, 108, 2, 1172, 1170, 3, 2, 2, 2, 1172, 1171, 3, 2, 2, 2, 1173, 211, 3, 2, 2, 2, 1174, 1175, 5, 74, 38, 2, 1175, 1176, 7, 60, 2, 2, 1176, 1177, 7, 139, 2, 2, 1177, 213, 3, 2, 2, 2, 1178, 1179, 5, 52, 27, 2, 1179, 1180, 7, 33, 2, 2, 1180, 1182, 7, 11, 2, 2, 1181, 1183, 5, 90, 46, 2, 1182, 1181, 3, 2, 2, 2, 1182, 1183, 3, 2, 2, 2, 1183, 1184, 3, 2, 2, 2, 1184, 1187, 7, 12, 2, 2, 1185, 1186, 7, 72, 2, 2, 1186, 1188, 5, 232, 117, 2, 1187, 1185, 3, 2, 2, 2, 1187, 1188, 3, 2, 2, 2, 1188, 1189, 3, 2, 2, 2, 1189, 1190, 7, 9, 2, 2, 1190, 1191, 5, 18, 10, 2, 1191, 1192, 7, 10, 2, 2, 1192, 215, 3, 2, 2, 2, 1193, 1194, 7, 117, 2, 2, 1194, 1195, 7, 128, 2, 2, 1195, 1196, 5, 96, 49, 2, 1196, 1197, 7, 124, 2, 2, 1197, 1201, 5, 96, 49, 2, 1198, 1199, 7, 73, 2, 2, 1199, 1200, 7, 127, 2, 2, 1200, 1202, 5, 96, 49, 2, 1201, 1198, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1217, 3, 2, 2, 2, 1203, 1204, 7, 117, 2, 2, 1204, 1205, 7, 128, 2, 2, 1205, 1210, 5, 246, 124, 2, 1206, 1207, 7, 16, 2, 2, 1207, 1209, 5, 246, 124, 2, 1208, 1206, 3, 2, 2, 2, 1209, 1212, 3, 2, 2, 2, 1210, 1208, 3, 2, 2, 2, 1210, 1211, 3, 2, 2, 2, 1211, 1213, 3, 2, 2, 2, 1212, 1210, 3, 2, 2, 2, 1213, 1214, 7, 124, 2, 2, 1214, 1215, 5, 96, 49, 2, 1215, 1217, 3, 2, 2, 2, 1216, 1193, 3, 2, 2, 2, 1216, 1203, 3, 2, 2, 2, 1217, 217, 3, 2, 2, 2, 1218, 1219, 7, 118, 2, 2, 1219, 1220, 7, 128, 2, 2, 1220, 1221, 5, 228, 115, 2, 1221, 219, 3, 2, 2, 2, 1222, 1223, 7, 119, 2, 2, 1223, 1224, 7, 128, 2, 2, 1224, 1225, 5, 228, 115, 2, 1225, 1226, 7, 72, 2, 2, 1226, 1227, 5, 96, 49, 2, 1227, 221, 3, 2, 2, 2, 1228, 1229, 7, 120, 2, 2, 1229, 1230, 7, 125, 2, 2, 1230, 1231, 7, 99, 2, 2, 1231, 1232, 7, 128, 2, 2, 1232, 1233, 5, 228, 115, 2, 1233, 1234, 7, 126, 2, 2, 1234, 1235, 5, 96, 49, 2, 1235, 223, 3, 2, 2, 2, 1236, 1237, 7, 121, 2, 2, 1237, 1242, 5, 230, 116, 2, 1238, 1239, 7, 16, 2, 2, 1239, 1241, 5, 230, 116, 2, 1240, 1238, 3, 2, 2, 2, 1241, 1244, 3, 2, 2, 2, 1242, 1240, 3, 2, 2, 2, 1242, 1243, 3, 2, 2, 2, 1243, 1245, 3, 2, 2, 2, 1244, 1242, 3, 2, 2, 2, 1245, 1246, 7, 122, 2, 2, 1246, 1247, 5, 96, 49, 2, 1247, 1248, 7, 69, 2, 2, 1248, 1249, 5, 96, 49, 2, 1249, 225, 3, 2, 2, 2, 1250, 1251, 7, 123, 2, 2, 1251, 1252, 7, 128, 2, 2, 1252, 1253, 5, 96, 49, 2, 1253, 1254, 7, 124, 2, 2, 1254, 1255, 5, 96, 49, 2, 1255, 227, 3, 2, 2, 2, 1256, 1259, 5, 190, 96, 2, 1257, 1260, 5, 182, 92, 2, 1258, 1260, 5, 188, 95, 2, 1259, 1257, 3, 2, 2, 2, 1259, 1258, 3, 2, 2, 2, 1260, 1261, 3, 2, 2, 2, 1261, 1259, 3, 2, 2, 2, 1261, 1262, 3, 2, 2, 2, 1262, 229, 3, 2, 2, 2, 1263, 1264, 5, 194, 98, 2, 1264, 1265, 7, 8, 2, 2, 1265, 1266, 5, 96, 49, 2, 1266, 231, 3, 2, 2, 2, 1267, 1268, 7, 11, 2, 2, 1268, 1276, 7, 12, 2, 2, 1269, 1273, 5, 236, 119, 2, 1270, 1274, 7, 137, 2, 2, 1271, 1274, 7, 13, 2, 2, 1272, 1274, 7, 50, 2, 2, 1273, 1270, 3, 2, 2, 2, 1273, 1271, 3, 2, 2, 2, 1273, 1272, 3, 2, 2, 2, 1273, 1274, 3, 2, 2, 2, 1274, 1276, 3, 2, 2, 2, 1275, 1267, 3, 2, 2, 2, 1275, 1269, 3, 2, 2, 2, 1276, 233, 3, 2, 2, 2, 1277, 1286, 7, 9, 2, 2, 1278, 1283, 5, 246, 124, 2, 1279, 1280, 7, 16, 2, 2, 1280, 1282, 5, 246, 124, 2, 1281, 1279, 3, 2, 2, 2, 1282, 1285, 3, 2, 2, 2, 1283, 1281, 3, 2, 2, 2, 1283, 1284, 3, 2, 2, 2, 1284, 1287, 3, 2, 2, 2, 1285, 1283, 3, 2, 2, 2, 1286, 1278, 3, 2, 2, 2, 1286, 1287, 3, 2, 2, 2, 1287, 1288, 3, 2, 2, 2, 1288, 1294, 7, 10, 2, 2, 1289, 1290, 7, 61, 2, 2, 1290, 1291, 5, 94, 48, 2, 1291, 1292, 7, 62, 2, 2, 1292, 1294, 3, 2, 2, 2, 1293, 1277, 3, 2, 2, 2, 1293, 1289, 3, 2, 2, 2, 1294, 235, 3, 2, 2, 2, 1295, 1299, 5, 74, 38, 2, 1296, 1299, 7, 138, 2, 2, 1297, 1299, 5, 238, 120, 2, 1298, 1295, 3, 2, 2, 2, 1298, 1296, 3, 2, 2, 2, 1298, 1297, 3, 2, 2, 2, 1299, 237, 3, 2, 2, 2, 1300, 1303, 5, 240, 121, 2, 1301, 1303, 5, 242, 122, 2, 1302, 1300, 3, 2, 2, 2, 1302, 1301, 3, 2, 2, 2, 1303, 239, 3, 2, 2, 2, 1304, 1305, 7, 33, 2, 2, 1305, 1306, 7, 11, 2, 2, 1306, 1307, 7, 13, 2, 2, 1307, 1308, 7, 12, 2, 2, 1308, 241, 3, 2, 2, 2, 1309, 1310, 7, 33, 2, 2, 1310, 1319, 7, 11, 2, 2, 1311, 1316, 5, 232, 117, 2, 1312, 1313, 7, 16, 2, 2, 1313, 1315, 5, 232, 117, 2, 1314, 1312, 3, 2, 2, 2, 1315, 1318, 3, 2, 2, 2, 1316, 1314, 3, 2, 2, 2, 1316, 1317, 3, 2, 2, 2, 1317, 1320, 3, 2, 2, 2, 1318, 1316, 3, 2, 2, 2, 1319, 1311, 3, 2, 2, 2, 1319, 1320, 3, 2, 2, 2, 1320, 1321, 3, 2, 2, 2, 1321, 1322, 7, 12, 2, 2, 1322, 1323, 7, 72, 2, 2, 1323, 1324, 5, 232, 117, 2, 1324, 243, 3, 2, 2, 2, 1325, 1327, 5, 236, 119, 2, 1326, 1328, 7, 137, 2, 2, 1327, 1326, 3, 2, 2, 2, 1327, 1328, 3, 2, 2, 2, 1328, 245, 3, 2, 2, 2, 1329, 1332, 5, 96, 49, 2, 1330, 1332, 7, 145, 2, 2, 1331, 1329, 3, 2, 2, 2, 1331, 1330, 3, 2, 2, 2, 1332, 1333, 3, 2, 2, 2, 1333, 1334, 9, 8, 2, 2, 1334, 1335, 5, 96, 49, 2, 1335, 247, 3, 2, 2, 2, 1336, 1338, 7, 56, 2, 2, 1337, 1339, 5, 94, 48, 2, 1338, 1337, 3, 2, 2, 2, 1338, 1339, 3, 2, 2, 2, 1339, 1340, 3, 2, 2, 2, 1340, 1341, 7, 57, 2, 2, 1341, 249, 3, 2, 2, 2, 1342, 1343, 5, 252, 127, 2, 1343, 251, 3, 2, 2, 2, 1344, 1345, 7, 136, 2, 2, 1345, 253, 3, 2, 2, 2, 1346, 1347, 9, 9, 2, 2, 1347, 255, 3, 2, 2, 2, 135, 264, 268, 284, 290, 298, 306, 314, 329, 359, 367, 369, 391, 401, 411, 416, 421, 425, 437, 441, 450, 457, 471, 475, 478, 483, 493, 501, 505, 517, 529, 551, 559, 564, 567, 571, 580, 589, 592, 600, 607, 609, 616, 623, 625, 633, 638, 645, 652, 662, 669, 676, 683, 692, 702, 706, 714, 716, 728, 734, 738, 742, 753, 759, 774, 780, 784, 788, 795, 802, 808, 813, 815, 819, 826, 833, 842, 854, 864, 876, 880, 889, 896, 918, 923, 928, 932, 944, 952, 956, 963, 970, 976, 983, 991, 998, 1004, 1010, 1016, 1022, 1033, 1039, 1044, 1052, 1073, 1082, 1084, 1107, 1124, 1135, 1157, 1161, 1168, 1172, 1182, 1187, 1201, 1210, 1216, 1242, 1259, 1261, 1273, 1275, 1283, 1286, 1293, 1298, 1302, 1316, 1319, 1327, 1331, 1338]
\ 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 74d3a280cf..90fc814284 100644
--- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens
+++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens
@@ -121,27 +121,28 @@ 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
+Kwith=124
+Kposition=125
+Kjson=126
+Kupdating=127
+Kbreak=128
+Kloop=129
+Kcontinue=130
+Kexit=131
+Kreturning=132
+Kwhile=133
+STRING=134
+ArgumentPlaceholder=135
+NullLiteral=136
+Literal=137
+NumericLiteral=138
+IntegerLiteral=139
+DecimalLiteral=140
+DoubleLiteral=141
+WS=142
+NCName=143
+XQComment=144
+ContentChar=145
';'=1
'module'=2
'namespace'=3
@@ -265,14 +266,15 @@ ContentChar=144
'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
+'with'=124
+'position'=125
+'json'=126
+'updating'=127
+'break'=128
+'loop'=129
+'continue'=130
+'exit'=131
+'returning'=132
+'while'=133
+'?'=135
+'null'=136
diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
index 0d02ed8f1b..c72c3c8cdf 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.interp
@@ -123,9 +123,10 @@ null
'append'
'into'
'value'
-'json'
'with'
'position'
+'json'
+'updating'
'break'
'loop'
'continue'
@@ -270,9 +271,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -416,9 +418,10 @@ Kmodify
Kappend
Kinto
Kvalue
-Kjson
Kwith
Kposition
+Kjson
+Kupdating
Kbreak
Kloop
Kcontinue
@@ -452,4 +455,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, 147, 1209, 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, 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, 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, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 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, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 7, 135, 1095, 10, 135, 12, 135, 14, 135, 1098, 11, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 5, 136, 1105, 10, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 5, 142, 1127, 10, 142, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 7, 144, 1136, 10, 144, 12, 144, 14, 144, 1139, 11, 144, 5, 144, 1141, 10, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 7, 145, 1148, 10, 145, 12, 145, 14, 145, 1151, 11, 145, 5, 145, 1153, 10, 145, 5, 145, 1155, 10, 145, 3, 145, 3, 145, 5, 145, 1159, 10, 145, 3, 145, 3, 145, 3, 146, 6, 146, 1164, 10, 146, 13, 146, 14, 146, 1165, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 7, 148, 1174, 10, 148, 12, 148, 14, 148, 1177, 11, 148, 3, 149, 5, 149, 1180, 10, 149, 3, 150, 3, 150, 5, 150, 1184, 10, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 7, 151, 1194, 10, 151, 12, 151, 14, 151, 1197, 11, 151, 3, 151, 6, 151, 1200, 10, 151, 13, 151, 14, 151, 1201, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 2, 2, 153, 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, 2, 273, 2, 275, 2, 277, 137, 279, 138, 281, 139, 283, 140, 285, 141, 287, 142, 289, 143, 291, 2, 293, 144, 295, 145, 297, 2, 299, 2, 301, 146, 303, 147, 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, 1221, 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, 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, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 3, 305, 3, 2, 2, 2, 5, 307, 3, 2, 2, 2, 7, 314, 3, 2, 2, 2, 9, 324, 3, 2, 2, 2, 11, 326, 3, 2, 2, 2, 13, 328, 3, 2, 2, 2, 15, 331, 3, 2, 2, 2, 17, 333, 3, 2, 2, 2, 19, 335, 3, 2, 2, 2, 21, 337, 3, 2, 2, 2, 23, 339, 3, 2, 2, 2, 25, 341, 3, 2, 2, 2, 27, 343, 3, 2, 2, 2, 29, 345, 3, 2, 2, 2, 31, 347, 3, 2, 2, 2, 33, 356, 3, 2, 2, 2, 35, 364, 3, 2, 2, 2, 37, 379, 3, 2, 2, 2, 39, 381, 3, 2, 2, 2, 41, 399, 3, 2, 2, 2, 43, 418, 3, 2, 2, 2, 45, 427, 3, 2, 2, 2, 47, 438, 3, 2, 2, 2, 49, 442, 3, 2, 2, 2, 51, 450, 3, 2, 2, 2, 53, 460, 3, 2, 2, 2, 55, 471, 3, 2, 2, 2, 57, 477, 3, 2, 2, 2, 59, 495, 3, 2, 2, 2, 61, 502, 3, 2, 2, 2, 63, 511, 3, 2, 2, 2, 65, 520, 3, 2, 2, 2, 67, 527, 3, 2, 2, 2, 69, 535, 3, 2, 2, 2, 71, 543, 3, 2, 2, 2, 73, 550, 3, 2, 2, 2, 75, 553, 3, 2, 2, 2, 77, 556, 3, 2, 2, 2, 79, 559, 3, 2, 2, 2, 81, 562, 3, 2, 2, 2, 83, 565, 3, 2, 2, 2, 85, 568, 3, 2, 2, 2, 87, 571, 3, 2, 2, 2, 89, 573, 3, 2, 2, 2, 91, 576, 3, 2, 2, 2, 93, 578, 3, 2, 2, 2, 95, 581, 3, 2, 2, 2, 97, 584, 3, 2, 2, 2, 99, 586, 3, 2, 2, 2, 101, 588, 3, 2, 2, 2, 103, 592, 3, 2, 2, 2, 105, 597, 3, 2, 2, 2, 107, 601, 3, 2, 2, 2, 109, 603, 3, 2, 2, 2, 111, 605, 3, 2, 2, 2, 113, 607, 3, 2, 2, 2, 115, 609, 3, 2, 2, 2, 117, 612, 3, 2, 2, 2, 119, 614, 3, 2, 2, 2, 121, 617, 3, 2, 2, 2, 123, 620, 3, 2, 2, 2, 125, 624, 3, 2, 2, 2, 127, 628, 3, 2, 2, 2, 129, 634, 3, 2, 2, 2, 131, 640, 3, 2, 2, 2, 133, 643, 3, 2, 2, 2, 135, 649, 3, 2, 2, 2, 137, 656, 3, 2, 2, 2, 139, 659, 3, 2, 2, 2, 141, 662, 3, 2, 2, 2, 143, 665, 3, 2, 2, 2, 145, 668, 3, 2, 2, 2, 147, 677, 3, 2, 2, 2, 149, 683, 3, 2, 2, 2, 151, 689, 3, 2, 2, 2, 153, 696, 3, 2, 2, 2, 155, 706, 3, 2, 2, 2, 157, 717, 3, 2, 2, 2, 159, 722, 3, 2, 2, 2, 161, 728, 3, 2, 2, 2, 163, 738, 3, 2, 2, 2, 165, 748, 3, 2, 2, 2, 167, 757, 3, 2, 2, 2, 169, 763, 3, 2, 2, 2, 171, 770, 3, 2, 2, 2, 173, 775, 3, 2, 2, 2, 175, 779, 3, 2, 2, 2, 177, 785, 3, 2, 2, 2, 179, 793, 3, 2, 2, 2, 181, 798, 3, 2, 2, 2, 183, 803, 3, 2, 2, 2, 185, 814, 3, 2, 2, 2, 187, 817, 3, 2, 2, 2, 189, 821, 3, 2, 2, 2, 191, 825, 3, 2, 2, 2, 193, 828, 3, 2, 2, 2, 195, 837, 3, 2, 2, 2, 197, 840, 3, 2, 2, 2, 199, 851, 3, 2, 2, 2, 201, 854, 3, 2, 2, 2, 203, 860, 3, 2, 2, 2, 205, 865, 3, 2, 2, 2, 207, 874, 3, 2, 2, 2, 209, 882, 3, 2, 2, 2, 211, 889, 3, 2, 2, 2, 213, 899, 3, 2, 2, 2, 215, 904, 3, 2, 2, 2, 217, 910, 3, 2, 2, 2, 219, 915, 3, 2, 2, 2, 221, 924, 3, 2, 2, 2, 223, 933, 3, 2, 2, 2, 225, 941, 3, 2, 2, 2, 227, 949, 3, 2, 2, 2, 229, 954, 3, 2, 2, 2, 231, 963, 3, 2, 2, 2, 233, 970, 3, 2, 2, 2, 235, 977, 3, 2, 2, 2, 237, 984, 3, 2, 2, 2, 239, 992, 3, 2, 2, 2, 241, 997, 3, 2, 2, 2, 243, 1004, 3, 2, 2, 2, 245, 1011, 3, 2, 2, 2, 247, 1016, 3, 2, 2, 2, 249, 1022, 3, 2, 2, 2, 251, 1027, 3, 2, 2, 2, 253, 1036, 3, 2, 2, 2, 255, 1041, 3, 2, 2, 2, 257, 1050, 3, 2, 2, 2, 259, 1056, 3, 2, 2, 2, 261, 1061, 3, 2, 2, 2, 263, 1070, 3, 2, 2, 2, 265, 1075, 3, 2, 2, 2, 267, 1085, 3, 2, 2, 2, 269, 1091, 3, 2, 2, 2, 271, 1101, 3, 2, 2, 2, 273, 1106, 3, 2, 2, 2, 275, 1112, 3, 2, 2, 2, 277, 1114, 3, 2, 2, 2, 279, 1116, 3, 2, 2, 2, 281, 1121, 3, 2, 2, 2, 283, 1126, 3, 2, 2, 2, 285, 1128, 3, 2, 2, 2, 287, 1140, 3, 2, 2, 2, 289, 1154, 3, 2, 2, 2, 291, 1163, 3, 2, 2, 2, 293, 1167, 3, 2, 2, 2, 295, 1171, 3, 2, 2, 2, 297, 1179, 3, 2, 2, 2, 299, 1183, 3, 2, 2, 2, 301, 1185, 3, 2, 2, 2, 303, 1207, 3, 2, 2, 2, 305, 306, 7, 61, 2, 2, 306, 4, 3, 2, 2, 2, 307, 308, 7, 111, 2, 2, 308, 309, 7, 113, 2, 2, 309, 310, 7, 102, 2, 2, 310, 311, 7, 119, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 103, 2, 2, 313, 6, 3, 2, 2, 2, 314, 315, 7, 112, 2, 2, 315, 316, 7, 99, 2, 2, 316, 317, 7, 111, 2, 2, 317, 318, 7, 103, 2, 2, 318, 319, 7, 117, 2, 2, 319, 320, 7, 114, 2, 2, 320, 321, 7, 99, 2, 2, 321, 322, 7, 101, 2, 2, 322, 323, 7, 103, 2, 2, 323, 8, 3, 2, 2, 2, 324, 325, 7, 63, 2, 2, 325, 10, 3, 2, 2, 2, 326, 327, 7, 38, 2, 2, 327, 12, 3, 2, 2, 2, 328, 329, 7, 60, 2, 2, 329, 330, 7, 63, 2, 2, 330, 14, 3, 2, 2, 2, 331, 332, 7, 125, 2, 2, 332, 16, 3, 2, 2, 2, 333, 334, 7, 127, 2, 2, 334, 18, 3, 2, 2, 2, 335, 336, 7, 42, 2, 2, 336, 20, 3, 2, 2, 2, 337, 338, 7, 43, 2, 2, 338, 22, 3, 2, 2, 2, 339, 340, 7, 44, 2, 2, 340, 24, 3, 2, 2, 2, 341, 342, 7, 126, 2, 2, 342, 26, 3, 2, 2, 2, 343, 344, 7, 39, 2, 2, 344, 28, 3, 2, 2, 2, 345, 346, 7, 46, 2, 2, 346, 30, 3, 2, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 116, 2, 2, 349, 350, 7, 102, 2, 2, 350, 351, 7, 103, 2, 2, 351, 352, 7, 116, 2, 2, 352, 353, 7, 107, 2, 2, 353, 354, 7, 112, 2, 2, 354, 355, 7, 105, 2, 2, 355, 32, 3, 2, 2, 2, 356, 357, 7, 113, 2, 2, 357, 358, 7, 116, 2, 2, 358, 359, 7, 102, 2, 2, 359, 360, 7, 103, 2, 2, 360, 361, 7, 116, 2, 2, 361, 362, 7, 103, 2, 2, 362, 363, 7, 102, 2, 2, 363, 34, 3, 2, 2, 2, 364, 365, 7, 102, 2, 2, 365, 366, 7, 103, 2, 2, 366, 367, 7, 101, 2, 2, 367, 368, 7, 107, 2, 2, 368, 369, 7, 111, 2, 2, 369, 370, 7, 99, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 47, 2, 2, 372, 373, 7, 104, 2, 2, 373, 374, 7, 113, 2, 2, 374, 375, 7, 116, 2, 2, 375, 376, 7, 111, 2, 2, 376, 377, 7, 99, 2, 2, 377, 378, 7, 118, 2, 2, 378, 36, 3, 2, 2, 2, 379, 380, 7, 60, 2, 2, 380, 38, 3, 2, 2, 2, 381, 382, 7, 102, 2, 2, 382, 383, 7, 103, 2, 2, 383, 384, 7, 101, 2, 2, 384, 385, 7, 107, 2, 2, 385, 386, 7, 111, 2, 2, 386, 387, 7, 99, 2, 2, 387, 388, 7, 110, 2, 2, 388, 389, 7, 47, 2, 2, 389, 390, 7, 117, 2, 2, 390, 391, 7, 103, 2, 2, 391, 392, 7, 114, 2, 2, 392, 393, 7, 99, 2, 2, 393, 394, 7, 116, 2, 2, 394, 395, 7, 99, 2, 2, 395, 396, 7, 118, 2, 2, 396, 397, 7, 113, 2, 2, 397, 398, 7, 116, 2, 2, 398, 40, 3, 2, 2, 2, 399, 400, 7, 105, 2, 2, 400, 401, 7, 116, 2, 2, 401, 402, 7, 113, 2, 2, 402, 403, 7, 119, 2, 2, 403, 404, 7, 114, 2, 2, 404, 405, 7, 107, 2, 2, 405, 406, 7, 112, 2, 2, 406, 407, 7, 105, 2, 2, 407, 408, 7, 47, 2, 2, 408, 409, 7, 117, 2, 2, 409, 410, 7, 103, 2, 2, 410, 411, 7, 114, 2, 2, 411, 412, 7, 99, 2, 2, 412, 413, 7, 116, 2, 2, 413, 414, 7, 99, 2, 2, 414, 415, 7, 118, 2, 2, 415, 416, 7, 113, 2, 2, 416, 417, 7, 116, 2, 2, 417, 42, 3, 2, 2, 2, 418, 419, 7, 107, 2, 2, 419, 420, 7, 112, 2, 2, 420, 421, 7, 104, 2, 2, 421, 422, 7, 107, 2, 2, 422, 423, 7, 112, 2, 2, 423, 424, 7, 107, 2, 2, 424, 425, 7, 118, 2, 2, 425, 426, 7, 123, 2, 2, 426, 44, 3, 2, 2, 2, 427, 428, 7, 111, 2, 2, 428, 429, 7, 107, 2, 2, 429, 430, 7, 112, 2, 2, 430, 431, 7, 119, 2, 2, 431, 432, 7, 117, 2, 2, 432, 433, 7, 47, 2, 2, 433, 434, 7, 117, 2, 2, 434, 435, 7, 107, 2, 2, 435, 436, 7, 105, 2, 2, 436, 437, 7, 112, 2, 2, 437, 46, 3, 2, 2, 2, 438, 439, 7, 80, 2, 2, 439, 440, 7, 99, 2, 2, 440, 441, 7, 80, 2, 2, 441, 48, 3, 2, 2, 2, 442, 443, 7, 114, 2, 2, 443, 444, 7, 103, 2, 2, 444, 445, 7, 116, 2, 2, 445, 446, 7, 101, 2, 2, 446, 447, 7, 103, 2, 2, 447, 448, 7, 112, 2, 2, 448, 449, 7, 118, 2, 2, 449, 50, 3, 2, 2, 2, 450, 451, 7, 114, 2, 2, 451, 452, 7, 103, 2, 2, 452, 453, 7, 116, 2, 2, 453, 454, 7, 47, 2, 2, 454, 455, 7, 111, 2, 2, 455, 456, 7, 107, 2, 2, 456, 457, 7, 110, 2, 2, 457, 458, 7, 110, 2, 2, 458, 459, 7, 103, 2, 2, 459, 52, 3, 2, 2, 2, 460, 461, 7, 124, 2, 2, 461, 462, 7, 103, 2, 2, 462, 463, 7, 116, 2, 2, 463, 464, 7, 113, 2, 2, 464, 465, 7, 47, 2, 2, 465, 466, 7, 102, 2, 2, 466, 467, 7, 107, 2, 2, 467, 468, 7, 105, 2, 2, 468, 469, 7, 107, 2, 2, 469, 470, 7, 118, 2, 2, 470, 54, 3, 2, 2, 2, 471, 472, 7, 102, 2, 2, 472, 473, 7, 107, 2, 2, 473, 474, 7, 105, 2, 2, 474, 475, 7, 107, 2, 2, 475, 476, 7, 118, 2, 2, 476, 56, 3, 2, 2, 2, 477, 478, 7, 114, 2, 2, 478, 479, 7, 99, 2, 2, 479, 480, 7, 118, 2, 2, 480, 481, 7, 118, 2, 2, 481, 482, 7, 103, 2, 2, 482, 483, 7, 116, 2, 2, 483, 484, 7, 112, 2, 2, 484, 485, 7, 47, 2, 2, 485, 486, 7, 117, 2, 2, 486, 487, 7, 103, 2, 2, 487, 488, 7, 114, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 116, 2, 2, 490, 491, 7, 99, 2, 2, 491, 492, 7, 118, 2, 2, 492, 493, 7, 113, 2, 2, 493, 494, 7, 116, 2, 2, 494, 58, 3, 2, 2, 2, 495, 496, 7, 107, 2, 2, 496, 497, 7, 111, 2, 2, 497, 498, 7, 114, 2, 2, 498, 499, 7, 113, 2, 2, 499, 500, 7, 116, 2, 2, 500, 501, 7, 118, 2, 2, 501, 60, 3, 2, 2, 2, 502, 503, 7, 103, 2, 2, 503, 504, 7, 122, 2, 2, 504, 505, 7, 118, 2, 2, 505, 506, 7, 103, 2, 2, 506, 507, 7, 116, 2, 2, 507, 508, 7, 112, 2, 2, 508, 509, 7, 99, 2, 2, 509, 510, 7, 110, 2, 2, 510, 62, 3, 2, 2, 2, 511, 512, 7, 104, 2, 2, 512, 513, 7, 119, 2, 2, 513, 514, 7, 112, 2, 2, 514, 515, 7, 101, 2, 2, 515, 516, 7, 118, 2, 2, 516, 517, 7, 107, 2, 2, 517, 518, 7, 113, 2, 2, 518, 519, 7, 112, 2, 2, 519, 64, 3, 2, 2, 2, 520, 521, 7, 108, 2, 2, 521, 522, 7, 117, 2, 2, 522, 523, 7, 113, 2, 2, 523, 524, 7, 119, 2, 2, 524, 525, 7, 112, 2, 2, 525, 526, 7, 102, 2, 2, 526, 66, 3, 2, 2, 2, 527, 528, 7, 101, 2, 2, 528, 529, 7, 113, 2, 2, 529, 530, 7, 111, 2, 2, 530, 531, 7, 114, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 101, 2, 2, 533, 534, 7, 118, 2, 2, 534, 68, 3, 2, 2, 2, 535, 536, 7, 120, 2, 2, 536, 537, 7, 103, 2, 2, 537, 538, 7, 116, 2, 2, 538, 539, 7, 100, 2, 2, 539, 540, 7, 113, 2, 2, 540, 541, 7, 117, 2, 2, 541, 542, 7, 103, 2, 2, 542, 70, 3, 2, 2, 2, 543, 544, 7, 117, 2, 2, 544, 545, 7, 101, 2, 2, 545, 546, 7, 106, 2, 2, 546, 547, 7, 103, 2, 2, 547, 548, 7, 111, 2, 2, 548, 549, 7, 99, 2, 2, 549, 72, 3, 2, 2, 2, 550, 551, 7, 103, 2, 2, 551, 552, 7, 115, 2, 2, 552, 74, 3, 2, 2, 2, 553, 554, 7, 112, 2, 2, 554, 555, 7, 103, 2, 2, 555, 76, 3, 2, 2, 2, 556, 557, 7, 110, 2, 2, 557, 558, 7, 118, 2, 2, 558, 78, 3, 2, 2, 2, 559, 560, 7, 110, 2, 2, 560, 561, 7, 103, 2, 2, 561, 80, 3, 2, 2, 2, 562, 563, 7, 105, 2, 2, 563, 564, 7, 118, 2, 2, 564, 82, 3, 2, 2, 2, 565, 566, 7, 105, 2, 2, 566, 567, 7, 103, 2, 2, 567, 84, 3, 2, 2, 2, 568, 569, 7, 35, 2, 2, 569, 570, 7, 63, 2, 2, 570, 86, 3, 2, 2, 2, 571, 572, 7, 62, 2, 2, 572, 88, 3, 2, 2, 2, 573, 574, 7, 62, 2, 2, 574, 575, 7, 63, 2, 2, 575, 90, 3, 2, 2, 2, 576, 577, 7, 64, 2, 2, 577, 92, 3, 2, 2, 2, 578, 579, 7, 64, 2, 2, 579, 580, 7, 63, 2, 2, 580, 94, 3, 2, 2, 2, 581, 582, 7, 126, 2, 2, 582, 583, 7, 126, 2, 2, 583, 96, 3, 2, 2, 2, 584, 585, 7, 45, 2, 2, 585, 98, 3, 2, 2, 2, 586, 587, 7, 47, 2, 2, 587, 100, 3, 2, 2, 2, 588, 589, 7, 102, 2, 2, 589, 590, 7, 107, 2, 2, 590, 591, 7, 120, 2, 2, 591, 102, 3, 2, 2, 2, 592, 593, 7, 107, 2, 2, 593, 594, 7, 102, 2, 2, 594, 595, 7, 107, 2, 2, 595, 596, 7, 120, 2, 2, 596, 104, 3, 2, 2, 2, 597, 598, 7, 111, 2, 2, 598, 599, 7, 113, 2, 2, 599, 600, 7, 102, 2, 2, 600, 106, 3, 2, 2, 2, 601, 602, 7, 35, 2, 2, 602, 108, 3, 2, 2, 2, 603, 604, 7, 93, 2, 2, 604, 110, 3, 2, 2, 2, 605, 606, 7, 95, 2, 2, 606, 112, 3, 2, 2, 2, 607, 608, 7, 48, 2, 2, 608, 114, 3, 2, 2, 2, 609, 610, 7, 38, 2, 2, 610, 611, 7, 38, 2, 2, 611, 116, 3, 2, 2, 2, 612, 613, 7, 37, 2, 2, 613, 118, 3, 2, 2, 2, 614, 615, 7, 125, 2, 2, 615, 616, 7, 126, 2, 2, 616, 120, 3, 2, 2, 2, 617, 618, 7, 126, 2, 2, 618, 619, 7, 127, 2, 2, 619, 122, 3, 2, 2, 2, 620, 621, 7, 104, 2, 2, 621, 622, 7, 113, 2, 2, 622, 623, 7, 116, 2, 2, 623, 124, 3, 2, 2, 2, 624, 625, 7, 110, 2, 2, 625, 626, 7, 103, 2, 2, 626, 627, 7, 118, 2, 2, 627, 126, 3, 2, 2, 2, 628, 629, 7, 121, 2, 2, 629, 630, 7, 106, 2, 2, 630, 631, 7, 103, 2, 2, 631, 632, 7, 116, 2, 2, 632, 633, 7, 103, 2, 2, 633, 128, 3, 2, 2, 2, 634, 635, 7, 105, 2, 2, 635, 636, 7, 116, 2, 2, 636, 637, 7, 113, 2, 2, 637, 638, 7, 119, 2, 2, 638, 639, 7, 114, 2, 2, 639, 130, 3, 2, 2, 2, 640, 641, 7, 100, 2, 2, 641, 642, 7, 123, 2, 2, 642, 132, 3, 2, 2, 2, 643, 644, 7, 113, 2, 2, 644, 645, 7, 116, 2, 2, 645, 646, 7, 102, 2, 2, 646, 647, 7, 103, 2, 2, 647, 648, 7, 116, 2, 2, 648, 134, 3, 2, 2, 2, 649, 650, 7, 116, 2, 2, 650, 651, 7, 103, 2, 2, 651, 652, 7, 118, 2, 2, 652, 653, 7, 119, 2, 2, 653, 654, 7, 116, 2, 2, 654, 655, 7, 112, 2, 2, 655, 136, 3, 2, 2, 2, 656, 657, 7, 107, 2, 2, 657, 658, 7, 104, 2, 2, 658, 138, 3, 2, 2, 2, 659, 660, 7, 107, 2, 2, 660, 661, 7, 112, 2, 2, 661, 140, 3, 2, 2, 2, 662, 663, 7, 99, 2, 2, 663, 664, 7, 117, 2, 2, 664, 142, 3, 2, 2, 2, 665, 666, 7, 99, 2, 2, 666, 667, 7, 118, 2, 2, 667, 144, 3, 2, 2, 2, 668, 669, 7, 99, 2, 2, 669, 670, 7, 110, 2, 2, 670, 671, 7, 110, 2, 2, 671, 672, 7, 113, 2, 2, 672, 673, 7, 121, 2, 2, 673, 674, 7, 107, 2, 2, 674, 675, 7, 112, 2, 2, 675, 676, 7, 105, 2, 2, 676, 146, 3, 2, 2, 2, 677, 678, 7, 103, 2, 2, 678, 679, 7, 111, 2, 2, 679, 680, 7, 114, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 123, 2, 2, 682, 148, 3, 2, 2, 2, 683, 684, 7, 101, 2, 2, 684, 685, 7, 113, 2, 2, 685, 686, 7, 119, 2, 2, 686, 687, 7, 112, 2, 2, 687, 688, 7, 118, 2, 2, 688, 150, 3, 2, 2, 2, 689, 690, 7, 117, 2, 2, 690, 691, 7, 118, 2, 2, 691, 692, 7, 99, 2, 2, 692, 693, 7, 100, 2, 2, 693, 694, 7, 110, 2, 2, 694, 695, 7, 103, 2, 2, 695, 152, 3, 2, 2, 2, 696, 697, 7, 99, 2, 2, 697, 698, 7, 117, 2, 2, 698, 699, 7, 101, 2, 2, 699, 700, 7, 103, 2, 2, 700, 701, 7, 112, 2, 2, 701, 702, 7, 102, 2, 2, 702, 703, 7, 107, 2, 2, 703, 704, 7, 112, 2, 2, 704, 705, 7, 105, 2, 2, 705, 154, 3, 2, 2, 2, 706, 707, 7, 102, 2, 2, 707, 708, 7, 103, 2, 2, 708, 709, 7, 117, 2, 2, 709, 710, 7, 101, 2, 2, 710, 711, 7, 103, 2, 2, 711, 712, 7, 112, 2, 2, 712, 713, 7, 102, 2, 2, 713, 714, 7, 107, 2, 2, 714, 715, 7, 112, 2, 2, 715, 716, 7, 105, 2, 2, 716, 156, 3, 2, 2, 2, 717, 718, 7, 117, 2, 2, 718, 719, 7, 113, 2, 2, 719, 720, 7, 111, 2, 2, 720, 721, 7, 103, 2, 2, 721, 158, 3, 2, 2, 2, 722, 723, 7, 103, 2, 2, 723, 724, 7, 120, 2, 2, 724, 725, 7, 103, 2, 2, 725, 726, 7, 116, 2, 2, 726, 727, 7, 123, 2, 2, 727, 160, 3, 2, 2, 2, 728, 729, 7, 117, 2, 2, 729, 730, 7, 99, 2, 2, 730, 731, 7, 118, 2, 2, 731, 732, 7, 107, 2, 2, 732, 733, 7, 117, 2, 2, 733, 734, 7, 104, 2, 2, 734, 735, 7, 107, 2, 2, 735, 736, 7, 103, 2, 2, 736, 737, 7, 117, 2, 2, 737, 162, 3, 2, 2, 2, 738, 739, 7, 101, 2, 2, 739, 740, 7, 113, 2, 2, 740, 741, 7, 110, 2, 2, 741, 742, 7, 110, 2, 2, 742, 743, 7, 99, 2, 2, 743, 744, 7, 118, 2, 2, 744, 745, 7, 107, 2, 2, 745, 746, 7, 113, 2, 2, 746, 747, 7, 112, 2, 2, 747, 164, 3, 2, 2, 2, 748, 749, 7, 105, 2, 2, 749, 750, 7, 116, 2, 2, 750, 751, 7, 103, 2, 2, 751, 752, 7, 99, 2, 2, 752, 753, 7, 118, 2, 2, 753, 754, 7, 103, 2, 2, 754, 755, 7, 117, 2, 2, 755, 756, 7, 118, 2, 2, 756, 166, 3, 2, 2, 2, 757, 758, 7, 110, 2, 2, 758, 759, 7, 103, 2, 2, 759, 760, 7, 99, 2, 2, 760, 761, 7, 117, 2, 2, 761, 762, 7, 118, 2, 2, 762, 168, 3, 2, 2, 2, 763, 764, 7, 117, 2, 2, 764, 765, 7, 121, 2, 2, 765, 766, 7, 107, 2, 2, 766, 767, 7, 118, 2, 2, 767, 768, 7, 101, 2, 2, 768, 769, 7, 106, 2, 2, 769, 170, 3, 2, 2, 2, 770, 771, 7, 101, 2, 2, 771, 772, 7, 99, 2, 2, 772, 773, 7, 117, 2, 2, 773, 774, 7, 103, 2, 2, 774, 172, 3, 2, 2, 2, 775, 776, 7, 118, 2, 2, 776, 777, 7, 116, 2, 2, 777, 778, 7, 123, 2, 2, 778, 174, 3, 2, 2, 2, 779, 780, 7, 101, 2, 2, 780, 781, 7, 99, 2, 2, 781, 782, 7, 118, 2, 2, 782, 783, 7, 101, 2, 2, 783, 784, 7, 106, 2, 2, 784, 176, 3, 2, 2, 2, 785, 786, 7, 102, 2, 2, 786, 787, 7, 103, 2, 2, 787, 788, 7, 104, 2, 2, 788, 789, 7, 99, 2, 2, 789, 790, 7, 119, 2, 2, 790, 791, 7, 110, 2, 2, 791, 792, 7, 118, 2, 2, 792, 178, 3, 2, 2, 2, 793, 794, 7, 118, 2, 2, 794, 795, 7, 106, 2, 2, 795, 796, 7, 103, 2, 2, 796, 797, 7, 112, 2, 2, 797, 180, 3, 2, 2, 2, 798, 799, 7, 103, 2, 2, 799, 800, 7, 110, 2, 2, 800, 801, 7, 117, 2, 2, 801, 802, 7, 103, 2, 2, 802, 182, 3, 2, 2, 2, 803, 804, 7, 118, 2, 2, 804, 805, 7, 123, 2, 2, 805, 806, 7, 114, 2, 2, 806, 807, 7, 103, 2, 2, 807, 808, 7, 117, 2, 2, 808, 809, 7, 121, 2, 2, 809, 810, 7, 107, 2, 2, 810, 811, 7, 118, 2, 2, 811, 812, 7, 101, 2, 2, 812, 813, 7, 106, 2, 2, 813, 184, 3, 2, 2, 2, 814, 815, 7, 113, 2, 2, 815, 816, 7, 116, 2, 2, 816, 186, 3, 2, 2, 2, 817, 818, 7, 99, 2, 2, 818, 819, 7, 112, 2, 2, 819, 820, 7, 102, 2, 2, 820, 188, 3, 2, 2, 2, 821, 822, 7, 112, 2, 2, 822, 823, 7, 113, 2, 2, 823, 824, 7, 118, 2, 2, 824, 190, 3, 2, 2, 2, 825, 826, 7, 118, 2, 2, 826, 827, 7, 113, 2, 2, 827, 192, 3, 2, 2, 2, 828, 829, 7, 107, 2, 2, 829, 830, 7, 112, 2, 2, 830, 831, 7, 117, 2, 2, 831, 832, 7, 118, 2, 2, 832, 833, 7, 99, 2, 2, 833, 834, 7, 112, 2, 2, 834, 835, 7, 101, 2, 2, 835, 836, 7, 103, 2, 2, 836, 194, 3, 2, 2, 2, 837, 838, 7, 113, 2, 2, 838, 839, 7, 104, 2, 2, 839, 196, 3, 2, 2, 2, 840, 841, 7, 117, 2, 2, 841, 842, 7, 118, 2, 2, 842, 843, 7, 99, 2, 2, 843, 844, 7, 118, 2, 2, 844, 845, 7, 107, 2, 2, 845, 846, 7, 101, 2, 2, 846, 847, 7, 99, 2, 2, 847, 848, 7, 110, 2, 2, 848, 849, 7, 110, 2, 2, 849, 850, 7, 123, 2, 2, 850, 198, 3, 2, 2, 2, 851, 852, 7, 107, 2, 2, 852, 853, 7, 117, 2, 2, 853, 200, 3, 2, 2, 2, 854, 855, 7, 118, 2, 2, 855, 856, 7, 116, 2, 2, 856, 857, 7, 103, 2, 2, 857, 858, 7, 99, 2, 2, 858, 859, 7, 118, 2, 2, 859, 202, 3, 2, 2, 2, 860, 861, 7, 101, 2, 2, 861, 862, 7, 99, 2, 2, 862, 863, 7, 117, 2, 2, 863, 864, 7, 118, 2, 2, 864, 204, 3, 2, 2, 2, 865, 866, 7, 101, 2, 2, 866, 867, 7, 99, 2, 2, 867, 868, 7, 117, 2, 2, 868, 869, 7, 118, 2, 2, 869, 870, 7, 99, 2, 2, 870, 871, 7, 100, 2, 2, 871, 872, 7, 110, 2, 2, 872, 873, 7, 103, 2, 2, 873, 206, 3, 2, 2, 2, 874, 875, 7, 120, 2, 2, 875, 876, 7, 103, 2, 2, 876, 877, 7, 116, 2, 2, 877, 878, 7, 117, 2, 2, 878, 879, 7, 107, 2, 2, 879, 880, 7, 113, 2, 2, 880, 881, 7, 112, 2, 2, 881, 208, 3, 2, 2, 2, 882, 883, 7, 108, 2, 2, 883, 884, 7, 117, 2, 2, 884, 885, 7, 113, 2, 2, 885, 886, 7, 112, 2, 2, 886, 887, 7, 107, 2, 2, 887, 888, 7, 115, 2, 2, 888, 210, 3, 2, 2, 2, 889, 890, 7, 119, 2, 2, 890, 891, 7, 112, 2, 2, 891, 892, 7, 113, 2, 2, 892, 893, 7, 116, 2, 2, 893, 894, 7, 102, 2, 2, 894, 895, 7, 103, 2, 2, 895, 896, 7, 116, 2, 2, 896, 897, 7, 103, 2, 2, 897, 898, 7, 102, 2, 2, 898, 212, 3, 2, 2, 2, 899, 900, 7, 118, 2, 2, 900, 901, 7, 116, 2, 2, 901, 902, 7, 119, 2, 2, 902, 903, 7, 103, 2, 2, 903, 214, 3, 2, 2, 2, 904, 905, 7, 104, 2, 2, 905, 906, 7, 99, 2, 2, 906, 907, 7, 110, 2, 2, 907, 908, 7, 117, 2, 2, 908, 909, 7, 103, 2, 2, 909, 216, 3, 2, 2, 2, 910, 911, 7, 118, 2, 2, 911, 912, 7, 123, 2, 2, 912, 913, 7, 114, 2, 2, 913, 914, 7, 103, 2, 2, 914, 218, 3, 2, 2, 2, 915, 916, 7, 120, 2, 2, 916, 917, 7, 99, 2, 2, 917, 918, 7, 110, 2, 2, 918, 919, 7, 107, 2, 2, 919, 920, 7, 102, 2, 2, 920, 921, 7, 99, 2, 2, 921, 922, 7, 118, 2, 2, 922, 923, 7, 103, 2, 2, 923, 220, 3, 2, 2, 2, 924, 925, 7, 99, 2, 2, 925, 926, 7, 112, 2, 2, 926, 927, 7, 112, 2, 2, 927, 928, 7, 113, 2, 2, 928, 929, 7, 118, 2, 2, 929, 930, 7, 99, 2, 2, 930, 931, 7, 118, 2, 2, 931, 932, 7, 103, 2, 2, 932, 222, 3, 2, 2, 2, 933, 934, 7, 102, 2, 2, 934, 935, 7, 103, 2, 2, 935, 936, 7, 101, 2, 2, 936, 937, 7, 110, 2, 2, 937, 938, 7, 99, 2, 2, 938, 939, 7, 116, 2, 2, 939, 940, 7, 103, 2, 2, 940, 224, 3, 2, 2, 2, 941, 942, 7, 101, 2, 2, 942, 943, 7, 113, 2, 2, 943, 944, 7, 112, 2, 2, 944, 945, 7, 118, 2, 2, 945, 946, 7, 103, 2, 2, 946, 947, 7, 122, 2, 2, 947, 948, 7, 118, 2, 2, 948, 226, 3, 2, 2, 2, 949, 950, 7, 107, 2, 2, 950, 951, 7, 118, 2, 2, 951, 952, 7, 103, 2, 2, 952, 953, 7, 111, 2, 2, 953, 228, 3, 2, 2, 2, 954, 955, 7, 120, 2, 2, 955, 956, 7, 99, 2, 2, 956, 957, 7, 116, 2, 2, 957, 958, 7, 107, 2, 2, 958, 959, 7, 99, 2, 2, 959, 960, 7, 100, 2, 2, 960, 961, 7, 110, 2, 2, 961, 962, 7, 103, 2, 2, 962, 230, 3, 2, 2, 2, 963, 964, 7, 107, 2, 2, 964, 965, 7, 112, 2, 2, 965, 966, 7, 117, 2, 2, 966, 967, 7, 103, 2, 2, 967, 968, 7, 116, 2, 2, 968, 969, 7, 118, 2, 2, 969, 232, 3, 2, 2, 2, 970, 971, 7, 102, 2, 2, 971, 972, 7, 103, 2, 2, 972, 973, 7, 110, 2, 2, 973, 974, 7, 103, 2, 2, 974, 975, 7, 118, 2, 2, 975, 976, 7, 103, 2, 2, 976, 234, 3, 2, 2, 2, 977, 978, 7, 116, 2, 2, 978, 979, 7, 103, 2, 2, 979, 980, 7, 112, 2, 2, 980, 981, 7, 99, 2, 2, 981, 982, 7, 111, 2, 2, 982, 983, 7, 103, 2, 2, 983, 236, 3, 2, 2, 2, 984, 985, 7, 116, 2, 2, 985, 986, 7, 103, 2, 2, 986, 987, 7, 114, 2, 2, 987, 988, 7, 110, 2, 2, 988, 989, 7, 99, 2, 2, 989, 990, 7, 101, 2, 2, 990, 991, 7, 103, 2, 2, 991, 238, 3, 2, 2, 2, 992, 993, 7, 101, 2, 2, 993, 994, 7, 113, 2, 2, 994, 995, 7, 114, 2, 2, 995, 996, 7, 123, 2, 2, 996, 240, 3, 2, 2, 2, 997, 998, 7, 111, 2, 2, 998, 999, 7, 113, 2, 2, 999, 1000, 7, 102, 2, 2, 1000, 1001, 7, 107, 2, 2, 1001, 1002, 7, 104, 2, 2, 1002, 1003, 7, 123, 2, 2, 1003, 242, 3, 2, 2, 2, 1004, 1005, 7, 99, 2, 2, 1005, 1006, 7, 114, 2, 2, 1006, 1007, 7, 114, 2, 2, 1007, 1008, 7, 103, 2, 2, 1008, 1009, 7, 112, 2, 2, 1009, 1010, 7, 102, 2, 2, 1010, 244, 3, 2, 2, 2, 1011, 1012, 7, 107, 2, 2, 1012, 1013, 7, 112, 2, 2, 1013, 1014, 7, 118, 2, 2, 1014, 1015, 7, 113, 2, 2, 1015, 246, 3, 2, 2, 2, 1016, 1017, 7, 120, 2, 2, 1017, 1018, 7, 99, 2, 2, 1018, 1019, 7, 110, 2, 2, 1019, 1020, 7, 119, 2, 2, 1020, 1021, 7, 103, 2, 2, 1021, 248, 3, 2, 2, 2, 1022, 1023, 7, 121, 2, 2, 1023, 1024, 7, 107, 2, 2, 1024, 1025, 7, 118, 2, 2, 1025, 1026, 7, 106, 2, 2, 1026, 250, 3, 2, 2, 2, 1027, 1028, 7, 114, 2, 2, 1028, 1029, 7, 113, 2, 2, 1029, 1030, 7, 117, 2, 2, 1030, 1031, 7, 107, 2, 2, 1031, 1032, 7, 118, 2, 2, 1032, 1033, 7, 107, 2, 2, 1033, 1034, 7, 113, 2, 2, 1034, 1035, 7, 112, 2, 2, 1035, 252, 3, 2, 2, 2, 1036, 1037, 7, 108, 2, 2, 1037, 1038, 7, 117, 2, 2, 1038, 1039, 7, 113, 2, 2, 1039, 1040, 7, 112, 2, 2, 1040, 254, 3, 2, 2, 2, 1041, 1042, 7, 119, 2, 2, 1042, 1043, 7, 114, 2, 2, 1043, 1044, 7, 102, 2, 2, 1044, 1045, 7, 99, 2, 2, 1045, 1046, 7, 118, 2, 2, 1046, 1047, 7, 107, 2, 2, 1047, 1048, 7, 112, 2, 2, 1048, 1049, 7, 105, 2, 2, 1049, 256, 3, 2, 2, 2, 1050, 1051, 7, 100, 2, 2, 1051, 1052, 7, 116, 2, 2, 1052, 1053, 7, 103, 2, 2, 1053, 1054, 7, 99, 2, 2, 1054, 1055, 7, 109, 2, 2, 1055, 258, 3, 2, 2, 2, 1056, 1057, 7, 110, 2, 2, 1057, 1058, 7, 113, 2, 2, 1058, 1059, 7, 113, 2, 2, 1059, 1060, 7, 114, 2, 2, 1060, 260, 3, 2, 2, 2, 1061, 1062, 7, 101, 2, 2, 1062, 1063, 7, 113, 2, 2, 1063, 1064, 7, 112, 2, 2, 1064, 1065, 7, 118, 2, 2, 1065, 1066, 7, 107, 2, 2, 1066, 1067, 7, 112, 2, 2, 1067, 1068, 7, 119, 2, 2, 1068, 1069, 7, 103, 2, 2, 1069, 262, 3, 2, 2, 2, 1070, 1071, 7, 103, 2, 2, 1071, 1072, 7, 122, 2, 2, 1072, 1073, 7, 107, 2, 2, 1073, 1074, 7, 118, 2, 2, 1074, 264, 3, 2, 2, 2, 1075, 1076, 7, 116, 2, 2, 1076, 1077, 7, 103, 2, 2, 1077, 1078, 7, 118, 2, 2, 1078, 1079, 7, 119, 2, 2, 1079, 1080, 7, 116, 2, 2, 1080, 1081, 7, 112, 2, 2, 1081, 1082, 7, 107, 2, 2, 1082, 1083, 7, 112, 2, 2, 1083, 1084, 7, 105, 2, 2, 1084, 266, 3, 2, 2, 2, 1085, 1086, 7, 121, 2, 2, 1086, 1087, 7, 106, 2, 2, 1087, 1088, 7, 107, 2, 2, 1088, 1089, 7, 110, 2, 2, 1089, 1090, 7, 103, 2, 2, 1090, 268, 3, 2, 2, 2, 1091, 1096, 7, 36, 2, 2, 1092, 1095, 5, 271, 136, 2, 1093, 1095, 10, 2, 2, 2, 1094, 1092, 3, 2, 2, 2, 1094, 1093, 3, 2, 2, 2, 1095, 1098, 3, 2, 2, 2, 1096, 1094, 3, 2, 2, 2, 1096, 1097, 3, 2, 2, 2, 1097, 1099, 3, 2, 2, 2, 1098, 1096, 3, 2, 2, 2, 1099, 1100, 7, 36, 2, 2, 1100, 270, 3, 2, 2, 2, 1101, 1104, 7, 94, 2, 2, 1102, 1105, 9, 3, 2, 2, 1103, 1105, 5, 273, 137, 2, 1104, 1102, 3, 2, 2, 2, 1104, 1103, 3, 2, 2, 2, 1105, 272, 3, 2, 2, 2, 1106, 1107, 7, 119, 2, 2, 1107, 1108, 5, 275, 138, 2, 1108, 1109, 5, 275, 138, 2, 1109, 1110, 5, 275, 138, 2, 1110, 1111, 5, 275, 138, 2, 1111, 274, 3, 2, 2, 2, 1112, 1113, 9, 4, 2, 2, 1113, 276, 3, 2, 2, 2, 1114, 1115, 7, 65, 2, 2, 1115, 278, 3, 2, 2, 2, 1116, 1117, 7, 112, 2, 2, 1117, 1118, 7, 119, 2, 2, 1118, 1119, 7, 110, 2, 2, 1119, 1120, 7, 110, 2, 2, 1120, 280, 3, 2, 2, 2, 1121, 1122, 5, 283, 142, 2, 1122, 282, 3, 2, 2, 2, 1123, 1127, 5, 285, 143, 2, 1124, 1127, 5, 287, 144, 2, 1125, 1127, 5, 289, 145, 2, 1126, 1123, 3, 2, 2, 2, 1126, 1124, 3, 2, 2, 2, 1126, 1125, 3, 2, 2, 2, 1127, 284, 3, 2, 2, 2, 1128, 1129, 5, 291, 146, 2, 1129, 286, 3, 2, 2, 2, 1130, 1131, 7, 48, 2, 2, 1131, 1141, 5, 291, 146, 2, 1132, 1133, 5, 291, 146, 2, 1133, 1137, 7, 48, 2, 2, 1134, 1136, 9, 5, 2, 2, 1135, 1134, 3, 2, 2, 2, 1136, 1139, 3, 2, 2, 2, 1137, 1135, 3, 2, 2, 2, 1137, 1138, 3, 2, 2, 2, 1138, 1141, 3, 2, 2, 2, 1139, 1137, 3, 2, 2, 2, 1140, 1130, 3, 2, 2, 2, 1140, 1132, 3, 2, 2, 2, 1141, 288, 3, 2, 2, 2, 1142, 1143, 7, 48, 2, 2, 1143, 1155, 5, 291, 146, 2, 1144, 1152, 5, 291, 146, 2, 1145, 1149, 7, 48, 2, 2, 1146, 1148, 9, 5, 2, 2, 1147, 1146, 3, 2, 2, 2, 1148, 1151, 3, 2, 2, 2, 1149, 1147, 3, 2, 2, 2, 1149, 1150, 3, 2, 2, 2, 1150, 1153, 3, 2, 2, 2, 1151, 1149, 3, 2, 2, 2, 1152, 1145, 3, 2, 2, 2, 1152, 1153, 3, 2, 2, 2, 1153, 1155, 3, 2, 2, 2, 1154, 1142, 3, 2, 2, 2, 1154, 1144, 3, 2, 2, 2, 1155, 1156, 3, 2, 2, 2, 1156, 1158, 9, 6, 2, 2, 1157, 1159, 9, 7, 2, 2, 1158, 1157, 3, 2, 2, 2, 1158, 1159, 3, 2, 2, 2, 1159, 1160, 3, 2, 2, 2, 1160, 1161, 5, 291, 146, 2, 1161, 290, 3, 2, 2, 2, 1162, 1164, 9, 5, 2, 2, 1163, 1162, 3, 2, 2, 2, 1164, 1165, 3, 2, 2, 2, 1165, 1163, 3, 2, 2, 2, 1165, 1166, 3, 2, 2, 2, 1166, 292, 3, 2, 2, 2, 1167, 1168, 9, 8, 2, 2, 1168, 1169, 3, 2, 2, 2, 1169, 1170, 8, 147, 2, 2, 1170, 294, 3, 2, 2, 2, 1171, 1175, 5, 297, 149, 2, 1172, 1174, 5, 299, 150, 2, 1173, 1172, 3, 2, 2, 2, 1174, 1177, 3, 2, 2, 2, 1175, 1173, 3, 2, 2, 2, 1175, 1176, 3, 2, 2, 2, 1176, 296, 3, 2, 2, 2, 1177, 1175, 3, 2, 2, 2, 1178, 1180, 9, 9, 2, 2, 1179, 1178, 3, 2, 2, 2, 1180, 298, 3, 2, 2, 2, 1181, 1184, 5, 297, 149, 2, 1182, 1184, 9, 10, 2, 2, 1183, 1181, 3, 2, 2, 2, 1183, 1182, 3, 2, 2, 2, 1184, 300, 3, 2, 2, 2, 1185, 1186, 7, 42, 2, 2, 1186, 1195, 7, 60, 2, 2, 1187, 1194, 5, 301, 151, 2, 1188, 1189, 7, 42, 2, 2, 1189, 1194, 10, 11, 2, 2, 1190, 1191, 7, 60, 2, 2, 1191, 1194, 10, 12, 2, 2, 1192, 1194, 10, 13, 2, 2, 1193, 1187, 3, 2, 2, 2, 1193, 1188, 3, 2, 2, 2, 1193, 1190, 3, 2, 2, 2, 1193, 1192, 3, 2, 2, 2, 1194, 1197, 3, 2, 2, 2, 1195, 1193, 3, 2, 2, 2, 1195, 1196, 3, 2, 2, 2, 1196, 1199, 3, 2, 2, 2, 1197, 1195, 3, 2, 2, 2, 1198, 1200, 7, 60, 2, 2, 1199, 1198, 3, 2, 2, 2, 1200, 1201, 3, 2, 2, 2, 1201, 1199, 3, 2, 2, 2, 1201, 1202, 3, 2, 2, 2, 1202, 1203, 3, 2, 2, 2, 1203, 1204, 7, 43, 2, 2, 1204, 1205, 3, 2, 2, 2, 1205, 1206, 8, 151, 2, 2, 1206, 302, 3, 2, 2, 2, 1207, 1208, 10, 14, 2, 2, 1208, 304, 3, 2, 2, 2, 20, 2, 1094, 1096, 1104, 1126, 1137, 1140, 1149, 1152, 1154, 1158, 1165, 1175, 1179, 1183, 1193, 1195, 1201, 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 1b99efc9dc..6edd67492b 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java
@@ -39,11 +39,11 @@ public class JsoniqLexer extends Lexer {
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;
+ Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126,
+ Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132,
+ Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137,
+ NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141,
+ WS=142, NCName=143, XQComment=144, ContentChar=145;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -70,9 +70,9 @@ private static String[] makeRuleNames() {
"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",
+ "Kinto", "Kvalue", "Kwith", "Kposition", "Kjson", "Kupdating", "Kbreak",
+ "Kloop", "Kcontinue", "Kexit", "Kreturning", "Kwhile", "STRING", "ESC",
+ "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral",
"IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS",
"NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar"
};
@@ -98,9 +98,9 @@ private static String[] makeLiteralNames() {
"'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'"
+ "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'",
+ "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -119,10 +119,10 @@ private static String[] makeSymbolicNames() {
"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",
+ "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith",
+ "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit",
+ "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral",
+ "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
"WS", "NCName", "XQComment", "ContentChar"
};
}
@@ -185,7 +185,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\u0093\u04b9\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"+
@@ -204,65 +204,66 @@ 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"+
+ "\4\u0097\t\u0097\4\u0098\t\u0098\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\3"+
+ "A\3A\3B\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3"+
+ "F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3"+
+ "K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3"+
+ "Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3"+
+ "S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3"+
+ "W\3W\3W\3X\3X\3X\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\3c\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f"+
+ "\3g\3g\3g\3g\3g\3g\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i"+
+ "\3i\3j\3j\3j\3j\3j\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m"+
+ "\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p"+
+ "\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s"+
+ "\3s\3s\3s\3s\3s\3s\3t\3t\3t\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\3u\3v\3v\3v"+
+ "\3v\3v\3v\3v\3w\3w\3w\3w\3w\3w\3w\3w\3x\3x\3x\3x\3x\3y\3y\3y\3y\3y\3y"+
+ "\3y\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\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\u0081\3\u0082\3\u0082\3\u0082\3\u0082"+
+ "\3\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+
+ "\3\u0083\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\u0085\3\u0085\3\u0085\3\u0086\3\u0086"+
+ "\3\u0086\3\u0086\3\u0086\3\u0086\3\u0087\3\u0087\3\u0087\7\u0087\u0447"+
+ "\n\u0087\f\u0087\16\u0087\u044a\13\u0087\3\u0087\3\u0087\3\u0088\3\u0088"+
+ "\3\u0088\5\u0088\u0451\n\u0088\3\u0089\3\u0089\3\u0089\3\u0089\3\u0089"+
+ "\3\u0089\3\u008a\3\u008a\3\u008b\3\u008b\3\u008c\3\u008c\3\u008c\3\u008c"+
+ "\3\u008c\3\u008d\3\u008d\3\u008e\3\u008e\3\u008e\5\u008e\u0467\n\u008e"+
+ "\3\u008f\3\u008f\3\u0090\3\u0090\3\u0090\3\u0090\3\u0090\7\u0090\u0470"+
+ "\n\u0090\f\u0090\16\u0090\u0473\13\u0090\5\u0090\u0475\n\u0090\3\u0091"+
+ "\3\u0091\3\u0091\3\u0091\3\u0091\7\u0091\u047c\n\u0091\f\u0091\16\u0091"+
+ "\u047f\13\u0091\5\u0091\u0481\n\u0091\5\u0091\u0483\n\u0091\3\u0091\3"+
+ "\u0091\5\u0091\u0487\n\u0091\3\u0091\3\u0091\3\u0092\6\u0092\u048c\n\u0092"+
+ "\r\u0092\16\u0092\u048d\3\u0093\3\u0093\3\u0093\3\u0093\3\u0094\3\u0094"+
+ "\7\u0094\u0496\n\u0094\f\u0094\16\u0094\u0499\13\u0094\3\u0095\5\u0095"+
+ "\u049c\n\u0095\3\u0096\3\u0096\5\u0096\u04a0\n\u0096\3\u0097\3\u0097\3"+
+ "\u0097\3\u0097\3\u0097\3\u0097\3\u0097\3\u0097\7\u0097\u04aa\n\u0097\f"+
+ "\u0097\16\u0097\u04ad\13\u0097\3\u0097\6\u0097\u04b0\n\u0097\r\u0097\16"+
+ "\u0097\u04b1\3\u0097\3\u0097\3\u0097\3\u0097\3\u0098\3\u0098\2\2\u0099"+
"\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"+
@@ -274,25 +275,25 @@ public JsoniqLexer(CharStream input) {
"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"+
+ "\u0088\u010f\2\u0111\2\u0113\2\u0115\u0089\u0117\u008a\u0119\u008b\u011b"+
+ "\u008c\u011d\u008d\u011f\u008e\u0121\u008f\u0123\2\u0125\u0090\u0127\u0091"+
+ "\u0129\2\u012b\2\u012d\u0092\u012f\u0093\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\2"+
+ "C\\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\u04c5\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\2"+
+ "Q\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\2"+
+ "w\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"+
@@ -307,298 +308,301 @@ public JsoniqLexer(CharStream input) {
"\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";
+ "\3\2\2\2\2\u010b\3\2\2\2\2\u010d\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\u0125\3\2\2\2\2\u0127\3\2\2\2\2\u012d\3\2\2\2\2\u012f\3\2\2"+
+ "\2\3\u0131\3\2\2\2\5\u0133\3\2\2\2\7\u013a\3\2\2\2\t\u0144\3\2\2\2\13"+
+ "\u0146\3\2\2\2\r\u0148\3\2\2\2\17\u014b\3\2\2\2\21\u014d\3\2\2\2\23\u014f"+
+ "\3\2\2\2\25\u0151\3\2\2\2\27\u0153\3\2\2\2\31\u0155\3\2\2\2\33\u0157\3"+
+ "\2\2\2\35\u0159\3\2\2\2\37\u015b\3\2\2\2!\u0164\3\2\2\2#\u016c\3\2\2\2"+
+ "%\u017b\3\2\2\2\'\u017d\3\2\2\2)\u018f\3\2\2\2+\u01a2\3\2\2\2-\u01ab\3"+
+ "\2\2\2/\u01b6\3\2\2\2\61\u01ba\3\2\2\2\63\u01c2\3\2\2\2\65\u01cc\3\2\2"+
+ "\2\67\u01d7\3\2\2\29\u01dd\3\2\2\2;\u01ef\3\2\2\2=\u01f6\3\2\2\2?\u01ff"+
+ "\3\2\2\2A\u0208\3\2\2\2C\u020f\3\2\2\2E\u0217\3\2\2\2G\u021f\3\2\2\2I"+
+ "\u0226\3\2\2\2K\u0229\3\2\2\2M\u022c\3\2\2\2O\u022f\3\2\2\2Q\u0232\3\2"+
+ "\2\2S\u0235\3\2\2\2U\u0238\3\2\2\2W\u023b\3\2\2\2Y\u023d\3\2\2\2[\u0240"+
+ "\3\2\2\2]\u0242\3\2\2\2_\u0245\3\2\2\2a\u0248\3\2\2\2c\u024a\3\2\2\2e"+
+ "\u024c\3\2\2\2g\u0250\3\2\2\2i\u0255\3\2\2\2k\u0259\3\2\2\2m\u025b\3\2"+
+ "\2\2o\u025d\3\2\2\2q\u025f\3\2\2\2s\u0261\3\2\2\2u\u0264\3\2\2\2w\u0266"+
+ "\3\2\2\2y\u0269\3\2\2\2{\u026c\3\2\2\2}\u0270\3\2\2\2\177\u0274\3\2\2"+
+ "\2\u0081\u027a\3\2\2\2\u0083\u0280\3\2\2\2\u0085\u0283\3\2\2\2\u0087\u0289"+
+ "\3\2\2\2\u0089\u0290\3\2\2\2\u008b\u0293\3\2\2\2\u008d\u0296\3\2\2\2\u008f"+
+ "\u0299\3\2\2\2\u0091\u029c\3\2\2\2\u0093\u02a5\3\2\2\2\u0095\u02ab\3\2"+
+ "\2\2\u0097\u02b1\3\2\2\2\u0099\u02b8\3\2\2\2\u009b\u02c2\3\2\2\2\u009d"+
+ "\u02cd\3\2\2\2\u009f\u02d2\3\2\2\2\u00a1\u02d8\3\2\2\2\u00a3\u02e2\3\2"+
+ "\2\2\u00a5\u02ec\3\2\2\2\u00a7\u02f5\3\2\2\2\u00a9\u02fb\3\2\2\2\u00ab"+
+ "\u0302\3\2\2\2\u00ad\u0307\3\2\2\2\u00af\u030b\3\2\2\2\u00b1\u0311\3\2"+
+ "\2\2\u00b3\u0319\3\2\2\2\u00b5\u031e\3\2\2\2\u00b7\u0323\3\2\2\2\u00b9"+
+ "\u032e\3\2\2\2\u00bb\u0331\3\2\2\2\u00bd\u0335\3\2\2\2\u00bf\u0339\3\2"+
+ "\2\2\u00c1\u033c\3\2\2\2\u00c3\u0345\3\2\2\2\u00c5\u0348\3\2\2\2\u00c7"+
+ "\u0353\3\2\2\2\u00c9\u0356\3\2\2\2\u00cb\u035c\3\2\2\2\u00cd\u0361\3\2"+
+ "\2\2\u00cf\u036a\3\2\2\2\u00d1\u0372\3\2\2\2\u00d3\u0379\3\2\2\2\u00d5"+
+ "\u0383\3\2\2\2\u00d7\u0388\3\2\2\2\u00d9\u038e\3\2\2\2\u00db\u0393\3\2"+
+ "\2\2\u00dd\u039c\3\2\2\2\u00df\u03a5\3\2\2\2\u00e1\u03ad\3\2\2\2\u00e3"+
+ "\u03b5\3\2\2\2\u00e5\u03ba\3\2\2\2\u00e7\u03c3\3\2\2\2\u00e9\u03ca\3\2"+
+ "\2\2\u00eb\u03d1\3\2\2\2\u00ed\u03d8\3\2\2\2\u00ef\u03e0\3\2\2\2\u00f1"+
+ "\u03e5\3\2\2\2\u00f3\u03ec\3\2\2\2\u00f5\u03f3\3\2\2\2\u00f7\u03f8\3\2"+
+ "\2\2\u00f9\u03fe\3\2\2\2\u00fb\u0403\3\2\2\2\u00fd\u040c\3\2\2\2\u00ff"+
+ "\u0411\3\2\2\2\u0101\u041a\3\2\2\2\u0103\u0420\3\2\2\2\u0105\u0425\3\2"+
+ "\2\2\u0107\u042e\3\2\2\2\u0109\u0433\3\2\2\2\u010b\u043d\3\2\2\2\u010d"+
+ "\u0443\3\2\2\2\u010f\u044d\3\2\2\2\u0111\u0452\3\2\2\2\u0113\u0458\3\2"+
+ "\2\2\u0115\u045a\3\2\2\2\u0117\u045c\3\2\2\2\u0119\u0461\3\2\2\2\u011b"+
+ "\u0466\3\2\2\2\u011d\u0468\3\2\2\2\u011f\u0474\3\2\2\2\u0121\u0482\3\2"+
+ "\2\2\u0123\u048b\3\2\2\2\u0125\u048f\3\2\2\2\u0127\u0493\3\2\2\2\u0129"+
+ "\u049b\3\2\2\2\u012b\u049f\3\2\2\2\u012d\u04a1\3\2\2\2\u012f\u04b7\3\2"+
+ "\2\2\u0131\u0132\7=\2\2\u0132\4\3\2\2\2\u0133\u0134\7o\2\2\u0134\u0135"+
+ "\7q\2\2\u0135\u0136\7f\2\2\u0136\u0137\7w\2\2\u0137\u0138\7n\2\2\u0138"+
+ "\u0139\7g\2\2\u0139\6\3\2\2\2\u013a\u013b\7p\2\2\u013b\u013c\7c\2\2\u013c"+
+ "\u013d\7o\2\2\u013d\u013e\7g\2\2\u013e\u013f\7u\2\2\u013f\u0140\7r\2\2"+
+ "\u0140\u0141\7c\2\2\u0141\u0142\7e\2\2\u0142\u0143\7g\2\2\u0143\b\3\2"+
+ "\2\2\u0144\u0145\7?\2\2\u0145\n\3\2\2\2\u0146\u0147\7&\2\2\u0147\f\3\2"+
+ "\2\2\u0148\u0149\7<\2\2\u0149\u014a\7?\2\2\u014a\16\3\2\2\2\u014b\u014c"+
+ "\7}\2\2\u014c\20\3\2\2\2\u014d\u014e\7\177\2\2\u014e\22\3\2\2\2\u014f"+
+ "\u0150\7*\2\2\u0150\24\3\2\2\2\u0151\u0152\7+\2\2\u0152\26\3\2\2\2\u0153"+
+ "\u0154\7,\2\2\u0154\30\3\2\2\2\u0155\u0156\7~\2\2\u0156\32\3\2\2\2\u0157"+
+ "\u0158\7\'\2\2\u0158\34\3\2\2\2\u0159\u015a\7.\2\2\u015a\36\3\2\2\2\u015b"+
+ "\u015c\7q\2\2\u015c\u015d\7t\2\2\u015d\u015e\7f\2\2\u015e\u015f\7g\2\2"+
+ "\u015f\u0160\7t\2\2\u0160\u0161\7k\2\2\u0161\u0162\7p\2\2\u0162\u0163"+
+ "\7i\2\2\u0163 \3\2\2\2\u0164\u0165\7q\2\2\u0165\u0166\7t\2\2\u0166\u0167"+
+ "\7f\2\2\u0167\u0168\7g\2\2\u0168\u0169\7t\2\2\u0169\u016a\7g\2\2\u016a"+
+ "\u016b\7f\2\2\u016b\"\3\2\2\2\u016c\u016d\7f\2\2\u016d\u016e\7g\2\2\u016e"+
+ "\u016f\7e\2\2\u016f\u0170\7k\2\2\u0170\u0171\7o\2\2\u0171\u0172\7c\2\2"+
+ "\u0172\u0173\7n\2\2\u0173\u0174\7/\2\2\u0174\u0175\7h\2\2\u0175\u0176"+
+ "\7q\2\2\u0176\u0177\7t\2\2\u0177\u0178\7o\2\2\u0178\u0179\7c\2\2\u0179"+
+ "\u017a\7v\2\2\u017a$\3\2\2\2\u017b\u017c\7<\2\2\u017c&\3\2\2\2\u017d\u017e"+
+ "\7f\2\2\u017e\u017f\7g\2\2\u017f\u0180\7e\2\2\u0180\u0181\7k\2\2\u0181"+
+ "\u0182\7o\2\2\u0182\u0183\7c\2\2\u0183\u0184\7n\2\2\u0184\u0185\7/\2\2"+
+ "\u0185\u0186\7u\2\2\u0186\u0187\7g\2\2\u0187\u0188\7r\2\2\u0188\u0189"+
+ "\7c\2\2\u0189\u018a\7t\2\2\u018a\u018b\7c\2\2\u018b\u018c\7v\2\2\u018c"+
+ "\u018d\7q\2\2\u018d\u018e\7t\2\2\u018e(\3\2\2\2\u018f\u0190\7i\2\2\u0190"+
+ "\u0191\7t\2\2\u0191\u0192\7q\2\2\u0192\u0193\7w\2\2\u0193\u0194\7r\2\2"+
+ "\u0194\u0195\7k\2\2\u0195\u0196\7p\2\2\u0196\u0197\7i\2\2\u0197\u0198"+
+ "\7/\2\2\u0198\u0199\7u\2\2\u0199\u019a\7g\2\2\u019a\u019b\7r\2\2\u019b"+
+ "\u019c\7c\2\2\u019c\u019d\7t\2\2\u019d\u019e\7c\2\2\u019e\u019f\7v\2\2"+
+ "\u019f\u01a0\7q\2\2\u01a0\u01a1\7t\2\2\u01a1*\3\2\2\2\u01a2\u01a3\7k\2"+
+ "\2\u01a3\u01a4\7p\2\2\u01a4\u01a5\7h\2\2\u01a5\u01a6\7k\2\2\u01a6\u01a7"+
+ "\7p\2\2\u01a7\u01a8\7k\2\2\u01a8\u01a9\7v\2\2\u01a9\u01aa\7{\2\2\u01aa"+
+ ",\3\2\2\2\u01ab\u01ac\7o\2\2\u01ac\u01ad\7k\2\2\u01ad\u01ae\7p\2\2\u01ae"+
+ "\u01af\7w\2\2\u01af\u01b0\7u\2\2\u01b0\u01b1\7/\2\2\u01b1\u01b2\7u\2\2"+
+ "\u01b2\u01b3\7k\2\2\u01b3\u01b4\7i\2\2\u01b4\u01b5\7p\2\2\u01b5.\3\2\2"+
+ "\2\u01b6\u01b7\7P\2\2\u01b7\u01b8\7c\2\2\u01b8\u01b9\7P\2\2\u01b9\60\3"+
+ "\2\2\2\u01ba\u01bb\7r\2\2\u01bb\u01bc\7g\2\2\u01bc\u01bd\7t\2\2\u01bd"+
+ "\u01be\7e\2\2\u01be\u01bf\7g\2\2\u01bf\u01c0\7p\2\2\u01c0\u01c1\7v\2\2"+
+ "\u01c1\62\3\2\2\2\u01c2\u01c3\7r\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7"+
+ "t\2\2\u01c5\u01c6\7/\2\2\u01c6\u01c7\7o\2\2\u01c7\u01c8\7k\2\2\u01c8\u01c9"+
+ "\7n\2\2\u01c9\u01ca\7n\2\2\u01ca\u01cb\7g\2\2\u01cb\64\3\2\2\2\u01cc\u01cd"+
+ "\7|\2\2\u01cd\u01ce\7g\2\2\u01ce\u01cf\7t\2\2\u01cf\u01d0\7q\2\2\u01d0"+
+ "\u01d1\7/\2\2\u01d1\u01d2\7f\2\2\u01d2\u01d3\7k\2\2\u01d3\u01d4\7i\2\2"+
+ "\u01d4\u01d5\7k\2\2\u01d5\u01d6\7v\2\2\u01d6\66\3\2\2\2\u01d7\u01d8\7"+
+ "f\2\2\u01d8\u01d9\7k\2\2\u01d9\u01da\7i\2\2\u01da\u01db\7k\2\2\u01db\u01dc"+
+ "\7v\2\2\u01dc8\3\2\2\2\u01dd\u01de\7r\2\2\u01de\u01df\7c\2\2\u01df\u01e0"+
+ "\7v\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7t\2\2\u01e3"+
+ "\u01e4\7p\2\2\u01e4\u01e5\7/\2\2\u01e5\u01e6\7u\2\2\u01e6\u01e7\7g\2\2"+
+ "\u01e7\u01e8\7r\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\7t\2\2\u01ea\u01eb"+
+ "\7c\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7q\2\2\u01ed\u01ee\7t\2\2\u01ee"+
+ ":\3\2\2\2\u01ef\u01f0\7k\2\2\u01f0\u01f1\7o\2\2\u01f1\u01f2\7r\2\2\u01f2"+
+ "\u01f3\7q\2\2\u01f3\u01f4\7t\2\2\u01f4\u01f5\7v\2\2\u01f5<\3\2\2\2\u01f6"+
+ "\u01f7\7g\2\2\u01f7\u01f8\7z\2\2\u01f8\u01f9\7v\2\2\u01f9\u01fa\7g\2\2"+
+ "\u01fa\u01fb\7t\2\2\u01fb\u01fc\7p\2\2\u01fc\u01fd\7c\2\2\u01fd\u01fe"+
+ "\7n\2\2\u01fe>\3\2\2\2\u01ff\u0200\7h\2\2\u0200\u0201\7w\2\2\u0201\u0202"+
+ "\7p\2\2\u0202\u0203\7e\2\2\u0203\u0204\7v\2\2\u0204\u0205\7k\2\2\u0205"+
+ "\u0206\7q\2\2\u0206\u0207\7p\2\2\u0207@\3\2\2\2\u0208\u0209\7l\2\2\u0209"+
+ "\u020a\7u\2\2\u020a\u020b\7q\2\2\u020b\u020c\7w\2\2\u020c\u020d\7p\2\2"+
+ "\u020d\u020e\7f\2\2\u020eB\3\2\2\2\u020f\u0210\7e\2\2\u0210\u0211\7q\2"+
+ "\2\u0211\u0212\7o\2\2\u0212\u0213\7r\2\2\u0213\u0214\7c\2\2\u0214\u0215"+
+ "\7e\2\2\u0215\u0216\7v\2\2\u0216D\3\2\2\2\u0217\u0218\7x\2\2\u0218\u0219"+
+ "\7g\2\2\u0219\u021a\7t\2\2\u021a\u021b\7d\2\2\u021b\u021c\7q\2\2\u021c"+
+ "\u021d\7u\2\2\u021d\u021e\7g\2\2\u021eF\3\2\2\2\u021f\u0220\7u\2\2\u0220"+
+ "\u0221\7e\2\2\u0221\u0222\7j\2\2\u0222\u0223\7g\2\2\u0223\u0224\7o\2\2"+
+ "\u0224\u0225\7c\2\2\u0225H\3\2\2\2\u0226\u0227\7g\2\2\u0227\u0228\7s\2"+
+ "\2\u0228J\3\2\2\2\u0229\u022a\7p\2\2\u022a\u022b\7g\2\2\u022bL\3\2\2\2"+
+ "\u022c\u022d\7n\2\2\u022d\u022e\7v\2\2\u022eN\3\2\2\2\u022f\u0230\7n\2"+
+ "\2\u0230\u0231\7g\2\2\u0231P\3\2\2\2\u0232\u0233\7i\2\2\u0233\u0234\7"+
+ "v\2\2\u0234R\3\2\2\2\u0235\u0236\7i\2\2\u0236\u0237\7g\2\2\u0237T\3\2"+
+ "\2\2\u0238\u0239\7#\2\2\u0239\u023a\7?\2\2\u023aV\3\2\2\2\u023b\u023c"+
+ "\7>\2\2\u023cX\3\2\2\2\u023d\u023e\7>\2\2\u023e\u023f\7?\2\2\u023fZ\3"+
+ "\2\2\2\u0240\u0241\7@\2\2\u0241\\\3\2\2\2\u0242\u0243\7@\2\2\u0243\u0244"+
+ "\7?\2\2\u0244^\3\2\2\2\u0245\u0246\7~\2\2\u0246\u0247\7~\2\2\u0247`\3"+
+ "\2\2\2\u0248\u0249\7-\2\2\u0249b\3\2\2\2\u024a\u024b\7/\2\2\u024bd\3\2"+
+ "\2\2\u024c\u024d\7f\2\2\u024d\u024e\7k\2\2\u024e\u024f\7x\2\2\u024ff\3"+
+ "\2\2\2\u0250\u0251\7k\2\2\u0251\u0252\7f\2\2\u0252\u0253\7k\2\2\u0253"+
+ "\u0254\7x\2\2\u0254h\3\2\2\2\u0255\u0256\7o\2\2\u0256\u0257\7q\2\2\u0257"+
+ "\u0258\7f\2\2\u0258j\3\2\2\2\u0259\u025a\7#\2\2\u025al\3\2\2\2\u025b\u025c"+
+ "\7]\2\2\u025cn\3\2\2\2\u025d\u025e\7_\2\2\u025ep\3\2\2\2\u025f\u0260\7"+
+ "\60\2\2\u0260r\3\2\2\2\u0261\u0262\7&\2\2\u0262\u0263\7&\2\2\u0263t\3"+
+ "\2\2\2\u0264\u0265\7%\2\2\u0265v\3\2\2\2\u0266\u0267\7}\2\2\u0267\u0268"+
+ "\7~\2\2\u0268x\3\2\2\2\u0269\u026a\7~\2\2\u026a\u026b\7\177\2\2\u026b"+
+ "z\3\2\2\2\u026c\u026d\7h\2\2\u026d\u026e\7q\2\2\u026e\u026f\7t\2\2\u026f"+
+ "|\3\2\2\2\u0270\u0271\7n\2\2\u0271\u0272\7g\2\2\u0272\u0273\7v\2\2\u0273"+
+ "~\3\2\2\2\u0274\u0275\7y\2\2\u0275\u0276\7j\2\2\u0276\u0277\7g\2\2\u0277"+
+ "\u0278\7t\2\2\u0278\u0279\7g\2\2\u0279\u0080\3\2\2\2\u027a\u027b\7i\2"+
+ "\2\u027b\u027c\7t\2\2\u027c\u027d\7q\2\2\u027d\u027e\7w\2\2\u027e\u027f"+
+ "\7r\2\2\u027f\u0082\3\2\2\2\u0280\u0281\7d\2\2\u0281\u0282\7{\2\2\u0282"+
+ "\u0084\3\2\2\2\u0283\u0284\7q\2\2\u0284\u0285\7t\2\2\u0285\u0286\7f\2"+
+ "\2\u0286\u0287\7g\2\2\u0287\u0288\7t\2\2\u0288\u0086\3\2\2\2\u0289\u028a"+
+ "\7t\2\2\u028a\u028b\7g\2\2\u028b\u028c\7v\2\2\u028c\u028d\7w\2\2\u028d"+
+ "\u028e\7t\2\2\u028e\u028f\7p\2\2\u028f\u0088\3\2\2\2\u0290\u0291\7k\2"+
+ "\2\u0291\u0292\7h\2\2\u0292\u008a\3\2\2\2\u0293\u0294\7k\2\2\u0294\u0295"+
+ "\7p\2\2\u0295\u008c\3\2\2\2\u0296\u0297\7c\2\2\u0297\u0298\7u\2\2\u0298"+
+ "\u008e\3\2\2\2\u0299\u029a\7c\2\2\u029a\u029b\7v\2\2\u029b\u0090\3\2\2"+
+ "\2\u029c\u029d\7c\2\2\u029d\u029e\7n\2\2\u029e\u029f\7n\2\2\u029f\u02a0"+
+ "\7q\2\2\u02a0\u02a1\7y\2\2\u02a1\u02a2\7k\2\2\u02a2\u02a3\7p\2\2\u02a3"+
+ "\u02a4\7i\2\2\u02a4\u0092\3\2\2\2\u02a5\u02a6\7g\2\2\u02a6\u02a7\7o\2"+
+ "\2\u02a7\u02a8\7r\2\2\u02a8\u02a9\7v\2\2\u02a9\u02aa\7{\2\2\u02aa\u0094"+
+ "\3\2\2\2\u02ab\u02ac\7e\2\2\u02ac\u02ad\7q\2\2\u02ad\u02ae\7w\2\2\u02ae"+
+ "\u02af\7p\2\2\u02af\u02b0\7v\2\2\u02b0\u0096\3\2\2\2\u02b1\u02b2\7u\2"+
+ "\2\u02b2\u02b3\7v\2\2\u02b3\u02b4\7c\2\2\u02b4\u02b5\7d\2\2\u02b5\u02b6"+
+ "\7n\2\2\u02b6\u02b7\7g\2\2\u02b7\u0098\3\2\2\2\u02b8\u02b9\7c\2\2\u02b9"+
+ "\u02ba\7u\2\2\u02ba\u02bb\7e\2\2\u02bb\u02bc\7g\2\2\u02bc\u02bd\7p\2\2"+
+ "\u02bd\u02be\7f\2\2\u02be\u02bf\7k\2\2\u02bf\u02c0\7p\2\2\u02c0\u02c1"+
+ "\7i\2\2\u02c1\u009a\3\2\2\2\u02c2\u02c3\7f\2\2\u02c3\u02c4\7g\2\2\u02c4"+
+ "\u02c5\7u\2\2\u02c5\u02c6\7e\2\2\u02c6\u02c7\7g\2\2\u02c7\u02c8\7p\2\2"+
+ "\u02c8\u02c9\7f\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7p\2\2\u02cb\u02cc"+
+ "\7i\2\2\u02cc\u009c\3\2\2\2\u02cd\u02ce\7u\2\2\u02ce\u02cf\7q\2\2\u02cf"+
+ "\u02d0\7o\2\2\u02d0\u02d1\7g\2\2\u02d1\u009e\3\2\2\2\u02d2\u02d3\7g\2"+
+ "\2\u02d3\u02d4\7x\2\2\u02d4\u02d5\7g\2\2\u02d5\u02d6\7t\2\2\u02d6\u02d7"+
+ "\7{\2\2\u02d7\u00a0\3\2\2\2\u02d8\u02d9\7u\2\2\u02d9\u02da\7c\2\2\u02da"+
+ "\u02db\7v\2\2\u02db\u02dc\7k\2\2\u02dc\u02dd\7u\2\2\u02dd\u02de\7h\2\2"+
+ "\u02de\u02df\7k\2\2\u02df\u02e0\7g\2\2\u02e0\u02e1\7u\2\2\u02e1\u00a2"+
+ "\3\2\2\2\u02e2\u02e3\7e\2\2\u02e3\u02e4\7q\2\2\u02e4\u02e5\7n\2\2\u02e5"+
+ "\u02e6\7n\2\2\u02e6\u02e7\7c\2\2\u02e7\u02e8\7v\2\2\u02e8\u02e9\7k\2\2"+
+ "\u02e9\u02ea\7q\2\2\u02ea\u02eb\7p\2\2\u02eb\u00a4\3\2\2\2\u02ec\u02ed"+
+ "\7i\2\2\u02ed\u02ee\7t\2\2\u02ee\u02ef\7g\2\2\u02ef\u02f0\7c\2\2\u02f0"+
+ "\u02f1\7v\2\2\u02f1\u02f2\7g\2\2\u02f2\u02f3\7u\2\2\u02f3\u02f4\7v\2\2"+
+ "\u02f4\u00a6\3\2\2\2\u02f5\u02f6\7n\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8"+
+ "\7c\2\2\u02f8\u02f9\7u\2\2\u02f9\u02fa\7v\2\2\u02fa\u00a8\3\2\2\2\u02fb"+
+ "\u02fc\7u\2\2\u02fc\u02fd\7y\2\2\u02fd\u02fe\7k\2\2\u02fe\u02ff\7v\2\2"+
+ "\u02ff\u0300\7e\2\2\u0300\u0301\7j\2\2\u0301\u00aa\3\2\2\2\u0302\u0303"+
+ "\7e\2\2\u0303\u0304\7c\2\2\u0304\u0305\7u\2\2\u0305\u0306\7g\2\2\u0306"+
+ "\u00ac\3\2\2\2\u0307\u0308\7v\2\2\u0308\u0309\7t\2\2\u0309\u030a\7{\2"+
+ "\2\u030a\u00ae\3\2\2\2\u030b\u030c\7e\2\2\u030c\u030d\7c\2\2\u030d\u030e"+
+ "\7v\2\2\u030e\u030f\7e\2\2\u030f\u0310\7j\2\2\u0310\u00b0\3\2\2\2\u0311"+
+ "\u0312\7f\2\2\u0312\u0313\7g\2\2\u0313\u0314\7h\2\2\u0314\u0315\7c\2\2"+
+ "\u0315\u0316\7w\2\2\u0316\u0317\7n\2\2\u0317\u0318\7v\2\2\u0318\u00b2"+
+ "\3\2\2\2\u0319\u031a\7v\2\2\u031a\u031b\7j\2\2\u031b\u031c\7g\2\2\u031c"+
+ "\u031d\7p\2\2\u031d\u00b4\3\2\2\2\u031e\u031f\7g\2\2\u031f\u0320\7n\2"+
+ "\2\u0320\u0321\7u\2\2\u0321\u0322\7g\2\2\u0322\u00b6\3\2\2\2\u0323\u0324"+
+ "\7v\2\2\u0324\u0325\7{\2\2\u0325\u0326\7r\2\2\u0326\u0327\7g\2\2\u0327"+
+ "\u0328\7u\2\2\u0328\u0329\7y\2\2\u0329\u032a\7k\2\2\u032a\u032b\7v\2\2"+
+ "\u032b\u032c\7e\2\2\u032c\u032d\7j\2\2\u032d\u00b8\3\2\2\2\u032e\u032f"+
+ "\7q\2\2\u032f\u0330\7t\2\2\u0330\u00ba\3\2\2\2\u0331\u0332\7c\2\2\u0332"+
+ "\u0333\7p\2\2\u0333\u0334\7f\2\2\u0334\u00bc\3\2\2\2\u0335\u0336\7p\2"+
+ "\2\u0336\u0337\7q\2\2\u0337\u0338\7v\2\2\u0338\u00be\3\2\2\2\u0339\u033a"+
+ "\7v\2\2\u033a\u033b\7q\2\2\u033b\u00c0\3\2\2\2\u033c\u033d\7k\2\2\u033d"+
+ "\u033e\7p\2\2\u033e\u033f\7u\2\2\u033f\u0340\7v\2\2\u0340\u0341\7c\2\2"+
+ "\u0341\u0342\7p\2\2\u0342\u0343\7e\2\2\u0343\u0344\7g\2\2\u0344\u00c2"+
+ "\3\2\2\2\u0345\u0346\7q\2\2\u0346\u0347\7h\2\2\u0347\u00c4\3\2\2\2\u0348"+
+ "\u0349\7u\2\2\u0349\u034a\7v\2\2\u034a\u034b\7c\2\2\u034b\u034c\7v\2\2"+
+ "\u034c\u034d\7k\2\2\u034d\u034e\7e\2\2\u034e\u034f\7c\2\2\u034f\u0350"+
+ "\7n\2\2\u0350\u0351\7n\2\2\u0351\u0352\7{\2\2\u0352\u00c6\3\2\2\2\u0353"+
+ "\u0354\7k\2\2\u0354\u0355\7u\2\2\u0355\u00c8\3\2\2\2\u0356\u0357\7v\2"+
+ "\2\u0357\u0358\7t\2\2\u0358\u0359\7g\2\2\u0359\u035a\7c\2\2\u035a\u035b"+
+ "\7v\2\2\u035b\u00ca\3\2\2\2\u035c\u035d\7e\2\2\u035d\u035e\7c\2\2\u035e"+
+ "\u035f\7u\2\2\u035f\u0360\7v\2\2\u0360\u00cc\3\2\2\2\u0361\u0362\7e\2"+
+ "\2\u0362\u0363\7c\2\2\u0363\u0364\7u\2\2\u0364\u0365\7v\2\2\u0365\u0366"+
+ "\7c\2\2\u0366\u0367\7d\2\2\u0367\u0368\7n\2\2\u0368\u0369\7g\2\2\u0369"+
+ "\u00ce\3\2\2\2\u036a\u036b\7x\2\2\u036b\u036c\7g\2\2\u036c\u036d\7t\2"+
+ "\2\u036d\u036e\7u\2\2\u036e\u036f\7k\2\2\u036f\u0370\7q\2\2\u0370\u0371"+
+ "\7p\2\2\u0371\u00d0\3\2\2\2\u0372\u0373\7l\2\2\u0373\u0374\7u\2\2\u0374"+
+ "\u0375\7q\2\2\u0375\u0376\7p\2\2\u0376\u0377\7k\2\2\u0377\u0378\7s\2\2"+
+ "\u0378\u00d2\3\2\2\2\u0379\u037a\7w\2\2\u037a\u037b\7p\2\2\u037b\u037c"+
+ "\7q\2\2\u037c\u037d\7t\2\2\u037d\u037e\7f\2\2\u037e\u037f\7g\2\2\u037f"+
+ "\u0380\7t\2\2\u0380\u0381\7g\2\2\u0381\u0382\7f\2\2\u0382\u00d4\3\2\2"+
+ "\2\u0383\u0384\7v\2\2\u0384\u0385\7t\2\2\u0385\u0386\7w\2\2\u0386\u0387"+
+ "\7g\2\2\u0387\u00d6\3\2\2\2\u0388\u0389\7h\2\2\u0389\u038a\7c\2\2\u038a"+
+ "\u038b\7n\2\2\u038b\u038c\7u\2\2\u038c\u038d\7g\2\2\u038d\u00d8\3\2\2"+
+ "\2\u038e\u038f\7v\2\2\u038f\u0390\7{\2\2\u0390\u0391\7r\2\2\u0391\u0392"+
+ "\7g\2\2\u0392\u00da\3\2\2\2\u0393\u0394\7x\2\2\u0394\u0395\7c\2\2\u0395"+
+ "\u0396\7n\2\2\u0396\u0397\7k\2\2\u0397\u0398\7f\2\2\u0398\u0399\7c\2\2"+
+ "\u0399\u039a\7v\2\2\u039a\u039b\7g\2\2\u039b\u00dc\3\2\2\2\u039c\u039d"+
+ "\7c\2\2\u039d\u039e\7p\2\2\u039e\u039f\7p\2\2\u039f\u03a0\7q\2\2\u03a0"+
+ "\u03a1\7v\2\2\u03a1\u03a2\7c\2\2\u03a2\u03a3\7v\2\2\u03a3\u03a4\7g\2\2"+
+ "\u03a4\u00de\3\2\2\2\u03a5\u03a6\7f\2\2\u03a6\u03a7\7g\2\2\u03a7\u03a8"+
+ "\7e\2\2\u03a8\u03a9\7n\2\2\u03a9\u03aa\7c\2\2\u03aa\u03ab\7t\2\2\u03ab"+
+ "\u03ac\7g\2\2\u03ac\u00e0\3\2\2\2\u03ad\u03ae\7e\2\2\u03ae\u03af\7q\2"+
+ "\2\u03af\u03b0\7p\2\2\u03b0\u03b1\7v\2\2\u03b1\u03b2\7g\2\2\u03b2\u03b3"+
+ "\7z\2\2\u03b3\u03b4\7v\2\2\u03b4\u00e2\3\2\2\2\u03b5\u03b6\7k\2\2\u03b6"+
+ "\u03b7\7v\2\2\u03b7\u03b8\7g\2\2\u03b8\u03b9\7o\2\2\u03b9\u00e4\3\2\2"+
+ "\2\u03ba\u03bb\7x\2\2\u03bb\u03bc\7c\2\2\u03bc\u03bd\7t\2\2\u03bd\u03be"+
+ "\7k\2\2\u03be\u03bf\7c\2\2\u03bf\u03c0\7d\2\2\u03c0\u03c1\7n\2\2\u03c1"+
+ "\u03c2\7g\2\2\u03c2\u00e6\3\2\2\2\u03c3\u03c4\7k\2\2\u03c4\u03c5\7p\2"+
+ "\2\u03c5\u03c6\7u\2\2\u03c6\u03c7\7g\2\2\u03c7\u03c8\7t\2\2\u03c8\u03c9"+
+ "\7v\2\2\u03c9\u00e8\3\2\2\2\u03ca\u03cb\7f\2\2\u03cb\u03cc\7g\2\2\u03cc"+
+ "\u03cd\7n\2\2\u03cd\u03ce\7g\2\2\u03ce\u03cf\7v\2\2\u03cf\u03d0\7g\2\2"+
+ "\u03d0\u00ea\3\2\2\2\u03d1\u03d2\7t\2\2\u03d2\u03d3\7g\2\2\u03d3\u03d4"+
+ "\7p\2\2\u03d4\u03d5\7c\2\2\u03d5\u03d6\7o\2\2\u03d6\u03d7\7g\2\2\u03d7"+
+ "\u00ec\3\2\2\2\u03d8\u03d9\7t\2\2\u03d9\u03da\7g\2\2\u03da\u03db\7r\2"+
+ "\2\u03db\u03dc\7n\2\2\u03dc\u03dd\7c\2\2\u03dd\u03de\7e\2\2\u03de\u03df"+
+ "\7g\2\2\u03df\u00ee\3\2\2\2\u03e0\u03e1\7e\2\2\u03e1\u03e2\7q\2\2\u03e2"+
+ "\u03e3\7r\2\2\u03e3\u03e4\7{\2\2\u03e4\u00f0\3\2\2\2\u03e5\u03e6\7o\2"+
+ "\2\u03e6\u03e7\7q\2\2\u03e7\u03e8\7f\2\2\u03e8\u03e9\7k\2\2\u03e9\u03ea"+
+ "\7h\2\2\u03ea\u03eb\7{\2\2\u03eb\u00f2\3\2\2\2\u03ec\u03ed\7c\2\2\u03ed"+
+ "\u03ee\7r\2\2\u03ee\u03ef\7r\2\2\u03ef\u03f0\7g\2\2\u03f0\u03f1\7p\2\2"+
+ "\u03f1\u03f2\7f\2\2\u03f2\u00f4\3\2\2\2\u03f3\u03f4\7k\2\2\u03f4\u03f5"+
+ "\7p\2\2\u03f5\u03f6\7v\2\2\u03f6\u03f7\7q\2\2\u03f7\u00f6\3\2\2\2\u03f8"+
+ "\u03f9\7x\2\2\u03f9\u03fa\7c\2\2\u03fa\u03fb\7n\2\2\u03fb\u03fc\7w\2\2"+
+ "\u03fc\u03fd\7g\2\2\u03fd\u00f8\3\2\2\2\u03fe\u03ff\7y\2\2\u03ff\u0400"+
+ "\7k\2\2\u0400\u0401\7v\2\2\u0401\u0402\7j\2\2\u0402\u00fa\3\2\2\2\u0403"+
+ "\u0404\7r\2\2\u0404\u0405\7q\2\2\u0405\u0406\7u\2\2\u0406\u0407\7k\2\2"+
+ "\u0407\u0408\7v\2\2\u0408\u0409\7k\2\2\u0409\u040a\7q\2\2\u040a\u040b"+
+ "\7p\2\2\u040b\u00fc\3\2\2\2\u040c\u040d\7l\2\2\u040d\u040e\7u\2\2\u040e"+
+ "\u040f\7q\2\2\u040f\u0410\7p\2\2\u0410\u00fe\3\2\2\2\u0411\u0412\7w\2"+
+ "\2\u0412\u0413\7r\2\2\u0413\u0414\7f\2\2\u0414\u0415\7c\2\2\u0415\u0416"+
+ "\7v\2\2\u0416\u0417\7k\2\2\u0417\u0418\7p\2\2\u0418\u0419\7i\2\2\u0419"+
+ "\u0100\3\2\2\2\u041a\u041b\7d\2\2\u041b\u041c\7t\2\2\u041c\u041d\7g\2"+
+ "\2\u041d\u041e\7c\2\2\u041e\u041f\7m\2\2\u041f\u0102\3\2\2\2\u0420\u0421"+
+ "\7n\2\2\u0421\u0422\7q\2\2\u0422\u0423\7q\2\2\u0423\u0424\7r\2\2\u0424"+
+ "\u0104\3\2\2\2\u0425\u0426\7e\2\2\u0426\u0427\7q\2\2\u0427\u0428\7p\2"+
+ "\2\u0428\u0429\7v\2\2\u0429\u042a\7k\2\2\u042a\u042b\7p\2\2\u042b\u042c"+
+ "\7w\2\2\u042c\u042d\7g\2\2\u042d\u0106\3\2\2\2\u042e\u042f\7g\2\2\u042f"+
+ "\u0430\7z\2\2\u0430\u0431\7k\2\2\u0431\u0432\7v\2\2\u0432\u0108\3\2\2"+
+ "\2\u0433\u0434\7t\2\2\u0434\u0435\7g\2\2\u0435\u0436\7v\2\2\u0436\u0437"+
+ "\7w\2\2\u0437\u0438\7t\2\2\u0438\u0439\7p\2\2\u0439\u043a\7k\2\2\u043a"+
+ "\u043b\7p\2\2\u043b\u043c\7i\2\2\u043c\u010a\3\2\2\2\u043d\u043e\7y\2"+
+ "\2\u043e\u043f\7j\2\2\u043f\u0440\7k\2\2\u0440\u0441\7n\2\2\u0441\u0442"+
+ "\7g\2\2\u0442\u010c\3\2\2\2\u0443\u0448\7$\2\2\u0444\u0447\5\u010f\u0088"+
+ "\2\u0445\u0447\n\2\2\2\u0446\u0444\3\2\2\2\u0446\u0445\3\2\2\2\u0447\u044a"+
+ "\3\2\2\2\u0448\u0446\3\2\2\2\u0448\u0449\3\2\2\2\u0449\u044b\3\2\2\2\u044a"+
+ "\u0448\3\2\2\2\u044b\u044c\7$\2\2\u044c\u010e\3\2\2\2\u044d\u0450\7^\2"+
+ "\2\u044e\u0451\t\3\2\2\u044f\u0451\5\u0111\u0089\2\u0450\u044e\3\2\2\2"+
+ "\u0450\u044f\3\2\2\2\u0451\u0110\3\2\2\2\u0452\u0453\7w\2\2\u0453\u0454"+
+ "\5\u0113\u008a\2\u0454\u0455\5\u0113\u008a\2\u0455\u0456\5\u0113\u008a"+
+ "\2\u0456\u0457\5\u0113\u008a\2\u0457\u0112\3\2\2\2\u0458\u0459\t\4\2\2"+
+ "\u0459\u0114\3\2\2\2\u045a\u045b\7A\2\2\u045b\u0116\3\2\2\2\u045c\u045d"+
+ "\7p\2\2\u045d\u045e\7w\2\2\u045e\u045f\7n\2\2\u045f\u0460\7n\2\2\u0460"+
+ "\u0118\3\2\2\2\u0461\u0462\5\u011b\u008e\2\u0462\u011a\3\2\2\2\u0463\u0467"+
+ "\5\u011d\u008f\2\u0464\u0467\5\u011f\u0090\2\u0465\u0467\5\u0121\u0091"+
+ "\2\u0466\u0463\3\2\2\2\u0466\u0464\3\2\2\2\u0466\u0465\3\2\2\2\u0467\u011c"+
+ "\3\2\2\2\u0468\u0469\5\u0123\u0092\2\u0469\u011e\3\2\2\2\u046a\u046b\7"+
+ "\60\2\2\u046b\u0475\5\u0123\u0092\2\u046c\u046d\5\u0123\u0092\2\u046d"+
+ "\u0471\7\60\2\2\u046e\u0470\t\5\2\2\u046f\u046e\3\2\2\2\u0470\u0473\3"+
+ "\2\2\2\u0471\u046f\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0475\3\2\2\2\u0473"+
+ "\u0471\3\2\2\2\u0474\u046a\3\2\2\2\u0474\u046c\3\2\2\2\u0475\u0120\3\2"+
+ "\2\2\u0476\u0477\7\60\2\2\u0477\u0483\5\u0123\u0092\2\u0478\u0480\5\u0123"+
+ "\u0092\2\u0479\u047d\7\60\2\2\u047a\u047c\t\5\2\2\u047b\u047a\3\2\2\2"+
+ "\u047c\u047f\3\2\2\2\u047d\u047b\3\2\2\2\u047d\u047e\3\2\2\2\u047e\u0481"+
+ "\3\2\2\2\u047f\u047d\3\2\2\2\u0480\u0479\3\2\2\2\u0480\u0481\3\2\2\2\u0481"+
+ "\u0483\3\2\2\2\u0482\u0476\3\2\2\2\u0482\u0478\3\2\2\2\u0483\u0484\3\2"+
+ "\2\2\u0484\u0486\t\6\2\2\u0485\u0487\t\7\2\2\u0486\u0485\3\2\2\2\u0486"+
+ "\u0487\3\2\2\2\u0487\u0488\3\2\2\2\u0488\u0489\5\u0123\u0092\2\u0489\u0122"+
+ "\3\2\2\2\u048a\u048c\t\5\2\2\u048b\u048a\3\2\2\2\u048c\u048d\3\2\2\2\u048d"+
+ "\u048b\3\2\2\2\u048d\u048e\3\2\2\2\u048e\u0124\3\2\2\2\u048f\u0490\t\b"+
+ "\2\2\u0490\u0491\3\2\2\2\u0491\u0492\b\u0093\2\2\u0492\u0126\3\2\2\2\u0493"+
+ "\u0497\5\u0129\u0095\2\u0494\u0496\5\u012b\u0096\2\u0495\u0494\3\2\2\2"+
+ "\u0496\u0499\3\2\2\2\u0497\u0495\3\2\2\2\u0497\u0498\3\2\2\2\u0498\u0128"+
+ "\3\2\2\2\u0499\u0497\3\2\2\2\u049a\u049c\t\t\2\2\u049b\u049a\3\2\2\2\u049c"+
+ "\u012a\3\2\2\2\u049d\u04a0\5\u0129\u0095\2\u049e\u04a0\t\n\2\2\u049f\u049d"+
+ "\3\2\2\2\u049f\u049e\3\2\2\2\u04a0\u012c\3\2\2\2\u04a1\u04a2\7*\2\2\u04a2"+
+ "\u04ab\7<\2\2\u04a3\u04aa\5\u012d\u0097\2\u04a4\u04a5\7*\2\2\u04a5\u04aa"+
+ "\n\13\2\2\u04a6\u04a7\7<\2\2\u04a7\u04aa\n\f\2\2\u04a8\u04aa\n\r\2\2\u04a9"+
+ "\u04a3\3\2\2\2\u04a9\u04a4\3\2\2\2\u04a9\u04a6\3\2\2\2\u04a9\u04a8\3\2"+
+ "\2\2\u04aa\u04ad\3\2\2\2\u04ab\u04a9\3\2\2\2\u04ab\u04ac\3\2\2\2\u04ac"+
+ "\u04af\3\2\2\2\u04ad\u04ab\3\2\2\2\u04ae\u04b0\7<\2\2\u04af\u04ae\3\2"+
+ "\2\2\u04b0\u04b1\3\2\2\2\u04b1\u04af\3\2\2\2\u04b1\u04b2\3\2\2\2\u04b2"+
+ "\u04b3\3\2\2\2\u04b3\u04b4\7+\2\2\u04b4\u04b5\3\2\2\2\u04b5\u04b6\b\u0097"+
+ "\2\2\u04b6\u012e\3\2\2\2\u04b7\u04b8\n\16\2\2\u04b8\u0130\3\2\2\2\24\2"+
+ "\u0446\u0448\u0450\u0466\u0471\u0474\u047d\u0480\u0482\u0486\u048d\u0497"+
+ "\u049b\u049f\u04a9\u04ab\u04b1\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 74d3a280cf..90fc814284 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
+++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens
@@ -121,27 +121,28 @@ 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
+Kwith=124
+Kposition=125
+Kjson=126
+Kupdating=127
+Kbreak=128
+Kloop=129
+Kcontinue=130
+Kexit=131
+Kreturning=132
+Kwhile=133
+STRING=134
+ArgumentPlaceholder=135
+NullLiteral=136
+Literal=137
+NumericLiteral=138
+IntegerLiteral=139
+DecimalLiteral=140
+DoubleLiteral=141
+WS=142
+NCName=143
+XQComment=144
+ContentChar=145
';'=1
'module'=2
'namespace'=3
@@ -265,14 +266,15 @@ ContentChar=144
'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
+'with'=124
+'position'=125
+'json'=126
+'updating'=127
+'break'=128
+'loop'=129
+'continue'=130
+'exit'=131
+'returning'=132
+'while'=133
+'?'=135
+'null'=136
diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java
index f29c09bf46..311fb7e04e 100644
--- a/src/main/java/org/rumbledb/parser/JsoniqParser.java
+++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java
@@ -48,11 +48,11 @@ public class JsoniqParser extends Parser {
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;
+ Kappend=121, Kinto=122, Kvalue=123, Kwith=124, Kposition=125, Kjson=126,
+ Kupdating=127, Kbreak=128, Kloop=129, Kcontinue=130, Kexit=131, Kreturning=132,
+ Kwhile=133, STRING=134, ArgumentPlaceholder=135, NullLiteral=136, Literal=137,
+ NumericLiteral=138, IntegerLiteral=139, DecimalLiteral=140, DoubleLiteral=141,
+ WS=142, NCName=143, XQComment=144, ContentChar=145;
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,
@@ -145,9 +145,9 @@ private static String[] makeLiteralNames() {
"'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'"
+ "'replace'", "'copy'", "'modify'", "'append'", "'into'", "'value'", "'with'",
+ "'position'", "'json'", "'updating'", "'break'", "'loop'", "'continue'",
+ "'exit'", "'returning'", "'while'", null, "'?'", "'null'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -166,10 +166,10 @@ private static String[] makeSymbolicNames() {
"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",
+ "Kreplace", "Kcopy", "Kmodify", "Kappend", "Kinto", "Kvalue", "Kwith",
+ "Kposition", "Kjson", "Kupdating", "Kbreak", "Kloop", "Kcontinue", "Kexit",
+ "Kreturning", "Kwhile", "STRING", "ArgumentPlaceholder", "NullLiteral",
+ "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral",
"WS", "NCName", "XQComment", "ContentChar"
};
}
@@ -395,9 +395,10 @@ public final ModuleContext module() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -795,7 +796,7 @@ public final StatementsAndOptionalExprContext statementsAndOptionalExpr() throws
setState(312);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 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(311);
expr();
@@ -1765,9 +1766,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -1866,9 +1868,10 @@ public final CatchCaseStatementContext catchCaseStatement() throws RecognitionEx
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -2092,9 +2095,11 @@ public final CaseStatementContext caseStatement() throws RecognitionException {
public static class AnnotationContext extends ParserRuleContext {
public QnameContext name;
+ public Token updating;
public QnameContext qname() {
return getRuleContext(QnameContext.class,0);
}
+ public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); }
public List Literal() { return getTokens(JsoniqParser.Literal); }
public TerminalNode Literal(int i) {
return getToken(JsoniqParser.Literal, i);
@@ -2117,40 +2122,56 @@ public final AnnotationContext annotation() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(461);
- match(T__12);
- setState(462);
- ((AnnotationContext)_localctx).name = qname();
- setState(473);
+ setState(476);
_errHandler.sync(this);
- _la = _input.LA(1);
- if (_la==T__8) {
+ switch (_input.LA(1)) {
+ case T__12:
{
- setState(463);
- match(T__8);
- setState(464);
- match(Literal);
- setState(469);
+ setState(461);
+ match(T__12);
+ setState(462);
+ ((AnnotationContext)_localctx).name = qname();
+ setState(473);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__13) {
+ if (_la==T__8) {
{
- {
- setState(465);
- match(T__13);
- setState(466);
+ setState(463);
+ match(T__8);
+ setState(464);
match(Literal);
- }
- }
- setState(471);
+ setState(469);
_errHandler.sync(this);
_la = _input.LA(1);
+ while (_la==T__13) {
+ {
+ {
+ setState(465);
+ match(T__13);
+ setState(466);
+ match(Literal);
+ }
+ }
+ setState(471);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ setState(472);
+ match(T__9);
+ }
}
- setState(472);
- match(T__9);
+
+ }
+ break;
+ case Kupdating:
+ {
+ setState(475);
+ ((AnnotationContext)_localctx).updating = match(Kupdating);
}
+ break;
+ default:
+ throw new NoViableAltException(this);
}
-
}
}
catch (RecognitionException re) {
@@ -2189,17 +2210,17 @@ public final AnnotationsContext annotations() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(478);
+ setState(481);
_errHandler.sync(this);
_la = _input.LA(1);
- while (_la==T__12) {
+ while (_la==T__12 || _la==Kupdating) {
{
{
- setState(475);
+ setState(478);
annotation();
}
}
- setState(480);
+ setState(483);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2245,29 +2266,29 @@ public final VarDeclStatementContext varDeclStatement() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(481);
+ setState(484);
annotations();
- setState(482);
+ setState(485);
match(Kvariable);
- setState(483);
+ setState(486);
varDeclForStatement();
- setState(488);
+ setState(491);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(484);
+ setState(487);
match(T__13);
- setState(485);
+ setState(488);
varDeclForStatement();
}
}
- setState(490);
+ setState(493);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(491);
+ setState(494);
match(T__0);
}
}
@@ -2314,28 +2335,28 @@ public final VarDeclForStatementContext varDeclForStatement() throws Recognition
try {
enterOuterAlt(_localctx, 1);
{
- setState(493);
- ((VarDeclForStatementContext)_localctx).var_ref = varRef();
setState(496);
+ ((VarDeclForStatementContext)_localctx).var_ref = varRef();
+ setState(499);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(494);
+ setState(497);
match(Kas);
- setState(495);
+ setState(498);
sequenceType();
}
}
- setState(500);
+ setState(503);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(498);
+ setState(501);
match(T__5);
- setState(499);
+ setState(502);
((VarDeclForStatementContext)_localctx).exprSingle = exprSingle();
((VarDeclForStatementContext)_localctx).expr_vals.add(((VarDeclForStatementContext)_localctx).exprSingle);
}
@@ -2381,15 +2402,15 @@ public final WhileStatementContext whileStatement() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(502);
+ setState(505);
match(Kwhile);
- setState(503);
+ setState(506);
match(T__8);
- setState(504);
+ setState(507);
((WhileStatementContext)_localctx).test_expr = expr();
- setState(505);
+ setState(508);
match(T__9);
- setState(506);
+ setState(509);
((WhileStatementContext)_localctx).stmt = statement();
}
}
@@ -2432,34 +2453,34 @@ public final SetterContext setter() throws RecognitionException {
SetterContext _localctx = new SetterContext(_ctx, getState());
enterRule(_localctx, 58, RULE_setter);
try {
- setState(512);
+ setState(515);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(508);
+ setState(511);
defaultCollationDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(509);
+ setState(512);
orderingModeDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(510);
+ setState(513);
emptyOrderDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(511);
+ setState(514);
decimalFormatDecl();
}
break;
@@ -2499,15 +2520,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(514);
+ setState(517);
match(Kdeclare);
- setState(515);
+ setState(518);
match(T__2);
- setState(516);
+ setState(519);
match(NCName);
- setState(517);
+ setState(520);
match(T__3);
- setState(518);
+ setState(521);
uriLiteral();
}
}
@@ -2550,34 +2571,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException {
AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState());
enterRule(_localctx, 62, RULE_annotatedDecl);
try {
- setState(524);
+ setState(527);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(520);
+ setState(523);
functionDecl();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(521);
+ setState(524);
varDecl();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(522);
+ setState(525);
typeDecl();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(523);
+ setState(526);
contextItemDecl();
}
break;
@@ -2618,13 +2639,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti
try {
enterOuterAlt(_localctx, 1);
{
- setState(526);
+ setState(529);
match(Kdeclare);
- setState(527);
+ setState(530);
match(Kdefault);
- setState(528);
+ setState(531);
match(Kcollation);
- setState(529);
+ setState(532);
uriLiteral();
}
}
@@ -2660,11 +2681,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(531);
+ setState(534);
match(Kdeclare);
- setState(532);
+ setState(535);
match(T__14);
- setState(533);
+ setState(536);
_la = _input.LA(1);
if ( !(_la==T__15 || _la==Kunordered) ) {
_errHandler.recoverInline(this);
@@ -2713,16 +2734,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(535);
+ setState(538);
match(Kdeclare);
- setState(536);
+ setState(539);
match(Kdefault);
- setState(537);
+ setState(540);
match(Korder);
- setState(538);
+ setState(541);
match(Kempty);
{
- setState(539);
+ setState(542);
((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==Kgreatest || _la==Kleast) ) {
@@ -2783,17 +2804,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(541);
+ setState(544);
match(Kdeclare);
- setState(546);
+ setState(549);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__16:
{
{
- setState(542);
+ setState(545);
match(T__16);
- setState(543);
+ setState(546);
qname();
}
}
@@ -2801,9 +2822,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
case Kdefault:
{
{
- setState(544);
+ setState(547);
match(Kdefault);
- setState(545);
+ setState(548);
match(T__16);
}
}
@@ -2811,21 +2832,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce
default:
throw new NoViableAltException(this);
}
- setState(554);
+ setState(557);
_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)) {
{
{
- setState(548);
+ setState(551);
dfPropertyName();
- setState(549);
+ setState(552);
match(T__3);
- setState(550);
+ setState(553);
stringLiteral();
}
}
- setState(556);
+ setState(559);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2874,17 +2895,17 @@ public final QnameContext qname() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(562);
+ setState(565);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
case 1:
{
- setState(559);
+ setState(562);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(557);
+ setState(560);
((QnameContext)_localctx).ns = match(NCName);
}
break;
@@ -2951,9 +2972,10 @@ public final QnameContext qname() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -2962,24 +2984,24 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(558);
+ setState(561);
((QnameContext)_localctx).nskw = keyWords();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(561);
+ setState(564);
match(T__17);
}
break;
}
- setState(566);
+ setState(569);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NCName:
{
- setState(564);
+ setState(567);
((QnameContext)_localctx).local_name = match(NCName);
}
break;
@@ -3046,9 +3068,10 @@ public final QnameContext qname() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -3057,7 +3080,7 @@ public final QnameContext qname() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(565);
+ setState(568);
((QnameContext)_localctx).local_namekw = keyWords();
}
break;
@@ -3096,7 +3119,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(568);
+ setState(571);
_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)) ) {
_errHandler.recoverInline(this);
@@ -3148,48 +3171,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(570);
+ setState(573);
match(T__28);
- setState(571);
+ setState(574);
match(T__1);
- setState(575);
+ setState(578);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__2) {
{
- setState(572);
+ setState(575);
match(T__2);
- setState(573);
+ setState(576);
((ModuleImportContext)_localctx).prefix = match(NCName);
- setState(574);
+ setState(577);
match(T__3);
}
}
- setState(577);
+ setState(580);
((ModuleImportContext)_localctx).targetNamespace = uriLiteral();
- setState(587);
+ setState(590);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(578);
+ setState(581);
match(Kat);
- setState(579);
+ setState(582);
uriLiteral();
- setState(584);
+ setState(587);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(580);
+ setState(583);
match(T__13);
- setState(581);
+ setState(584);
uriLiteral();
}
}
- setState(586);
+ setState(589);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3244,35 +3267,35 @@ public final VarDeclContext varDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(589);
+ setState(592);
match(Kdeclare);
- setState(590);
+ setState(593);
annotations();
- setState(591);
+ setState(594);
match(Kvariable);
- setState(592);
- varRef();
setState(595);
+ varRef();
+ setState(598);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(593);
+ setState(596);
match(Kas);
- setState(594);
+ setState(597);
sequenceType();
}
}
- setState(604);
+ setState(607);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__5:
{
{
- setState(597);
+ setState(600);
match(T__5);
- setState(598);
+ setState(601);
exprSingle();
}
}
@@ -3280,16 +3303,16 @@ public final VarDeclContext varDecl() throws RecognitionException {
case T__29:
{
{
- setState(599);
- ((VarDeclContext)_localctx).external = match(T__29);
setState(602);
+ ((VarDeclContext)_localctx).external = match(T__29);
+ setState(605);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(600);
+ setState(603);
match(T__5);
- setState(601);
+ setState(604);
exprSingle();
}
}
@@ -3343,33 +3366,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(606);
+ setState(609);
match(Kdeclare);
- setState(607);
+ setState(610);
match(Kcontext);
- setState(608);
- match(Kitem);
setState(611);
+ match(Kitem);
+ setState(614);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(609);
+ setState(612);
match(Kas);
- setState(610);
+ setState(613);
sequenceType();
}
}
- setState(620);
+ setState(623);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__5:
{
{
- setState(613);
+ setState(616);
match(T__5);
- setState(614);
+ setState(617);
exprSingle();
}
}
@@ -3377,16 +3400,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio
case T__29:
{
{
- setState(615);
- ((ContextItemDeclContext)_localctx).external = match(T__29);
setState(618);
+ ((ContextItemDeclContext)_localctx).external = match(T__29);
+ setState(621);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5) {
{
- setState(616);
+ setState(619);
match(T__5);
- setState(617);
+ setState(620);
exprSingle();
}
}
@@ -3414,6 +3437,7 @@ public static class FunctionDeclContext extends ParserRuleContext {
public QnameContext fn_name;
public SequenceTypeContext return_type;
public StatementsAndOptionalExprContext fn_body;
+ public Token is_external;
public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); }
public AnnotationsContext annotations() {
return getRuleContext(AnnotationsContext.class,0);
@@ -3449,59 +3473,59 @@ public final FunctionDeclContext functionDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(622);
+ setState(625);
match(Kdeclare);
- setState(623);
+ setState(626);
annotations();
- setState(624);
+ setState(627);
match(T__30);
- setState(625);
+ setState(628);
((FunctionDeclContext)_localctx).fn_name = qname();
- setState(626);
+ setState(629);
match(T__8);
- setState(628);
+ setState(631);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(627);
+ setState(630);
paramList();
}
}
- setState(630);
- match(T__9);
setState(633);
+ match(T__9);
+ setState(636);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(631);
+ setState(634);
match(Kas);
- setState(632);
+ setState(635);
((FunctionDeclContext)_localctx).return_type = sequenceType();
}
}
- setState(640);
+ setState(643);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__6:
{
- setState(635);
+ setState(638);
match(T__6);
{
- setState(636);
+ setState(639);
((FunctionDeclContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(637);
+ setState(640);
match(T__7);
}
break;
case T__29:
{
- setState(639);
- match(T__29);
+ setState(642);
+ ((FunctionDeclContext)_localctx).is_external = match(T__29);
}
break;
default:
@@ -3553,25 +3577,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(642);
+ setState(645);
match(Kdeclare);
- setState(643);
+ setState(646);
match(Ktype);
- setState(644);
+ setState(647);
((TypeDeclContext)_localctx).type_name = qname();
- setState(645);
+ setState(648);
match(Kas);
- setState(647);
+ setState(650);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
case 1:
{
- setState(646);
+ setState(649);
((TypeDeclContext)_localctx).schema = schemaLanguage();
}
break;
}
- setState(649);
+ setState(652);
((TypeDeclContext)_localctx).type_definition = exprSingle();
}
}
@@ -3603,33 +3627,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException
SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState());
enterRule(_localctx, 86, RULE_schemaLanguage);
try {
- setState(657);
+ setState(660);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(651);
+ setState(654);
match(T__31);
- setState(652);
+ setState(655);
match(T__32);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(653);
+ setState(656);
match(T__31);
- setState(654);
+ setState(657);
match(T__33);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(655);
+ setState(658);
match(Kjson);
- setState(656);
+ setState(659);
match(T__34);
}
break;
@@ -3671,21 +3695,21 @@ public final ParamListContext paramList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(659);
+ setState(662);
param();
- setState(664);
+ setState(667);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(660);
+ setState(663);
match(T__13);
- setState(661);
+ setState(664);
param();
}
}
- setState(666);
+ setState(669);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3728,18 +3752,18 @@ public final ParamContext param() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(667);
+ setState(670);
match(T__4);
- setState(668);
- qname();
setState(671);
+ qname();
+ setState(674);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(669);
+ setState(672);
match(Kas);
- setState(670);
+ setState(673);
sequenceType();
}
}
@@ -3782,21 +3806,21 @@ public final ExprContext expr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(673);
+ setState(676);
exprSingle();
- setState(678);
+ setState(681);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(674);
+ setState(677);
match(T__13);
- setState(675);
+ setState(678);
exprSingle();
}
}
- setState(680);
+ setState(683);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3847,48 +3871,48 @@ public final ExprSingleContext exprSingle() throws RecognitionException {
ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState());
enterRule(_localctx, 94, RULE_exprSingle);
try {
- setState(687);
+ setState(690);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(681);
+ setState(684);
exprSimple();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(682);
+ setState(685);
flowrExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(683);
+ setState(686);
switchExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(684);
+ setState(687);
typeSwitchExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(685);
+ setState(688);
ifExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(686);
+ setState(689);
tryCatchExpr();
}
break;
@@ -3945,62 +3969,62 @@ public final ExprSimpleContext exprSimple() throws RecognitionException {
ExprSimpleContext _localctx = new ExprSimpleContext(_ctx, getState());
enterRule(_localctx, 96, RULE_exprSimple);
try {
- setState(697);
+ setState(700);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(689);
+ setState(692);
quantifiedExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(690);
+ setState(693);
orExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(691);
+ setState(694);
insertExpr();
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(692);
+ setState(695);
deleteExpr();
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(693);
+ setState(696);
renameExpr();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(694);
+ setState(697);
replaceExpr();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(695);
+ setState(698);
transformExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(696);
+ setState(699);
appendExpr();
}
break;
@@ -4079,66 +4103,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(701);
+ setState(704);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(699);
+ setState(702);
((FlowrExprContext)_localctx).start_for = forClause();
}
break;
case Klet:
{
- setState(700);
+ setState(703);
((FlowrExprContext)_localctx).start_let = letClause();
}
break;
default:
throw new NoViableAltException(this);
}
- setState(711);
+ setState(714);
_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)) {
{
- setState(709);
+ setState(712);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
{
- setState(703);
+ setState(706);
forClause();
}
break;
case Klet:
{
- setState(704);
+ setState(707);
letClause();
}
break;
case Kwhere:
{
- setState(705);
+ setState(708);
whereClause();
}
break;
case Kgroup:
{
- setState(706);
+ setState(709);
groupByClause();
}
break;
case Korder:
case Kstable:
{
- setState(707);
+ setState(710);
orderByClause();
}
break;
case Kcount:
{
- setState(708);
+ setState(711);
countClause();
}
break;
@@ -4146,13 +4170,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException {
throw new NoViableAltException(this);
}
}
- setState(713);
+ setState(716);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(714);
+ setState(717);
match(Kreturn);
- setState(715);
+ setState(718);
((FlowrExprContext)_localctx).return_expr = exprSingle();
}
}
@@ -4195,25 +4219,25 @@ public final ForClauseContext forClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(717);
+ setState(720);
match(Kfor);
- setState(718);
+ setState(721);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
- setState(723);
+ setState(726);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(719);
+ setState(722);
match(T__13);
- setState(720);
+ setState(723);
((ForClauseContext)_localctx).forVar = forVar();
((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar);
}
}
- setState(725);
+ setState(728);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4271,47 +4295,47 @@ public final ForVarContext forVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(726);
- ((ForVarContext)_localctx).var_ref = varRef();
setState(729);
+ ((ForVarContext)_localctx).var_ref = varRef();
+ setState(732);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(727);
+ setState(730);
match(Kas);
- setState(728);
+ setState(731);
((ForVarContext)_localctx).seq = sequenceType();
}
}
- setState(733);
+ setState(736);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kallowing) {
{
- setState(731);
+ setState(734);
((ForVarContext)_localctx).flag = match(Kallowing);
- setState(732);
+ setState(735);
match(Kempty);
}
}
- setState(737);
+ setState(740);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kat) {
{
- setState(735);
+ setState(738);
match(Kat);
- setState(736);
+ setState(739);
((ForVarContext)_localctx).at = varRef();
}
}
- setState(739);
+ setState(742);
match(Kin);
- setState(740);
+ setState(743);
((ForVarContext)_localctx).ex = exprSingle();
}
}
@@ -4354,25 +4378,25 @@ public final LetClauseContext letClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(742);
+ setState(745);
match(Klet);
- setState(743);
+ setState(746);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
- setState(748);
+ setState(751);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(744);
+ setState(747);
match(T__13);
- setState(745);
+ setState(748);
((LetClauseContext)_localctx).letVar = letVar();
((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar);
}
}
- setState(750);
+ setState(753);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4421,23 +4445,23 @@ public final LetVarContext letVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(751);
- ((LetVarContext)_localctx).var_ref = varRef();
setState(754);
+ ((LetVarContext)_localctx).var_ref = varRef();
+ setState(757);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(752);
+ setState(755);
match(Kas);
- setState(753);
+ setState(756);
((LetVarContext)_localctx).seq = sequenceType();
}
}
- setState(756);
+ setState(759);
match(T__5);
- setState(757);
+ setState(760);
((LetVarContext)_localctx).ex = exprSingle();
}
}
@@ -4474,9 +4498,9 @@ public final WhereClauseContext whereClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(759);
+ setState(762);
match(Kwhere);
- setState(760);
+ setState(763);
exprSingle();
}
}
@@ -4520,27 +4544,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(762);
+ setState(765);
match(Kgroup);
- setState(763);
+ setState(766);
match(Kby);
- setState(764);
+ setState(767);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
- setState(769);
+ setState(772);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(765);
+ setState(768);
match(T__13);
- setState(766);
+ setState(769);
((GroupByClauseContext)_localctx).groupByVar = groupByVar();
((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar);
}
}
- setState(771);
+ setState(774);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4595,40 +4619,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(772);
+ setState(775);
((GroupByVarContext)_localctx).var_ref = varRef();
- setState(779);
+ setState(782);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__5 || _la==Kas) {
{
- setState(775);
+ setState(778);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(773);
+ setState(776);
match(Kas);
- setState(774);
+ setState(777);
((GroupByVarContext)_localctx).seq = sequenceType();
}
}
- setState(777);
+ setState(780);
((GroupByVarContext)_localctx).decl = match(T__5);
- setState(778);
+ setState(781);
((GroupByVarContext)_localctx).ex = exprSingle();
}
}
- setState(783);
+ setState(786);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(781);
+ setState(784);
match(Kcollation);
- setState(782);
+ setState(785);
((GroupByVarContext)_localctx).uri = uriLiteral();
}
}
@@ -4675,15 +4699,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(790);
+ setState(793);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Korder:
{
{
- setState(785);
+ setState(788);
match(Korder);
- setState(786);
+ setState(789);
match(Kby);
}
}
@@ -4691,11 +4715,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
case Kstable:
{
{
- setState(787);
+ setState(790);
((OrderByClauseContext)_localctx).stb = match(Kstable);
- setState(788);
+ setState(791);
match(Korder);
- setState(789);
+ setState(792);
match(Kby);
}
}
@@ -4703,21 +4727,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(792);
+ setState(795);
orderByExpr();
- setState(797);
+ setState(800);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(793);
+ setState(796);
match(T__13);
- setState(794);
+ setState(797);
orderByExpr();
}
}
- setState(799);
+ setState(802);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4770,20 +4794,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(800);
- ((OrderByExprContext)_localctx).ex = exprSingle();
setState(803);
+ ((OrderByExprContext)_localctx).ex = exprSingle();
+ setState(806);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kascending:
{
- setState(801);
+ setState(804);
match(Kascending);
}
break;
case Kdescending:
{
- setState(802);
+ setState(805);
((OrderByExprContext)_localctx).desc = match(Kdescending);
}
break;
@@ -4802,25 +4826,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
default:
break;
}
- setState(810);
+ setState(813);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kempty) {
{
- setState(805);
- match(Kempty);
setState(808);
+ match(Kempty);
+ setState(811);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kgreatest:
{
- setState(806);
+ setState(809);
((OrderByExprContext)_localctx).gr = match(Kgreatest);
}
break;
case Kleast:
{
- setState(807);
+ setState(810);
((OrderByExprContext)_localctx).ls = match(Kleast);
}
break;
@@ -4830,14 +4854,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException {
}
}
- setState(814);
+ setState(817);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kcollation) {
{
- setState(812);
+ setState(815);
match(Kcollation);
- setState(813);
+ setState(816);
((OrderByExprContext)_localctx).uril = uriLiteral();
}
}
@@ -4877,9 +4901,9 @@ public final CountClauseContext countClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(816);
+ setState(819);
match(Kcount);
- setState(817);
+ setState(820);
varRef();
}
}
@@ -4929,47 +4953,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(821);
+ setState(824);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Ksome:
{
- setState(819);
+ setState(822);
((QuantifiedExprContext)_localctx).so = match(Ksome);
}
break;
case Kevery:
{
- setState(820);
+ setState(823);
((QuantifiedExprContext)_localctx).ev = match(Kevery);
}
break;
default:
throw new NoViableAltException(this);
}
- setState(823);
+ setState(826);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
- setState(828);
+ setState(831);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(824);
+ setState(827);
match(T__13);
- setState(825);
+ setState(828);
((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar();
((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar);
}
}
- setState(830);
+ setState(833);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(831);
+ setState(834);
match(Ksatisfies);
- setState(832);
+ setState(835);
exprSingle();
}
}
@@ -5014,23 +5038,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(834);
- varRef();
setState(837);
+ varRef();
+ setState(840);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(835);
+ setState(838);
match(Kas);
- setState(836);
+ setState(839);
sequenceType();
}
}
- setState(839);
+ setState(842);
match(Kin);
- setState(840);
+ setState(843);
exprSingle();
}
}
@@ -5083,34 +5107,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(842);
+ setState(845);
match(Kswitch);
- setState(843);
+ setState(846);
match(T__8);
- setState(844);
+ setState(847);
((SwitchExprContext)_localctx).cond = expr();
- setState(845);
+ setState(848);
match(T__9);
- setState(847);
+ setState(850);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(846);
+ setState(849);
((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause();
((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause);
}
}
- setState(849);
+ setState(852);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(851);
+ setState(854);
match(Kdefault);
- setState(852);
+ setState(855);
match(Kreturn);
- setState(853);
+ setState(856);
((SwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5158,26 +5182,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(857);
+ setState(860);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(855);
+ setState(858);
match(Kcase);
- setState(856);
+ setState(859);
((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle();
((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle);
}
}
- setState(859);
+ setState(862);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(861);
+ setState(864);
match(Kreturn);
- setState(862);
+ setState(865);
((SwitchCaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5234,44 +5258,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(864);
+ setState(867);
match(Ktypeswitch);
- setState(865);
+ setState(868);
match(T__8);
- setState(866);
+ setState(869);
((TypeSwitchExprContext)_localctx).cond = expr();
- setState(867);
+ setState(870);
match(T__9);
- setState(869);
+ setState(872);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(868);
+ setState(871);
((TypeSwitchExprContext)_localctx).caseClause = caseClause();
((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause);
}
}
- setState(871);
+ setState(874);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( _la==Kcase );
- setState(873);
+ setState(876);
match(Kdefault);
- setState(875);
+ setState(878);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(874);
+ setState(877);
((TypeSwitchExprContext)_localctx).var_ref = varRef();
}
}
- setState(877);
+ setState(880);
match(Kreturn);
- setState(878);
+ setState(881);
((TypeSwitchExprContext)_localctx).def = exprSingle();
}
}
@@ -5324,43 +5348,43 @@ public final CaseClauseContext caseClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(880);
+ setState(883);
match(Kcase);
- setState(884);
+ setState(887);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(881);
+ setState(884);
((CaseClauseContext)_localctx).var_ref = varRef();
- setState(882);
+ setState(885);
match(Kas);
}
}
- setState(886);
+ setState(889);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
- setState(891);
+ setState(894);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__11) {
{
{
- setState(887);
+ setState(890);
match(T__11);
- setState(888);
+ setState(891);
((CaseClauseContext)_localctx).sequenceType = sequenceType();
((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType);
}
}
- setState(893);
+ setState(896);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(894);
+ setState(897);
match(Kreturn);
- setState(895);
+ setState(898);
((CaseClauseContext)_localctx).ret = exprSingle();
}
}
@@ -5408,21 +5432,21 @@ public final IfExprContext ifExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(897);
+ setState(900);
match(Kif);
- setState(898);
+ setState(901);
match(T__8);
- setState(899);
+ setState(902);
((IfExprContext)_localctx).test_condition = expr();
- setState(900);
+ setState(903);
match(T__9);
- setState(901);
+ setState(904);
match(Kthen);
- setState(902);
+ setState(905);
((IfExprContext)_localctx).branch = exprSingle();
- setState(903);
+ setState(906);
match(Kelse);
- setState(904);
+ setState(907);
((IfExprContext)_localctx).else_branch = exprSingle();
}
}
@@ -5469,15 +5493,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(906);
+ setState(909);
match(Ktry);
- setState(907);
+ setState(910);
match(T__6);
- setState(908);
+ setState(911);
((TryCatchExprContext)_localctx).try_expression = expr();
- setState(909);
+ setState(912);
match(T__7);
- setState(911);
+ setState(914);
_errHandler.sync(this);
_alt = 1;
do {
@@ -5485,7 +5509,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
case 1:
{
{
- setState(910);
+ setState(913);
((TryCatchExprContext)_localctx).catchClause = catchClause();
((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause);
}
@@ -5494,9 +5518,9 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(913);
+ setState(916);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,81,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,82,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -5545,14 +5569,14 @@ public final CatchClauseContext catchClause() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(915);
- match(Kcatch);
setState(918);
+ match(Kcatch);
+ setState(921);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__10:
{
- setState(916);
+ setState(919);
((CatchClauseContext)_localctx).s11 = match(T__10);
((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
}
@@ -5620,9 +5644,10 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -5632,7 +5657,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(917);
+ setState(920);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5640,20 +5665,20 @@ public final CatchClauseContext catchClause() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(927);
+ setState(930);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__11) {
{
{
- setState(920);
- match(T__11);
setState(923);
+ match(T__11);
+ setState(926);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__10:
{
- setState(921);
+ setState(924);
((CatchClauseContext)_localctx).s11 = match(T__10);
((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s11);
}
@@ -5721,9 +5746,10 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -5733,7 +5759,7 @@ public final CatchClauseContext catchClause() throws RecognitionException {
case NullLiteral:
case NCName:
{
- setState(922);
+ setState(925);
((CatchClauseContext)_localctx).qname = qname();
((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname);
}
@@ -5743,15 +5769,15 @@ public final CatchClauseContext catchClause() throws RecognitionException {
}
}
}
- setState(929);
+ setState(932);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(930);
+ setState(933);
match(T__6);
- setState(931);
+ setState(934);
((CatchClauseContext)_localctx).catch_expression = expr();
- setState(932);
+ setState(935);
match(T__7);
}
}
@@ -5798,26 +5824,26 @@ public final OrExprContext orExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(934);
+ setState(937);
((OrExprContext)_localctx).main_expr = andExpr();
- setState(939);
+ setState(942);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,85,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(935);
+ setState(938);
match(Kor);
- setState(936);
+ setState(939);
((OrExprContext)_localctx).andExpr = andExpr();
((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr);
}
}
}
- setState(941);
+ setState(944);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,85,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
}
}
}
@@ -5864,26 +5890,26 @@ public final AndExprContext andExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(942);
+ setState(945);
((AndExprContext)_localctx).main_expr = notExpr();
- setState(947);
+ setState(950);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,87,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(943);
+ setState(946);
match(Kand);
- setState(944);
+ setState(947);
((AndExprContext)_localctx).notExpr = notExpr();
((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr);
}
}
}
- setState(949);
+ setState(952);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,86,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,87,_ctx);
}
}
}
@@ -5923,18 +5949,18 @@ public final NotExprContext notExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(951);
+ setState(954);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,87,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) {
case 1:
{
- setState(950);
+ setState(953);
((NotExprContext)_localctx).Knot = match(Knot);
((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot);
}
break;
}
- setState(953);
+ setState(956);
((NotExprContext)_localctx).main_expr = comparisonExpr();
}
}
@@ -5964,7 +5990,7 @@ public static class ComparisonExprContext extends ParserRuleContext {
public Token s44;
public Token s45;
public Token s46;
- public Token _tset1828;
+ public Token _tset1837;
public StringConcatExprContext stringConcatExpr;
public List rhs = new ArrayList();
public List stringConcatExpr() {
@@ -5991,26 +6017,26 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(955);
- ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr();
setState(958);
+ ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr();
+ setState(961);
_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)) {
{
- setState(956);
- ((ComparisonExprContext)_localctx)._tset1828 = _input.LT(1);
+ setState(959);
+ ((ComparisonExprContext)_localctx)._tset1837 = _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)) ) {
- ((ComparisonExprContext)_localctx)._tset1828 = (Token)_errHandler.recoverInline(this);
+ ((ComparisonExprContext)_localctx)._tset1837 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1828);
- setState(957);
+ ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1837);
+ setState(960);
((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr();
((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr);
}
@@ -6057,22 +6083,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(960);
+ setState(963);
((StringConcatExprContext)_localctx).main_expr = rangeExpr();
- setState(965);
+ setState(968);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__46) {
{
{
- setState(961);
+ setState(964);
match(T__46);
- setState(962);
+ setState(965);
((StringConcatExprContext)_localctx).rangeExpr = rangeExpr();
((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr);
}
}
- setState(967);
+ setState(970);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6117,16 +6143,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(968);
- ((RangeExprContext)_localctx).main_expr = additiveExpr();
setState(971);
+ ((RangeExprContext)_localctx).main_expr = additiveExpr();
+ setState(974);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,90,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,91,_ctx) ) {
case 1:
{
- setState(969);
+ setState(972);
match(Kto);
- setState(970);
+ setState(973);
((RangeExprContext)_localctx).additiveExpr = additiveExpr();
((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr);
}
@@ -6150,7 +6176,7 @@ public static class AdditiveExprContext extends ParserRuleContext {
public Token s48;
public List op = new ArrayList();
public Token s49;
- public Token _tset1937;
+ public Token _tset1946;
public MultiplicativeExprContext multiplicativeExpr;
public List rhs = new ArrayList();
public List multiplicativeExpr() {
@@ -6178,36 +6204,36 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(973);
+ setState(976);
((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr();
- setState(978);
+ setState(981);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
- setState(974);
- ((AdditiveExprContext)_localctx)._tset1937 = _input.LT(1);
+ setState(977);
+ ((AdditiveExprContext)_localctx)._tset1946 = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__47 || _la==T__48) ) {
- ((AdditiveExprContext)_localctx)._tset1937 = (Token)_errHandler.recoverInline(this);
+ ((AdditiveExprContext)_localctx)._tset1946 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1937);
- setState(975);
+ ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1946);
+ setState(978);
((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr();
((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr);
}
}
}
- setState(980);
+ setState(983);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,91,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,92,_ctx);
}
}
}
@@ -6229,7 +6255,7 @@ public static class MultiplicativeExprContext extends ParserRuleContext {
public Token s50;
public Token s51;
public Token s52;
- public Token _tset1965;
+ public Token _tset1974;
public InstanceOfExprContext instanceOfExpr;
public List rhs = new ArrayList();
public List instanceOfExpr() {
@@ -6256,32 +6282,32 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(981);
+ setState(984);
((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr();
- setState(986);
+ setState(989);
_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)) {
{
{
- setState(982);
- ((MultiplicativeExprContext)_localctx)._tset1965 = _input.LT(1);
+ setState(985);
+ ((MultiplicativeExprContext)_localctx)._tset1974 = _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)) ) {
- ((MultiplicativeExprContext)_localctx)._tset1965 = (Token)_errHandler.recoverInline(this);
+ ((MultiplicativeExprContext)_localctx)._tset1974 = (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(983);
+ ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1974);
+ setState(986);
((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr();
((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr);
}
}
- setState(988);
+ setState(991);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -6326,18 +6352,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException
try {
enterOuterAlt(_localctx, 1);
{
- setState(989);
+ setState(992);
((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr();
- setState(993);
+ setState(996);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
case 1:
{
- setState(990);
+ setState(993);
match(Kinstance);
- setState(991);
+ setState(994);
match(Kof);
- setState(992);
+ setState(995);
((InstanceOfExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6383,18 +6409,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(995);
+ setState(998);
((IsStaticallyExprContext)_localctx).main_expr = treatExpr();
- setState(999);
+ setState(1002);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,94,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
case 1:
{
- setState(996);
+ setState(999);
match(Kis);
- setState(997);
+ setState(1000);
match(Kstatically);
- setState(998);
+ setState(1001);
((IsStaticallyExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6440,18 +6466,18 @@ public final TreatExprContext treatExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1001);
+ setState(1004);
((TreatExprContext)_localctx).main_expr = castableExpr();
- setState(1005);
+ setState(1008);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,95,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
case 1:
{
- setState(1002);
+ setState(1005);
match(Ktreat);
- setState(1003);
+ setState(1006);
match(Kas);
- setState(1004);
+ setState(1007);
((TreatExprContext)_localctx).seq = sequenceType();
}
break;
@@ -6497,18 +6523,18 @@ public final CastableExprContext castableExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1007);
+ setState(1010);
((CastableExprContext)_localctx).main_expr = castExpr();
- setState(1011);
+ setState(1014);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,96,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
case 1:
{
- setState(1008);
+ setState(1011);
match(Kcastable);
- setState(1009);
+ setState(1012);
match(Kas);
- setState(1010);
+ setState(1013);
((CastableExprContext)_localctx).single = singleType();
}
break;
@@ -6554,18 +6580,18 @@ public final CastExprContext castExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1013);
+ setState(1016);
((CastExprContext)_localctx).main_expr = arrowExpr();
- setState(1017);
+ setState(1020);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,97,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) {
case 1:
{
- setState(1014);
+ setState(1017);
match(Kcast);
- setState(1015);
+ setState(1018);
match(Kas);
- setState(1016);
+ setState(1019);
((CastExprContext)_localctx).single = singleType();
}
break;
@@ -6622,33 +6648,33 @@ public final ArrowExprContext arrowExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1019);
+ setState(1022);
((ArrowExprContext)_localctx).main_expr = unaryExpr();
- setState(1028);
+ setState(1031);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,98,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,99,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
{
- setState(1020);
+ setState(1023);
match(T__3);
- setState(1021);
+ setState(1024);
match(T__44);
}
- setState(1023);
+ setState(1026);
((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier();
((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier);
- setState(1024);
+ setState(1027);
((ArrowExprContext)_localctx).argumentList = argumentList();
((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList);
}
}
}
- setState(1030);
+ setState(1033);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,98,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,99,_ctx);
}
}
}
@@ -6688,7 +6714,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState());
enterRule(_localctx, 166, RULE_arrowFunctionSpecifier);
try {
- setState(1034);
+ setState(1037);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -6754,9 +6780,10 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -6767,21 +6794,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1031);
+ setState(1034);
qname();
}
break;
case T__4:
enterOuterAlt(_localctx, 2);
{
- setState(1032);
+ setState(1035);
varRef();
}
break;
case T__8:
enterOuterAlt(_localctx, 3);
{
- setState(1033);
+ setState(1036);
parenthesizedExpr();
}
break;
@@ -6804,7 +6831,7 @@ public static class UnaryExprContext extends ParserRuleContext {
public Token s49;
public List op = new ArrayList();
public Token s48;
- public Token _tset2144;
+ public Token _tset2153;
public ValueExprContext main_expr;
public ValueExprContext valueExpr() {
return getRuleContext(ValueExprContext.class,0);
@@ -6827,31 +6854,31 @@ public final UnaryExprContext unaryExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1039);
+ setState(1042);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__47 || _la==T__48) {
{
{
- setState(1036);
- ((UnaryExprContext)_localctx)._tset2144 = _input.LT(1);
+ setState(1039);
+ ((UnaryExprContext)_localctx)._tset2153 = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__47 || _la==T__48) ) {
- ((UnaryExprContext)_localctx)._tset2144 = (Token)_errHandler.recoverInline(this);
+ ((UnaryExprContext)_localctx)._tset2153 = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
- ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2144);
+ ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset2153);
}
}
- setState(1041);
+ setState(1044);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1042);
+ setState(1045);
((UnaryExprContext)_localctx).main_expr = valueExpr();
}
}
@@ -6894,27 +6921,27 @@ public final ValueExprContext valueExpr() throws RecognitionException {
ValueExprContext _localctx = new ValueExprContext(_ctx, getState());
enterRule(_localctx, 170, RULE_valueExpr);
try {
- setState(1047);
+ setState(1050);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,101,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1044);
+ setState(1047);
((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1045);
+ setState(1048);
((ValueExprContext)_localctx).validate_expr = validateExpr();
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1046);
+ setState(1049);
((ValueExprContext)_localctx).annotate_expr = annotateExpr();
}
break;
@@ -6957,17 +6984,17 @@ public final ValidateExprContext validateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1049);
+ setState(1052);
match(Kvalidate);
- setState(1050);
+ setState(1053);
match(Ktype);
- setState(1051);
+ setState(1054);
sequenceType();
- setState(1052);
+ setState(1055);
match(T__6);
- setState(1053);
+ setState(1056);
expr();
- setState(1054);
+ setState(1057);
match(T__7);
}
}
@@ -7008,17 +7035,17 @@ public final AnnotateExprContext annotateExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1056);
+ setState(1059);
match(Kannotate);
- setState(1057);
+ setState(1060);
match(Ktype);
- setState(1058);
+ setState(1061);
sequenceType();
- setState(1059);
+ setState(1062);
match(T__6);
- setState(1060);
+ setState(1063);
expr();
- setState(1061);
+ setState(1064);
match(T__7);
}
}
@@ -7061,22 +7088,22 @@ public final SimpleMapExprContext simpleMapExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1063);
+ setState(1066);
((SimpleMapExprContext)_localctx).main_expr = postFixExpr();
- setState(1068);
+ setState(1071);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__52) {
{
{
- setState(1064);
+ setState(1067);
match(T__52);
- setState(1065);
+ setState(1068);
((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr();
((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr);
}
}
- setState(1070);
+ setState(1073);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -7146,53 +7173,53 @@ public final PostFixExprContext postFixExpr() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1071);
+ setState(1074);
((PostFixExprContext)_localctx).main_expr = primaryExpr();
- setState(1079);
+ setState(1082);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
- setState(1077);
+ setState(1080);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) {
case 1:
{
- setState(1072);
+ setState(1075);
arrayLookup();
}
break;
case 2:
{
- setState(1073);
+ setState(1076);
predicate();
}
break;
case 3:
{
- setState(1074);
+ setState(1077);
objectLookup();
}
break;
case 4:
{
- setState(1075);
+ setState(1078);
arrayUnboxing();
}
break;
case 5:
{
- setState(1076);
+ setState(1079);
argumentList();
}
break;
}
}
}
- setState(1081);
+ setState(1084);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,104,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,105,_ctx);
}
}
}
@@ -7228,15 +7255,15 @@ public final ArrayLookupContext arrayLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1082);
+ setState(1085);
match(T__53);
- setState(1083);
+ setState(1086);
match(T__53);
- setState(1084);
+ setState(1087);
expr();
- setState(1085);
+ setState(1088);
match(T__54);
- setState(1086);
+ setState(1089);
match(T__54);
}
}
@@ -7269,9 +7296,9 @@ public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1088);
+ setState(1091);
match(T__53);
- setState(1089);
+ setState(1092);
match(T__54);
}
}
@@ -7307,11 +7334,11 @@ public final PredicateContext predicate() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1091);
+ setState(1094);
match(T__53);
- setState(1092);
+ setState(1095);
expr();
- setState(1093);
+ setState(1096);
match(T__54);
}
}
@@ -7366,9 +7393,9 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1095);
+ setState(1098);
match(T__55);
- setState(1102);
+ setState(1105);
_errHandler.sync(this);
switch (_input.LA(1)) {
case Kfor:
@@ -7434,9 +7461,10 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -7445,37 +7473,37 @@ public final ObjectLookupContext objectLookup() throws RecognitionException {
case Kwhile:
case NullLiteral:
{
- setState(1096);
+ setState(1099);
((ObjectLookupContext)_localctx).kw = keyWords();
}
break;
case STRING:
{
- setState(1097);
+ setState(1100);
((ObjectLookupContext)_localctx).lt = stringLiteral();
}
break;
case NCName:
{
- setState(1098);
+ setState(1101);
((ObjectLookupContext)_localctx).nc = match(NCName);
}
break;
case T__8:
{
- setState(1099);
+ setState(1102);
((ObjectLookupContext)_localctx).pe = parenthesizedExpr();
}
break;
case T__4:
{
- setState(1100);
+ setState(1103);
((ObjectLookupContext)_localctx).vr = varRef();
}
break;
case T__56:
{
- setState(1101);
+ setState(1104);
((ObjectLookupContext)_localctx).ci = contextItemExpr();
}
break;
@@ -7548,111 +7576,111 @@ public final PrimaryExprContext primaryExpr() throws RecognitionException {
PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState());
enterRule(_localctx, 188, RULE_primaryExpr);
try {
- setState(1119);
+ setState(1122);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1104);
+ setState(1107);
match(NullLiteral);
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1105);
+ setState(1108);
match(Ktrue);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1106);
+ setState(1109);
match(Kfalse);
}
break;
case 4:
enterOuterAlt(_localctx, 4);
{
- setState(1107);
+ setState(1110);
match(Literal);
}
break;
case 5:
enterOuterAlt(_localctx, 5);
{
- setState(1108);
+ setState(1111);
stringLiteral();
}
break;
case 6:
enterOuterAlt(_localctx, 6);
{
- setState(1109);
+ setState(1112);
varRef();
}
break;
case 7:
enterOuterAlt(_localctx, 7);
{
- setState(1110);
+ setState(1113);
parenthesizedExpr();
}
break;
case 8:
enterOuterAlt(_localctx, 8);
{
- setState(1111);
+ setState(1114);
contextItemExpr();
}
break;
case 9:
enterOuterAlt(_localctx, 9);
{
- setState(1112);
+ setState(1115);
objectConstructor();
}
break;
case 10:
enterOuterAlt(_localctx, 10);
{
- setState(1113);
+ setState(1116);
functionCall();
}
break;
case 11:
enterOuterAlt(_localctx, 11);
{
- setState(1114);
+ setState(1117);
orderedExpr();
}
break;
case 12:
enterOuterAlt(_localctx, 12);
{
- setState(1115);
+ setState(1118);
unorderedExpr();
}
break;
case 13:
enterOuterAlt(_localctx, 13);
{
- setState(1116);
+ setState(1119);
arrayConstructor();
}
break;
case 14:
enterOuterAlt(_localctx, 14);
{
- setState(1117);
+ setState(1120);
functionItemExpr();
}
break;
case 15:
enterOuterAlt(_localctx, 15);
{
- setState(1118);
+ setState(1121);
blockExpr();
}
break;
@@ -7690,11 +7718,11 @@ public final BlockExprContext blockExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1121);
+ setState(1124);
match(T__6);
- setState(1122);
+ setState(1125);
statementsAndExpr();
- setState(1123);
+ setState(1126);
match(T__7);
}
}
@@ -7731,9 +7759,9 @@ public final VarRefContext varRef() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1125);
+ setState(1128);
match(T__4);
- setState(1126);
+ setState(1129);
((VarRefContext)_localctx).var_name = qname();
}
}
@@ -7770,19 +7798,19 @@ public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(1128);
+ setState(1131);
match(T__8);
- setState(1130);
+ setState(1133);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 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(1129);
+ setState(1132);
expr();
}
}
- setState(1132);
+ setState(1135);
match(T__9);
}
}
@@ -7815,7 +7843,7 @@ public final ContextItemExprContext contextItemExpr() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1134);
+ setState(1137);
match(T__56);
}
}
@@ -7851,13 +7879,13 @@ public final OrderedExprContext orderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1136);
+ setState(1139);
match(T__15);
- setState(1137);
+ setState(1140);
match(T__6);
- setState(1138);
+ setState(1141);
expr();
- setState(1139);
+ setState(1142);
match(T__7);
}
}
@@ -7894,13 +7922,13 @@ public final UnorderedExprContext unorderedExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1141);
+ setState(1144);
match(Kunordered);
- setState(1142);
+ setState(1145);
match(T__6);
- setState(1143);
+ setState(1146);
expr();
- setState(1144);
+ setState(1147);
match(T__7);
}
}
@@ -7940,9 +7968,9 @@ public final FunctionCallContext functionCall() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1146);
+ setState(1149);
((FunctionCallContext)_localctx).fn_name = qname();
- setState(1147);
+ setState(1150);
argumentList();
}
}
@@ -7984,34 +8012,34 @@ public final ArgumentListContext argumentList() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1149);
+ setState(1152);
match(T__8);
- setState(1156);
+ setState(1159);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 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(1150);
+ setState(1153);
((ArgumentListContext)_localctx).argument = argument();
((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument);
- setState(1152);
+ setState(1155);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__13) {
{
- setState(1151);
+ setState(1154);
match(T__13);
}
}
}
}
- setState(1158);
+ setState(1161);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1159);
+ setState(1162);
match(T__9);
}
}
@@ -8046,7 +8074,7 @@ public final ArgumentContext argument() throws RecognitionException {
ArgumentContext _localctx = new ArgumentContext(_ctx, getState());
enterRule(_localctx, 206, RULE_argument);
try {
- setState(1163);
+ setState(1166);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__4:
@@ -8123,9 +8151,10 @@ public final ArgumentContext argument() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -8138,14 +8167,14 @@ public final ArgumentContext argument() throws RecognitionException {
case NCName:
enterOuterAlt(_localctx, 1);
{
- setState(1161);
+ setState(1164);
exprSingle();
}
break;
case ArgumentPlaceholder:
enterOuterAlt(_localctx, 2);
{
- setState(1162);
+ setState(1165);
match(ArgumentPlaceholder);
}
break;
@@ -8186,99 +8215,23 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept
FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState());
enterRule(_localctx, 208, RULE_functionItemExpr);
try {
- setState(1167);
+ setState(1170);
_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:
+ switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) {
+ case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1165);
+ setState(1168);
namedFunctionRef();
}
break;
- case T__12:
- case T__30:
+ case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1166);
+ setState(1169);
inlineFunctionExpr();
}
break;
- default:
- throw new NoViableAltException(this);
}
}
catch (RecognitionException re) {
@@ -8316,11 +8269,11 @@ public final NamedFunctionRefContext namedFunctionRef() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(1169);
+ setState(1172);
((NamedFunctionRefContext)_localctx).fn_name = qname();
- setState(1170);
+ setState(1173);
match(T__57);
- setState(1171);
+ setState(1174);
((NamedFunctionRefContext)_localctx).arity = match(Literal);
}
}
@@ -8369,44 +8322,44 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx
try {
enterOuterAlt(_localctx, 1);
{
- setState(1173);
+ setState(1176);
annotations();
- setState(1174);
+ setState(1177);
match(T__30);
- setState(1175);
+ setState(1178);
match(T__8);
- setState(1177);
+ setState(1180);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(1176);
+ setState(1179);
paramList();
}
}
- setState(1179);
- match(T__9);
setState(1182);
+ match(T__9);
+ setState(1185);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==Kas) {
{
- setState(1180);
+ setState(1183);
match(Kas);
- setState(1181);
+ setState(1184);
((InlineFunctionExprContext)_localctx).return_type = sequenceType();
}
}
{
- setState(1184);
+ setState(1187);
match(T__6);
{
- setState(1185);
+ setState(1188);
((InlineFunctionExprContext)_localctx).fn_body = statementsAndOptionalExpr();
}
- setState(1186);
+ setState(1189);
match(T__7);
}
}
@@ -8459,32 +8412,32 @@ public final InsertExprContext insertExpr() throws RecognitionException {
enterRule(_localctx, 214, RULE_insertExpr);
int _la;
try {
- setState(1211);
+ setState(1214);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,117,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1188);
+ setState(1191);
match(Kinsert);
- setState(1189);
+ setState(1192);
match(Kjson);
- setState(1190);
+ setState(1193);
((InsertExprContext)_localctx).to_insert_expr = exprSingle();
- setState(1191);
+ setState(1194);
match(Kinto);
- setState(1192);
+ setState(1195);
((InsertExprContext)_localctx).main_expr = exprSingle();
- setState(1196);
+ setState(1199);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,115,_ctx) ) {
case 1:
{
- setState(1193);
+ setState(1196);
match(Kat);
- setState(1194);
+ setState(1197);
match(Kposition);
- setState(1195);
+ setState(1198);
((InsertExprContext)_localctx).pos_expr = exprSingle();
}
break;
@@ -8494,31 +8447,31 @@ public final InsertExprContext insertExpr() throws RecognitionException {
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1198);
+ setState(1201);
match(Kinsert);
- setState(1199);
+ setState(1202);
match(Kjson);
- setState(1200);
+ setState(1203);
pairConstructor();
- setState(1205);
+ setState(1208);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1201);
+ setState(1204);
match(T__13);
- setState(1202);
+ setState(1205);
pairConstructor();
}
}
- setState(1207);
+ setState(1210);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1208);
+ setState(1211);
match(Kinto);
- setState(1209);
+ setState(1212);
((InsertExprContext)_localctx).main_expr = exprSingle();
}
break;
@@ -8558,11 +8511,11 @@ public final DeleteExprContext deleteExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1213);
+ setState(1216);
match(Kdelete);
- setState(1214);
+ setState(1217);
match(Kjson);
- setState(1215);
+ setState(1218);
updateLocator();
}
}
@@ -8605,15 +8558,15 @@ public final RenameExprContext renameExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1217);
+ setState(1220);
match(Krename);
- setState(1218);
+ setState(1221);
match(Kjson);
- setState(1219);
+ setState(1222);
updateLocator();
- setState(1220);
+ setState(1223);
match(Kas);
- setState(1221);
+ setState(1224);
((RenameExprContext)_localctx).name_expr = exprSingle();
}
}
@@ -8658,19 +8611,19 @@ public final ReplaceExprContext replaceExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1223);
+ setState(1226);
match(Kreplace);
- setState(1224);
+ setState(1227);
match(Kvalue);
- setState(1225);
+ setState(1228);
match(Kof);
- setState(1226);
+ setState(1229);
match(Kjson);
- setState(1227);
+ setState(1230);
updateLocator();
- setState(1228);
+ setState(1231);
match(Kwith);
- setState(1229);
+ setState(1232);
((ReplaceExprContext)_localctx).replacer_expr = exprSingle();
}
}
@@ -8721,33 +8674,33 @@ public final TransformExprContext transformExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1231);
+ setState(1234);
match(Kcopy);
- setState(1232);
+ setState(1235);
copyDecl();
- setState(1237);
+ setState(1240);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1233);
+ setState(1236);
match(T__13);
- setState(1234);
+ setState(1237);
copyDecl();
}
}
- setState(1239);
+ setState(1242);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(1240);
+ setState(1243);
match(Kmodify);
- setState(1241);
+ setState(1244);
((TransformExprContext)_localctx).mod_expr = exprSingle();
- setState(1242);
+ setState(1245);
match(Kreturn);
- setState(1243);
+ setState(1246);
((TransformExprContext)_localctx).ret_expr = exprSingle();
}
}
@@ -8791,15 +8744,15 @@ public final AppendExprContext appendExpr() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1245);
+ setState(1248);
match(Kappend);
- setState(1246);
+ setState(1249);
match(Kjson);
- setState(1247);
+ setState(1250);
((AppendExprContext)_localctx).to_append_expr = exprSingle();
- setState(1248);
+ setState(1251);
match(Kinto);
- setState(1249);
+ setState(1252);
((AppendExprContext)_localctx).array_expr = exprSingle();
}
}
@@ -8849,27 +8802,27 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(1251);
+ setState(1254);
((UpdateLocatorContext)_localctx).main_expr = primaryExpr();
- setState(1254);
+ setState(1257);
_errHandler.sync(this);
_alt = 1;
do {
switch (_alt) {
case 1:
{
- setState(1254);
+ setState(1257);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__53:
{
- setState(1252);
+ setState(1255);
arrayLookup();
}
break;
case T__55:
{
- setState(1253);
+ setState(1256);
objectLookup();
}
break;
@@ -8881,9 +8834,9 @@ public final UpdateLocatorContext updateLocator() throws RecognitionException {
default:
throw new NoViableAltException(this);
}
- setState(1256);
+ setState(1259);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,119,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,120,_ctx);
} while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER );
}
}
@@ -8924,11 +8877,11 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1258);
+ setState(1261);
((CopyDeclContext)_localctx).var_ref = varRef();
- setState(1259);
+ setState(1262);
match(T__5);
- setState(1260);
+ setState(1263);
((CopyDeclContext)_localctx).src_expr = exprSingle();
}
}
@@ -8945,7 +8898,7 @@ public final CopyDeclContext copyDecl() throws RecognitionException {
public static class SequenceTypeContext extends ParserRuleContext {
public ItemTypeContext item;
- public Token s134;
+ public Token s135;
public List question = new ArrayList();
public Token s11;
public List star = new ArrayList();
@@ -8970,15 +8923,15 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState());
enterRule(_localctx, 230, RULE_sequenceType);
try {
- setState(1270);
+ setState(1273);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__8:
enterOuterAlt(_localctx, 1);
{
- setState(1262);
+ setState(1265);
match(T__8);
- setState(1263);
+ setState(1266);
match(T__9);
}
break;
@@ -9046,9 +8999,10 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
case Kappend:
case Kinto:
case Kvalue:
- case Kjson:
case Kwith:
case Kposition:
+ case Kjson:
+ case Kupdating:
case Kbreak:
case Kloop:
case Kcontinue:
@@ -9059,28 +9013,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException {
case NCName:
enterOuterAlt(_localctx, 2);
{
- setState(1264);
+ setState(1267);
((SequenceTypeContext)_localctx).item = itemType();
- setState(1268);
+ setState(1271);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,120,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) {
case 1:
{
- setState(1265);
- ((SequenceTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s134);
+ setState(1268);
+ ((SequenceTypeContext)_localctx).s135 = match(ArgumentPlaceholder);
+ ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s135);
}
break;
case 2:
{
- setState(1266);
+ setState(1269);
((SequenceTypeContext)_localctx).s11 = match(T__10);
((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s11);
}
break;
case 3:
{
- setState(1267);
+ setState(1270);
((SequenceTypeContext)_localctx).s48 = match(T__47);
((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48);
}
@@ -9131,53 +9085,53 @@ public final ObjectConstructorContext objectConstructor() throws RecognitionExce
enterRule(_localctx, 232, RULE_objectConstructor);
int _la;
try {
- setState(1288);
+ setState(1291);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__6:
enterOuterAlt(_localctx, 1);
{
- setState(1272);
+ setState(1275);
match(T__6);
- setState(1281);
+ setState(1284);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 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(1273);
+ setState(1276);
pairConstructor();
- setState(1278);
+ setState(1281);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1274);
+ setState(1277);
match(T__13);
- setState(1275);
+ setState(1278);
pairConstructor();
}
}
- setState(1280);
+ setState(1283);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(1283);
+ setState(1286);
match(T__7);
}
break;
case T__58:
enterOuterAlt(_localctx, 2);
{
- setState(1284);
+ setState(1287);
((ObjectConstructorContext)_localctx).s59 = match(T__58);
((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59);
- setState(1285);
+ setState(1288);
expr();
- setState(1286);
+ setState(1289);
match(T__59);
}
break;
@@ -9219,27 +9173,27 @@ public final ItemTypeContext itemType() throws RecognitionException {
ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState());
enterRule(_localctx, 234, RULE_itemType);
try {
- setState(1293);
+ setState(1296);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,125,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
case 1:
enterOuterAlt(_localctx, 1);
{
- setState(1290);
+ setState(1293);
qname();
}
break;
case 2:
enterOuterAlt(_localctx, 2);
{
- setState(1291);
+ setState(1294);
match(NullLiteral);
}
break;
case 3:
enterOuterAlt(_localctx, 3);
{
- setState(1292);
+ setState(1295);
functionTest();
}
break;
@@ -9280,18 +9234,18 @@ public final FunctionTestContext functionTest() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1297);
+ setState(1300);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,126,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,127,_ctx) ) {
case 1:
{
- setState(1295);
+ setState(1298);
anyFunctionTest();
}
break;
case 2:
{
- setState(1296);
+ setState(1299);
typedFunctionTest();
}
break;
@@ -9327,13 +9281,13 @@ public final AnyFunctionTestContext anyFunctionTest() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1299);
+ setState(1302);
match(T__30);
- setState(1300);
+ setState(1303);
match(T__8);
- setState(1301);
+ setState(1304);
match(T__10);
- setState(1302);
+ setState(1305);
match(T__9);
}
}
@@ -9377,43 +9331,43 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce
try {
enterOuterAlt(_localctx, 1);
{
- setState(1304);
+ setState(1307);
match(T__30);
- setState(1305);
+ setState(1308);
match(T__8);
- setState(1314);
+ setState(1317);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 128)) & ((1L << (Kbreak - 128)) | (1L << (Kloop - 128)) | (1L << (Kcontinue - 128)) | (1L << (Kexit - 128)) | (1L << (Kreturning - 128)) | (1L << (Kwhile - 128)) | (1L << (NullLiteral - 128)) | (1L << (NCName - 128)))) != 0)) {
{
- setState(1306);
+ setState(1309);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
- setState(1311);
+ setState(1314);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__13) {
{
{
- setState(1307);
+ setState(1310);
match(T__13);
- setState(1308);
+ setState(1311);
((TypedFunctionTestContext)_localctx).sequenceType = sequenceType();
((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType);
}
}
- setState(1313);
+ setState(1316);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
- setState(1316);
+ setState(1319);
match(T__9);
- setState(1317);
+ setState(1320);
match(Kas);
- setState(1318);
+ setState(1321);
((TypedFunctionTestContext)_localctx).rt = sequenceType();
}
}
@@ -9430,7 +9384,7 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce
public static class SingleTypeContext extends ParserRuleContext {
public ItemTypeContext item;
- public Token s134;
+ public Token s135;
public List question = new ArrayList();
public ItemTypeContext itemType() {
return getRuleContext(ItemTypeContext.class,0);
@@ -9453,16 +9407,16 @@ public final SingleTypeContext singleType() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1320);
+ setState(1323);
((SingleTypeContext)_localctx).item = itemType();
- setState(1322);
+ setState(1325);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,129,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
case 1:
{
- setState(1321);
- ((SingleTypeContext)_localctx).s134 = match(ArgumentPlaceholder);
- ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s134);
+ setState(1324);
+ ((SingleTypeContext)_localctx).s135 = match(ArgumentPlaceholder);
+ ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s135);
}
break;
}
@@ -9509,23 +9463,23 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio
try {
enterOuterAlt(_localctx, 1);
{
- setState(1326);
+ setState(1329);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,130,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) {
case 1:
{
- setState(1324);
+ setState(1327);
((PairConstructorContext)_localctx).lhs = exprSingle();
}
break;
case 2:
{
- setState(1325);
+ setState(1328);
((PairConstructorContext)_localctx).name = match(NCName);
}
break;
}
- setState(1328);
+ setState(1331);
_la = _input.LA(1);
if ( !(_la==T__17 || _la==ArgumentPlaceholder) ) {
_errHandler.recoverInline(this);
@@ -9535,7 +9489,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio
_errHandler.reportMatch(this);
consume();
}
- setState(1329);
+ setState(1332);
((PairConstructorContext)_localctx).rhs = exprSingle();
}
}
@@ -9572,19 +9526,19 @@ public final ArrayConstructorContext arrayConstructor() throws RecognitionExcept
try {
enterOuterAlt(_localctx, 1);
{
- setState(1331);
+ setState(1334);
match(T__53);
- setState(1333);
+ setState(1336);
_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__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 << (Kwith - 64)) | (1L << (Kposition - 64)) | (1L << (Kjson - 64)) | (1L << (Kupdating - 64)))) != 0) || ((((_la - 128)) & ~0x3f) == 0 && ((1L << (_la - 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(1332);
+ setState(1335);
expr();
}
}
- setState(1335);
+ setState(1338);
match(T__54);
}
}
@@ -9620,7 +9574,7 @@ public final UriLiteralContext uriLiteral() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1337);
+ setState(1340);
stringLiteral();
}
}
@@ -9654,7 +9608,7 @@ public final StringLiteralContext stringLiteral() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1339);
+ setState(1342);
match(STRING);
}
}
@@ -9730,7 +9684,6 @@ public static class KeyWordsContext extends ParserRuleContext {
public TerminalNode Kappend() { return getToken(JsoniqParser.Kappend, 0); }
public TerminalNode Kcopy() { return getToken(JsoniqParser.Kcopy, 0); }
public TerminalNode Kmodify() { return getToken(JsoniqParser.Kmodify, 0); }
- public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); }
public TerminalNode Kinto() { return getToken(JsoniqParser.Kinto, 0); }
public TerminalNode Kvalue() { return getToken(JsoniqParser.Kvalue, 0); }
public TerminalNode Kwith() { return getToken(JsoniqParser.Kwith, 0); }
@@ -9743,6 +9696,8 @@ public static class KeyWordsContext extends ParserRuleContext {
public TerminalNode Kexit() { return getToken(JsoniqParser.Kexit, 0); }
public TerminalNode Kreturning() { return getToken(JsoniqParser.Kreturning, 0); }
public TerminalNode Kwhile() { return getToken(JsoniqParser.Kwhile, 0); }
+ public TerminalNode Kjson() { return getToken(JsoniqParser.Kjson, 0); }
+ public TerminalNode Kupdating() { return getToken(JsoniqParser.Kupdating, 0); }
public KeyWordsContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -9761,9 +9716,9 @@ public final KeyWordsContext keyWords() throws RecognitionException {
try {
enterOuterAlt(_localctx, 1);
{
- setState(1341);
+ setState(1344);
_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 - 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 << (Kwith - 61)))) != 0) || ((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (Kposition - 125)) | (1L << (Kjson - 125)) | (1L << (Kupdating - 125)) | (1L << (Kbreak - 125)) | (1L << (Kloop - 125)) | (1L << (Kcontinue - 125)) | (1L << (Kexit - 125)) | (1L << (Kreturning - 125)) | (1L << (Kwhile - 125)) | (1L << (NullLiteral - 125)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -9785,7 +9740,7 @@ public final KeyWordsContext keyWords() throws RecognitionException {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0092\u0542\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0093\u0545\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"+
@@ -9816,477 +9771,479 @@ public final KeyWordsContext keyWords() throws RecognitionException {
"\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\7q\u04d6\nq\fq\16q\u04d9\13q\3q\3q\3q\3q"+
- "\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04e9\ns\rs\16s\u04ea\3t\3t\3t\3t\3"+
- "u\3u\3u\3u\3u\3u\5u\u04f7\nu\5u\u04f9\nu\3v\3v\3v\3v\7v\u04ff\nv\fv\16"+
- "v\u0502\13v\5v\u0504\nv\3v\3v\3v\3v\3v\5v\u050b\nv\3w\3w\3w\5w\u0510\n"+
- "w\3x\3x\5x\u0514\nx\3y\3y\3y\3y\3y\3z\3z\3z\3z\3z\7z\u0520\nz\fz\16z\u0523"+
- "\13z\5z\u0525\nz\3z\3z\3z\3z\3{\3{\5{\u052d\n{\3|\3|\5|\u0531\n|\3|\3"+
- "|\3|\3}\3}\5}\u0538\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\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\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\u0583\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\u04df\3\2\2\2\u00e4\u04e5\3\2\2\2\u00e6"+
- "\u04ec\3\2\2\2\u00e8\u04f8\3\2\2\2\u00ea\u050a\3\2\2\2\u00ec\u050f\3\2"+
- "\2\2\u00ee\u0513\3\2\2\2\u00f0\u0515\3\2\2\2\u00f2\u051a\3\2\2\2\u00f4"+
- "\u052a\3\2\2\2\u00f6\u0530\3\2\2\2\u00f8\u0535\3\2\2\2\u00fa\u053b\3\2"+
- "\2\2\u00fc\u053d\3\2\2\2\u00fe\u053f\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\7"+
- "Y\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\u0086D\2\u02b0\u02b2\5\u0088"+
- "E\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\u00c2b\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\u02fbo\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\u00e8u\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\7"+
- "L\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\u00e8"+
- "u\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\7c\2\2\u04cc\u04cd\7~\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\u04d7\5\u00e6t\2\u04d3\u04d4\7\20\2\2\u04d4"+
- "\u04d6\5\u00e6t\2\u04d5\u04d3\3\2\2\2\u04d6\u04d9\3\2\2\2\u04d7\u04d5"+
- "\3\2\2\2\u04d7\u04d8\3\2\2\2\u04d8\u04da\3\2\2\2\u04d9\u04d7\3\2\2\2\u04da"+
- "\u04db\7z\2\2\u04db\u04dc\5`\61\2\u04dc\u04dd\7E\2\2\u04dd\u04de\5`\61"+
- "\2\u04de\u00e1\3\2\2\2\u04df\u04e0\7{\2\2\u04e0\u04e1\7~\2\2\u04e1\u04e2"+
- "\5`\61\2\u04e2\u04e3\7|\2\2\u04e3\u04e4\5`\61\2\u04e4\u00e3\3\2\2\2\u04e5"+
- "\u04e8\5\u00be`\2\u04e6\u04e9\5\u00b6\\\2\u04e7\u04e9\5\u00bc_\2\u04e8"+
- "\u04e6\3\2\2\2\u04e8\u04e7\3\2\2\2\u04e9\u04ea\3\2\2\2\u04ea\u04e8\3\2"+
- "\2\2\u04ea\u04eb\3\2\2\2\u04eb\u00e5\3\2\2\2\u04ec\u04ed\5\u00c2b\2\u04ed"+
- "\u04ee\7\b\2\2\u04ee\u04ef\5`\61\2\u04ef\u00e7\3\2\2\2\u04f0\u04f1\7\13"+
- "\2\2\u04f1\u04f9\7\f\2\2\u04f2\u04f6\5\u00ecw\2\u04f3\u04f7\7\u0088\2"+
- "\2\u04f4\u04f7\7\r\2\2\u04f5\u04f7\7\62\2\2\u04f6\u04f3\3\2\2\2\u04f6"+
- "\u04f4\3\2\2\2\u04f6\u04f5\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f9\3\2"+
- "\2\2\u04f8\u04f0\3\2\2\2\u04f8\u04f2\3\2\2\2\u04f9\u00e9\3\2\2\2\u04fa"+
- "\u0503\7\t\2\2\u04fb\u0500\5\u00f6|\2\u04fc\u04fd\7\20\2\2\u04fd\u04ff"+
- "\5\u00f6|\2\u04fe\u04fc\3\2\2\2\u04ff\u0502\3\2\2\2\u0500\u04fe\3\2\2"+
- "\2\u0500\u0501\3\2\2\2\u0501\u0504\3\2\2\2\u0502\u0500\3\2\2\2\u0503\u04fb"+
- "\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0505\3\2\2\2\u0505\u050b\7\n\2\2\u0506"+
- "\u0507\7=\2\2\u0507\u0508\5^\60\2\u0508\u0509\7>\2\2\u0509\u050b\3\2\2"+
- "\2\u050a\u04fa\3\2\2\2\u050a\u0506\3\2\2\2\u050b\u00eb\3\2\2\2\u050c\u0510"+
- "\5J&\2\u050d\u0510\7\u0089\2\2\u050e\u0510\5\u00eex\2\u050f\u050c\3\2"+
- "\2\2\u050f\u050d\3\2\2\2\u050f\u050e\3\2\2\2\u0510\u00ed\3\2\2\2\u0511"+
- "\u0514\5\u00f0y\2\u0512\u0514\5\u00f2z\2\u0513\u0511\3\2\2\2\u0513\u0512"+
- "\3\2\2\2\u0514\u00ef\3\2\2\2\u0515\u0516\7!\2\2\u0516\u0517\7\13\2\2\u0517"+
- "\u0518\7\r\2\2\u0518\u0519\7\f\2\2\u0519\u00f1\3\2\2\2\u051a\u051b\7!"+
- "\2\2\u051b\u0524\7\13\2\2\u051c\u0521\5\u00e8u\2\u051d\u051e\7\20\2\2"+
- "\u051e\u0520\5\u00e8u\2\u051f\u051d\3\2\2\2\u0520\u0523\3\2\2\2\u0521"+
- "\u051f\3\2\2\2\u0521\u0522\3\2\2\2\u0522\u0525\3\2\2\2\u0523\u0521\3\2"+
- "\2\2\u0524\u051c\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0526\3\2\2\2\u0526"+
- "\u0527\7\f\2\2\u0527\u0528\7H\2\2\u0528\u0529\5\u00e8u\2\u0529\u00f3\3"+
- "\2\2\2\u052a\u052c\5\u00ecw\2\u052b\u052d\7\u0088\2\2\u052c\u052b\3\2"+
- "\2\2\u052c\u052d\3\2\2\2\u052d\u00f5\3\2\2\2\u052e\u0531\5`\61\2\u052f"+
- "\u0531\7\u0090\2\2\u0530\u052e\3\2\2\2\u0530\u052f\3\2\2\2\u0531\u0532"+
- "\3\2\2\2\u0532\u0533\t\b\2\2\u0533\u0534\5`\61\2\u0534\u00f7\3\2\2\2\u0535"+
- "\u0537\78\2\2\u0536\u0538\5^\60\2\u0537\u0536\3\2\2\2\u0537\u0538\3\2"+
- "\2\2\u0538\u0539\3\2\2\2\u0539\u053a\79\2\2\u053a\u00f9\3\2\2\2\u053b"+
- "\u053c\5\u00fc\177\2\u053c\u00fb\3\2\2\2\u053d\u053e\7\u0087\2\2\u053e"+
- "\u00fd\3\2\2\2\u053f\u0540\t\t\2\2\u0540\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\u04d7\u04e8\u04ea\u04f6\u04f8"+
- "\u0500\u0503\u050a\u050f\u0513\u0521\u0524\u052c\u0530\u0537";
+ "\32\7\32\u01d6\n\32\f\32\16\32\u01d9\13\32\3\32\5\32\u01dc\n\32\3\32\5"+
+ "\32\u01df\n\32\3\33\7\33\u01e2\n\33\f\33\16\33\u01e5\13\33\3\34\3\34\3"+
+ "\34\3\34\3\34\7\34\u01ec\n\34\f\34\16\34\u01ef\13\34\3\34\3\34\3\35\3"+
+ "\35\3\35\5\35\u01f6\n\35\3\35\3\35\5\35\u01fa\n\35\3\36\3\36\3\36\3\36"+
+ "\3\36\3\36\3\37\3\37\3\37\3\37\5\37\u0206\n\37\3 \3 \3 \3 \3 \3 \3!\3"+
+ "!\3!\3!\5!\u0212\n!\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$"+
+ "\3%\3%\3%\3%\3%\5%\u0228\n%\3%\3%\3%\3%\7%\u022e\n%\f%\16%\u0231\13%\3"+
+ "&\3&\5&\u0235\n&\3&\5&\u0238\n&\3&\3&\5&\u023c\n&\3\'\3\'\3(\3(\3(\3("+
+ "\3(\5(\u0245\n(\3(\3(\3(\3(\3(\7(\u024c\n(\f(\16(\u024f\13(\5(\u0251\n"+
+ "(\3)\3)\3)\3)\3)\3)\5)\u0259\n)\3)\3)\3)\3)\3)\5)\u0260\n)\5)\u0262\n"+
+ ")\3*\3*\3*\3*\3*\5*\u0269\n*\3*\3*\3*\3*\3*\5*\u0270\n*\5*\u0272\n*\3"+
+ "+\3+\3+\3+\3+\3+\5+\u027a\n+\3+\3+\3+\5+\u027f\n+\3+\3+\3+\3+\3+\5+\u0286"+
+ "\n+\3,\3,\3,\3,\3,\5,\u028d\n,\3,\3,\3-\3-\3-\3-\3-\3-\5-\u0297\n-\3."+
+ "\3.\3.\7.\u029c\n.\f.\16.\u029f\13.\3/\3/\3/\3/\5/\u02a5\n/\3\60\3\60"+
+ "\3\60\7\60\u02aa\n\60\f\60\16\60\u02ad\13\60\3\61\3\61\3\61\3\61\3\61"+
+ "\3\61\5\61\u02b5\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u02bf"+
+ "\n\62\3\63\3\63\5\63\u02c3\n\63\3\63\3\63\3\63\3\63\3\63\3\63\7\63\u02cb"+
+ "\n\63\f\63\16\63\u02ce\13\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\7\64\u02d7"+
+ "\n\64\f\64\16\64\u02da\13\64\3\65\3\65\3\65\5\65\u02df\n\65\3\65\3\65"+
+ "\5\65\u02e3\n\65\3\65\3\65\5\65\u02e7\n\65\3\65\3\65\3\65\3\66\3\66\3"+
+ "\66\3\66\7\66\u02f0\n\66\f\66\16\66\u02f3\13\66\3\67\3\67\3\67\5\67\u02f8"+
+ "\n\67\3\67\3\67\3\67\38\38\38\39\39\39\39\39\79\u0305\n9\f9\169\u0308"+
+ "\139\3:\3:\3:\5:\u030d\n:\3:\3:\5:\u0311\n:\3:\3:\5:\u0315\n:\3;\3;\3"+
+ ";\3;\3;\5;\u031c\n;\3;\3;\3;\7;\u0321\n;\f;\16;\u0324\13;\3<\3<\3<\5<"+
+ "\u0329\n<\3<\3<\3<\5<\u032e\n<\5<\u0330\n<\3<\3<\5<\u0334\n<\3=\3=\3="+
+ "\3>\3>\5>\u033b\n>\3>\3>\3>\7>\u0340\n>\f>\16>\u0343\13>\3>\3>\3>\3?\3"+
+ "?\3?\5?\u034b\n?\3?\3?\3?\3@\3@\3@\3@\3@\6@\u0355\n@\r@\16@\u0356\3@\3"+
+ "@\3@\3@\3A\3A\6A\u035f\nA\rA\16A\u0360\3A\3A\3A\3B\3B\3B\3B\3B\6B\u036b"+
+ "\nB\rB\16B\u036c\3B\3B\5B\u0371\nB\3B\3B\3B\3C\3C\3C\3C\5C\u037a\nC\3"+
+ "C\3C\3C\7C\u037f\nC\fC\16C\u0382\13C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D"+
+ "\3D\3E\3E\3E\3E\3E\6E\u0395\nE\rE\16E\u0396\3F\3F\3F\5F\u039c\nF\3F\3"+
+ "F\3F\5F\u03a1\nF\7F\u03a3\nF\fF\16F\u03a6\13F\3F\3F\3F\3F\3G\3G\3G\7G"+
+ "\u03af\nG\fG\16G\u03b2\13G\3H\3H\3H\7H\u03b7\nH\fH\16H\u03ba\13H\3I\5"+
+ "I\u03bd\nI\3I\3I\3J\3J\3J\5J\u03c4\nJ\3K\3K\3K\7K\u03c9\nK\fK\16K\u03cc"+
+ "\13K\3L\3L\3L\5L\u03d1\nL\3M\3M\3M\7M\u03d6\nM\fM\16M\u03d9\13M\3N\3N"+
+ "\3N\7N\u03de\nN\fN\16N\u03e1\13N\3O\3O\3O\3O\5O\u03e7\nO\3P\3P\3P\3P\5"+
+ "P\u03ed\nP\3Q\3Q\3Q\3Q\5Q\u03f3\nQ\3R\3R\3R\3R\5R\u03f9\nR\3S\3S\3S\3"+
+ "S\5S\u03ff\nS\3T\3T\3T\3T\3T\3T\3T\7T\u0408\nT\fT\16T\u040b\13T\3U\3U"+
+ "\3U\5U\u0410\nU\3V\7V\u0413\nV\fV\16V\u0416\13V\3V\3V\3W\3W\3W\5W\u041d"+
+ "\nW\3X\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\7Z\u0430\nZ\fZ"+
+ "\16Z\u0433\13Z\3[\3[\3[\3[\3[\3[\7[\u043b\n[\f[\16[\u043e\13[\3\\\3\\"+
+ "\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3_\5_\u0454\n"+
+ "_\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\3`\5`\u0465\n`\3a\3a\3a\3"+
+ "a\3b\3b\3b\3c\3c\5c\u0470\nc\3c\3c\3d\3d\3e\3e\3e\3e\3e\3f\3f\3f\3f\3"+
+ "f\3g\3g\3g\3h\3h\3h\5h\u0486\nh\7h\u0488\nh\fh\16h\u048b\13h\3h\3h\3i"+
+ "\3i\5i\u0491\ni\3j\3j\5j\u0495\nj\3k\3k\3k\3k\3l\3l\3l\3l\5l\u049f\nl"+
+ "\3l\3l\3l\5l\u04a4\nl\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3m\3m\5m\u04b2\nm"+
+ "\3m\3m\3m\3m\3m\7m\u04b9\nm\fm\16m\u04bc\13m\3m\3m\3m\5m\u04c1\nm\3n\3"+
+ "n\3n\3n\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\7q\u04d9"+
+ "\nq\fq\16q\u04dc\13q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3s\3s\3s\6s\u04ec"+
+ "\ns\rs\16s\u04ed\3t\3t\3t\3t\3u\3u\3u\3u\3u\3u\5u\u04fa\nu\5u\u04fc\n"+
+ "u\3v\3v\3v\3v\7v\u0502\nv\fv\16v\u0505\13v\5v\u0507\nv\3v\3v\3v\3v\3v"+
+ "\5v\u050e\nv\3w\3w\3w\5w\u0513\nw\3x\3x\5x\u0517\nx\3y\3y\3y\3y\3y\3z"+
+ "\3z\3z\3z\3z\7z\u0523\nz\fz\16z\u0526\13z\5z\u0528\nz\3z\3z\3z\3z\3{\3"+
+ "{\5{\u0530\n{\3|\3|\5|\u0534\n|\3|\3|\3|\3}\3}\5}\u053b\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\\^`bdfhjlnprtv"+
+ "xz|~\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\u0089\u0089\4\2?\u0087\u008a\u008a"+
+ "\2\u0587\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\u01de\3\2\2\2\64\u01e3\3\2"+
+ "\2\2\66\u01e6\3\2\2\28\u01f2\3\2\2\2:\u01fb\3\2\2\2<\u0205\3\2\2\2>\u0207"+
+ "\3\2\2\2@\u0211\3\2\2\2B\u0213\3\2\2\2D\u0218\3\2\2\2F\u021c\3\2\2\2H"+
+ "\u0222\3\2\2\2J\u0237\3\2\2\2L\u023d\3\2\2\2N\u023f\3\2\2\2P\u0252\3\2"+
+ "\2\2R\u0263\3\2\2\2T\u0273\3\2\2\2V\u0287\3\2\2\2X\u0296\3\2\2\2Z\u0298"+
+ "\3\2\2\2\\\u02a0\3\2\2\2^\u02a6\3\2\2\2`\u02b4\3\2\2\2b\u02be\3\2\2\2"+
+ "d\u02c2\3\2\2\2f\u02d2\3\2\2\2h\u02db\3\2\2\2j\u02eb\3\2\2\2l\u02f4\3"+
+ "\2\2\2n\u02fc\3\2\2\2p\u02ff\3\2\2\2r\u0309\3\2\2\2t\u031b\3\2\2\2v\u0325"+
+ "\3\2\2\2x\u0335\3\2\2\2z\u033a\3\2\2\2|\u0347\3\2\2\2~\u034f\3\2\2\2\u0080"+
+ "\u035e\3\2\2\2\u0082\u0365\3\2\2\2\u0084\u0375\3\2\2\2\u0086\u0386\3\2"+
+ "\2\2\u0088\u038f\3\2\2\2\u008a\u0398\3\2\2\2\u008c\u03ab\3\2\2\2\u008e"+
+ "\u03b3\3\2\2\2\u0090\u03bc\3\2\2\2\u0092\u03c0\3\2\2\2\u0094\u03c5\3\2"+
+ "\2\2\u0096\u03cd\3\2\2\2\u0098\u03d2\3\2\2\2\u009a\u03da\3\2\2\2\u009c"+
+ "\u03e2\3\2\2\2\u009e\u03e8\3\2\2\2\u00a0\u03ee\3\2\2\2\u00a2\u03f4\3\2"+
+ "\2\2\u00a4\u03fa\3\2\2\2\u00a6\u0400\3\2\2\2\u00a8\u040f\3\2\2\2\u00aa"+
+ "\u0414\3\2\2\2\u00ac\u041c\3\2\2\2\u00ae\u041e\3\2\2\2\u00b0\u0425\3\2"+
+ "\2\2\u00b2\u042c\3\2\2\2\u00b4\u0434\3\2\2\2\u00b6\u043f\3\2\2\2\u00b8"+
+ "\u0445\3\2\2\2\u00ba\u0448\3\2\2\2\u00bc\u044c\3\2\2\2\u00be\u0464\3\2"+
+ "\2\2\u00c0\u0466\3\2\2\2\u00c2\u046a\3\2\2\2\u00c4\u046d\3\2\2\2\u00c6"+
+ "\u0473\3\2\2\2\u00c8\u0475\3\2\2\2\u00ca\u047a\3\2\2\2\u00cc\u047f\3\2"+
+ "\2\2\u00ce\u0482\3\2\2\2\u00d0\u0490\3\2\2\2\u00d2\u0494\3\2\2\2\u00d4"+
+ "\u0496\3\2\2\2\u00d6\u049a\3\2\2\2\u00d8\u04c0\3\2\2\2\u00da\u04c2\3\2"+
+ "\2\2\u00dc\u04c6\3\2\2\2\u00de\u04cc\3\2\2\2\u00e0\u04d4\3\2\2\2\u00e2"+
+ "\u04e2\3\2\2\2\u00e4\u04e8\3\2\2\2\u00e6\u04ef\3\2\2\2\u00e8\u04fb\3\2"+
+ "\2\2\u00ea\u050d\3\2\2\2\u00ec\u0512\3\2\2\2\u00ee\u0516\3\2\2\2\u00f0"+
+ "\u0518\3\2\2\2\u00f2\u051d\3\2\2\2\u00f4\u052d\3\2\2\2\u00f6\u0533\3\2"+
+ "\2\2\u00f8\u0538\3\2\2\2\u00fa\u053e\3\2\2\2\u00fc\u0540\3\2\2\2\u00fe"+
+ "\u0542\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\u0091\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\u0082\2\2\u0159\u015a\7\u0083"+
+ "\2\2\u015a\u015b\7\3\2\2\u015b\35\3\2\2\2\u015c\u015d\7\u0084\2\2\u015d"+
+ "\u015e\7\u0083\2\2\u015e\u015f\7\3\2\2\u015f\37\3\2\2\2\u0160\u0161\7"+
+ "\u0085\2\2\u0161\u0162\7\u0086\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\u008b\2\2\u01d3\u01d4\7\20\2\2\u01d4\u01d6\7\u008b"+
+ "\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\u01df\3\2\2\2\u01dd"+
+ "\u01df\7\u0081\2\2\u01de\u01cf\3\2\2\2\u01de\u01dd\3\2\2\2\u01df\63\3"+
+ "\2\2\2\u01e0\u01e2\5\62\32\2\u01e1\u01e0\3\2\2\2\u01e2\u01e5\3\2\2\2\u01e3"+
+ "\u01e1\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4\65\3\2\2\2\u01e5\u01e3\3\2\2"+
+ "\2\u01e6\u01e7\5\64\33\2\u01e7\u01e8\7t\2\2\u01e8\u01ed\58\35\2\u01e9"+
+ "\u01ea\7\20\2\2\u01ea\u01ec\58\35\2\u01eb\u01e9\3\2\2\2\u01ec\u01ef\3"+
+ "\2\2\2\u01ed\u01eb\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee\u01f0\3\2\2\2\u01ef"+
+ "\u01ed\3\2\2\2\u01f0\u01f1\7\3\2\2\u01f1\67\3\2\2\2\u01f2\u01f5\5\u00c2"+
+ "b\2\u01f3\u01f4\7H\2\2\u01f4\u01f6\5\u00e8u\2\u01f5\u01f3\3\2\2\2\u01f5"+
+ "\u01f6\3\2\2\2\u01f6\u01f9\3\2\2\2\u01f7\u01f8\7\b\2\2\u01f8\u01fa\5`"+
+ "\61\2\u01f9\u01f7\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa9\3\2\2\2\u01fb\u01fc"+
+ "\7\u0087\2\2\u01fc\u01fd\7\13\2\2\u01fd\u01fe\5^\60\2\u01fe\u01ff\7\f"+
+ "\2\2\u01ff\u0200\5\24\13\2\u0200;\3\2\2\2\u0201\u0206\5B\"\2\u0202\u0206"+
+ "\5D#\2\u0203\u0206\5F$\2\u0204\u0206\5H%\2\u0205\u0201\3\2\2\2\u0205\u0202"+
+ "\3\2\2\2\u0205\u0203\3\2\2\2\u0205\u0204\3\2\2\2\u0206=\3\2\2\2\u0207"+
+ "\u0208\7q\2\2\u0208\u0209\7\5\2\2\u0209\u020a\7\u0091\2\2\u020a\u020b"+
+ "\7\6\2\2\u020b\u020c\5\u00fa~\2\u020c?\3\2\2\2\u020d\u0212\5T+\2\u020e"+
+ "\u0212\5P)\2\u020f\u0212\5V,\2\u0210\u0212\5R*\2\u0211\u020d\3\2\2\2\u0211"+
+ "\u020e\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0210\3\2\2\2\u0212A\3\2\2\2"+
+ "\u0213\u0214\7q\2\2\u0214\u0215\7Z\2\2\u0215\u0216\7S\2\2\u0216\u0217"+
+ "\5\u00fa~\2\u0217C\3\2\2\2\u0218\u0219\7q\2\2\u0219\u021a\7\21\2\2\u021a"+
+ "\u021b\t\2\2\2\u021bE\3\2\2\2\u021c\u021d\7q\2\2\u021d\u021e\7Z\2\2\u021e"+
+ "\u021f\7D\2\2\u021f\u0220\7K\2\2\u0220\u0221\t\3\2\2\u0221G\3\2\2\2\u0222"+
+ "\u0227\7q\2\2\u0223\u0224\7\23\2\2\u0224\u0228\5J&\2\u0225\u0226\7Z\2"+
+ "\2\u0226\u0228\7\23\2\2\u0227\u0223\3\2\2\2\u0227\u0225\3\2\2\2\u0228"+
+ "\u022f\3\2\2\2\u0229\u022a\5L\'\2\u022a\u022b\7\6\2\2\u022b\u022c\5\u00fc"+
+ "\177\2\u022c\u022e\3\2\2\2\u022d\u0229\3\2\2\2\u022e\u0231\3\2\2\2\u022f"+
+ "\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230I\3\2\2\2\u0231\u022f\3\2\2\2"+
+ "\u0232\u0235\7\u0091\2\2\u0233\u0235\5\u00fe\u0080\2\u0234\u0232\3\2\2"+
+ "\2\u0234\u0233\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0238\7\24\2\2\u0237"+
+ "\u0234\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u023b\3\2\2\2\u0239\u023c\7\u0091"+
+ "\2\2\u023a\u023c\5\u00fe\u0080\2\u023b\u0239\3\2\2\2\u023b\u023a\3\2\2"+
+ "\2\u023cK\3\2\2\2\u023d\u023e\t\4\2\2\u023eM\3\2\2\2\u023f\u0240\7\37"+
+ "\2\2\u0240\u0244\7\4\2\2\u0241\u0242\7\5\2\2\u0242\u0243\7\u0091\2\2\u0243"+
+ "\u0245\7\6\2\2\u0244\u0241\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0246\3\2"+
+ "\2\2\u0246\u0250\5\u00fa~\2\u0247\u0248\7I\2\2\u0248\u024d\5\u00fa~\2"+
+ "\u0249\u024a\7\20\2\2\u024a\u024c\5\u00fa~\2\u024b\u0249\3\2\2\2\u024c"+
+ "\u024f\3\2\2\2\u024d\u024b\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u0251\3\2"+
+ "\2\2\u024f\u024d\3\2\2\2\u0250\u0247\3\2\2\2\u0250\u0251\3\2\2\2\u0251"+
+ "O\3\2\2\2\u0252\u0253\7q\2\2\u0253\u0254\5\64\33\2\u0254\u0255\7t\2\2"+
+ "\u0255\u0258\5\u00c2b\2\u0256\u0257\7H\2\2\u0257\u0259\5\u00e8u\2\u0258"+
+ "\u0256\3\2\2\2\u0258\u0259\3\2\2\2\u0259\u0261\3\2\2\2\u025a\u025b\7\b"+
+ "\2\2\u025b\u0262\5`\61\2\u025c\u025f\7 \2\2\u025d\u025e\7\b\2\2\u025e"+
+ "\u0260\5`\61\2\u025f\u025d\3\2\2\2\u025f\u0260\3\2\2\2\u0260\u0262\3\2"+
+ "\2\2\u0261\u025a\3\2\2\2\u0261\u025c\3\2\2\2\u0262Q\3\2\2\2\u0263\u0264"+
+ "\7q\2\2\u0264\u0265\7r\2\2\u0265\u0268\7s\2\2\u0266\u0267\7H\2\2\u0267"+
+ "\u0269\5\u00e8u\2\u0268\u0266\3\2\2\2\u0268\u0269\3\2\2\2\u0269\u0271"+
+ "\3\2\2\2\u026a\u026b\7\b\2\2\u026b\u0272\5`\61\2\u026c\u026f\7 \2\2\u026d"+
+ "\u026e\7\b\2\2\u026e\u0270\5`\61\2\u026f\u026d\3\2\2\2\u026f\u0270\3\2"+
+ "\2\2\u0270\u0272\3\2\2\2\u0271\u026a\3\2\2\2\u0271\u026c\3\2\2\2\u0272"+
+ "S\3\2\2\2\u0273\u0274\7q\2\2\u0274\u0275\5\64\33\2\u0275\u0276\7!\2\2"+
+ "\u0276\u0277\5J&\2\u0277\u0279\7\13\2\2\u0278\u027a\5Z.\2\u0279\u0278"+
+ "\3\2\2\2\u0279\u027a\3\2\2\2\u027a\u027b\3\2\2\2\u027b\u027e\7\f\2\2\u027c"+
+ "\u027d\7H\2\2\u027d\u027f\5\u00e8u\2\u027e\u027c\3\2\2\2\u027e\u027f\3"+
+ "\2\2\2\u027f\u0285\3\2\2\2\u0280\u0281\7\t\2\2\u0281\u0282\5\22\n\2\u0282"+
+ "\u0283\7\n\2\2\u0283\u0286\3\2\2\2\u0284\u0286\7 \2\2\u0285\u0280\3\2"+
+ "\2\2\u0285\u0284\3\2\2\2\u0286U\3\2\2\2\u0287\u0288\7q\2\2\u0288\u0289"+
+ "\7n\2\2\u0289\u028a\5J&\2\u028a\u028c\7H\2\2\u028b\u028d\5X-\2\u028c\u028b"+
+ "\3\2\2\2\u028c\u028d\3\2\2\2\u028d\u028e\3\2\2\2\u028e\u028f\5`\61\2\u028f"+
+ "W\3\2\2\2\u0290\u0291\7\"\2\2\u0291\u0297\7#\2\2\u0292\u0293\7\"\2\2\u0293"+
+ "\u0297\7$\2\2\u0294\u0295\7\u0080\2\2\u0295\u0297\7%\2\2\u0296\u0290\3"+
+ "\2\2\2\u0296\u0292\3\2\2\2\u0296\u0294\3\2\2\2\u0297Y\3\2\2\2\u0298\u029d"+
+ "\5\\/\2\u0299\u029a\7\20\2\2\u029a\u029c\5\\/\2\u029b\u0299\3\2\2\2\u029c"+
+ "\u029f\3\2\2\2\u029d\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029e[\3\2\2\2"+
+ "\u029f\u029d\3\2\2\2\u02a0\u02a1\7\7\2\2\u02a1\u02a4\5J&\2\u02a2\u02a3"+
+ "\7H\2\2\u02a3\u02a5\5\u00e8u\2\u02a4\u02a2\3\2\2\2\u02a4\u02a5\3\2\2\2"+
+ "\u02a5]\3\2\2\2\u02a6\u02ab\5`\61\2\u02a7\u02a8\7\20\2\2\u02a8\u02aa\5"+
+ "`\61\2\u02a9\u02a7\3\2\2\2\u02aa\u02ad\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ab"+
+ "\u02ac\3\2\2\2\u02ac_\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ae\u02b5\5b\62\2"+
+ "\u02af\u02b5\5d\63\2\u02b0\u02b5\5~@\2\u02b1\u02b5\5\u0082B\2\u02b2\u02b5"+
+ "\5\u0086D\2\u02b3\u02b5\5\u0088E\2\u02b4\u02ae\3\2\2\2\u02b4\u02af\3\2"+
+ "\2\2\u02b4\u02b0\3\2\2\2\u02b4\u02b1\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4"+
+ "\u02b3\3\2\2\2\u02b5a\3\2\2\2\u02b6\u02bf\5z>\2\u02b7\u02bf\5\u008cG\2"+
+ "\u02b8\u02bf\5\u00d8m\2\u02b9\u02bf\5\u00dan\2\u02ba\u02bf\5\u00dco\2"+
+ "\u02bb\u02bf\5\u00dep\2\u02bc\u02bf\5\u00e0q\2\u02bd\u02bf\5\u00e2r\2"+
+ "\u02be\u02b6\3\2\2\2\u02be\u02b7\3\2\2\2\u02be\u02b8\3\2\2\2\u02be\u02b9"+
+ "\3\2\2\2\u02be\u02ba\3\2\2\2\u02be\u02bb\3\2\2\2\u02be\u02bc\3\2\2\2\u02be"+
+ "\u02bd\3\2\2\2\u02bfc\3\2\2\2\u02c0\u02c3\5f\64\2\u02c1\u02c3\5j\66\2"+
+ "\u02c2\u02c0\3\2\2\2\u02c2\u02c1\3\2\2\2\u02c3\u02cc\3\2\2\2\u02c4\u02cb"+
+ "\5f\64\2\u02c5\u02cb\5j\66\2\u02c6\u02cb\5n8\2\u02c7\u02cb\5p9\2\u02c8"+
+ "\u02cb\5t;\2\u02c9\u02cb\5x=\2\u02ca\u02c4\3\2\2\2\u02ca\u02c5\3\2\2\2"+
+ "\u02ca\u02c6\3\2\2\2\u02ca\u02c7\3\2\2\2\u02ca\u02c8\3\2\2\2\u02ca\u02c9"+
+ "\3\2\2\2\u02cb\u02ce\3\2\2\2\u02cc\u02ca\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd"+
+ "\u02cf\3\2\2\2\u02ce\u02cc\3\2\2\2\u02cf\u02d0\7E\2\2\u02d0\u02d1\5`\61"+
+ "\2\u02d1e\3\2\2\2\u02d2\u02d3\7?\2\2\u02d3\u02d8\5h\65\2\u02d4\u02d5\7"+
+ "\20\2\2\u02d5\u02d7\5h\65\2\u02d6\u02d4\3\2\2\2\u02d7\u02da\3\2\2\2\u02d8"+
+ "\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9g\3\2\2\2\u02da\u02d8\3\2\2\2"+
+ "\u02db\u02de\5\u00c2b\2\u02dc\u02dd\7H\2\2\u02dd\u02df\5\u00e8u\2\u02de"+
+ "\u02dc\3\2\2\2\u02de\u02df\3\2\2\2\u02df\u02e2\3\2\2\2\u02e0\u02e1\7J"+
+ "\2\2\u02e1\u02e3\7K\2\2\u02e2\u02e0\3\2\2\2\u02e2\u02e3\3\2\2\2\u02e3"+
+ "\u02e6\3\2\2\2\u02e4\u02e5\7I\2\2\u02e5\u02e7\5\u00c2b\2\u02e6\u02e4\3"+
+ "\2\2\2\u02e6\u02e7\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8\u02e9\7G\2\2\u02e9"+
+ "\u02ea\5`\61\2\u02eai\3\2\2\2\u02eb\u02ec\7@\2\2\u02ec\u02f1\5l\67\2\u02ed"+
+ "\u02ee\7\20\2\2\u02ee\u02f0\5l\67\2\u02ef\u02ed\3\2\2\2\u02f0\u02f3\3"+
+ "\2\2\2\u02f1\u02ef\3\2\2\2\u02f1\u02f2\3\2\2\2\u02f2k\3\2\2\2\u02f3\u02f1"+
+ "\3\2\2\2\u02f4\u02f7\5\u00c2b\2\u02f5\u02f6\7H\2\2\u02f6\u02f8\5\u00e8"+
+ "u\2\u02f7\u02f5\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f8\u02f9\3\2\2\2\u02f9"+
+ "\u02fa\7\b\2\2\u02fa\u02fb\5`\61\2\u02fbm\3\2\2\2\u02fc\u02fd\7A\2\2\u02fd"+
+ "\u02fe\5`\61\2\u02feo\3\2\2\2\u02ff\u0300\7B\2\2\u0300\u0301\7C\2\2\u0301"+
+ "\u0306\5r:\2\u0302\u0303\7\20\2\2\u0303\u0305\5r:\2\u0304\u0302\3\2\2"+
+ "\2\u0305\u0308\3\2\2\2\u0306\u0304\3\2\2\2\u0306\u0307\3\2\2\2\u0307q"+
+ "\3\2\2\2\u0308\u0306\3\2\2\2\u0309\u0310\5\u00c2b\2\u030a\u030b\7H\2\2"+
+ "\u030b\u030d\5\u00e8u\2\u030c\u030a\3\2\2\2\u030c\u030d\3\2\2\2\u030d"+
+ "\u030e\3\2\2\2\u030e\u030f\7\b\2\2\u030f\u0311\5`\61\2\u0310\u030c\3\2"+
+ "\2\2\u0310\u0311\3\2\2\2\u0311\u0314\3\2\2\2\u0312\u0313\7S\2\2\u0313"+
+ "\u0315\5\u00fa~\2\u0314\u0312\3\2\2\2\u0314\u0315\3\2\2\2\u0315s\3\2\2"+
+ "\2\u0316\u0317\7D\2\2\u0317\u031c\7C\2\2\u0318\u0319\7M\2\2\u0319\u031a"+
+ "\7D\2\2\u031a\u031c\7C\2\2\u031b\u0316\3\2\2\2\u031b\u0318\3\2\2\2\u031c"+
+ "\u031d\3\2\2\2\u031d\u0322\5v<\2\u031e\u031f\7\20\2\2\u031f\u0321\5v<"+
+ "\2\u0320\u031e\3\2\2\2\u0321\u0324\3\2\2\2\u0322\u0320\3\2\2\2\u0322\u0323"+
+ "\3\2\2\2\u0323u\3\2\2\2\u0324\u0322\3\2\2\2\u0325\u0328\5`\61\2\u0326"+
+ "\u0329\7N\2\2\u0327\u0329\7O\2\2\u0328\u0326\3\2\2\2\u0328\u0327\3\2\2"+
+ "\2\u0328\u0329\3\2\2\2\u0329\u032f\3\2\2\2\u032a\u032d\7K\2\2\u032b\u032e"+
+ "\7T\2\2\u032c\u032e\7U\2\2\u032d\u032b\3\2\2\2\u032d\u032c\3\2\2\2\u032e"+
+ "\u0330\3\2\2\2\u032f\u032a\3\2\2\2\u032f\u0330\3\2\2\2\u0330\u0333\3\2"+
+ "\2\2\u0331\u0332\7S\2\2\u0332\u0334\5\u00fa~\2\u0333\u0331\3\2\2\2\u0333"+
+ "\u0334\3\2\2\2\u0334w\3\2\2\2\u0335\u0336\7L\2\2\u0336\u0337\5\u00c2b"+
+ "\2\u0337y\3\2\2\2\u0338\u033b\7P\2\2\u0339\u033b\7Q\2\2\u033a\u0338\3"+
+ "\2\2\2\u033a\u0339\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u0341\5|?\2\u033d"+
+ "\u033e\7\20\2\2\u033e\u0340\5|?\2\u033f\u033d\3\2\2\2\u0340\u0343\3\2"+
+ "\2\2\u0341\u033f\3\2\2\2\u0341\u0342\3\2\2\2\u0342\u0344\3\2\2\2\u0343"+
+ "\u0341\3\2\2\2\u0344\u0345\7R\2\2\u0345\u0346\5`\61\2\u0346{\3\2\2\2\u0347"+
+ "\u034a\5\u00c2b\2\u0348\u0349\7H\2\2\u0349\u034b\5\u00e8u\2\u034a\u0348"+
+ "\3\2\2\2\u034a\u034b\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u034d\7G\2\2\u034d"+
+ "\u034e\5`\61\2\u034e}\3\2\2\2\u034f\u0350\7V\2\2\u0350\u0351\7\13\2\2"+
+ "\u0351\u0352\5^\60\2\u0352\u0354\7\f\2\2\u0353\u0355\5\u0080A\2\u0354"+
+ "\u0353\3\2\2\2\u0355\u0356\3\2\2\2\u0356\u0354\3\2\2\2\u0356\u0357\3\2"+
+ "\2\2\u0357\u0358\3\2\2\2\u0358\u0359\7Z\2\2\u0359\u035a\7E\2\2\u035a\u035b"+
+ "\5`\61\2\u035b\177\3\2\2\2\u035c\u035d\7W\2\2\u035d\u035f\5`\61\2\u035e"+
+ "\u035c\3\2\2\2\u035f\u0360\3\2\2\2\u0360\u035e\3\2\2\2\u0360\u0361\3\2"+
+ "\2\2\u0361\u0362\3\2\2\2\u0362\u0363\7E\2\2\u0363\u0364\5`\61\2\u0364"+
+ "\u0081\3\2\2\2\u0365\u0366\7]\2\2\u0366\u0367\7\13\2\2\u0367\u0368\5^"+
+ "\60\2\u0368\u036a\7\f\2\2\u0369\u036b\5\u0084C\2\u036a\u0369\3\2\2\2\u036b"+
+ "\u036c\3\2\2\2\u036c\u036a\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u036e\3\2"+
+ "\2\2\u036e\u0370\7Z\2\2\u036f\u0371\5\u00c2b\2\u0370\u036f\3\2\2\2\u0370"+
+ "\u0371\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\7E\2\2\u0373\u0374\5`\61"+
+ "\2\u0374\u0083\3\2\2\2\u0375\u0379\7W\2\2\u0376\u0377\5\u00c2b\2\u0377"+
+ "\u0378\7H\2\2\u0378\u037a\3\2\2\2\u0379\u0376\3\2\2\2\u0379\u037a\3\2"+
+ "\2\2\u037a\u037b\3\2\2\2\u037b\u0380\5\u00e8u\2\u037c\u037d\7\16\2\2\u037d"+
+ "\u037f\5\u00e8u\2\u037e\u037c\3\2\2\2\u037f\u0382\3\2\2\2\u0380\u037e"+
+ "\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0383\3\2\2\2\u0382\u0380\3\2\2\2\u0383"+
+ "\u0384\7E\2\2\u0384\u0385\5`\61\2\u0385\u0085\3\2\2\2\u0386\u0387\7F\2"+
+ "\2\u0387\u0388\7\13\2\2\u0388\u0389\5^\60\2\u0389\u038a\7\f\2\2\u038a"+
+ "\u038b\7[\2\2\u038b\u038c\5`\61\2\u038c\u038d\7\\\2\2\u038d\u038e\5`\61"+
+ "\2\u038e\u0087\3\2\2\2\u038f\u0390\7X\2\2\u0390\u0391\7\t\2\2\u0391\u0392"+
+ "\5^\60\2\u0392\u0394\7\n\2\2\u0393\u0395\5\u008aF\2\u0394\u0393\3\2\2"+
+ "\2\u0395\u0396\3\2\2\2\u0396\u0394\3\2\2\2\u0396\u0397\3\2\2\2\u0397\u0089"+
+ "\3\2\2\2\u0398\u039b\7Y\2\2\u0399\u039c\7\r\2\2\u039a\u039c\5J&\2\u039b"+
+ "\u0399\3\2\2\2\u039b\u039a\3\2\2\2\u039c\u03a4\3\2\2\2\u039d\u03a0\7\16"+
+ "\2\2\u039e\u03a1\7\r\2\2\u039f\u03a1\5J&\2\u03a0\u039e\3\2\2\2\u03a0\u039f"+
+ "\3\2\2\2\u03a1\u03a3\3\2\2\2\u03a2\u039d\3\2\2\2\u03a3\u03a6\3\2\2\2\u03a4"+
+ "\u03a2\3\2\2\2\u03a4\u03a5\3\2\2\2\u03a5\u03a7\3\2\2\2\u03a6\u03a4\3\2"+
+ "\2\2\u03a7\u03a8\7\t\2\2\u03a8\u03a9\5^\60\2\u03a9\u03aa\7\n\2\2\u03aa"+
+ "\u008b\3\2\2\2\u03ab\u03b0\5\u008eH\2\u03ac\u03ad\7^\2\2\u03ad\u03af\5"+
+ "\u008eH\2\u03ae\u03ac\3\2\2\2\u03af\u03b2\3\2\2\2\u03b0\u03ae\3\2\2\2"+
+ "\u03b0\u03b1\3\2\2\2\u03b1\u008d\3\2\2\2\u03b2\u03b0\3\2\2\2\u03b3\u03b8"+
+ "\5\u0090I\2\u03b4\u03b5\7_\2\2\u03b5\u03b7\5\u0090I\2\u03b6\u03b4\3\2"+
+ "\2\2\u03b7\u03ba\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b8\u03b9\3\2\2\2\u03b9"+
+ "\u008f\3\2\2\2\u03ba\u03b8\3\2\2\2\u03bb\u03bd\7`\2\2\u03bc\u03bb\3\2"+
+ "\2\2\u03bc\u03bd\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u03bf\5\u0092J\2\u03bf"+
+ "\u0091\3\2\2\2\u03c0\u03c3\5\u0094K\2\u03c1\u03c2\t\5\2\2\u03c2\u03c4"+
+ "\5\u0094K\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4\u0093\3\2\2"+
+ "\2\u03c5\u03ca\5\u0096L\2\u03c6\u03c7\7\61\2\2\u03c7\u03c9\5\u0096L\2"+
+ "\u03c8\u03c6\3\2\2\2\u03c9\u03cc\3\2\2\2\u03ca\u03c8\3\2\2\2\u03ca\u03cb"+
+ "\3\2\2\2\u03cb\u0095\3\2\2\2\u03cc\u03ca\3\2\2\2\u03cd\u03d0\5\u0098M"+
+ "\2\u03ce\u03cf\7a\2\2\u03cf\u03d1\5\u0098M\2\u03d0\u03ce\3\2\2\2\u03d0"+
+ "\u03d1\3\2\2\2\u03d1\u0097\3\2\2\2\u03d2\u03d7\5\u009aN\2\u03d3\u03d4"+
+ "\t\6\2\2\u03d4\u03d6\5\u009aN\2\u03d5\u03d3\3\2\2\2\u03d6\u03d9\3\2\2"+
+ "\2\u03d7\u03d5\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u0099\3\2\2\2\u03d9\u03d7"+
+ "\3\2\2\2\u03da\u03df\5\u009cO\2\u03db\u03dc\t\7\2\2\u03dc\u03de\5\u009c"+
+ "O\2\u03dd\u03db\3\2\2\2\u03de\u03e1\3\2\2\2\u03df\u03dd\3\2\2\2\u03df"+
+ "\u03e0\3\2\2\2\u03e0\u009b\3\2\2\2\u03e1\u03df\3\2\2\2\u03e2\u03e6\5\u009e"+
+ "P\2\u03e3\u03e4\7b\2\2\u03e4\u03e5\7c\2\2\u03e5\u03e7\5\u00e8u\2\u03e6"+
+ "\u03e3\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u009d\3\2\2\2\u03e8\u03ec\5\u00a0"+
+ "Q\2\u03e9\u03ea\7e\2\2\u03ea\u03eb\7d\2\2\u03eb\u03ed\5\u00e8u\2\u03ec"+
+ "\u03e9\3\2\2\2\u03ec\u03ed\3\2\2\2\u03ed\u009f\3\2\2\2\u03ee\u03f2\5\u00a2"+
+ "R\2\u03ef\u03f0\7f\2\2\u03f0\u03f1\7H\2\2\u03f1\u03f3\5\u00e8u\2\u03f2"+
+ "\u03ef\3\2\2\2\u03f2\u03f3\3\2\2\2\u03f3\u00a1\3\2\2\2\u03f4\u03f8\5\u00a4"+
+ "S\2\u03f5\u03f6\7h\2\2\u03f6\u03f7\7H\2\2\u03f7\u03f9\5\u00f4{\2\u03f8"+
+ "\u03f5\3\2\2\2\u03f8\u03f9\3\2\2\2\u03f9\u00a3\3\2\2\2\u03fa\u03fe\5\u00a6"+
+ "T\2\u03fb\u03fc\7g\2\2\u03fc\u03fd\7H\2\2\u03fd\u03ff\5\u00f4{\2\u03fe"+
+ "\u03fb\3\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u00a5\3\2\2\2\u0400\u0409\5\u00aa"+
+ "V\2\u0401\u0402\7\6\2\2\u0402\u0403\7/\2\2\u0403\u0404\3\2\2\2\u0404\u0405"+
+ "\5\u00a8U\2\u0405\u0406\5\u00ceh\2\u0406\u0408\3\2\2\2\u0407\u0401\3\2"+
+ "\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3\2\2\2\u0409\u040a\3\2\2\2\u040a"+
+ "\u00a7\3\2\2\2\u040b\u0409\3\2\2\2\u040c\u0410\5J&\2\u040d\u0410\5\u00c2"+
+ "b\2\u040e\u0410\5\u00c4c\2\u040f\u040c\3\2\2\2\u040f\u040d\3\2\2\2\u040f"+
+ "\u040e\3\2\2\2\u0410\u00a9\3\2\2\2\u0411\u0413\t\6\2\2\u0412\u0411\3\2"+
+ "\2\2\u0413\u0416\3\2\2\2\u0414\u0412\3\2\2\2\u0414\u0415\3\2\2\2\u0415"+
+ "\u0417\3\2\2\2\u0416\u0414\3\2\2\2\u0417\u0418\5\u00acW\2\u0418\u00ab"+
+ "\3\2\2\2\u0419\u041d\5\u00b2Z\2\u041a\u041d\5\u00aeX\2\u041b\u041d\5\u00b0"+
+ "Y\2\u041c\u0419\3\2\2\2\u041c\u041a\3\2\2\2\u041c\u041b\3\2\2\2\u041d"+
+ "\u00ad\3\2\2\2\u041e\u041f\7o\2\2\u041f\u0420\7n\2\2\u0420\u0421\5\u00e8"+
+ "u\2\u0421\u0422\7\t\2\2\u0422\u0423\5^\60\2\u0423\u0424\7\n\2\2\u0424"+
+ "\u00af\3\2\2\2\u0425\u0426\7p\2\2\u0426\u0427\7n\2\2\u0427\u0428\5\u00e8"+
+ "u\2\u0428\u0429\7\t\2\2\u0429\u042a\5^\60\2\u042a\u042b\7\n\2\2\u042b"+
+ "\u00b1\3\2\2\2\u042c\u0431\5\u00b4[\2\u042d\u042e\7\67\2\2\u042e\u0430"+
+ "\5\u00b4[\2\u042f\u042d\3\2\2\2\u0430\u0433\3\2\2\2\u0431\u042f\3\2\2"+
+ "\2\u0431\u0432\3\2\2\2\u0432\u00b3\3\2\2\2\u0433\u0431\3\2\2\2\u0434\u043c"+
+ "\5\u00be`\2\u0435\u043b\5\u00b6\\\2\u0436\u043b\5\u00ba^\2\u0437\u043b"+
+ "\5\u00bc_\2\u0438\u043b\5\u00b8]\2\u0439\u043b\5\u00ceh\2\u043a\u0435"+
+ "\3\2\2\2\u043a\u0436\3\2\2\2\u043a\u0437\3\2\2\2\u043a\u0438\3\2\2\2\u043a"+
+ "\u0439\3\2\2\2\u043b\u043e\3\2\2\2\u043c\u043a\3\2\2\2\u043c\u043d\3\2"+
+ "\2\2\u043d\u00b5\3\2\2\2\u043e\u043c\3\2\2\2\u043f\u0440\78\2\2\u0440"+
+ "\u0441\78\2\2\u0441\u0442\5^\60\2\u0442\u0443\79\2\2\u0443\u0444\79\2"+
+ "\2\u0444\u00b7\3\2\2\2\u0445\u0446\78\2\2\u0446\u0447\79\2\2\u0447\u00b9"+
+ "\3\2\2\2\u0448\u0449\78\2\2\u0449\u044a\5^\60\2\u044a\u044b\79\2\2\u044b"+
+ "\u00bb\3\2\2\2\u044c\u0453\7:\2\2\u044d\u0454\5\u00fe\u0080\2\u044e\u0454"+
+ "\5\u00fc\177\2\u044f\u0454\7\u0091\2\2\u0450\u0454\5\u00c4c\2\u0451\u0454"+
+ "\5\u00c2b\2\u0452\u0454\5\u00c6d\2\u0453\u044d\3\2\2\2\u0453\u044e\3\2"+
+ "\2\2\u0453\u044f\3\2\2\2\u0453\u0450\3\2\2\2\u0453\u0451\3\2\2\2\u0453"+
+ "\u0452\3\2\2\2\u0454\u00bd\3\2\2\2\u0455\u0465\7\u008a\2\2\u0456\u0465"+
+ "\7l\2\2\u0457\u0465\7m\2\2\u0458\u0465\7\u008b\2\2\u0459\u0465\5\u00fc"+
+ "\177\2\u045a\u0465\5\u00c2b\2\u045b\u0465\5\u00c4c\2\u045c\u0465\5\u00c6"+
+ "d\2\u045d\u0465\5\u00eav\2\u045e\u0465\5\u00ccg\2\u045f\u0465\5\u00c8"+
+ "e\2\u0460\u0465\5\u00caf\2\u0461\u0465\5\u00f8}\2\u0462\u0465\5\u00d2"+
+ "j\2\u0463\u0465\5\u00c0a\2\u0464\u0455\3\2\2\2\u0464\u0456\3\2\2\2\u0464"+
+ "\u0457\3\2\2\2\u0464\u0458\3\2\2\2\u0464\u0459\3\2\2\2\u0464\u045a\3\2"+
+ "\2\2\u0464\u045b\3\2\2\2\u0464\u045c\3\2\2\2\u0464\u045d\3\2\2\2\u0464"+
+ "\u045e\3\2\2\2\u0464\u045f\3\2\2\2\u0464\u0460\3\2\2\2\u0464\u0461\3\2"+
+ "\2\2\u0464\u0462\3\2\2\2\u0464\u0463\3\2\2\2\u0465\u00bf\3\2\2\2\u0466"+
+ "\u0467\7\t\2\2\u0467\u0468\5\20\t\2\u0468\u0469\7\n\2\2\u0469\u00c1\3"+
+ "\2\2\2\u046a\u046b\7\7\2\2\u046b\u046c\5J&\2\u046c\u00c3\3\2\2\2\u046d"+
+ "\u046f\7\13\2\2\u046e\u0470\5^\60\2\u046f\u046e\3\2\2\2\u046f\u0470\3"+
+ "\2\2\2\u0470\u0471\3\2\2\2\u0471\u0472\7\f\2\2\u0472\u00c5\3\2\2\2\u0473"+
+ "\u0474\7;\2\2\u0474\u00c7\3\2\2\2\u0475\u0476\7\22\2\2\u0476\u0477\7\t"+
+ "\2\2\u0477\u0478\5^\60\2\u0478\u0479\7\n\2\2\u0479\u00c9\3\2\2\2\u047a"+
+ "\u047b\7k\2\2\u047b\u047c\7\t\2\2\u047c\u047d\5^\60\2\u047d\u047e\7\n"+
+ "\2\2\u047e\u00cb\3\2\2\2\u047f\u0480\5J&\2\u0480\u0481\5\u00ceh\2\u0481"+
+ "\u00cd\3\2\2\2\u0482\u0489\7\13\2\2\u0483\u0485\5\u00d0i\2\u0484\u0486"+
+ "\7\20\2\2\u0485\u0484\3\2\2\2\u0485\u0486\3\2\2\2\u0486\u0488\3\2\2\2"+
+ "\u0487\u0483\3\2\2\2\u0488\u048b\3\2\2\2\u0489\u0487\3\2\2\2\u0489\u048a"+
+ "\3\2\2\2\u048a\u048c\3\2\2\2\u048b\u0489\3\2\2\2\u048c\u048d\7\f\2\2\u048d"+
+ "\u00cf\3\2\2\2\u048e\u0491\5`\61\2\u048f\u0491\7\u0089\2\2\u0490\u048e"+
+ "\3\2\2\2\u0490\u048f\3\2\2\2\u0491\u00d1\3\2\2\2\u0492\u0495\5\u00d4k"+
+ "\2\u0493\u0495\5\u00d6l\2\u0494\u0492\3\2\2\2\u0494\u0493\3\2\2\2\u0495"+
+ "\u00d3\3\2\2\2\u0496\u0497\5J&\2\u0497\u0498\7<\2\2\u0498\u0499\7\u008b"+
+ "\2\2\u0499\u00d5\3\2\2\2\u049a\u049b\5\64\33\2\u049b\u049c\7!\2\2\u049c"+
+ "\u049e\7\13\2\2\u049d\u049f\5Z.\2\u049e\u049d\3\2\2\2\u049e\u049f\3\2"+
+ "\2\2\u049f\u04a0\3\2\2\2\u04a0\u04a3\7\f\2\2\u04a1\u04a2\7H\2\2\u04a2"+
+ "\u04a4\5\u00e8u\2\u04a3\u04a1\3\2\2\2\u04a3\u04a4\3\2\2\2\u04a4\u04a5"+
+ "\3\2\2\2\u04a5\u04a6\7\t\2\2\u04a6\u04a7\5\22\n\2\u04a7\u04a8\7\n\2\2"+
+ "\u04a8\u00d7\3\2\2\2\u04a9\u04aa\7u\2\2\u04aa\u04ab\7\u0080\2\2\u04ab"+
+ "\u04ac\5`\61\2\u04ac\u04ad\7|\2\2\u04ad\u04b1\5`\61\2\u04ae\u04af\7I\2"+
+ "\2\u04af\u04b0\7\177\2\2\u04b0\u04b2\5`\61\2\u04b1\u04ae\3\2\2\2\u04b1"+
+ "\u04b2\3\2\2\2\u04b2\u04c1\3\2\2\2\u04b3\u04b4\7u\2\2\u04b4\u04b5\7\u0080"+
+ "\2\2\u04b5\u04ba\5\u00f6|\2\u04b6\u04b7\7\20\2\2\u04b7\u04b9\5\u00f6|"+
+ "\2\u04b8\u04b6\3\2\2\2\u04b9\u04bc\3\2\2\2\u04ba\u04b8\3\2\2\2\u04ba\u04bb"+
+ "\3\2\2\2\u04bb\u04bd\3\2\2\2\u04bc\u04ba\3\2\2\2\u04bd\u04be\7|\2\2\u04be"+
+ "\u04bf\5`\61\2\u04bf\u04c1\3\2\2\2\u04c0\u04a9\3\2\2\2\u04c0\u04b3\3\2"+
+ "\2\2\u04c1\u00d9\3\2\2\2\u04c2\u04c3\7v\2\2\u04c3\u04c4\7\u0080\2\2\u04c4"+
+ "\u04c5\5\u00e4s\2\u04c5\u00db\3\2\2\2\u04c6\u04c7\7w\2\2\u04c7\u04c8\7"+
+ "\u0080\2\2\u04c8\u04c9\5\u00e4s\2\u04c9\u04ca\7H\2\2\u04ca\u04cb\5`\61"+
+ "\2\u04cb\u00dd\3\2\2\2\u04cc\u04cd\7x\2\2\u04cd\u04ce\7}\2\2\u04ce\u04cf"+
+ "\7c\2\2\u04cf\u04d0\7\u0080\2\2\u04d0\u04d1\5\u00e4s\2\u04d1\u04d2\7~"+
+ "\2\2\u04d2\u04d3\5`\61\2\u04d3\u00df\3\2\2\2\u04d4\u04d5\7y\2\2\u04d5"+
+ "\u04da\5\u00e6t\2\u04d6\u04d7\7\20\2\2\u04d7\u04d9\5\u00e6t\2\u04d8\u04d6"+
+ "\3\2\2\2\u04d9\u04dc\3\2\2\2\u04da\u04d8\3\2\2\2\u04da\u04db\3\2\2\2\u04db"+
+ "\u04dd\3\2\2\2\u04dc\u04da\3\2\2\2\u04dd\u04de\7z\2\2\u04de\u04df\5`\61"+
+ "\2\u04df\u04e0\7E\2\2\u04e0\u04e1\5`\61\2\u04e1\u00e1\3\2\2\2\u04e2\u04e3"+
+ "\7{\2\2\u04e3\u04e4\7\u0080\2\2\u04e4\u04e5\5`\61\2\u04e5\u04e6\7|\2\2"+
+ "\u04e6\u04e7\5`\61\2\u04e7\u00e3\3\2\2\2\u04e8\u04eb\5\u00be`\2\u04e9"+
+ "\u04ec\5\u00b6\\\2\u04ea\u04ec\5\u00bc_\2\u04eb\u04e9\3\2\2\2\u04eb\u04ea"+
+ "\3\2\2\2\u04ec\u04ed\3\2\2\2\u04ed\u04eb\3\2\2\2\u04ed\u04ee\3\2\2\2\u04ee"+
+ "\u00e5\3\2\2\2\u04ef\u04f0\5\u00c2b\2\u04f0\u04f1\7\b\2\2\u04f1\u04f2"+
+ "\5`\61\2\u04f2\u00e7\3\2\2\2\u04f3\u04f4\7\13\2\2\u04f4\u04fc\7\f\2\2"+
+ "\u04f5\u04f9\5\u00ecw\2\u04f6\u04fa\7\u0089\2\2\u04f7\u04fa\7\r\2\2\u04f8"+
+ "\u04fa\7\62\2\2\u04f9\u04f6\3\2\2\2\u04f9\u04f7\3\2\2\2\u04f9\u04f8\3"+
+ "\2\2\2\u04f9\u04fa\3\2\2\2\u04fa\u04fc\3\2\2\2\u04fb\u04f3\3\2\2\2\u04fb"+
+ "\u04f5\3\2\2\2\u04fc\u00e9\3\2\2\2\u04fd\u0506\7\t\2\2\u04fe\u0503\5\u00f6"+
+ "|\2\u04ff\u0500\7\20\2\2\u0500\u0502\5\u00f6|\2\u0501\u04ff\3\2\2\2\u0502"+
+ "\u0505\3\2\2\2\u0503\u0501\3\2\2\2\u0503\u0504\3\2\2\2\u0504\u0507\3\2"+
+ "\2\2\u0505\u0503\3\2\2\2\u0506\u04fe\3\2\2\2\u0506\u0507\3\2\2\2\u0507"+
+ "\u0508\3\2\2\2\u0508\u050e\7\n\2\2\u0509\u050a\7=\2\2\u050a\u050b\5^\60"+
+ "\2\u050b\u050c\7>\2\2\u050c\u050e\3\2\2\2\u050d\u04fd\3\2\2\2\u050d\u0509"+
+ "\3\2\2\2\u050e\u00eb\3\2\2\2\u050f\u0513\5J&\2\u0510\u0513\7\u008a\2\2"+
+ "\u0511\u0513\5\u00eex\2\u0512\u050f\3\2\2\2\u0512\u0510\3\2\2\2\u0512"+
+ "\u0511\3\2\2\2\u0513\u00ed\3\2\2\2\u0514\u0517\5\u00f0y\2\u0515\u0517"+
+ "\5\u00f2z\2\u0516\u0514\3\2\2\2\u0516\u0515\3\2\2\2\u0517\u00ef\3\2\2"+
+ "\2\u0518\u0519\7!\2\2\u0519\u051a\7\13\2\2\u051a\u051b\7\r\2\2\u051b\u051c"+
+ "\7\f\2\2\u051c\u00f1\3\2\2\2\u051d\u051e\7!\2\2\u051e\u0527\7\13\2\2\u051f"+
+ "\u0524\5\u00e8u\2\u0520\u0521\7\20\2\2\u0521\u0523\5\u00e8u\2\u0522\u0520"+
+ "\3\2\2\2\u0523\u0526\3\2\2\2\u0524\u0522\3\2\2\2\u0524\u0525\3\2\2\2\u0525"+
+ "\u0528\3\2\2\2\u0526\u0524\3\2\2\2\u0527\u051f\3\2\2\2\u0527\u0528\3\2"+
+ "\2\2\u0528\u0529\3\2\2\2\u0529\u052a\7\f\2\2\u052a\u052b\7H\2\2\u052b"+
+ "\u052c\5\u00e8u\2\u052c\u00f3\3\2\2\2\u052d\u052f\5\u00ecw\2\u052e\u0530"+
+ "\7\u0089\2\2\u052f\u052e\3\2\2\2\u052f\u0530\3\2\2\2\u0530\u00f5\3\2\2"+
+ "\2\u0531\u0534\5`\61\2\u0532\u0534\7\u0091\2\2\u0533\u0531\3\2\2\2\u0533"+
+ "\u0532\3\2\2\2\u0534\u0535\3\2\2\2\u0535\u0536\t\b\2\2\u0536\u0537\5`"+
+ "\61\2\u0537\u00f7\3\2\2\2\u0538\u053a\78\2\2\u0539\u053b\5^\60\2\u053a"+
+ "\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u053c\3\2\2\2\u053c\u053d\79"+
+ "\2\2\u053d\u00f9\3\2\2\2\u053e\u053f\5\u00fc\177\2\u053f\u00fb\3\2\2\2"+
+ "\u0540\u0541\7\u0088\2\2\u0541\u00fd\3\2\2\2\u0542\u0543\t\t\2\2\u0543"+
+ "\u00ff\3\2\2\2\u0087\u0108\u010c\u011c\u0122\u012a\u0132\u013a\u0149\u0167"+
+ "\u016f\u0171\u0187\u0191\u019b\u01a0\u01a5\u01a9\u01b5\u01b9\u01c2\u01c9"+
+ "\u01d7\u01db\u01de\u01e3\u01ed\u01f5\u01f9\u0205\u0211\u0227\u022f\u0234"+
+ "\u0237\u023b\u0244\u024d\u0250\u0258\u025f\u0261\u0268\u026f\u0271\u0279"+
+ "\u027e\u0285\u028c\u0296\u029d\u02a4\u02ab\u02b4\u02be\u02c2\u02ca\u02cc"+
+ "\u02d8\u02de\u02e2\u02e6\u02f1\u02f7\u0306\u030c\u0310\u0314\u031b\u0322"+
+ "\u0328\u032d\u032f\u0333\u033a\u0341\u034a\u0356\u0360\u036c\u0370\u0379"+
+ "\u0380\u0396\u039b\u03a0\u03a4\u03b0\u03b8\u03bc\u03c3\u03ca\u03d0\u03d7"+
+ "\u03df\u03e6\u03ec\u03f2\u03f8\u03fe\u0409\u040f\u0414\u041c\u0431\u043a"+
+ "\u043c\u0453\u0464\u046f\u0485\u0489\u0490\u0494\u049e\u04a3\u04b1\u04ba"+
+ "\u04c0\u04da\u04eb\u04ed\u04f9\u04fb\u0503\u0506\u050d\u0512\u0516\u0524"+
+ "\u0527\u052f\u0533\u053a";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/org/rumbledb/parser/XQueryLexer.interp b/src/main/java/org/rumbledb/parser/XQueryLexer.interp
new file mode 100644
index 0000000000..f2c9eb2158
--- /dev/null
+++ b/src/main/java/org/rumbledb/parser/XQueryLexer.interp
@@ -0,0 +1,1035 @@
+token literal names:
+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
+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
+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
+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
+null
+null
+null
+null
+null
+null
+null
+null
+
+token symbolic names:
+null
+EscapeQuot
+EscapeApos
+DOUBLE_LBRACE
+DOUBLE_RBRACE
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+EscapeApos_AposString
+
+rule names:
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+Digits
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+NameStartChar
+NameChar
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+GRAVE_STRING
+RBRACKET_STRING
+LBRACE_STRING
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+Quot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+LBRACE_QuotString
+RBRACE_QuotString
+PredefinedEntityRef_QuotString
+CharRef_QuotString
+ContentChar_QuotString
+EscapeApos_AposString
+Apos_AposString
+DOUBLE_LBRACE_AposString
+DOUBLE_RBRACE_AposString
+LBRACE_AposString
+RBRACE_AposString
+PredefinedEntityRef_AposString
+CharRef_AposString
+ContentChar_AposString
+INT_QUOT_IntegerLiteral
+INT_QUOT_DecimalLiteral
+INT_QUOT_DoubleLiteral
+INT_QUOT_DFPropertyName
+INT_QUOT_PredefinedEntityRef
+INT_QUOT_CharRef
+INT_QUOT_EscapeQuot
+INT_QUOT_Apos
+INT_QUOT_Quot
+INT_QUOT_COMMENT
+INT_QUOT_XMLDECL
+INT_QUOT_PI
+INT_QUOT_CDATA
+INT_QUOT_PRAGMA
+INT_QUOT_WS
+INT_QUOT_EQUAL
+INT_QUOT_NOT_EQUAL
+INT_QUOT_LPAREN
+INT_QUOT_RPAREN
+INT_QUOT_LBRACKET
+INT_QUOT_RBRACKET
+INT_QUOT_LBRACE
+INT_QUOT_RBRACE_EXIT
+INT_QUOT_RBRACE
+INT_QUOT_STAR
+INT_QUOT_PLUS
+INT_QUOT_MINUS
+INT_QUOT_COMMA
+INT_QUOT_DOT
+INT_QUOT_DDOT
+INT_QUOT_COLON
+INT_QUOT_COLON_EQ
+INT_QUOT_SEMICOLON
+INT_QUOT_SLASH
+INT_QUOT_DSLASH
+INT_QUOT_BACKSLASH
+INT_QUOT_VBAR
+INT_QUOT_LANGLE
+INT_QUOT_RANGLE
+INT_QUOT_QUESTION
+INT_QUOT_AT
+INT_QUOT_DOLLAR
+INT_QUOT_MOD
+INT_QUOT_BANG
+INT_QUOT_HASH
+INT_QUOT_CARAT
+INT_QUOT_ARROW
+INT_QUOT_GRAVE
+INT_QUOT_CONCATENATION
+INT_QUOT_TILDE
+INT_QUOT_KW_ALLOWING
+INT_QUOT_KW_ANCESTOR
+INT_QUOT_KW_ANCESTOR_OR_SELF
+INT_QUOT_KW_AND
+INT_QUOT_KW_ARRAY
+INT_QUOT_KW_AS
+INT_QUOT_KW_ASCENDING
+INT_QUOT_KW_AT
+INT_QUOT_KW_ATTRIBUTE
+INT_QUOT_KW_BASE_URI
+INT_QUOT_KW_BOUNDARY_SPACE
+INT_QUOT_KW_BINARY
+INT_QUOT_KW_BY
+INT_QUOT_KW_CASE
+INT_QUOT_KW_CAST
+INT_QUOT_KW_CASTABLE
+INT_QUOT_KW_CATCH
+INT_QUOT_KW_CHILD
+INT_QUOT_KW_COLLATION
+INT_QUOT_KW_COMMENT
+INT_QUOT_KW_CONSTRUCTION
+INT_QUOT_KW_CONTEXT
+INT_QUOT_KW_COPY_NS
+INT_QUOT_KW_COUNT
+INT_QUOT_KW_DECLARE
+INT_QUOT_KW_DEFAULT
+INT_QUOT_KW_DESCENDANT
+INT_QUOT_KW_DESCENDANT_OR_SELF
+INT_QUOT_KW_DESCENDING
+INT_QUOT_KW_DECIMAL_FORMAT
+INT_QUOT_KW_DIV
+INT_QUOT_KW_DOCUMENT
+INT_QUOT_KW_DOCUMENT_NODE
+INT_QUOT_KW_ELEMENT
+INT_QUOT_KW_ELSE
+INT_QUOT_KW_EMPTY
+INT_QUOT_KW_EMPTY_SEQUENCE
+INT_QUOT_KW_ENCODING
+INT_QUOT_KW_END
+INT_QUOT_KW_EQ
+INT_QUOT_KW_EVERY
+INT_QUOT_KW_EXCEPT
+INT_QUOT_KW_EXTERNAL
+INT_QUOT_KW_FOLLOWING
+INT_QUOT_KW_FOLLOWING_SIBLING
+INT_QUOT_KW_FOR
+INT_QUOT_KW_FUNCTION
+INT_QUOT_KW_GE
+INT_QUOT_KW_GREATEST
+INT_QUOT_KW_GROUP
+INT_QUOT_KW_GT
+INT_QUOT_KW_IDIV
+INT_QUOT_KW_IF
+INT_QUOT_KW_IMPORT
+INT_QUOT_KW_IN
+INT_QUOT_KW_INHERIT
+INT_QUOT_KW_INSTANCE
+INT_QUOT_KW_INTERSECT
+INT_QUOT_KW_IS
+INT_QUOT_KW_ITEM
+INT_QUOT_KW_LAX
+INT_QUOT_KW_LE
+INT_QUOT_KW_LEAST
+INT_QUOT_KW_LET
+INT_QUOT_KW_LT
+INT_QUOT_KW_MAP
+INT_QUOT_KW_MOD
+INT_QUOT_KW_MODULE
+INT_QUOT_KW_NAMESPACE
+INT_QUOT_KW_NE
+INT_QUOT_KW_NEXT
+INT_QUOT_KW_NAMESPACE_NODE
+INT_QUOT_KW_NO_INHERIT
+INT_QUOT_KW_NO_PRESERVE
+INT_QUOT_KW_NODE
+INT_QUOT_KW_OF
+INT_QUOT_KW_ONLY
+INT_QUOT_KW_OPTION
+INT_QUOT_KW_OR
+INT_QUOT_KW_ORDER
+INT_QUOT_KW_ORDERED
+INT_QUOT_KW_ORDERING
+INT_QUOT_KW_PARENT
+INT_QUOT_KW_PRECEDING
+INT_QUOT_KW_PRECEDING_SIBLING
+INT_QUOT_KW_PRESERVE
+INT_QUOT_KW_PREVIOUS
+INT_QUOT_KW_PI
+INT_QUOT_KW_RETURN
+INT_QUOT_KW_SATISFIES
+INT_QUOT_KW_SCHEMA
+INT_QUOT_KW_SCHEMA_ATTR
+INT_QUOT_KW_SCHEMA_ELEM
+INT_QUOT_KW_SELF
+INT_QUOT_KW_SLIDING
+INT_QUOT_KW_SOME
+INT_QUOT_KW_STABLE
+INT_QUOT_KW_START
+INT_QUOT_KW_STRICT
+INT_QUOT_KW_STRIP
+INT_QUOT_KW_SWITCH
+INT_QUOT_KW_TEXT
+INT_QUOT_KW_THEN
+INT_QUOT_KW_TO
+INT_QUOT_KW_TREAT
+INT_QUOT_KW_TRY
+INT_QUOT_KW_TUMBLING
+INT_QUOT_KW_TYPE
+INT_QUOT_KW_TYPESWITCH
+INT_QUOT_KW_UNION
+INT_QUOT_KW_UNORDERED
+INT_QUOT_KW_UPDATE
+INT_QUOT_KW_VALIDATE
+INT_QUOT_KW_VARIABLE
+INT_QUOT_KW_VERSION
+INT_QUOT_KW_WHEN
+INT_QUOT_KW_WHERE
+INT_QUOT_KW_WINDOW
+INT_QUOT_KW_XQUERY
+INT_QUOT_KW_ARRAY_NODE
+INT_QUOT_KW_BOOLEAN_NODE
+INT_QUOT_KW_NULL_NODE
+INT_QUOT_KW_NUMBER_NODE
+INT_QUOT_KW_OBJECT_NODE
+INT_QUOT_KW_REPLACE
+INT_QUOT_KW_WITH
+INT_QUOT_KW_VALUE
+INT_QUOT_KW_INSERT
+INT_QUOT_KW_INTO
+INT_QUOT_KW_DELETE
+INT_QUOT_KW_RENAME
+INT_QUOT_URIQualifiedName
+INT_QUOT_FullQName
+INT_QUOT_NCNameWithLocalWildcard
+INT_QUOT_NCNameWithPrefixWildcard
+INT_QUOT_NCName
+INT_QUOT_XQDOC_COMMENT_START
+INT_QUOT_XQDOC_COMMENT_END
+INT_QUOT_XQDocComment
+INT_QUOT_XQComment
+INT_QUOT_CHAR
+INT_QUOT_ENTER_STRING
+INT_QUOT_EXIT_INTERPOLATION
+INT_ContentChar
+INT_APOS_IntegerLiteral
+INT_APOS_DecimalLiteral
+INT_APOS_DoubleLiteral
+INT_APOS_DFPropertyName
+INT_APOS_PredefinedEntityRef
+INT_APOS_CharRef
+INT_APOS_EscapeApos
+INT_APOS_Quot
+INT_APOS_Apos
+INT_APOS_COMMENT
+INT_APOS_XMLDECL
+INT_APOS_PI
+INT_APOS_CDATA
+INT_APOS_PRAGMA
+INT_APOS_WS
+INT_APOS_EQUAL
+INT_APOS_NOT_EQUAL
+INT_APOS_LPAREN
+INT_APOS_RPAREN
+INT_APOS_LBRACKET
+INT_APOS_RBRACKET
+INT_APOS_LBRACE
+INT_APOS_RBRACE_EXIT
+INT_APOS_RBRACE
+INT_APOS_STAR
+INT_APOS_PLUS
+INT_APOS_MINUS
+INT_APOS_COMMA
+INT_APOS_DOT
+INT_APOS_DDOT
+INT_APOS_COLON
+INT_APOS_COLON_EQ
+INT_APOS_SEMICOLON
+INT_APOS_SLASH
+INT_APOS_DSLASH
+INT_APOS_BACKSLASH
+INT_APOS_VBAR
+INT_APOS_LANGLE
+INT_APOS_RANGLE
+INT_APOS_QUESTION
+INT_APOS_AT
+INT_APOS_DOLLAR
+INT_APOS_MOD
+INT_APOS_BANG
+INT_APOS_HASH
+INT_APOS_CARAT
+INT_APOS_ARROW
+INT_APOS_GRAVE
+INT_APOS_CONCATENATION
+INT_APOS_TILDE
+INT_APOS_KW_ALLOWING
+INT_APOS_KW_ANCESTOR
+INT_APOS_KW_ANCESTOR_OR_SELF
+INT_APOS_KW_AND
+INT_APOS_KW_ARRAY
+INT_APOS_KW_AS
+INT_APOS_KW_ASCENDING
+INT_APOS_KW_AT
+INT_APOS_KW_ATTRIBUTE
+INT_APOS_KW_BASE_URI
+INT_APOS_KW_BOUNDARY_SPACE
+INT_APOS_KW_BINARY
+INT_APOS_KW_BY
+INT_APOS_KW_CASE
+INT_APOS_KW_CAST
+INT_APOS_KW_CASTABLE
+INT_APOS_KW_CATCH
+INT_APOS_KW_CHILD
+INT_APOS_KW_COLLATION
+INT_APOS_KW_COMMENT
+INT_APOS_KW_CONSTRUCTION
+INT_APOS_KW_CONTEXT
+INT_APOS_KW_COPY_NS
+INT_APOS_KW_COUNT
+INT_APOS_KW_DECLARE
+INT_APOS_KW_DEFAULT
+INT_APOS_KW_DESCENDANT
+INT_APOS_KW_DESCENDANT_OR_SELF
+INT_APOS_KW_DESCENDING
+INT_APOS_KW_DECIMAL_FORMAT
+INT_APOS_KW_DIV
+INT_APOS_KW_DOCUMENT
+INT_APOS_KW_DOCUMENT_NODE
+INT_APOS_KW_ELEMENT
+INT_APOS_KW_ELSE
+INT_APOS_KW_EMPTY
+INT_APOS_KW_EMPTY_SEQUENCE
+INT_APOS_KW_ENCODING
+INT_APOS_KW_END
+INT_APOS_KW_EQ
+INT_APOS_KW_EVERY
+INT_APOS_KW_EXCEPT
+INT_APOS_KW_EXTERNAL
+INT_APOS_KW_FOLLOWING
+INT_APOS_KW_FOLLOWING_SIBLING
+INT_APOS_KW_FOR
+INT_APOS_KW_FUNCTION
+INT_APOS_KW_GE
+INT_APOS_KW_GREATEST
+INT_APOS_KW_GROUP
+INT_APOS_KW_GT
+INT_APOS_KW_IDIV
+INT_APOS_KW_IF
+INT_APOS_KW_IMPORT
+INT_APOS_KW_IN
+INT_APOS_KW_INHERIT
+INT_APOS_KW_INSTANCE
+INT_APOS_KW_INTERSECT
+INT_APOS_KW_IS
+INT_APOS_KW_ITEM
+INT_APOS_KW_LAX
+INT_APOS_KW_LE
+INT_APOS_KW_LEAST
+INT_APOS_KW_LET
+INT_APOS_KW_LT
+INT_APOS_KW_MAP
+INT_APOS_KW_MOD
+INT_APOS_KW_MODULE
+INT_APOS_KW_NAMESPACE
+INT_APOS_KW_NE
+INT_APOS_KW_NEXT
+INT_APOS_KW_NAMESPACE_NODE
+INT_APOS_KW_NO_INHERIT
+INT_APOS_KW_NO_PRESERVE
+INT_APOS_KW_NODE
+INT_APOS_KW_OF
+INT_APOS_KW_ONLY
+INT_APOS_KW_OPTION
+INT_APOS_KW_OR
+INT_APOS_KW_ORDER
+INT_APOS_KW_ORDERED
+INT_APOS_KW_ORDERING
+INT_APOS_KW_PARENT
+INT_APOS_KW_PRECEDING
+INT_APOS_KW_PRECEDING_SIBLING
+INT_APOS_KW_PRESERVE
+INT_APOS_KW_PREVIOUS
+INT_APOS_KW_PI
+INT_APOS_KW_RETURN
+INT_APOS_KW_SATISFIES
+INT_APOS_KW_SCHEMA
+INT_APOS_KW_SCHEMA_ATTR
+INT_APOS_KW_SCHEMA_ELEM
+INT_APOS_KW_SELF
+INT_APOS_KW_SLIDING
+INT_APOS_KW_SOME
+INT_APOS_KW_STABLE
+INT_APOS_KW_START
+INT_APOS_KW_STRICT
+INT_APOS_KW_STRIP
+INT_APOS_KW_SWITCH
+INT_APOS_KW_TEXT
+INT_APOS_KW_THEN
+INT_APOS_KW_TO
+INT_APOS_KW_TREAT
+INT_APOS_KW_TRY
+INT_APOS_KW_TUMBLING
+INT_APOS_KW_TYPE
+INT_APOS_KW_TYPESWITCH
+INT_APOS_KW_UNION
+INT_APOS_KW_UNORDERED
+INT_APOS_KW_UPDATE
+INT_APOS_KW_VALIDATE
+INT_APOS_KW_VARIABLE
+INT_APOS_KW_VERSION
+INT_APOS_KW_WHEN
+INT_APOS_KW_WHERE
+INT_APOS_KW_WINDOW
+INT_APOS_KW_XQUERY
+INT_APOS_KW_ARRAY_NODE
+INT_APOS_KW_BOOLEAN_NODE
+INT_APOS_KW_NULL_NODE
+INT_APOS_KW_NUMBER_NODE
+INT_APOS_KW_OBJECT_NODE
+INT_APOS_KW_REPLACE
+INT_APOS_KW_WITH
+INT_APOS_KW_VALUE
+INT_APOS_KW_INSERT
+INT_APOS_KW_INTO
+INT_APOS_KW_DELETE
+INT_APOS_KW_RENAME
+INT_APOS_URIQualifiedName
+INT_APOS_FullQName
+INT_APOS_NCNameWithLocalWildcard
+INT_APOS_NCNameWithPrefixWildcard
+INT_APOS_NCName
+INT_APOS_XQDOC_COMMENT_START
+INT_APOS_XQDOC_COMMENT_END
+INT_APOS_XQDocComment
+INT_APOS_XQComment
+INT_APOS_CHAR
+INT_APOS_ENTER_STRING
+INT_APOS_EXIT_INTERPOLATION
+INT_APOS_ContentChar
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+STRING_MODE
+QUOT_LITERAL_STRING
+APOS_LITERAL_STRING
+STRING_INTERPOLATION_MODE_QUOT
+STRING_INTERPOLATION_MODE_APOS
+
+atn:
+[4, 0, 203, 6735, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 2, 242, 7, 242, 2, 243, 7, 243, 2, 244, 7, 244, 2, 245, 7, 245, 2, 246, 7, 246, 2, 247, 7, 247, 2, 248, 7, 248, 2, 249, 7, 249, 2, 250, 7, 250, 2, 251, 7, 251, 2, 252, 7, 252, 2, 253, 7, 253, 2, 254, 7, 254, 2, 255, 7, 255, 2, 256, 7, 256, 2, 257, 7, 257, 2, 258, 7, 258, 2, 259, 7, 259, 2, 260, 7, 260, 2, 261, 7, 261, 2, 262, 7, 262, 2, 263, 7, 263, 2, 264, 7, 264, 2, 265, 7, 265, 2, 266, 7, 266, 2, 267, 7, 267, 2, 268, 7, 268, 2, 269, 7, 269, 2, 270, 7, 270, 2, 271, 7, 271, 2, 272, 7, 272, 2, 273, 7, 273, 2, 274, 7, 274, 2, 275, 7, 275, 2, 276, 7, 276, 2, 277, 7, 277, 2, 278, 7, 278, 2, 279, 7, 279, 2, 280, 7, 280, 2, 281, 7, 281, 2, 282, 7, 282, 2, 283, 7, 283, 2, 284, 7, 284, 2, 285, 7, 285, 2, 286, 7, 286, 2, 287, 7, 287, 2, 288, 7, 288, 2, 289, 7, 289, 2, 290, 7, 290, 2, 291, 7, 291, 2, 292, 7, 292, 2, 293, 7, 293, 2, 294, 7, 294, 2, 295, 7, 295, 2, 296, 7, 296, 2, 297, 7, 297, 2, 298, 7, 298, 2, 299, 7, 299, 2, 300, 7, 300, 2, 301, 7, 301, 2, 302, 7, 302, 2, 303, 7, 303, 2, 304, 7, 304, 2, 305, 7, 305, 2, 306, 7, 306, 2, 307, 7, 307, 2, 308, 7, 308, 2, 309, 7, 309, 2, 310, 7, 310, 2, 311, 7, 311, 2, 312, 7, 312, 2, 313, 7, 313, 2, 314, 7, 314, 2, 315, 7, 315, 2, 316, 7, 316, 2, 317, 7, 317, 2, 318, 7, 318, 2, 319, 7, 319, 2, 320, 7, 320, 2, 321, 7, 321, 2, 322, 7, 322, 2, 323, 7, 323, 2, 324, 7, 324, 2, 325, 7, 325, 2, 326, 7, 326, 2, 327, 7, 327, 2, 328, 7, 328, 2, 329, 7, 329, 2, 330, 7, 330, 2, 331, 7, 331, 2, 332, 7, 332, 2, 333, 7, 333, 2, 334, 7, 334, 2, 335, 7, 335, 2, 336, 7, 336, 2, 337, 7, 337, 2, 338, 7, 338, 2, 339, 7, 339, 2, 340, 7, 340, 2, 341, 7, 341, 2, 342, 7, 342, 2, 343, 7, 343, 2, 344, 7, 344, 2, 345, 7, 345, 2, 346, 7, 346, 2, 347, 7, 347, 2, 348, 7, 348, 2, 349, 7, 349, 2, 350, 7, 350, 2, 351, 7, 351, 2, 352, 7, 352, 2, 353, 7, 353, 2, 354, 7, 354, 2, 355, 7, 355, 2, 356, 7, 356, 2, 357, 7, 357, 2, 358, 7, 358, 2, 359, 7, 359, 2, 360, 7, 360, 2, 361, 7, 361, 2, 362, 7, 362, 2, 363, 7, 363, 2, 364, 7, 364, 2, 365, 7, 365, 2, 366, 7, 366, 2, 367, 7, 367, 2, 368, 7, 368, 2, 369, 7, 369, 2, 370, 7, 370, 2, 371, 7, 371, 2, 372, 7, 372, 2, 373, 7, 373, 2, 374, 7, 374, 2, 375, 7, 375, 2, 376, 7, 376, 2, 377, 7, 377, 2, 378, 7, 378, 2, 379, 7, 379, 2, 380, 7, 380, 2, 381, 7, 381, 2, 382, 7, 382, 2, 383, 7, 383, 2, 384, 7, 384, 2, 385, 7, 385, 2, 386, 7, 386, 2, 387, 7, 387, 2, 388, 7, 388, 2, 389, 7, 389, 2, 390, 7, 390, 2, 391, 7, 391, 2, 392, 7, 392, 2, 393, 7, 393, 2, 394, 7, 394, 2, 395, 7, 395, 2, 396, 7, 396, 2, 397, 7, 397, 2, 398, 7, 398, 2, 399, 7, 399, 2, 400, 7, 400, 2, 401, 7, 401, 2, 402, 7, 402, 2, 403, 7, 403, 2, 404, 7, 404, 2, 405, 7, 405, 2, 406, 7, 406, 2, 407, 7, 407, 2, 408, 7, 408, 2, 409, 7, 409, 2, 410, 7, 410, 2, 411, 7, 411, 2, 412, 7, 412, 2, 413, 7, 413, 2, 414, 7, 414, 2, 415, 7, 415, 2, 416, 7, 416, 2, 417, 7, 417, 2, 418, 7, 418, 2, 419, 7, 419, 2, 420, 7, 420, 2, 421, 7, 421, 2, 422, 7, 422, 2, 423, 7, 423, 2, 424, 7, 424, 2, 425, 7, 425, 2, 426, 7, 426, 2, 427, 7, 427, 2, 428, 7, 428, 2, 429, 7, 429, 2, 430, 7, 430, 2, 431, 7, 431, 2, 432, 7, 432, 2, 433, 7, 433, 2, 434, 7, 434, 2, 435, 7, 435, 2, 436, 7, 436, 2, 437, 7, 437, 2, 438, 7, 438, 2, 439, 7, 439, 2, 440, 7, 440, 2, 441, 7, 441, 2, 442, 7, 442, 2, 443, 7, 443, 2, 444, 7, 444, 2, 445, 7, 445, 2, 446, 7, 446, 2, 447, 7, 447, 2, 448, 7, 448, 2, 449, 7, 449, 2, 450, 7, 450, 2, 451, 7, 451, 2, 452, 7, 452, 2, 453, 7, 453, 2, 454, 7, 454, 2, 455, 7, 455, 2, 456, 7, 456, 2, 457, 7, 457, 2, 458, 7, 458, 2, 459, 7, 459, 2, 460, 7, 460, 2, 461, 7, 461, 2, 462, 7, 462, 2, 463, 7, 463, 2, 464, 7, 464, 2, 465, 7, 465, 2, 466, 7, 466, 2, 467, 7, 467, 2, 468, 7, 468, 2, 469, 7, 469, 2, 470, 7, 470, 2, 471, 7, 471, 2, 472, 7, 472, 2, 473, 7, 473, 2, 474, 7, 474, 2, 475, 7, 475, 2, 476, 7, 476, 2, 477, 7, 477, 2, 478, 7, 478, 2, 479, 7, 479, 2, 480, 7, 480, 2, 481, 7, 481, 2, 482, 7, 482, 2, 483, 7, 483, 2, 484, 7, 484, 2, 485, 7, 485, 2, 486, 7, 486, 2, 487, 7, 487, 2, 488, 7, 488, 2, 489, 7, 489, 2, 490, 7, 490, 2, 491, 7, 491, 2, 492, 7, 492, 2, 493, 7, 493, 2, 494, 7, 494, 2, 495, 7, 495, 2, 496, 7, 496, 2, 497, 7, 497, 2, 498, 7, 498, 2, 499, 7, 499, 2, 500, 7, 500, 2, 501, 7, 501, 2, 502, 7, 502, 2, 503, 7, 503, 2, 504, 7, 504, 2, 505, 7, 505, 2, 506, 7, 506, 2, 507, 7, 507, 2, 508, 7, 508, 2, 509, 7, 509, 2, 510, 7, 510, 2, 511, 7, 511, 2, 512, 7, 512, 2, 513, 7, 513, 2, 514, 7, 514, 2, 515, 7, 515, 2, 516, 7, 516, 2, 517, 7, 517, 2, 518, 7, 518, 2, 519, 7, 519, 2, 520, 7, 520, 2, 521, 7, 521, 2, 522, 7, 522, 2, 523, 7, 523, 2, 524, 7, 524, 2, 525, 7, 525, 2, 526, 7, 526, 2, 527, 7, 527, 2, 528, 7, 528, 2, 529, 7, 529, 2, 530, 7, 530, 2, 531, 7, 531, 2, 532, 7, 532, 2, 533, 7, 533, 2, 534, 7, 534, 2, 535, 7, 535, 2, 536, 7, 536, 2, 537, 7, 537, 2, 538, 7, 538, 2, 539, 7, 539, 2, 540, 7, 540, 2, 541, 7, 541, 2, 542, 7, 542, 2, 543, 7, 543, 2, 544, 7, 544, 2, 545, 7, 545, 2, 546, 7, 546, 2, 547, 7, 547, 2, 548, 7, 548, 2, 549, 7, 549, 2, 550, 7, 550, 2, 551, 7, 551, 2, 552, 7, 552, 2, 553, 7, 553, 2, 554, 7, 554, 2, 555, 7, 555, 2, 556, 7, 556, 2, 557, 7, 557, 2, 558, 7, 558, 2, 559, 7, 559, 2, 560, 7, 560, 2, 561, 7, 561, 2, 562, 7, 562, 2, 563, 7, 563, 2, 564, 7, 564, 2, 565, 7, 565, 2, 566, 7, 566, 2, 567, 7, 567, 2, 568, 7, 568, 2, 569, 7, 569, 2, 570, 7, 570, 2, 571, 7, 571, 2, 572, 7, 572, 2, 573, 7, 573, 2, 574, 7, 574, 2, 575, 7, 575, 2, 576, 7, 576, 2, 577, 7, 577, 2, 578, 7, 578, 2, 579, 7, 579, 2, 580, 7, 580, 2, 581, 7, 581, 2, 582, 7, 582, 2, 583, 7, 583, 2, 584, 7, 584, 2, 585, 7, 585, 2, 586, 7, 586, 2, 587, 7, 587, 2, 588, 7, 588, 2, 589, 7, 589, 2, 590, 7, 590, 2, 591, 7, 591, 2, 592, 7, 592, 2, 593, 7, 593, 2, 594, 7, 594, 2, 595, 7, 595, 2, 596, 7, 596, 2, 597, 7, 597, 2, 598, 7, 598, 2, 599, 7, 599, 2, 600, 7, 600, 2, 601, 7, 601, 2, 602, 7, 602, 2, 603, 7, 603, 2, 604, 7, 604, 2, 605, 7, 605, 2, 606, 7, 606, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 1228, 8, 1, 10, 1, 12, 1, 1231, 9, 1, 3, 1, 1233, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1240, 8, 2, 10, 2, 12, 2, 1243, 9, 2, 3, 2, 1245, 8, 2, 3, 2, 1247, 8, 2, 1, 2, 1, 2, 3, 2, 1251, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1377, 8, 3, 1, 4, 4, 4, 1380, 8, 4, 11, 4, 12, 4, 1381, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 1400, 8, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1408, 8, 6, 11, 6, 12, 6, 1409, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 1418, 8, 6, 11, 6, 12, 6, 1419, 1, 6, 3, 6, 1423, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 1441, 8, 9, 10, 9, 12, 9, 1444, 9, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 1458, 8, 10, 10, 10, 12, 10, 1461, 9, 10, 3, 10, 1463, 8, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 1474, 8, 11, 10, 11, 12, 11, 1477, 9, 11, 3, 11, 1479, 8, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 1495, 8, 12, 10, 12, 12, 12, 1498, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1508, 8, 13, 1, 13, 1, 13, 1, 13, 3, 13, 1513, 8, 13, 1, 13, 1, 13, 1, 13, 5, 13, 1518, 8, 13, 10, 13, 12, 13, 1521, 9, 13, 3, 13, 1523, 8, 13, 1, 13, 1, 13, 1, 13, 1, 14, 4, 14, 1529, 8, 14, 11, 14, 12, 14, 1530, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 2642, 8, 180, 10, 180, 12, 180, 2645, 9, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 5, 184, 2664, 8, 184, 10, 184, 12, 184, 2667, 9, 184, 1, 185, 3, 185, 2670, 8, 185, 1, 186, 1, 186, 3, 186, 2674, 8, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 4, 188, 2681, 8, 188, 11, 188, 12, 188, 2682, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 5, 189, 2693, 8, 189, 10, 189, 12, 189, 2696, 9, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 5, 190, 2710, 8, 190, 10, 190, 12, 190, 2713, 9, 190, 1, 190, 5, 190, 2716, 8, 190, 10, 190, 12, 190, 2719, 9, 190, 1, 190, 4, 190, 2722, 8, 190, 11, 190, 12, 190, 2723, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 1, 201, 1, 201, 1, 201, 1, 201, 1, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 204, 1, 204, 1, 204, 1, 204, 1, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 206, 1, 206, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 207, 3, 207, 2815, 8, 207, 1, 207, 1, 207, 1, 207, 1, 207, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2825, 8, 208, 11, 208, 12, 208, 2826, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 1, 208, 4, 208, 2835, 8, 208, 11, 208, 12, 208, 2836, 1, 208, 3, 208, 2840, 8, 208, 1, 208, 1, 208, 1, 209, 1, 209, 1, 209, 1, 209, 1, 210, 1, 210, 1, 210, 1, 210, 1, 210, 1, 211, 1, 211, 1, 211, 1, 211, 1, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 1, 214, 1, 214, 1, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 3, 216, 2893, 8, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2903, 8, 217, 11, 217, 12, 217, 2904, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 1, 217, 4, 217, 2913, 8, 217, 11, 217, 12, 217, 2914, 1, 217, 3, 217, 2918, 8, 217, 1, 217, 1, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 220, 5, 220, 2935, 8, 220, 10, 220, 12, 220, 2938, 9, 220, 3, 220, 2940, 8, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 221, 1, 221, 1, 221, 5, 221, 2949, 8, 221, 10, 221, 12, 221, 2952, 9, 221, 3, 221, 2954, 8, 221, 3, 221, 2956, 8, 221, 1, 221, 1, 221, 3, 221, 2960, 8, 221, 1, 221, 1, 221, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 3088, 8, 222, 1, 222, 1, 222, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 223, 3, 223, 3108, 8, 223, 1, 223, 1, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3118, 8, 224, 11, 224, 12, 224, 3119, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 1, 224, 4, 224, 3128, 8, 224, 11, 224, 12, 224, 3129, 1, 224, 3, 224, 3133, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 227, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 5, 228, 3161, 8, 228, 10, 228, 12, 228, 3164, 9, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 228, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 5, 229, 3180, 8, 229, 10, 229, 12, 229, 3183, 9, 229, 3, 229, 3185, 8, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 229, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 5, 230, 3198, 8, 230, 10, 230, 12, 230, 3201, 9, 230, 3, 230, 3203, 8, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 230, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 5, 231, 3221, 8, 231, 10, 231, 12, 231, 3224, 9, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 231, 1, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3236, 8, 232, 1, 232, 1, 232, 1, 232, 3, 232, 3241, 8, 232, 1, 232, 1, 232, 1, 232, 5, 232, 3246, 8, 232, 10, 232, 12, 232, 3249, 9, 232, 3, 232, 3251, 8, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 232, 1, 233, 4, 233, 3259, 8, 233, 11, 233, 12, 233, 3260, 1, 233, 1, 233, 1, 233, 1, 234, 1, 234, 1, 234, 1, 234, 1, 235, 1, 235, 1, 235, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 238, 1, 238, 1, 238, 1, 238, 1, 239, 1, 239, 1, 239, 1, 239, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 241, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 242, 1, 243, 1, 243, 1, 243, 1, 243, 1, 244, 1, 244, 1, 244, 1, 244, 1, 245, 1, 245, 1, 245, 1, 245, 1, 246, 1, 246, 1, 246, 1, 246, 1, 247, 1, 247, 1, 247, 1, 247, 1, 248, 1, 248, 1, 248, 1, 248, 1, 248, 1, 249, 1, 249, 1, 249, 1, 249, 1, 250, 1, 250, 1, 250, 1, 250, 1, 250, 1, 251, 1, 251, 1, 251, 1, 251, 1, 252, 1, 252, 1, 252, 1, 252, 1, 253, 1, 253, 1, 253, 1, 253, 1, 253, 1, 254, 1, 254, 1, 254, 1, 254, 1, 255, 1, 255, 1, 255, 1, 255, 1, 256, 1, 256, 1, 256, 1, 256, 1, 257, 1, 257, 1, 257, 1, 257, 1, 258, 1, 258, 1, 258, 1, 258, 1, 259, 1, 259, 1, 259, 1, 259, 1, 260, 1, 260, 1, 260, 1, 260, 1, 261, 1, 261, 1, 261, 1, 261, 1, 262, 1, 262, 1, 262, 1, 262, 1, 263, 1, 263, 1, 263, 1, 263, 1, 264, 1, 264, 1, 264, 1, 264, 1, 265, 1, 265, 1, 265, 1, 265, 1, 265, 1, 266, 1, 266, 1, 266, 1, 266, 1, 267, 1, 267, 1, 267, 1, 267, 1, 267, 1, 268, 1, 268, 1, 268, 1, 268, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 269, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 270, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 271, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 272, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 273, 1, 274, 1, 274, 1, 274, 1, 274, 1, 274, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 275, 1, 276, 1, 276, 1, 276, 1, 276, 1, 276, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 277, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 278, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 279, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 280, 1, 281, 1, 281, 1, 281, 1, 281, 1, 281, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 282, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 283, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 284, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 285, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 286, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 287, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 288, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 289, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 290, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 291, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 292, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 293, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 294, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 295, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 296, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 297, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 298, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 299, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 300, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 301, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 302, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 303, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 304, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 305, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 306, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 307, 1, 308, 1, 308, 1, 308, 1, 308, 1, 308, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 309, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 310, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 311, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 312, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 313, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 314, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 315, 1, 316, 1, 316, 1, 316, 1, 316, 1, 316, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 317, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 318, 1, 319, 1, 319, 1, 319, 1, 319, 1, 319, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 320, 1, 321, 1, 321, 1, 321, 1, 321, 1, 321, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 322, 1, 323, 1, 323, 1, 323, 1, 323, 1, 323, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 324, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 325, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 326, 1, 327, 1, 327, 1, 327, 1, 327, 1, 327, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 328, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 329, 1, 330, 1, 330, 1, 330, 1, 330, 1, 330, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 331, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 332, 1, 333, 1, 333, 1, 333, 1, 333, 1, 333, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 334, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 335, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 336, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 337, 1, 338, 1, 338, 1, 338, 1, 338, 1, 338, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 339, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 340, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 341, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 342, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 343, 1, 344, 1, 344, 1, 344, 1, 344, 1, 344, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 345, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 346, 1, 347, 1, 347, 1, 347, 1, 347, 1, 347, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 348, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 349, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 350, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 351, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 352, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 353, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 354, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 355, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 356, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 357, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 358, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 359, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 360, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 361, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 362, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 363, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 364, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 365, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 366, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 367, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 368, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 369, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 370, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 371, 1, 372, 1, 372, 1, 372, 1, 372, 1, 372, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 373, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 374, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 375, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 376, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 377, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 378, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 379, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 380, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 381, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 382, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 383, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 384, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 385, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 386, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 387, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 388, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 389, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 390, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 391, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 392, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 393, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 394, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 395, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 396, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 397, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 398, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 399, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 5, 400, 4712, 8, 400, 10, 400, 12, 400, 4715, 9, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 400, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 401, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 402, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 403, 1, 404, 1, 404, 5, 404, 4742, 8, 404, 10, 404, 12, 404, 4745, 9, 404, 1, 404, 1, 404, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 405, 1, 406, 4, 406, 4756, 8, 406, 11, 406, 12, 406, 4757, 1, 406, 1, 406, 1, 406, 1, 406, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 5, 407, 4770, 8, 407, 10, 407, 12, 407, 4773, 9, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 407, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 5, 408, 4789, 8, 408, 10, 408, 12, 408, 4792, 9, 408, 1, 408, 5, 408, 4795, 8, 408, 10, 408, 12, 408, 4798, 9, 408, 1, 408, 4, 408, 4801, 8, 408, 11, 408, 12, 408, 4802, 1, 408, 1, 408, 1, 408, 1, 408, 1, 408, 1, 409, 1, 409, 1, 409, 1, 409, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 410, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 411, 1, 412, 1, 412, 1, 412, 1, 412, 1, 413, 1, 413, 1, 413, 1, 413, 1, 414, 1, 414, 1, 414, 1, 414, 1, 414, 5, 414, 4840, 8, 414, 10, 414, 12, 414, 4843, 9, 414, 3, 414, 4845, 8, 414, 1, 414, 1, 414, 1, 415, 1, 415, 1, 415, 1, 415, 1, 415, 5, 415, 4854, 8, 415, 10, 415, 12, 415, 4857, 9, 415, 3, 415, 4859, 8, 415, 3, 415, 4861, 8, 415, 1, 415, 1, 415, 3, 415, 4865, 8, 415, 1, 415, 1, 415, 1, 415, 1, 415, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 1, 416, 3, 416, 4993, 8, 416, 1, 416, 1, 416, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 417, 3, 417, 5013, 8, 417, 1, 417, 1, 417, 1, 417, 1, 417, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5023, 8, 418, 11, 418, 12, 418, 5024, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 1, 418, 4, 418, 5033, 8, 418, 11, 418, 12, 418, 5034, 1, 418, 3, 418, 5038, 8, 418, 1, 418, 1, 418, 1, 419, 1, 419, 1, 419, 1, 419, 1, 419, 1, 420, 1, 420, 1, 420, 1, 420, 1, 420, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 421, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 5, 422, 5066, 8, 422, 10, 422, 12, 422, 5069, 9, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 422, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 5, 423, 5085, 8, 423, 10, 423, 12, 423, 5088, 9, 423, 3, 423, 5090, 8, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 423, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 5, 424, 5103, 8, 424, 10, 424, 12, 424, 5106, 9, 424, 3, 424, 5108, 8, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 424, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 5, 425, 5126, 8, 425, 10, 425, 12, 425, 5129, 9, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 425, 1, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5141, 8, 426, 1, 426, 1, 426, 1, 426, 3, 426, 5146, 8, 426, 1, 426, 1, 426, 1, 426, 5, 426, 5151, 8, 426, 10, 426, 12, 426, 5154, 9, 426, 3, 426, 5156, 8, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 426, 1, 427, 4, 427, 5164, 8, 427, 11, 427, 12, 427, 5165, 1, 427, 1, 427, 1, 427, 1, 428, 1, 428, 1, 428, 1, 428, 1, 429, 1, 429, 1, 429, 1, 429, 1, 429, 1, 430, 1, 430, 1, 430, 1, 430, 1, 431, 1, 431, 1, 431, 1, 431, 1, 432, 1, 432, 1, 432, 1, 432, 1, 433, 1, 433, 1, 433, 1, 433, 1, 434, 1, 434, 1, 434, 1, 434, 1, 434, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 435, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 436, 1, 437, 1, 437, 1, 437, 1, 437, 1, 438, 1, 438, 1, 438, 1, 438, 1, 439, 1, 439, 1, 439, 1, 439, 1, 440, 1, 440, 1, 440, 1, 440, 1, 441, 1, 441, 1, 441, 1, 441, 1, 442, 1, 442, 1, 442, 1, 442, 1, 442, 1, 443, 1, 443, 1, 443, 1, 443, 1, 444, 1, 444, 1, 444, 1, 444, 1, 444, 1, 445, 1, 445, 1, 445, 1, 445, 1, 446, 1, 446, 1, 446, 1, 446, 1, 447, 1, 447, 1, 447, 1, 447, 1, 447, 1, 448, 1, 448, 1, 448, 1, 448, 1, 449, 1, 449, 1, 449, 1, 449, 1, 450, 1, 450, 1, 450, 1, 450, 1, 451, 1, 451, 1, 451, 1, 451, 1, 452, 1, 452, 1, 452, 1, 452, 1, 453, 1, 453, 1, 453, 1, 453, 1, 454, 1, 454, 1, 454, 1, 454, 1, 455, 1, 455, 1, 455, 1, 455, 1, 456, 1, 456, 1, 456, 1, 456, 1, 457, 1, 457, 1, 457, 1, 457, 1, 458, 1, 458, 1, 458, 1, 458, 1, 459, 1, 459, 1, 459, 1, 459, 1, 459, 1, 460, 1, 460, 1, 460, 1, 460, 1, 461, 1, 461, 1, 461, 1, 461, 1, 461, 1, 462, 1, 462, 1, 462, 1, 462, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 463, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 464, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 465, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 466, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 467, 1, 468, 1, 468, 1, 468, 1, 468, 1, 468, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 469, 1, 470, 1, 470, 1, 470, 1, 470, 1, 470, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 471, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 472, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 473, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 474, 1, 475, 1, 475, 1, 475, 1, 475, 1, 475, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 476, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 477, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 478, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 479, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 480, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 481, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 482, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 483, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 484, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 485, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 486, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 487, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 488, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 489, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 490, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 491, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 492, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 493, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 494, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 495, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 496, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 497, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 498, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 499, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 500, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 501, 1, 502, 1, 502, 1, 502, 1, 502, 1, 502, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 503, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 504, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 505, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 506, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 507, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 508, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 509, 1, 510, 1, 510, 1, 510, 1, 510, 1, 510, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 511, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 512, 1, 513, 1, 513, 1, 513, 1, 513, 1, 513, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 514, 1, 515, 1, 515, 1, 515, 1, 515, 1, 515, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 516, 1, 517, 1, 517, 1, 517, 1, 517, 1, 517, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 518, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 519, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 520, 1, 521, 1, 521, 1, 521, 1, 521, 1, 521, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 522, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 523, 1, 524, 1, 524, 1, 524, 1, 524, 1, 524, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 525, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 526, 1, 527, 1, 527, 1, 527, 1, 527, 1, 527, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 528, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 529, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 530, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 531, 1, 532, 1, 532, 1, 532, 1, 532, 1, 532, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 533, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 534, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 535, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 536, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 537, 1, 538, 1, 538, 1, 538, 1, 538, 1, 538, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 539, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 540, 1, 541, 1, 541, 1, 541, 1, 541, 1, 541, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 542, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 543, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 544, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 545, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 546, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 547, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 548, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 549, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 550, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 551, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 552, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 553, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 554, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 555, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 556, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 557, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 558, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 559, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 560, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 561, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 562, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 563, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 564, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 565, 1, 566, 1, 566, 1, 566, 1, 566, 1, 566, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 567, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 568, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 569, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 570, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 571, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 572, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 573, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 574, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 575, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 576, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 577, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 578, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 579, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 580, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 581, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 582, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 583, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 584, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 585, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 586, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 587, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 588, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 589, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 590, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 591, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 592, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 593, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 5, 594, 6617, 8, 594, 10, 594, 12, 594, 6620, 9, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 594, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 595, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 596, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 597, 1, 598, 1, 598, 5, 598, 6647, 8, 598, 10, 598, 12, 598, 6650, 9, 598, 1, 598, 1, 598, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 599, 1, 600, 4, 600, 6661, 8, 600, 11, 600, 12, 600, 6662, 1, 600, 1, 600, 1, 600, 1, 600, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 5, 601, 6675, 8, 601, 10, 601, 12, 601, 6678, 9, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 601, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 5, 602, 6694, 8, 602, 10, 602, 12, 602, 6697, 9, 602, 1, 602, 5, 602, 6700, 8, 602, 10, 602, 12, 602, 6703, 9, 602, 1, 602, 4, 602, 6706, 8, 602, 11, 602, 12, 602, 6707, 1, 602, 1, 602, 1, 602, 1, 602, 1, 602, 1, 603, 1, 603, 1, 603, 1, 603, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 604, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 605, 1, 606, 1, 606, 1, 606, 1, 606, 12, 1459, 1475, 1496, 1519, 3181, 3199, 3222, 3247, 5086, 5104, 5127, 5152, 0, 607, 6, 5, 8, 6, 10, 7, 12, 8, 14, 0, 16, 9, 18, 10, 20, 11, 22, 12, 24, 13, 26, 14, 28, 15, 30, 16, 32, 17, 34, 18, 36, 19, 38, 20, 40, 21, 42, 22, 44, 23, 46, 24, 48, 25, 50, 26, 52, 27, 54, 28, 56, 29, 58, 30, 60, 31, 62, 32, 64, 33, 66, 34, 68, 35, 70, 36, 72, 37, 74, 38, 76, 39, 78, 40, 80, 41, 82, 42, 84, 43, 86, 44, 88, 45, 90, 46, 92, 47, 94, 48, 96, 49, 98, 50, 100, 51, 102, 52, 104, 53, 106, 54, 108, 55, 110, 56, 112, 57, 114, 58, 116, 59, 118, 60, 120, 61, 122, 62, 124, 63, 126, 64, 128, 65, 130, 66, 132, 67, 134, 68, 136, 69, 138, 70, 140, 71, 142, 72, 144, 73, 146, 74, 148, 75, 150, 76, 152, 77, 154, 78, 156, 79, 158, 80, 160, 81, 162, 82, 164, 83, 166, 84, 168, 85, 170, 86, 172, 87, 174, 88, 176, 89, 178, 90, 180, 91, 182, 92, 184, 93, 186, 94, 188, 95, 190, 96, 192, 97, 194, 98, 196, 99, 198, 100, 200, 101, 202, 102, 204, 103, 206, 104, 208, 105, 210, 106, 212, 107, 214, 108, 216, 109, 218, 110, 220, 111, 222, 112, 224, 113, 226, 114, 228, 115, 230, 116, 232, 117, 234, 118, 236, 119, 238, 120, 240, 121, 242, 122, 244, 123, 246, 124, 248, 125, 250, 126, 252, 127, 254, 128, 256, 129, 258, 130, 260, 131, 262, 132, 264, 133, 266, 134, 268, 135, 270, 136, 272, 137, 274, 138, 276, 139, 278, 140, 280, 141, 282, 142, 284, 143, 286, 144, 288, 145, 290, 146, 292, 147, 294, 148, 296, 149, 298, 150, 300, 151, 302, 152, 304, 153, 306, 154, 308, 155, 310, 156, 312, 157, 314, 158, 316, 159, 318, 160, 320, 161, 322, 162, 324, 163, 326, 164, 328, 165, 330, 166, 332, 167, 334, 168, 336, 169, 338, 170, 340, 171, 342, 172, 344, 173, 346, 174, 348, 175, 350, 176, 352, 177, 354, 178, 356, 179, 358, 180, 360, 181, 362, 182, 364, 183, 366, 184, 368, 185, 370, 186, 372, 187, 374, 188, 376, 0, 378, 0, 380, 189, 382, 190, 384, 191, 386, 192, 388, 193, 390, 194, 392, 195, 394, 196, 396, 197, 398, 0, 400, 0, 402, 0, 404, 198, 406, 199, 408, 200, 410, 0, 412, 201, 414, 202, 416, 0, 418, 0, 420, 0, 422, 0, 424, 0, 426, 203, 428, 0, 430, 0, 432, 0, 434, 0, 436, 0, 438, 0, 440, 0, 442, 0, 444, 0, 446, 0, 448, 0, 450, 0, 452, 0, 454, 0, 456, 0, 458, 0, 460, 0, 462, 0, 464, 0, 466, 0, 468, 0, 470, 0, 472, 0, 474, 0, 476, 0, 478, 0, 480, 0, 482, 0, 484, 0, 486, 0, 488, 0, 490, 0, 492, 0, 494, 0, 496, 0, 498, 0, 500, 0, 502, 0, 504, 0, 506, 0, 508, 0, 510, 0, 512, 0, 514, 0, 516, 0, 518, 0, 520, 0, 522, 0, 524, 0, 526, 0, 528, 0, 530, 0, 532, 0, 534, 0, 536, 0, 538, 0, 540, 0, 542, 0, 544, 0, 546, 0, 548, 0, 550, 0, 552, 0, 554, 0, 556, 0, 558, 0, 560, 0, 562, 0, 564, 0, 566, 0, 568, 0, 570, 0, 572, 0, 574, 0, 576, 0, 578, 0, 580, 0, 582, 0, 584, 0, 586, 0, 588, 0, 590, 0, 592, 0, 594, 0, 596, 0, 598, 0, 600, 0, 602, 0, 604, 0, 606, 0, 608, 0, 610, 0, 612, 0, 614, 0, 616, 0, 618, 0, 620, 0, 622, 0, 624, 0, 626, 0, 628, 0, 630, 0, 632, 0, 634, 0, 636, 0, 638, 0, 640, 0, 642, 0, 644, 0, 646, 0, 648, 0, 650, 0, 652, 0, 654, 0, 656, 0, 658, 0, 660, 0, 662, 0, 664, 0, 666, 0, 668, 0, 670, 0, 672, 0, 674, 0, 676, 0, 678, 0, 680, 0, 682, 0, 684, 0, 686, 0, 688, 0, 690, 0, 692, 0, 694, 0, 696, 0, 698, 0, 700, 0, 702, 0, 704, 0, 706, 0, 708, 0, 710, 0, 712, 0, 714, 0, 716, 0, 718, 0, 720, 0, 722, 0, 724, 0, 726, 0, 728, 0, 730, 0, 732, 0, 734, 0, 736, 0, 738, 0, 740, 0, 742, 0, 744, 0, 746, 0, 748, 0, 750, 0, 752, 0, 754, 0, 756, 0, 758, 0, 760, 0, 762, 0, 764, 0, 766, 0, 768, 0, 770, 0, 772, 0, 774, 0, 776, 0, 778, 0, 780, 0, 782, 0, 784, 0, 786, 0, 788, 0, 790, 0, 792, 0, 794, 0, 796, 0, 798, 0, 800, 0, 802, 0, 804, 0, 806, 0, 808, 0, 810, 0, 812, 0, 814, 0, 816, 0, 818, 0, 820, 0, 822, 0, 824, 0, 826, 0, 828, 0, 830, 0, 832, 0, 834, 0, 836, 0, 838, 0, 840, 0, 842, 0, 844, 0, 846, 0, 848, 0, 850, 0, 852, 0, 854, 0, 856, 0, 858, 0, 860, 0, 862, 0, 864, 0, 866, 0, 868, 0, 870, 0, 872, 0, 874, 0, 876, 0, 878, 0, 880, 0, 882, 0, 884, 0, 886, 0, 888, 0, 890, 0, 892, 0, 894, 0, 896, 0, 898, 0, 900, 0, 902, 0, 904, 0, 906, 0, 908, 0, 910, 0, 912, 0, 914, 0, 916, 0, 918, 0, 920, 0, 922, 0, 924, 0, 926, 0, 928, 0, 930, 0, 932, 0, 934, 0, 936, 0, 938, 0, 940, 0, 942, 0, 944, 0, 946, 0, 948, 0, 950, 0, 952, 0, 954, 0, 956, 0, 958, 0, 960, 0, 962, 0, 964, 0, 966, 0, 968, 0, 970, 0, 972, 0, 974, 0, 976, 0, 978, 0, 980, 0, 982, 0, 984, 0, 986, 0, 988, 0, 990, 0, 992, 0, 994, 0, 996, 0, 998, 0, 1000, 0, 1002, 0, 1004, 0, 1006, 0, 1008, 0, 1010, 0, 1012, 0, 1014, 0, 1016, 0, 1018, 0, 1020, 0, 1022, 0, 1024, 0, 1026, 0, 1028, 0, 1030, 0, 1032, 0, 1034, 0, 1036, 0, 1038, 0, 1040, 0, 1042, 0, 1044, 0, 1046, 0, 1048, 0, 1050, 0, 1052, 0, 1054, 0, 1056, 0, 1058, 0, 1060, 0, 1062, 0, 1064, 0, 1066, 0, 1068, 0, 1070, 0, 1072, 0, 1074, 0, 1076, 0, 1078, 0, 1080, 0, 1082, 0, 1084, 0, 1086, 0, 1088, 0, 1090, 0, 1092, 0, 1094, 0, 1096, 0, 1098, 0, 1100, 0, 1102, 0, 1104, 0, 1106, 0, 1108, 0, 1110, 0, 1112, 0, 1114, 0, 1116, 0, 1118, 0, 1120, 0, 1122, 0, 1124, 0, 1126, 0, 1128, 0, 1130, 0, 1132, 0, 1134, 0, 1136, 0, 1138, 0, 1140, 0, 1142, 0, 1144, 0, 1146, 0, 1148, 0, 1150, 0, 1152, 0, 1154, 0, 1156, 0, 1158, 0, 1160, 0, 1162, 0, 1164, 0, 1166, 0, 1168, 0, 1170, 0, 1172, 0, 1174, 0, 1176, 0, 1178, 0, 1180, 0, 1182, 0, 1184, 0, 1186, 0, 1188, 0, 1190, 0, 1192, 0, 1194, 0, 1196, 0, 1198, 0, 1200, 0, 1202, 0, 1204, 0, 1206, 0, 1208, 0, 1210, 0, 1212, 0, 1214, 0, 1216, 0, 1218, 0, 6, 0, 1, 2, 3, 4, 5, 21, 1, 0, 48, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 45, 45, 2, 0, 88, 88, 120, 120, 2, 0, 77, 77, 109, 109, 2, 0, 76, 76, 108, 108, 3, 0, 9, 10, 13, 13, 32, 32, 3, 0, 38, 38, 123, 123, 125, 125, 14, 0, 65, 90, 95, 95, 97, 122, 192, 214, 216, 246, 248, 767, 880, 893, 895, 8191, 8204, 8205, 8304, 8591, 11264, 12271, 12289, 55295, 63744, 64975, 65008, 65533, 5, 0, 45, 46, 48, 57, 161, 191, 768, 879, 8255, 8256, 1, 0, 41, 41, 1, 0, 126, 126, 1, 0, 58, 58, 2, 0, 40, 40, 58, 58, 5, 0, 9, 10, 13, 13, 32, 57, 59, 55295, 57344, 65533, 5, 0, 34, 34, 38, 39, 60, 60, 123, 123, 125, 125, 8, 0, 9, 10, 13, 13, 32, 92, 94, 95, 97, 122, 124, 55295, 57344, 65533, 65536, 1114111, 4, 0, 34, 34, 38, 38, 123, 123, 125, 125, 3, 0, 38, 39, 123, 123, 125, 125, 6886, 0, 6, 1, 0, 0, 0, 0, 8, 1, 0, 0, 0, 0, 10, 1, 0, 0, 0, 0, 12, 1, 0, 0, 0, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 0, 68, 1, 0, 0, 0, 0, 70, 1, 0, 0, 0, 0, 72, 1, 0, 0, 0, 0, 74, 1, 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 80, 1, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 84, 1, 0, 0, 0, 0, 86, 1, 0, 0, 0, 0, 88, 1, 0, 0, 0, 0, 90, 1, 0, 0, 0, 0, 92, 1, 0, 0, 0, 0, 94, 1, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 98, 1, 0, 0, 0, 0, 100, 1, 0, 0, 0, 0, 102, 1, 0, 0, 0, 0, 104, 1, 0, 0, 0, 0, 106, 1, 0, 0, 0, 0, 108, 1, 0, 0, 0, 0, 110, 1, 0, 0, 0, 0, 112, 1, 0, 0, 0, 0, 114, 1, 0, 0, 0, 0, 116, 1, 0, 0, 0, 0, 118, 1, 0, 0, 0, 0, 120, 1, 0, 0, 0, 0, 122, 1, 0, 0, 0, 0, 124, 1, 0, 0, 0, 0, 126, 1, 0, 0, 0, 0, 128, 1, 0, 0, 0, 0, 130, 1, 0, 0, 0, 0, 132, 1, 0, 0, 0, 0, 134, 1, 0, 0, 0, 0, 136, 1, 0, 0, 0, 0, 138, 1, 0, 0, 0, 0, 140, 1, 0, 0, 0, 0, 142, 1, 0, 0, 0, 0, 144, 1, 0, 0, 0, 0, 146, 1, 0, 0, 0, 0, 148, 1, 0, 0, 0, 0, 150, 1, 0, 0, 0, 0, 152, 1, 0, 0, 0, 0, 154, 1, 0, 0, 0, 0, 156, 1, 0, 0, 0, 0, 158, 1, 0, 0, 0, 0, 160, 1, 0, 0, 0, 0, 162, 1, 0, 0, 0, 0, 164, 1, 0, 0, 0, 0, 166, 1, 0, 0, 0, 0, 168, 1, 0, 0, 0, 0, 170, 1, 0, 0, 0, 0, 172, 1, 0, 0, 0, 0, 174, 1, 0, 0, 0, 0, 176, 1, 0, 0, 0, 0, 178, 1, 0, 0, 0, 0, 180, 1, 0, 0, 0, 0, 182, 1, 0, 0, 0, 0, 184, 1, 0, 0, 0, 0, 186, 1, 0, 0, 0, 0, 188, 1, 0, 0, 0, 0, 190, 1, 0, 0, 0, 0, 192, 1, 0, 0, 0, 0, 194, 1, 0, 0, 0, 0, 196, 1, 0, 0, 0, 0, 198, 1, 0, 0, 0, 0, 200, 1, 0, 0, 0, 0, 202, 1, 0, 0, 0, 0, 204, 1, 0, 0, 0, 0, 206, 1, 0, 0, 0, 0, 208, 1, 0, 0, 0, 0, 210, 1, 0, 0, 0, 0, 212, 1, 0, 0, 0, 0, 214, 1, 0, 0, 0, 0, 216, 1, 0, 0, 0, 0, 218, 1, 0, 0, 0, 0, 220, 1, 0, 0, 0, 0, 222, 1, 0, 0, 0, 0, 224, 1, 0, 0, 0, 0, 226, 1, 0, 0, 0, 0, 228, 1, 0, 0, 0, 0, 230, 1, 0, 0, 0, 0, 232, 1, 0, 0, 0, 0, 234, 1, 0, 0, 0, 0, 236, 1, 0, 0, 0, 0, 238, 1, 0, 0, 0, 0, 240, 1, 0, 0, 0, 0, 242, 1, 0, 0, 0, 0, 244, 1, 0, 0, 0, 0, 246, 1, 0, 0, 0, 0, 248, 1, 0, 0, 0, 0, 250, 1, 0, 0, 0, 0, 252, 1, 0, 0, 0, 0, 254, 1, 0, 0, 0, 0, 256, 1, 0, 0, 0, 0, 258, 1, 0, 0, 0, 0, 260, 1, 0, 0, 0, 0, 262, 1, 0, 0, 0, 0, 264, 1, 0, 0, 0, 0, 266, 1, 0, 0, 0, 0, 268, 1, 0, 0, 0, 0, 270, 1, 0, 0, 0, 0, 272, 1, 0, 0, 0, 0, 274, 1, 0, 0, 0, 0, 276, 1, 0, 0, 0, 0, 278, 1, 0, 0, 0, 0, 280, 1, 0, 0, 0, 0, 282, 1, 0, 0, 0, 0, 284, 1, 0, 0, 0, 0, 286, 1, 0, 0, 0, 0, 288, 1, 0, 0, 0, 0, 290, 1, 0, 0, 0, 0, 292, 1, 0, 0, 0, 0, 294, 1, 0, 0, 0, 0, 296, 1, 0, 0, 0, 0, 298, 1, 0, 0, 0, 0, 300, 1, 0, 0, 0, 0, 302, 1, 0, 0, 0, 0, 304, 1, 0, 0, 0, 0, 306, 1, 0, 0, 0, 0, 308, 1, 0, 0, 0, 0, 310, 1, 0, 0, 0, 0, 312, 1, 0, 0, 0, 0, 314, 1, 0, 0, 0, 0, 316, 1, 0, 0, 0, 0, 318, 1, 0, 0, 0, 0, 320, 1, 0, 0, 0, 0, 322, 1, 0, 0, 0, 0, 324, 1, 0, 0, 0, 0, 326, 1, 0, 0, 0, 0, 328, 1, 0, 0, 0, 0, 330, 1, 0, 0, 0, 0, 332, 1, 0, 0, 0, 0, 334, 1, 0, 0, 0, 0, 336, 1, 0, 0, 0, 0, 338, 1, 0, 0, 0, 0, 340, 1, 0, 0, 0, 0, 342, 1, 0, 0, 0, 0, 344, 1, 0, 0, 0, 0, 346, 1, 0, 0, 0, 0, 348, 1, 0, 0, 0, 0, 350, 1, 0, 0, 0, 0, 352, 1, 0, 0, 0, 0, 354, 1, 0, 0, 0, 0, 356, 1, 0, 0, 0, 0, 358, 1, 0, 0, 0, 0, 360, 1, 0, 0, 0, 0, 362, 1, 0, 0, 0, 0, 364, 1, 0, 0, 0, 0, 366, 1, 0, 0, 0, 0, 368, 1, 0, 0, 0, 0, 370, 1, 0, 0, 0, 0, 372, 1, 0, 0, 0, 0, 374, 1, 0, 0, 0, 0, 380, 1, 0, 0, 0, 0, 382, 1, 0, 0, 0, 0, 384, 1, 0, 0, 0, 0, 386, 1, 0, 0, 0, 0, 388, 1, 0, 0, 0, 0, 390, 1, 0, 0, 0, 0, 392, 1, 0, 0, 0, 0, 394, 1, 0, 0, 0, 1, 396, 1, 0, 0, 0, 1, 398, 1, 0, 0, 0, 1, 400, 1, 0, 0, 0, 1, 402, 1, 0, 0, 0, 1, 404, 1, 0, 0, 0, 1, 406, 1, 0, 0, 0, 2, 408, 1, 0, 0, 0, 2, 410, 1, 0, 0, 0, 2, 412, 1, 0, 0, 0, 2, 414, 1, 0, 0, 0, 2, 416, 1, 0, 0, 0, 2, 418, 1, 0, 0, 0, 2, 420, 1, 0, 0, 0, 2, 422, 1, 0, 0, 0, 2, 424, 1, 0, 0, 0, 3, 426, 1, 0, 0, 0, 3, 428, 1, 0, 0, 0, 3, 430, 1, 0, 0, 0, 3, 432, 1, 0, 0, 0, 3, 434, 1, 0, 0, 0, 3, 436, 1, 0, 0, 0, 3, 438, 1, 0, 0, 0, 3, 440, 1, 0, 0, 0, 3, 442, 1, 0, 0, 0, 4, 444, 1, 0, 0, 0, 4, 446, 1, 0, 0, 0, 4, 448, 1, 0, 0, 0, 4, 450, 1, 0, 0, 0, 4, 452, 1, 0, 0, 0, 4, 454, 1, 0, 0, 0, 4, 456, 1, 0, 0, 0, 4, 458, 1, 0, 0, 0, 4, 460, 1, 0, 0, 0, 4, 462, 1, 0, 0, 0, 4, 464, 1, 0, 0, 0, 4, 466, 1, 0, 0, 0, 4, 468, 1, 0, 0, 0, 4, 470, 1, 0, 0, 0, 4, 472, 1, 0, 0, 0, 4, 474, 1, 0, 0, 0, 4, 476, 1, 0, 0, 0, 4, 478, 1, 0, 0, 0, 4, 480, 1, 0, 0, 0, 4, 482, 1, 0, 0, 0, 4, 484, 1, 0, 0, 0, 4, 486, 1, 0, 0, 0, 4, 488, 1, 0, 0, 0, 4, 490, 1, 0, 0, 0, 4, 492, 1, 0, 0, 0, 4, 494, 1, 0, 0, 0, 4, 496, 1, 0, 0, 0, 4, 498, 1, 0, 0, 0, 4, 500, 1, 0, 0, 0, 4, 502, 1, 0, 0, 0, 4, 504, 1, 0, 0, 0, 4, 506, 1, 0, 0, 0, 4, 508, 1, 0, 0, 0, 4, 510, 1, 0, 0, 0, 4, 512, 1, 0, 0, 0, 4, 514, 1, 0, 0, 0, 4, 516, 1, 0, 0, 0, 4, 518, 1, 0, 0, 0, 4, 520, 1, 0, 0, 0, 4, 522, 1, 0, 0, 0, 4, 524, 1, 0, 0, 0, 4, 526, 1, 0, 0, 0, 4, 528, 1, 0, 0, 0, 4, 530, 1, 0, 0, 0, 4, 532, 1, 0, 0, 0, 4, 534, 1, 0, 0, 0, 4, 536, 1, 0, 0, 0, 4, 538, 1, 0, 0, 0, 4, 540, 1, 0, 0, 0, 4, 542, 1, 0, 0, 0, 4, 544, 1, 0, 0, 0, 4, 546, 1, 0, 0, 0, 4, 548, 1, 0, 0, 0, 4, 550, 1, 0, 0, 0, 4, 552, 1, 0, 0, 0, 4, 554, 1, 0, 0, 0, 4, 556, 1, 0, 0, 0, 4, 558, 1, 0, 0, 0, 4, 560, 1, 0, 0, 0, 4, 562, 1, 0, 0, 0, 4, 564, 1, 0, 0, 0, 4, 566, 1, 0, 0, 0, 4, 568, 1, 0, 0, 0, 4, 570, 1, 0, 0, 0, 4, 572, 1, 0, 0, 0, 4, 574, 1, 0, 0, 0, 4, 576, 1, 0, 0, 0, 4, 578, 1, 0, 0, 0, 4, 580, 1, 0, 0, 0, 4, 582, 1, 0, 0, 0, 4, 584, 1, 0, 0, 0, 4, 586, 1, 0, 0, 0, 4, 588, 1, 0, 0, 0, 4, 590, 1, 0, 0, 0, 4, 592, 1, 0, 0, 0, 4, 594, 1, 0, 0, 0, 4, 596, 1, 0, 0, 0, 4, 598, 1, 0, 0, 0, 4, 600, 1, 0, 0, 0, 4, 602, 1, 0, 0, 0, 4, 604, 1, 0, 0, 0, 4, 606, 1, 0, 0, 0, 4, 608, 1, 0, 0, 0, 4, 610, 1, 0, 0, 0, 4, 612, 1, 0, 0, 0, 4, 614, 1, 0, 0, 0, 4, 616, 1, 0, 0, 0, 4, 618, 1, 0, 0, 0, 4, 620, 1, 0, 0, 0, 4, 622, 1, 0, 0, 0, 4, 624, 1, 0, 0, 0, 4, 626, 1, 0, 0, 0, 4, 628, 1, 0, 0, 0, 4, 630, 1, 0, 0, 0, 4, 632, 1, 0, 0, 0, 4, 634, 1, 0, 0, 0, 4, 636, 1, 0, 0, 0, 4, 638, 1, 0, 0, 0, 4, 640, 1, 0, 0, 0, 4, 642, 1, 0, 0, 0, 4, 644, 1, 0, 0, 0, 4, 646, 1, 0, 0, 0, 4, 648, 1, 0, 0, 0, 4, 650, 1, 0, 0, 0, 4, 652, 1, 0, 0, 0, 4, 654, 1, 0, 0, 0, 4, 656, 1, 0, 0, 0, 4, 658, 1, 0, 0, 0, 4, 660, 1, 0, 0, 0, 4, 662, 1, 0, 0, 0, 4, 664, 1, 0, 0, 0, 4, 666, 1, 0, 0, 0, 4, 668, 1, 0, 0, 0, 4, 670, 1, 0, 0, 0, 4, 672, 1, 0, 0, 0, 4, 674, 1, 0, 0, 0, 4, 676, 1, 0, 0, 0, 4, 678, 1, 0, 0, 0, 4, 680, 1, 0, 0, 0, 4, 682, 1, 0, 0, 0, 4, 684, 1, 0, 0, 0, 4, 686, 1, 0, 0, 0, 4, 688, 1, 0, 0, 0, 4, 690, 1, 0, 0, 0, 4, 692, 1, 0, 0, 0, 4, 694, 1, 0, 0, 0, 4, 696, 1, 0, 0, 0, 4, 698, 1, 0, 0, 0, 4, 700, 1, 0, 0, 0, 4, 702, 1, 0, 0, 0, 4, 704, 1, 0, 0, 0, 4, 706, 1, 0, 0, 0, 4, 708, 1, 0, 0, 0, 4, 710, 1, 0, 0, 0, 4, 712, 1, 0, 0, 0, 4, 714, 1, 0, 0, 0, 4, 716, 1, 0, 0, 0, 4, 718, 1, 0, 0, 0, 4, 720, 1, 0, 0, 0, 4, 722, 1, 0, 0, 0, 4, 724, 1, 0, 0, 0, 4, 726, 1, 0, 0, 0, 4, 728, 1, 0, 0, 0, 4, 730, 1, 0, 0, 0, 4, 732, 1, 0, 0, 0, 4, 734, 1, 0, 0, 0, 4, 736, 1, 0, 0, 0, 4, 738, 1, 0, 0, 0, 4, 740, 1, 0, 0, 0, 4, 742, 1, 0, 0, 0, 4, 744, 1, 0, 0, 0, 4, 746, 1, 0, 0, 0, 4, 748, 1, 0, 0, 0, 4, 750, 1, 0, 0, 0, 4, 752, 1, 0, 0, 0, 4, 754, 1, 0, 0, 0, 4, 756, 1, 0, 0, 0, 4, 758, 1, 0, 0, 0, 4, 760, 1, 0, 0, 0, 4, 762, 1, 0, 0, 0, 4, 764, 1, 0, 0, 0, 4, 766, 1, 0, 0, 0, 4, 768, 1, 0, 0, 0, 4, 770, 1, 0, 0, 0, 4, 772, 1, 0, 0, 0, 4, 774, 1, 0, 0, 0, 4, 776, 1, 0, 0, 0, 4, 778, 1, 0, 0, 0, 4, 780, 1, 0, 0, 0, 4, 782, 1, 0, 0, 0, 4, 784, 1, 0, 0, 0, 4, 786, 1, 0, 0, 0, 4, 788, 1, 0, 0, 0, 4, 790, 1, 0, 0, 0, 4, 792, 1, 0, 0, 0, 4, 794, 1, 0, 0, 0, 4, 796, 1, 0, 0, 0, 4, 798, 1, 0, 0, 0, 4, 800, 1, 0, 0, 0, 4, 802, 1, 0, 0, 0, 4, 804, 1, 0, 0, 0, 4, 806, 1, 0, 0, 0, 4, 808, 1, 0, 0, 0, 4, 810, 1, 0, 0, 0, 4, 812, 1, 0, 0, 0, 4, 814, 1, 0, 0, 0, 4, 816, 1, 0, 0, 0, 4, 818, 1, 0, 0, 0, 4, 820, 1, 0, 0, 0, 4, 822, 1, 0, 0, 0, 4, 824, 1, 0, 0, 0, 4, 826, 1, 0, 0, 0, 4, 828, 1, 0, 0, 0, 4, 830, 1, 0, 0, 0, 5, 832, 1, 0, 0, 0, 5, 834, 1, 0, 0, 0, 5, 836, 1, 0, 0, 0, 5, 838, 1, 0, 0, 0, 5, 840, 1, 0, 0, 0, 5, 842, 1, 0, 0, 0, 5, 844, 1, 0, 0, 0, 5, 846, 1, 0, 0, 0, 5, 848, 1, 0, 0, 0, 5, 850, 1, 0, 0, 0, 5, 852, 1, 0, 0, 0, 5, 854, 1, 0, 0, 0, 5, 856, 1, 0, 0, 0, 5, 858, 1, 0, 0, 0, 5, 860, 1, 0, 0, 0, 5, 862, 1, 0, 0, 0, 5, 864, 1, 0, 0, 0, 5, 866, 1, 0, 0, 0, 5, 868, 1, 0, 0, 0, 5, 870, 1, 0, 0, 0, 5, 872, 1, 0, 0, 0, 5, 874, 1, 0, 0, 0, 5, 876, 1, 0, 0, 0, 5, 878, 1, 0, 0, 0, 5, 880, 1, 0, 0, 0, 5, 882, 1, 0, 0, 0, 5, 884, 1, 0, 0, 0, 5, 886, 1, 0, 0, 0, 5, 888, 1, 0, 0, 0, 5, 890, 1, 0, 0, 0, 5, 892, 1, 0, 0, 0, 5, 894, 1, 0, 0, 0, 5, 896, 1, 0, 0, 0, 5, 898, 1, 0, 0, 0, 5, 900, 1, 0, 0, 0, 5, 902, 1, 0, 0, 0, 5, 904, 1, 0, 0, 0, 5, 906, 1, 0, 0, 0, 5, 908, 1, 0, 0, 0, 5, 910, 1, 0, 0, 0, 5, 912, 1, 0, 0, 0, 5, 914, 1, 0, 0, 0, 5, 916, 1, 0, 0, 0, 5, 918, 1, 0, 0, 0, 5, 920, 1, 0, 0, 0, 5, 922, 1, 0, 0, 0, 5, 924, 1, 0, 0, 0, 5, 926, 1, 0, 0, 0, 5, 928, 1, 0, 0, 0, 5, 930, 1, 0, 0, 0, 5, 932, 1, 0, 0, 0, 5, 934, 1, 0, 0, 0, 5, 936, 1, 0, 0, 0, 5, 938, 1, 0, 0, 0, 5, 940, 1, 0, 0, 0, 5, 942, 1, 0, 0, 0, 5, 944, 1, 0, 0, 0, 5, 946, 1, 0, 0, 0, 5, 948, 1, 0, 0, 0, 5, 950, 1, 0, 0, 0, 5, 952, 1, 0, 0, 0, 5, 954, 1, 0, 0, 0, 5, 956, 1, 0, 0, 0, 5, 958, 1, 0, 0, 0, 5, 960, 1, 0, 0, 0, 5, 962, 1, 0, 0, 0, 5, 964, 1, 0, 0, 0, 5, 966, 1, 0, 0, 0, 5, 968, 1, 0, 0, 0, 5, 970, 1, 0, 0, 0, 5, 972, 1, 0, 0, 0, 5, 974, 1, 0, 0, 0, 5, 976, 1, 0, 0, 0, 5, 978, 1, 0, 0, 0, 5, 980, 1, 0, 0, 0, 5, 982, 1, 0, 0, 0, 5, 984, 1, 0, 0, 0, 5, 986, 1, 0, 0, 0, 5, 988, 1, 0, 0, 0, 5, 990, 1, 0, 0, 0, 5, 992, 1, 0, 0, 0, 5, 994, 1, 0, 0, 0, 5, 996, 1, 0, 0, 0, 5, 998, 1, 0, 0, 0, 5, 1000, 1, 0, 0, 0, 5, 1002, 1, 0, 0, 0, 5, 1004, 1, 0, 0, 0, 5, 1006, 1, 0, 0, 0, 5, 1008, 1, 0, 0, 0, 5, 1010, 1, 0, 0, 0, 5, 1012, 1, 0, 0, 0, 5, 1014, 1, 0, 0, 0, 5, 1016, 1, 0, 0, 0, 5, 1018, 1, 0, 0, 0, 5, 1020, 1, 0, 0, 0, 5, 1022, 1, 0, 0, 0, 5, 1024, 1, 0, 0, 0, 5, 1026, 1, 0, 0, 0, 5, 1028, 1, 0, 0, 0, 5, 1030, 1, 0, 0, 0, 5, 1032, 1, 0, 0, 0, 5, 1034, 1, 0, 0, 0, 5, 1036, 1, 0, 0, 0, 5, 1038, 1, 0, 0, 0, 5, 1040, 1, 0, 0, 0, 5, 1042, 1, 0, 0, 0, 5, 1044, 1, 0, 0, 0, 5, 1046, 1, 0, 0, 0, 5, 1048, 1, 0, 0, 0, 5, 1050, 1, 0, 0, 0, 5, 1052, 1, 0, 0, 0, 5, 1054, 1, 0, 0, 0, 5, 1056, 1, 0, 0, 0, 5, 1058, 1, 0, 0, 0, 5, 1060, 1, 0, 0, 0, 5, 1062, 1, 0, 0, 0, 5, 1064, 1, 0, 0, 0, 5, 1066, 1, 0, 0, 0, 5, 1068, 1, 0, 0, 0, 5, 1070, 1, 0, 0, 0, 5, 1072, 1, 0, 0, 0, 5, 1074, 1, 0, 0, 0, 5, 1076, 1, 0, 0, 0, 5, 1078, 1, 0, 0, 0, 5, 1080, 1, 0, 0, 0, 5, 1082, 1, 0, 0, 0, 5, 1084, 1, 0, 0, 0, 5, 1086, 1, 0, 0, 0, 5, 1088, 1, 0, 0, 0, 5, 1090, 1, 0, 0, 0, 5, 1092, 1, 0, 0, 0, 5, 1094, 1, 0, 0, 0, 5, 1096, 1, 0, 0, 0, 5, 1098, 1, 0, 0, 0, 5, 1100, 1, 0, 0, 0, 5, 1102, 1, 0, 0, 0, 5, 1104, 1, 0, 0, 0, 5, 1106, 1, 0, 0, 0, 5, 1108, 1, 0, 0, 0, 5, 1110, 1, 0, 0, 0, 5, 1112, 1, 0, 0, 0, 5, 1114, 1, 0, 0, 0, 5, 1116, 1, 0, 0, 0, 5, 1118, 1, 0, 0, 0, 5, 1120, 1, 0, 0, 0, 5, 1122, 1, 0, 0, 0, 5, 1124, 1, 0, 0, 0, 5, 1126, 1, 0, 0, 0, 5, 1128, 1, 0, 0, 0, 5, 1130, 1, 0, 0, 0, 5, 1132, 1, 0, 0, 0, 5, 1134, 1, 0, 0, 0, 5, 1136, 1, 0, 0, 0, 5, 1138, 1, 0, 0, 0, 5, 1140, 1, 0, 0, 0, 5, 1142, 1, 0, 0, 0, 5, 1144, 1, 0, 0, 0, 5, 1146, 1, 0, 0, 0, 5, 1148, 1, 0, 0, 0, 5, 1150, 1, 0, 0, 0, 5, 1152, 1, 0, 0, 0, 5, 1154, 1, 0, 0, 0, 5, 1156, 1, 0, 0, 0, 5, 1158, 1, 0, 0, 0, 5, 1160, 1, 0, 0, 0, 5, 1162, 1, 0, 0, 0, 5, 1164, 1, 0, 0, 0, 5, 1166, 1, 0, 0, 0, 5, 1168, 1, 0, 0, 0, 5, 1170, 1, 0, 0, 0, 5, 1172, 1, 0, 0, 0, 5, 1174, 1, 0, 0, 0, 5, 1176, 1, 0, 0, 0, 5, 1178, 1, 0, 0, 0, 5, 1180, 1, 0, 0, 0, 5, 1182, 1, 0, 0, 0, 5, 1184, 1, 0, 0, 0, 5, 1186, 1, 0, 0, 0, 5, 1188, 1, 0, 0, 0, 5, 1190, 1, 0, 0, 0, 5, 1192, 1, 0, 0, 0, 5, 1194, 1, 0, 0, 0, 5, 1196, 1, 0, 0, 0, 5, 1198, 1, 0, 0, 0, 5, 1200, 1, 0, 0, 0, 5, 1202, 1, 0, 0, 0, 5, 1204, 1, 0, 0, 0, 5, 1206, 1, 0, 0, 0, 5, 1208, 1, 0, 0, 0, 5, 1210, 1, 0, 0, 0, 5, 1212, 1, 0, 0, 0, 5, 1214, 1, 0, 0, 0, 5, 1216, 1, 0, 0, 0, 5, 1218, 1, 0, 0, 0, 6, 1220, 1, 0, 0, 0, 8, 1232, 1, 0, 0, 0, 10, 1246, 1, 0, 0, 0, 12, 1376, 1, 0, 0, 0, 14, 1379, 1, 0, 0, 0, 16, 1383, 1, 0, 0, 0, 18, 1422, 1, 0, 0, 0, 20, 1424, 1, 0, 0, 0, 22, 1428, 1, 0, 0, 0, 24, 1432, 1, 0, 0, 0, 26, 1449, 1, 0, 0, 0, 28, 1467, 1, 0, 0, 0, 30, 1483, 1, 0, 0, 0, 32, 1503, 1, 0, 0, 0, 34, 1528, 1, 0, 0, 0, 36, 1534, 1, 0, 0, 0, 38, 1536, 1, 0, 0, 0, 40, 1539, 1, 0, 0, 0, 42, 1541, 1, 0, 0, 0, 44, 1543, 1, 0, 0, 0, 46, 1545, 1, 0, 0, 0, 48, 1547, 1, 0, 0, 0, 50, 1549, 1, 0, 0, 0, 52, 1551, 1, 0, 0, 0, 54, 1553, 1, 0, 0, 0, 56, 1555, 1, 0, 0, 0, 58, 1557, 1, 0, 0, 0, 60, 1559, 1, 0, 0, 0, 62, 1561, 1, 0, 0, 0, 64, 1564, 1, 0, 0, 0, 66, 1566, 1, 0, 0, 0, 68, 1569, 1, 0, 0, 0, 70, 1571, 1, 0, 0, 0, 72, 1573, 1, 0, 0, 0, 74, 1576, 1, 0, 0, 0, 76, 1578, 1, 0, 0, 0, 78, 1580, 1, 0, 0, 0, 80, 1582, 1, 0, 0, 0, 82, 1584, 1, 0, 0, 0, 84, 1586, 1, 0, 0, 0, 86, 1588, 1, 0, 0, 0, 88, 1590, 1, 0, 0, 0, 90, 1592, 1, 0, 0, 0, 92, 1594, 1, 0, 0, 0, 94, 1596, 1, 0, 0, 0, 96, 1598, 1, 0, 0, 0, 98, 1601, 1, 0, 0, 0, 100, 1603, 1, 0, 0, 0, 102, 1606, 1, 0, 0, 0, 104, 1608, 1, 0, 0, 0, 106, 1617, 1, 0, 0, 0, 108, 1626, 1, 0, 0, 0, 110, 1643, 1, 0, 0, 0, 112, 1647, 1, 0, 0, 0, 114, 1653, 1, 0, 0, 0, 116, 1656, 1, 0, 0, 0, 118, 1666, 1, 0, 0, 0, 120, 1669, 1, 0, 0, 0, 122, 1679, 1, 0, 0, 0, 124, 1688, 1, 0, 0, 0, 126, 1703, 1, 0, 0, 0, 128, 1710, 1, 0, 0, 0, 130, 1713, 1, 0, 0, 0, 132, 1718, 1, 0, 0, 0, 134, 1723, 1, 0, 0, 0, 136, 1732, 1, 0, 0, 0, 138, 1738, 1, 0, 0, 0, 140, 1744, 1, 0, 0, 0, 142, 1754, 1, 0, 0, 0, 144, 1762, 1, 0, 0, 0, 146, 1775, 1, 0, 0, 0, 148, 1783, 1, 0, 0, 0, 150, 1799, 1, 0, 0, 0, 152, 1805, 1, 0, 0, 0, 154, 1813, 1, 0, 0, 0, 156, 1821, 1, 0, 0, 0, 158, 1832, 1, 0, 0, 0, 160, 1851, 1, 0, 0, 0, 162, 1862, 1, 0, 0, 0, 164, 1877, 1, 0, 0, 0, 166, 1881, 1, 0, 0, 0, 168, 1890, 1, 0, 0, 0, 170, 1904, 1, 0, 0, 0, 172, 1912, 1, 0, 0, 0, 174, 1917, 1, 0, 0, 0, 176, 1923, 1, 0, 0, 0, 178, 1938, 1, 0, 0, 0, 180, 1947, 1, 0, 0, 0, 182, 1951, 1, 0, 0, 0, 184, 1954, 1, 0, 0, 0, 186, 1960, 1, 0, 0, 0, 188, 1967, 1, 0, 0, 0, 190, 1976, 1, 0, 0, 0, 192, 1986, 1, 0, 0, 0, 194, 2004, 1, 0, 0, 0, 196, 2008, 1, 0, 0, 0, 198, 2017, 1, 0, 0, 0, 200, 2020, 1, 0, 0, 0, 202, 2029, 1, 0, 0, 0, 204, 2035, 1, 0, 0, 0, 206, 2038, 1, 0, 0, 0, 208, 2043, 1, 0, 0, 0, 210, 2046, 1, 0, 0, 0, 212, 2053, 1, 0, 0, 0, 214, 2056, 1, 0, 0, 0, 216, 2064, 1, 0, 0, 0, 218, 2073, 1, 0, 0, 0, 220, 2083, 1, 0, 0, 0, 222, 2086, 1, 0, 0, 0, 224, 2091, 1, 0, 0, 0, 226, 2095, 1, 0, 0, 0, 228, 2098, 1, 0, 0, 0, 230, 2104, 1, 0, 0, 0, 232, 2108, 1, 0, 0, 0, 234, 2111, 1, 0, 0, 0, 236, 2115, 1, 0, 0, 0, 238, 2119, 1, 0, 0, 0, 240, 2126, 1, 0, 0, 0, 242, 2136, 1, 0, 0, 0, 244, 2139, 1, 0, 0, 0, 246, 2144, 1, 0, 0, 0, 248, 2159, 1, 0, 0, 0, 250, 2170, 1, 0, 0, 0, 252, 2182, 1, 0, 0, 0, 254, 2187, 1, 0, 0, 0, 256, 2190, 1, 0, 0, 0, 258, 2195, 1, 0, 0, 0, 260, 2202, 1, 0, 0, 0, 262, 2205, 1, 0, 0, 0, 264, 2211, 1, 0, 0, 0, 266, 2219, 1, 0, 0, 0, 268, 2228, 1, 0, 0, 0, 270, 2235, 1, 0, 0, 0, 272, 2245, 1, 0, 0, 0, 274, 2263, 1, 0, 0, 0, 276, 2272, 1, 0, 0, 0, 278, 2281, 1, 0, 0, 0, 280, 2304, 1, 0, 0, 0, 282, 2311, 1, 0, 0, 0, 284, 2321, 1, 0, 0, 0, 286, 2328, 1, 0, 0, 0, 288, 2345, 1, 0, 0, 0, 290, 2360, 1, 0, 0, 0, 292, 2365, 1, 0, 0, 0, 294, 2373, 1, 0, 0, 0, 296, 2378, 1, 0, 0, 0, 298, 2385, 1, 0, 0, 0, 300, 2391, 1, 0, 0, 0, 302, 2398, 1, 0, 0, 0, 304, 2404, 1, 0, 0, 0, 306, 2411, 1, 0, 0, 0, 308, 2416, 1, 0, 0, 0, 310, 2421, 1, 0, 0, 0, 312, 2424, 1, 0, 0, 0, 314, 2430, 1, 0, 0, 0, 316, 2434, 1, 0, 0, 0, 318, 2443, 1, 0, 0, 0, 320, 2448, 1, 0, 0, 0, 322, 2459, 1, 0, 0, 0, 324, 2465, 1, 0, 0, 0, 326, 2475, 1, 0, 0, 0, 328, 2482, 1, 0, 0, 0, 330, 2491, 1, 0, 0, 0, 332, 2500, 1, 0, 0, 0, 334, 2508, 1, 0, 0, 0, 336, 2513, 1, 0, 0, 0, 338, 2519, 1, 0, 0, 0, 340, 2526, 1, 0, 0, 0, 342, 2533, 1, 0, 0, 0, 344, 2544, 1, 0, 0, 0, 346, 2557, 1, 0, 0, 0, 348, 2567, 1, 0, 0, 0, 350, 2579, 1, 0, 0, 0, 352, 2591, 1, 0, 0, 0, 354, 2599, 1, 0, 0, 0, 356, 2604, 1, 0, 0, 0, 358, 2610, 1, 0, 0, 0, 360, 2617, 1, 0, 0, 0, 362, 2622, 1, 0, 0, 0, 364, 2629, 1, 0, 0, 0, 366, 2636, 1, 0, 0, 0, 368, 2649, 1, 0, 0, 0, 370, 2653, 1, 0, 0, 0, 372, 2657, 1, 0, 0, 0, 374, 2661, 1, 0, 0, 0, 376, 2669, 1, 0, 0, 0, 378, 2673, 1, 0, 0, 0, 380, 2675, 1, 0, 0, 0, 382, 2680, 1, 0, 0, 0, 384, 2686, 1, 0, 0, 0, 386, 2700, 1, 0, 0, 0, 388, 2729, 1, 0, 0, 0, 390, 2731, 1, 0, 0, 0, 392, 2737, 1, 0, 0, 0, 394, 2742, 1, 0, 0, 0, 396, 2744, 1, 0, 0, 0, 398, 2746, 1, 0, 0, 0, 400, 2750, 1, 0, 0, 0, 402, 2754, 1, 0, 0, 0, 404, 2758, 1, 0, 0, 0, 406, 2763, 1, 0, 0, 0, 408, 2769, 1, 0, 0, 0, 410, 2774, 1, 0, 0, 0, 412, 2779, 1, 0, 0, 0, 414, 2784, 1, 0, 0, 0, 416, 2789, 1, 0, 0, 0, 418, 2794, 1, 0, 0, 0, 420, 2798, 1, 0, 0, 0, 422, 2839, 1, 0, 0, 0, 424, 2843, 1, 0, 0, 0, 426, 2847, 1, 0, 0, 0, 428, 2852, 1, 0, 0, 0, 430, 2857, 1, 0, 0, 0, 432, 2862, 1, 0, 0, 0, 434, 2867, 1, 0, 0, 0, 436, 2872, 1, 0, 0, 0, 438, 2876, 1, 0, 0, 0, 440, 2917, 1, 0, 0, 0, 442, 2921, 1, 0, 0, 0, 444, 2925, 1, 0, 0, 0, 446, 2939, 1, 0, 0, 0, 448, 2955, 1, 0, 0, 0, 450, 3087, 1, 0, 0, 0, 452, 3091, 1, 0, 0, 0, 454, 3132, 1, 0, 0, 0, 456, 3136, 1, 0, 0, 0, 458, 3141, 1, 0, 0, 0, 460, 3146, 1, 0, 0, 0, 462, 3152, 1, 0, 0, 0, 464, 3171, 1, 0, 0, 0, 466, 3191, 1, 0, 0, 0, 468, 3209, 1, 0, 0, 0, 470, 3231, 1, 0, 0, 0, 472, 3258, 1, 0, 0, 0, 474, 3265, 1, 0, 0, 0, 476, 3269, 1, 0, 0, 0, 478, 3274, 1, 0, 0, 0, 480, 3278, 1, 0, 0, 0, 482, 3282, 1, 0, 0, 0, 484, 3286, 1, 0, 0, 0, 486, 3290, 1, 0, 0, 0, 488, 3295, 1, 0, 0, 0, 490, 3301, 1, 0, 0, 0, 492, 3307, 1, 0, 0, 0, 494, 3311, 1, 0, 0, 0, 496, 3315, 1, 0, 0, 0, 498, 3319, 1, 0, 0, 0, 500, 3323, 1, 0, 0, 0, 502, 3327, 1, 0, 0, 0, 504, 3332, 1, 0, 0, 0, 506, 3336, 1, 0, 0, 0, 508, 3341, 1, 0, 0, 0, 510, 3345, 1, 0, 0, 0, 512, 3349, 1, 0, 0, 0, 514, 3354, 1, 0, 0, 0, 516, 3358, 1, 0, 0, 0, 518, 3362, 1, 0, 0, 0, 520, 3366, 1, 0, 0, 0, 522, 3370, 1, 0, 0, 0, 524, 3374, 1, 0, 0, 0, 526, 3378, 1, 0, 0, 0, 528, 3382, 1, 0, 0, 0, 530, 3386, 1, 0, 0, 0, 532, 3390, 1, 0, 0, 0, 534, 3394, 1, 0, 0, 0, 536, 3398, 1, 0, 0, 0, 538, 3403, 1, 0, 0, 0, 540, 3407, 1, 0, 0, 0, 542, 3412, 1, 0, 0, 0, 544, 3416, 1, 0, 0, 0, 546, 3427, 1, 0, 0, 0, 548, 3438, 1, 0, 0, 0, 550, 3457, 1, 0, 0, 0, 552, 3463, 1, 0, 0, 0, 554, 3471, 1, 0, 0, 0, 556, 3476, 1, 0, 0, 0, 558, 3488, 1, 0, 0, 0, 560, 3493, 1, 0, 0, 0, 562, 3505, 1, 0, 0, 0, 564, 3516, 1, 0, 0, 0, 566, 3533, 1, 0, 0, 0, 568, 3542, 1, 0, 0, 0, 570, 3547, 1, 0, 0, 0, 572, 3554, 1, 0, 0, 0, 574, 3561, 1, 0, 0, 0, 576, 3572, 1, 0, 0, 0, 578, 3580, 1, 0, 0, 0, 580, 3588, 1, 0, 0, 0, 582, 3600, 1, 0, 0, 0, 584, 3610, 1, 0, 0, 0, 586, 3625, 1, 0, 0, 0, 588, 3635, 1, 0, 0, 0, 590, 3653, 1, 0, 0, 0, 592, 3661, 1, 0, 0, 0, 594, 3671, 1, 0, 0, 0, 596, 3681, 1, 0, 0, 0, 598, 3694, 1, 0, 0, 0, 600, 3715, 1, 0, 0, 0, 602, 3728, 1, 0, 0, 0, 604, 3745, 1, 0, 0, 0, 606, 3751, 1, 0, 0, 0, 608, 3762, 1, 0, 0, 0, 610, 3778, 1, 0, 0, 0, 612, 3788, 1, 0, 0, 0, 614, 3795, 1, 0, 0, 0, 616, 3803, 1, 0, 0, 0, 618, 3820, 1, 0, 0, 0, 620, 3831, 1, 0, 0, 0, 622, 3837, 1, 0, 0, 0, 624, 3842, 1, 0, 0, 0, 626, 3850, 1, 0, 0, 0, 628, 3859, 1, 0, 0, 0, 630, 3870, 1, 0, 0, 0, 632, 3882, 1, 0, 0, 0, 634, 3902, 1, 0, 0, 0, 636, 3908, 1, 0, 0, 0, 638, 3919, 1, 0, 0, 0, 640, 3924, 1, 0, 0, 0, 642, 3935, 1, 0, 0, 0, 644, 3943, 1, 0, 0, 0, 646, 3948, 1, 0, 0, 0, 648, 3955, 1, 0, 0, 0, 650, 3960, 1, 0, 0, 0, 652, 3969, 1, 0, 0, 0, 654, 3974, 1, 0, 0, 0, 656, 3984, 1, 0, 0, 0, 658, 3995, 1, 0, 0, 0, 660, 4007, 1, 0, 0, 0, 662, 4012, 1, 0, 0, 0, 664, 4019, 1, 0, 0, 0, 666, 4025, 1, 0, 0, 0, 668, 4030, 1, 0, 0, 0, 670, 4038, 1, 0, 0, 0, 672, 4044, 1, 0, 0, 0, 674, 4049, 1, 0, 0, 0, 676, 4055, 1, 0, 0, 0, 678, 4061, 1, 0, 0, 0, 680, 4070, 1, 0, 0, 0, 682, 4082, 1, 0, 0, 0, 684, 4087, 1, 0, 0, 0, 686, 4094, 1, 0, 0, 0, 688, 4111, 1, 0, 0, 0, 690, 4124, 1, 0, 0, 0, 692, 4138, 1, 0, 0, 0, 694, 4145, 1, 0, 0, 0, 696, 4150, 1, 0, 0, 0, 698, 4157, 1, 0, 0, 0, 700, 4166, 1, 0, 0, 0, 702, 4171, 1, 0, 0, 0, 704, 4179, 1, 0, 0, 0, 706, 4189, 1, 0, 0, 0, 708, 4200, 1, 0, 0, 0, 710, 4209, 1, 0, 0, 0, 712, 4221, 1, 0, 0, 0, 714, 4241, 1, 0, 0, 0, 716, 4252, 1, 0, 0, 0, 718, 4263, 1, 0, 0, 0, 720, 4288, 1, 0, 0, 0, 722, 4297, 1, 0, 0, 0, 724, 4309, 1, 0, 0, 0, 726, 4318, 1, 0, 0, 0, 728, 4337, 1, 0, 0, 0, 730, 4354, 1, 0, 0, 0, 732, 4361, 1, 0, 0, 0, 734, 4371, 1, 0, 0, 0, 736, 4378, 1, 0, 0, 0, 738, 4387, 1, 0, 0, 0, 740, 4395, 1, 0, 0, 0, 742, 4404, 1, 0, 0, 0, 744, 4412, 1, 0, 0, 0, 746, 4421, 1, 0, 0, 0, 748, 4428, 1, 0, 0, 0, 750, 4435, 1, 0, 0, 0, 752, 4440, 1, 0, 0, 0, 754, 4448, 1, 0, 0, 0, 756, 4454, 1, 0, 0, 0, 758, 4465, 1, 0, 0, 0, 760, 4472, 1, 0, 0, 0, 762, 4485, 1, 0, 0, 0, 764, 4493, 1, 0, 0, 0, 766, 4505, 1, 0, 0, 0, 768, 4514, 1, 0, 0, 0, 770, 4525, 1, 0, 0, 0, 772, 4536, 1, 0, 0, 0, 774, 4546, 1, 0, 0, 0, 776, 4553, 1, 0, 0, 0, 778, 4561, 1, 0, 0, 0, 780, 4570, 1, 0, 0, 0, 782, 4579, 1, 0, 0, 0, 784, 4592, 1, 0, 0, 0, 786, 4607, 1, 0, 0, 0, 788, 4619, 1, 0, 0, 0, 790, 4633, 1, 0, 0, 0, 792, 4647, 1, 0, 0, 0, 794, 4657, 1, 0, 0, 0, 796, 4664, 1, 0, 0, 0, 798, 4672, 1, 0, 0, 0, 800, 4681, 1, 0, 0, 0, 802, 4688, 1, 0, 0, 0, 804, 4697, 1, 0, 0, 0, 806, 4706, 1, 0, 0, 0, 808, 4721, 1, 0, 0, 0, 810, 4727, 1, 0, 0, 0, 812, 4733, 1, 0, 0, 0, 814, 4739, 1, 0, 0, 0, 816, 4748, 1, 0, 0, 0, 818, 4755, 1, 0, 0, 0, 820, 4763, 1, 0, 0, 0, 822, 4779, 1, 0, 0, 0, 824, 4809, 1, 0, 0, 0, 826, 4813, 1, 0, 0, 0, 828, 4820, 1, 0, 0, 0, 830, 4826, 1, 0, 0, 0, 832, 4830, 1, 0, 0, 0, 834, 4844, 1, 0, 0, 0, 836, 4860, 1, 0, 0, 0, 838, 4992, 1, 0, 0, 0, 840, 4996, 1, 0, 0, 0, 842, 5037, 1, 0, 0, 0, 844, 5041, 1, 0, 0, 0, 846, 5046, 1, 0, 0, 0, 848, 5051, 1, 0, 0, 0, 850, 5057, 1, 0, 0, 0, 852, 5076, 1, 0, 0, 0, 854, 5096, 1, 0, 0, 0, 856, 5114, 1, 0, 0, 0, 858, 5136, 1, 0, 0, 0, 860, 5163, 1, 0, 0, 0, 862, 5170, 1, 0, 0, 0, 864, 5174, 1, 0, 0, 0, 866, 5179, 1, 0, 0, 0, 868, 5183, 1, 0, 0, 0, 870, 5187, 1, 0, 0, 0, 872, 5191, 1, 0, 0, 0, 874, 5195, 1, 0, 0, 0, 876, 5200, 1, 0, 0, 0, 878, 5206, 1, 0, 0, 0, 880, 5212, 1, 0, 0, 0, 882, 5216, 1, 0, 0, 0, 884, 5220, 1, 0, 0, 0, 886, 5224, 1, 0, 0, 0, 888, 5228, 1, 0, 0, 0, 890, 5232, 1, 0, 0, 0, 892, 5237, 1, 0, 0, 0, 894, 5241, 1, 0, 0, 0, 896, 5246, 1, 0, 0, 0, 898, 5250, 1, 0, 0, 0, 900, 5254, 1, 0, 0, 0, 902, 5259, 1, 0, 0, 0, 904, 5263, 1, 0, 0, 0, 906, 5267, 1, 0, 0, 0, 908, 5271, 1, 0, 0, 0, 910, 5275, 1, 0, 0, 0, 912, 5279, 1, 0, 0, 0, 914, 5283, 1, 0, 0, 0, 916, 5287, 1, 0, 0, 0, 918, 5291, 1, 0, 0, 0, 920, 5295, 1, 0, 0, 0, 922, 5299, 1, 0, 0, 0, 924, 5303, 1, 0, 0, 0, 926, 5308, 1, 0, 0, 0, 928, 5312, 1, 0, 0, 0, 930, 5317, 1, 0, 0, 0, 932, 5321, 1, 0, 0, 0, 934, 5332, 1, 0, 0, 0, 936, 5343, 1, 0, 0, 0, 938, 5362, 1, 0, 0, 0, 940, 5368, 1, 0, 0, 0, 942, 5376, 1, 0, 0, 0, 944, 5381, 1, 0, 0, 0, 946, 5393, 1, 0, 0, 0, 948, 5398, 1, 0, 0, 0, 950, 5410, 1, 0, 0, 0, 952, 5421, 1, 0, 0, 0, 954, 5438, 1, 0, 0, 0, 956, 5447, 1, 0, 0, 0, 958, 5452, 1, 0, 0, 0, 960, 5459, 1, 0, 0, 0, 962, 5466, 1, 0, 0, 0, 964, 5477, 1, 0, 0, 0, 966, 5485, 1, 0, 0, 0, 968, 5493, 1, 0, 0, 0, 970, 5505, 1, 0, 0, 0, 972, 5515, 1, 0, 0, 0, 974, 5530, 1, 0, 0, 0, 976, 5540, 1, 0, 0, 0, 978, 5558, 1, 0, 0, 0, 980, 5566, 1, 0, 0, 0, 982, 5576, 1, 0, 0, 0, 984, 5586, 1, 0, 0, 0, 986, 5599, 1, 0, 0, 0, 988, 5620, 1, 0, 0, 0, 990, 5633, 1, 0, 0, 0, 992, 5650, 1, 0, 0, 0, 994, 5656, 1, 0, 0, 0, 996, 5667, 1, 0, 0, 0, 998, 5683, 1, 0, 0, 0, 1000, 5693, 1, 0, 0, 0, 1002, 5700, 1, 0, 0, 0, 1004, 5708, 1, 0, 0, 0, 1006, 5725, 1, 0, 0, 0, 1008, 5736, 1, 0, 0, 0, 1010, 5742, 1, 0, 0, 0, 1012, 5747, 1, 0, 0, 0, 1014, 5755, 1, 0, 0, 0, 1016, 5764, 1, 0, 0, 0, 1018, 5775, 1, 0, 0, 0, 1020, 5787, 1, 0, 0, 0, 1022, 5807, 1, 0, 0, 0, 1024, 5813, 1, 0, 0, 0, 1026, 5824, 1, 0, 0, 0, 1028, 5829, 1, 0, 0, 0, 1030, 5840, 1, 0, 0, 0, 1032, 5848, 1, 0, 0, 0, 1034, 5853, 1, 0, 0, 0, 1036, 5860, 1, 0, 0, 0, 1038, 5865, 1, 0, 0, 0, 1040, 5874, 1, 0, 0, 0, 1042, 5879, 1, 0, 0, 0, 1044, 5889, 1, 0, 0, 0, 1046, 5900, 1, 0, 0, 0, 1048, 5912, 1, 0, 0, 0, 1050, 5917, 1, 0, 0, 0, 1052, 5924, 1, 0, 0, 0, 1054, 5930, 1, 0, 0, 0, 1056, 5935, 1, 0, 0, 0, 1058, 5943, 1, 0, 0, 0, 1060, 5949, 1, 0, 0, 0, 1062, 5954, 1, 0, 0, 0, 1064, 5960, 1, 0, 0, 0, 1066, 5966, 1, 0, 0, 0, 1068, 5975, 1, 0, 0, 0, 1070, 5987, 1, 0, 0, 0, 1072, 5992, 1, 0, 0, 0, 1074, 5999, 1, 0, 0, 0, 1076, 6016, 1, 0, 0, 0, 1078, 6029, 1, 0, 0, 0, 1080, 6043, 1, 0, 0, 0, 1082, 6050, 1, 0, 0, 0, 1084, 6055, 1, 0, 0, 0, 1086, 6062, 1, 0, 0, 0, 1088, 6071, 1, 0, 0, 0, 1090, 6076, 1, 0, 0, 0, 1092, 6084, 1, 0, 0, 0, 1094, 6094, 1, 0, 0, 0, 1096, 6105, 1, 0, 0, 0, 1098, 6114, 1, 0, 0, 0, 1100, 6126, 1, 0, 0, 0, 1102, 6146, 1, 0, 0, 0, 1104, 6157, 1, 0, 0, 0, 1106, 6168, 1, 0, 0, 0, 1108, 6193, 1, 0, 0, 0, 1110, 6202, 1, 0, 0, 0, 1112, 6214, 1, 0, 0, 0, 1114, 6223, 1, 0, 0, 0, 1116, 6242, 1, 0, 0, 0, 1118, 6259, 1, 0, 0, 0, 1120, 6266, 1, 0, 0, 0, 1122, 6276, 1, 0, 0, 0, 1124, 6283, 1, 0, 0, 0, 1126, 6292, 1, 0, 0, 0, 1128, 6300, 1, 0, 0, 0, 1130, 6309, 1, 0, 0, 0, 1132, 6317, 1, 0, 0, 0, 1134, 6326, 1, 0, 0, 0, 1136, 6333, 1, 0, 0, 0, 1138, 6340, 1, 0, 0, 0, 1140, 6345, 1, 0, 0, 0, 1142, 6353, 1, 0, 0, 0, 1144, 6359, 1, 0, 0, 0, 1146, 6370, 1, 0, 0, 0, 1148, 6377, 1, 0, 0, 0, 1150, 6390, 1, 0, 0, 0, 1152, 6398, 1, 0, 0, 0, 1154, 6410, 1, 0, 0, 0, 1156, 6419, 1, 0, 0, 0, 1158, 6430, 1, 0, 0, 0, 1160, 6441, 1, 0, 0, 0, 1162, 6451, 1, 0, 0, 0, 1164, 6458, 1, 0, 0, 0, 1166, 6466, 1, 0, 0, 0, 1168, 6475, 1, 0, 0, 0, 1170, 6484, 1, 0, 0, 0, 1172, 6497, 1, 0, 0, 0, 1174, 6512, 1, 0, 0, 0, 1176, 6524, 1, 0, 0, 0, 1178, 6538, 1, 0, 0, 0, 1180, 6552, 1, 0, 0, 0, 1182, 6562, 1, 0, 0, 0, 1184, 6569, 1, 0, 0, 0, 1186, 6577, 1, 0, 0, 0, 1188, 6586, 1, 0, 0, 0, 1190, 6593, 1, 0, 0, 0, 1192, 6602, 1, 0, 0, 0, 1194, 6611, 1, 0, 0, 0, 1196, 6626, 1, 0, 0, 0, 1198, 6632, 1, 0, 0, 0, 1200, 6638, 1, 0, 0, 0, 1202, 6644, 1, 0, 0, 0, 1204, 6653, 1, 0, 0, 0, 1206, 6660, 1, 0, 0, 0, 1208, 6668, 1, 0, 0, 0, 1210, 6684, 1, 0, 0, 0, 1212, 6714, 1, 0, 0, 0, 1214, 6718, 1, 0, 0, 0, 1216, 6725, 1, 0, 0, 0, 1218, 6731, 1, 0, 0, 0, 1220, 1221, 3, 14, 4, 0, 1221, 7, 1, 0, 0, 0, 1222, 1223, 5, 46, 0, 0, 1223, 1233, 3, 14, 4, 0, 1224, 1225, 3, 14, 4, 0, 1225, 1229, 5, 46, 0, 0, 1226, 1228, 7, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1233, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1222, 1, 0, 0, 0, 1232, 1224, 1, 0, 0, 0, 1233, 9, 1, 0, 0, 0, 1234, 1235, 5, 46, 0, 0, 1235, 1247, 3, 14, 4, 0, 1236, 1244, 3, 14, 4, 0, 1237, 1241, 5, 46, 0, 0, 1238, 1240, 7, 0, 0, 0, 1239, 1238, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1237, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1234, 1, 0, 0, 0, 1246, 1236, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 7, 1, 0, 0, 1249, 1251, 7, 2, 0, 0, 1250, 1249, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 3, 14, 4, 0, 1253, 11, 1, 0, 0, 0, 1254, 1255, 5, 100, 0, 0, 1255, 1256, 5, 101, 0, 0, 1256, 1257, 5, 99, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 97, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 45, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 101, 0, 0, 1264, 1265, 5, 112, 0, 0, 1265, 1266, 5, 97, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 97, 0, 0, 1268, 1269, 5, 116, 0, 0, 1269, 1270, 5, 111, 0, 0, 1270, 1377, 5, 114, 0, 0, 1271, 1272, 5, 103, 0, 0, 1272, 1273, 5, 114, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 117, 0, 0, 1275, 1276, 5, 112, 0, 0, 1276, 1277, 5, 105, 0, 0, 1277, 1278, 5, 110, 0, 0, 1278, 1279, 5, 103, 0, 0, 1279, 1280, 5, 45, 0, 0, 1280, 1281, 5, 115, 0, 0, 1281, 1282, 5, 101, 0, 0, 1282, 1283, 5, 112, 0, 0, 1283, 1284, 5, 97, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 97, 0, 0, 1286, 1287, 5, 116, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1377, 5, 114, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 102, 0, 0, 1292, 1293, 5, 105, 0, 0, 1293, 1294, 5, 110, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 116, 0, 0, 1296, 1377, 5, 121, 0, 0, 1297, 1298, 5, 109, 0, 0, 1298, 1299, 5, 105, 0, 0, 1299, 1300, 5, 110, 0, 0, 1300, 1301, 5, 117, 0, 0, 1301, 1302, 5, 115, 0, 0, 1302, 1303, 5, 45, 0, 0, 1303, 1304, 5, 115, 0, 0, 1304, 1305, 5, 105, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 1377, 5, 110, 0, 0, 1307, 1308, 5, 78, 0, 0, 1308, 1309, 5, 97, 0, 0, 1309, 1377, 5, 78, 0, 0, 1310, 1311, 5, 112, 0, 0, 1311, 1312, 5, 101, 0, 0, 1312, 1313, 5, 114, 0, 0, 1313, 1314, 5, 99, 0, 0, 1314, 1315, 5, 101, 0, 0, 1315, 1316, 5, 110, 0, 0, 1316, 1377, 5, 116, 0, 0, 1317, 1318, 5, 112, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 114, 0, 0, 1320, 1321, 5, 45, 0, 0, 1321, 1322, 5, 109, 0, 0, 1322, 1323, 5, 105, 0, 0, 1323, 1324, 5, 108, 0, 0, 1324, 1325, 5, 108, 0, 0, 1325, 1377, 5, 101, 0, 0, 1326, 1327, 5, 122, 0, 0, 1327, 1328, 5, 101, 0, 0, 1328, 1329, 5, 114, 0, 0, 1329, 1330, 5, 111, 0, 0, 1330, 1331, 5, 45, 0, 0, 1331, 1332, 5, 100, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 103, 0, 0, 1334, 1335, 5, 105, 0, 0, 1335, 1377, 5, 116, 0, 0, 1336, 1337, 5, 100, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 103, 0, 0, 1339, 1340, 5, 105, 0, 0, 1340, 1377, 5, 116, 0, 0, 1341, 1342, 5, 112, 0, 0, 1342, 1343, 5, 97, 0, 0, 1343, 1344, 5, 116, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 1347, 5, 114, 0, 0, 1347, 1348, 5, 110, 0, 0, 1348, 1349, 5, 45, 0, 0, 1349, 1350, 5, 115, 0, 0, 1350, 1351, 5, 101, 0, 0, 1351, 1352, 5, 112, 0, 0, 1352, 1353, 5, 97, 0, 0, 1353, 1354, 5, 114, 0, 0, 1354, 1355, 5, 97, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 111, 0, 0, 1357, 1377, 5, 114, 0, 0, 1358, 1359, 5, 101, 0, 0, 1359, 1360, 5, 120, 0, 0, 1360, 1361, 5, 112, 0, 0, 1361, 1362, 5, 111, 0, 0, 1362, 1363, 5, 110, 0, 0, 1363, 1364, 5, 101, 0, 0, 1364, 1365, 5, 110, 0, 0, 1365, 1366, 5, 116, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 115, 0, 0, 1368, 1369, 5, 101, 0, 0, 1369, 1370, 5, 112, 0, 0, 1370, 1371, 5, 97, 0, 0, 1371, 1372, 5, 114, 0, 0, 1372, 1373, 5, 97, 0, 0, 1373, 1374, 5, 116, 0, 0, 1374, 1375, 5, 111, 0, 0, 1375, 1377, 5, 114, 0, 0, 1376, 1254, 1, 0, 0, 0, 1376, 1271, 1, 0, 0, 0, 1376, 1289, 1, 0, 0, 0, 1376, 1297, 1, 0, 0, 0, 1376, 1307, 1, 0, 0, 0, 1376, 1310, 1, 0, 0, 0, 1376, 1317, 1, 0, 0, 0, 1376, 1326, 1, 0, 0, 0, 1376, 1336, 1, 0, 0, 0, 1376, 1341, 1, 0, 0, 0, 1376, 1358, 1, 0, 0, 0, 1377, 13, 1, 0, 0, 0, 1378, 1380, 7, 0, 0, 0, 1379, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 15, 1, 0, 0, 0, 1383, 1399, 5, 38, 0, 0, 1384, 1385, 5, 108, 0, 0, 1385, 1400, 5, 116, 0, 0, 1386, 1387, 5, 103, 0, 0, 1387, 1400, 5, 116, 0, 0, 1388, 1389, 5, 97, 0, 0, 1389, 1390, 5, 109, 0, 0, 1390, 1400, 5, 112, 0, 0, 1391, 1392, 5, 113, 0, 0, 1392, 1393, 5, 117, 0, 0, 1393, 1394, 5, 111, 0, 0, 1394, 1400, 5, 116, 0, 0, 1395, 1396, 5, 97, 0, 0, 1396, 1397, 5, 112, 0, 0, 1397, 1398, 5, 111, 0, 0, 1398, 1400, 5, 115, 0, 0, 1399, 1384, 1, 0, 0, 0, 1399, 1386, 1, 0, 0, 0, 1399, 1388, 1, 0, 0, 0, 1399, 1391, 1, 0, 0, 0, 1399, 1395, 1, 0, 0, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 5, 59, 0, 0, 1402, 17, 1, 0, 0, 0, 1403, 1404, 5, 38, 0, 0, 1404, 1405, 5, 35, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1408, 7, 0, 0, 0, 1407, 1406, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1407, 1, 0, 0, 0, 1409, 1410, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1423, 5, 59, 0, 0, 1412, 1413, 5, 38, 0, 0, 1413, 1414, 5, 35, 0, 0, 1414, 1415, 5, 120, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1418, 7, 3, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1417, 1, 0, 0, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 5, 59, 0, 0, 1422, 1403, 1, 0, 0, 0, 1422, 1412, 1, 0, 0, 0, 1423, 19, 1, 0, 0, 0, 1424, 1425, 5, 34, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 7, 0, 0, 1427, 21, 1, 0, 0, 0, 1428, 1429, 5, 39, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1431, 6, 8, 1, 0, 1431, 23, 1, 0, 0, 0, 1432, 1433, 5, 60, 0, 0, 1433, 1434, 5, 33, 0, 0, 1434, 1435, 5, 45, 0, 0, 1435, 1436, 5, 45, 0, 0, 1436, 1442, 1, 0, 0, 0, 1437, 1438, 5, 45, 0, 0, 1438, 1441, 8, 4, 0, 0, 1439, 1441, 8, 4, 0, 0, 1440, 1437, 1, 0, 0, 0, 1440, 1439, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1442, 1443, 1, 0, 0, 0, 1443, 1445, 1, 0, 0, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1446, 5, 45, 0, 0, 1446, 1447, 5, 45, 0, 0, 1447, 1448, 5, 62, 0, 0, 1448, 25, 1, 0, 0, 0, 1449, 1450, 5, 60, 0, 0, 1450, 1451, 5, 63, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 7, 5, 0, 0, 1453, 1454, 7, 6, 0, 0, 1454, 1462, 7, 7, 0, 0, 1455, 1459, 7, 8, 0, 0, 1456, 1458, 9, 0, 0, 0, 1457, 1456, 1, 0, 0, 0, 1458, 1461, 1, 0, 0, 0, 1459, 1460, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1463, 1, 0, 0, 0, 1461, 1459, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1464, 1, 0, 0, 0, 1464, 1465, 5, 63, 0, 0, 1465, 1466, 5, 62, 0, 0, 1466, 27, 1, 0, 0, 0, 1467, 1468, 5, 60, 0, 0, 1468, 1469, 5, 63, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1478, 3, 374, 184, 0, 1471, 1475, 7, 8, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1479, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1471, 1, 0, 0, 0, 1478, 1479, 1, 0, 0, 0, 1479, 1480, 1, 0, 0, 0, 1480, 1481, 5, 63, 0, 0, 1481, 1482, 5, 62, 0, 0, 1482, 29, 1, 0, 0, 0, 1483, 1484, 5, 60, 0, 0, 1484, 1485, 5, 33, 0, 0, 1485, 1486, 5, 91, 0, 0, 1486, 1487, 5, 67, 0, 0, 1487, 1488, 5, 68, 0, 0, 1488, 1489, 5, 65, 0, 0, 1489, 1490, 5, 84, 0, 0, 1490, 1491, 5, 65, 0, 0, 1491, 1492, 5, 91, 0, 0, 1492, 1496, 1, 0, 0, 0, 1493, 1495, 9, 0, 0, 0, 1494, 1493, 1, 0, 0, 0, 1495, 1498, 1, 0, 0, 0, 1496, 1497, 1, 0, 0, 0, 1496, 1494, 1, 0, 0, 0, 1497, 1499, 1, 0, 0, 0, 1498, 1496, 1, 0, 0, 0, 1499, 1500, 5, 93, 0, 0, 1500, 1501, 5, 93, 0, 0, 1501, 1502, 5, 62, 0, 0, 1502, 31, 1, 0, 0, 0, 1503, 1504, 5, 40, 0, 0, 1504, 1505, 5, 35, 0, 0, 1505, 1507, 1, 0, 0, 0, 1506, 1508, 3, 34, 14, 0, 1507, 1506, 1, 0, 0, 0, 1507, 1508, 1, 0, 0, 0, 1508, 1512, 1, 0, 0, 0, 1509, 1510, 3, 374, 184, 0, 1510, 1511, 5, 58, 0, 0, 1511, 1513, 1, 0, 0, 0, 1512, 1509, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1522, 3, 374, 184, 0, 1515, 1519, 3, 34, 14, 0, 1516, 1518, 9, 0, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1521, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1520, 1523, 1, 0, 0, 0, 1521, 1519, 1, 0, 0, 0, 1522, 1515, 1, 0, 0, 0, 1522, 1523, 1, 0, 0, 0, 1523, 1524, 1, 0, 0, 0, 1524, 1525, 5, 35, 0, 0, 1525, 1526, 5, 41, 0, 0, 1526, 33, 1, 0, 0, 0, 1527, 1529, 7, 8, 0, 0, 1528, 1527, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1528, 1, 0, 0, 0, 1530, 1531, 1, 0, 0, 0, 1531, 1532, 1, 0, 0, 0, 1532, 1533, 6, 14, 2, 0, 1533, 35, 1, 0, 0, 0, 1534, 1535, 5, 61, 0, 0, 1535, 37, 1, 0, 0, 0, 1536, 1537, 5, 33, 0, 0, 1537, 1538, 5, 61, 0, 0, 1538, 39, 1, 0, 0, 0, 1539, 1540, 5, 40, 0, 0, 1540, 41, 1, 0, 0, 0, 1541, 1542, 5, 41, 0, 0, 1542, 43, 1, 0, 0, 0, 1543, 1544, 5, 91, 0, 0, 1544, 45, 1, 0, 0, 0, 1545, 1546, 5, 93, 0, 0, 1546, 47, 1, 0, 0, 0, 1547, 1548, 5, 123, 0, 0, 1548, 49, 1, 0, 0, 0, 1549, 1550, 5, 125, 0, 0, 1550, 51, 1, 0, 0, 0, 1551, 1552, 5, 42, 0, 0, 1552, 53, 1, 0, 0, 0, 1553, 1554, 5, 43, 0, 0, 1554, 55, 1, 0, 0, 0, 1555, 1556, 5, 45, 0, 0, 1556, 57, 1, 0, 0, 0, 1557, 1558, 5, 44, 0, 0, 1558, 59, 1, 0, 0, 0, 1559, 1560, 5, 46, 0, 0, 1560, 61, 1, 0, 0, 0, 1561, 1562, 5, 46, 0, 0, 1562, 1563, 5, 46, 0, 0, 1563, 63, 1, 0, 0, 0, 1564, 1565, 5, 58, 0, 0, 1565, 65, 1, 0, 0, 0, 1566, 1567, 5, 58, 0, 0, 1567, 1568, 5, 61, 0, 0, 1568, 67, 1, 0, 0, 0, 1569, 1570, 5, 59, 0, 0, 1570, 69, 1, 0, 0, 0, 1571, 1572, 5, 47, 0, 0, 1572, 71, 1, 0, 0, 0, 1573, 1574, 5, 47, 0, 0, 1574, 1575, 5, 47, 0, 0, 1575, 73, 1, 0, 0, 0, 1576, 1577, 5, 92, 0, 0, 1577, 75, 1, 0, 0, 0, 1578, 1579, 5, 124, 0, 0, 1579, 77, 1, 0, 0, 0, 1580, 1581, 5, 60, 0, 0, 1581, 79, 1, 0, 0, 0, 1582, 1583, 5, 62, 0, 0, 1583, 81, 1, 0, 0, 0, 1584, 1585, 5, 63, 0, 0, 1585, 83, 1, 0, 0, 0, 1586, 1587, 5, 64, 0, 0, 1587, 85, 1, 0, 0, 0, 1588, 1589, 5, 36, 0, 0, 1589, 87, 1, 0, 0, 0, 1590, 1591, 5, 37, 0, 0, 1591, 89, 1, 0, 0, 0, 1592, 1593, 5, 33, 0, 0, 1593, 91, 1, 0, 0, 0, 1594, 1595, 5, 35, 0, 0, 1595, 93, 1, 0, 0, 0, 1596, 1597, 5, 94, 0, 0, 1597, 95, 1, 0, 0, 0, 1598, 1599, 5, 61, 0, 0, 1599, 1600, 5, 62, 0, 0, 1600, 97, 1, 0, 0, 0, 1601, 1602, 5, 96, 0, 0, 1602, 99, 1, 0, 0, 0, 1603, 1604, 5, 124, 0, 0, 1604, 1605, 5, 124, 0, 0, 1605, 101, 1, 0, 0, 0, 1606, 1607, 5, 126, 0, 0, 1607, 103, 1, 0, 0, 0, 1608, 1609, 5, 97, 0, 0, 1609, 1610, 5, 108, 0, 0, 1610, 1611, 5, 108, 0, 0, 1611, 1612, 5, 111, 0, 0, 1612, 1613, 5, 119, 0, 0, 1613, 1614, 5, 105, 0, 0, 1614, 1615, 5, 110, 0, 0, 1615, 1616, 5, 103, 0, 0, 1616, 105, 1, 0, 0, 0, 1617, 1618, 5, 97, 0, 0, 1618, 1619, 5, 110, 0, 0, 1619, 1620, 5, 99, 0, 0, 1620, 1621, 5, 101, 0, 0, 1621, 1622, 5, 115, 0, 0, 1622, 1623, 5, 116, 0, 0, 1623, 1624, 5, 111, 0, 0, 1624, 1625, 5, 114, 0, 0, 1625, 107, 1, 0, 0, 0, 1626, 1627, 5, 97, 0, 0, 1627, 1628, 5, 110, 0, 0, 1628, 1629, 5, 99, 0, 0, 1629, 1630, 5, 101, 0, 0, 1630, 1631, 5, 115, 0, 0, 1631, 1632, 5, 116, 0, 0, 1632, 1633, 5, 111, 0, 0, 1633, 1634, 5, 114, 0, 0, 1634, 1635, 5, 45, 0, 0, 1635, 1636, 5, 111, 0, 0, 1636, 1637, 5, 114, 0, 0, 1637, 1638, 5, 45, 0, 0, 1638, 1639, 5, 115, 0, 0, 1639, 1640, 5, 101, 0, 0, 1640, 1641, 5, 108, 0, 0, 1641, 1642, 5, 102, 0, 0, 1642, 109, 1, 0, 0, 0, 1643, 1644, 5, 97, 0, 0, 1644, 1645, 5, 110, 0, 0, 1645, 1646, 5, 100, 0, 0, 1646, 111, 1, 0, 0, 0, 1647, 1648, 5, 97, 0, 0, 1648, 1649, 5, 114, 0, 0, 1649, 1650, 5, 114, 0, 0, 1650, 1651, 5, 97, 0, 0, 1651, 1652, 5, 121, 0, 0, 1652, 113, 1, 0, 0, 0, 1653, 1654, 5, 97, 0, 0, 1654, 1655, 5, 115, 0, 0, 1655, 115, 1, 0, 0, 0, 1656, 1657, 5, 97, 0, 0, 1657, 1658, 5, 115, 0, 0, 1658, 1659, 5, 99, 0, 0, 1659, 1660, 5, 101, 0, 0, 1660, 1661, 5, 110, 0, 0, 1661, 1662, 5, 100, 0, 0, 1662, 1663, 5, 105, 0, 0, 1663, 1664, 5, 110, 0, 0, 1664, 1665, 5, 103, 0, 0, 1665, 117, 1, 0, 0, 0, 1666, 1667, 5, 97, 0, 0, 1667, 1668, 5, 116, 0, 0, 1668, 119, 1, 0, 0, 0, 1669, 1670, 5, 97, 0, 0, 1670, 1671, 5, 116, 0, 0, 1671, 1672, 5, 116, 0, 0, 1672, 1673, 5, 114, 0, 0, 1673, 1674, 5, 105, 0, 0, 1674, 1675, 5, 98, 0, 0, 1675, 1676, 5, 117, 0, 0, 1676, 1677, 5, 116, 0, 0, 1677, 1678, 5, 101, 0, 0, 1678, 121, 1, 0, 0, 0, 1679, 1680, 5, 98, 0, 0, 1680, 1681, 5, 97, 0, 0, 1681, 1682, 5, 115, 0, 0, 1682, 1683, 5, 101, 0, 0, 1683, 1684, 5, 45, 0, 0, 1684, 1685, 5, 117, 0, 0, 1685, 1686, 5, 114, 0, 0, 1686, 1687, 5, 105, 0, 0, 1687, 123, 1, 0, 0, 0, 1688, 1689, 5, 98, 0, 0, 1689, 1690, 5, 111, 0, 0, 1690, 1691, 5, 117, 0, 0, 1691, 1692, 5, 110, 0, 0, 1692, 1693, 5, 100, 0, 0, 1693, 1694, 5, 97, 0, 0, 1694, 1695, 5, 114, 0, 0, 1695, 1696, 5, 121, 0, 0, 1696, 1697, 5, 45, 0, 0, 1697, 1698, 5, 115, 0, 0, 1698, 1699, 5, 112, 0, 0, 1699, 1700, 5, 97, 0, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1702, 5, 101, 0, 0, 1702, 125, 1, 0, 0, 0, 1703, 1704, 5, 98, 0, 0, 1704, 1705, 5, 105, 0, 0, 1705, 1706, 5, 110, 0, 0, 1706, 1707, 5, 97, 0, 0, 1707, 1708, 5, 114, 0, 0, 1708, 1709, 5, 121, 0, 0, 1709, 127, 1, 0, 0, 0, 1710, 1711, 5, 98, 0, 0, 1711, 1712, 5, 121, 0, 0, 1712, 129, 1, 0, 0, 0, 1713, 1714, 5, 99, 0, 0, 1714, 1715, 5, 97, 0, 0, 1715, 1716, 5, 115, 0, 0, 1716, 1717, 5, 101, 0, 0, 1717, 131, 1, 0, 0, 0, 1718, 1719, 5, 99, 0, 0, 1719, 1720, 5, 97, 0, 0, 1720, 1721, 5, 115, 0, 0, 1721, 1722, 5, 116, 0, 0, 1722, 133, 1, 0, 0, 0, 1723, 1724, 5, 99, 0, 0, 1724, 1725, 5, 97, 0, 0, 1725, 1726, 5, 115, 0, 0, 1726, 1727, 5, 116, 0, 0, 1727, 1728, 5, 97, 0, 0, 1728, 1729, 5, 98, 0, 0, 1729, 1730, 5, 108, 0, 0, 1730, 1731, 5, 101, 0, 0, 1731, 135, 1, 0, 0, 0, 1732, 1733, 5, 99, 0, 0, 1733, 1734, 5, 97, 0, 0, 1734, 1735, 5, 116, 0, 0, 1735, 1736, 5, 99, 0, 0, 1736, 1737, 5, 104, 0, 0, 1737, 137, 1, 0, 0, 0, 1738, 1739, 5, 99, 0, 0, 1739, 1740, 5, 104, 0, 0, 1740, 1741, 5, 105, 0, 0, 1741, 1742, 5, 108, 0, 0, 1742, 1743, 5, 100, 0, 0, 1743, 139, 1, 0, 0, 0, 1744, 1745, 5, 99, 0, 0, 1745, 1746, 5, 111, 0, 0, 1746, 1747, 5, 108, 0, 0, 1747, 1748, 5, 108, 0, 0, 1748, 1749, 5, 97, 0, 0, 1749, 1750, 5, 116, 0, 0, 1750, 1751, 5, 105, 0, 0, 1751, 1752, 5, 111, 0, 0, 1752, 1753, 5, 110, 0, 0, 1753, 141, 1, 0, 0, 0, 1754, 1755, 5, 99, 0, 0, 1755, 1756, 5, 111, 0, 0, 1756, 1757, 5, 109, 0, 0, 1757, 1758, 5, 109, 0, 0, 1758, 1759, 5, 101, 0, 0, 1759, 1760, 5, 110, 0, 0, 1760, 1761, 5, 116, 0, 0, 1761, 143, 1, 0, 0, 0, 1762, 1763, 5, 99, 0, 0, 1763, 1764, 5, 111, 0, 0, 1764, 1765, 5, 110, 0, 0, 1765, 1766, 5, 115, 0, 0, 1766, 1767, 5, 116, 0, 0, 1767, 1768, 5, 114, 0, 0, 1768, 1769, 5, 117, 0, 0, 1769, 1770, 5, 99, 0, 0, 1770, 1771, 5, 116, 0, 0, 1771, 1772, 5, 105, 0, 0, 1772, 1773, 5, 111, 0, 0, 1773, 1774, 5, 110, 0, 0, 1774, 145, 1, 0, 0, 0, 1775, 1776, 5, 99, 0, 0, 1776, 1777, 5, 111, 0, 0, 1777, 1778, 5, 110, 0, 0, 1778, 1779, 5, 116, 0, 0, 1779, 1780, 5, 101, 0, 0, 1780, 1781, 5, 120, 0, 0, 1781, 1782, 5, 116, 0, 0, 1782, 147, 1, 0, 0, 0, 1783, 1784, 5, 99, 0, 0, 1784, 1785, 5, 111, 0, 0, 1785, 1786, 5, 112, 0, 0, 1786, 1787, 5, 121, 0, 0, 1787, 1788, 5, 45, 0, 0, 1788, 1789, 5, 110, 0, 0, 1789, 1790, 5, 97, 0, 0, 1790, 1791, 5, 109, 0, 0, 1791, 1792, 5, 101, 0, 0, 1792, 1793, 5, 115, 0, 0, 1793, 1794, 5, 112, 0, 0, 1794, 1795, 5, 97, 0, 0, 1795, 1796, 5, 99, 0, 0, 1796, 1797, 5, 101, 0, 0, 1797, 1798, 5, 115, 0, 0, 1798, 149, 1, 0, 0, 0, 1799, 1800, 5, 99, 0, 0, 1800, 1801, 5, 111, 0, 0, 1801, 1802, 5, 117, 0, 0, 1802, 1803, 5, 110, 0, 0, 1803, 1804, 5, 116, 0, 0, 1804, 151, 1, 0, 0, 0, 1805, 1806, 5, 100, 0, 0, 1806, 1807, 5, 101, 0, 0, 1807, 1808, 5, 99, 0, 0, 1808, 1809, 5, 108, 0, 0, 1809, 1810, 5, 97, 0, 0, 1810, 1811, 5, 114, 0, 0, 1811, 1812, 5, 101, 0, 0, 1812, 153, 1, 0, 0, 0, 1813, 1814, 5, 100, 0, 0, 1814, 1815, 5, 101, 0, 0, 1815, 1816, 5, 102, 0, 0, 1816, 1817, 5, 97, 0, 0, 1817, 1818, 5, 117, 0, 0, 1818, 1819, 5, 108, 0, 0, 1819, 1820, 5, 116, 0, 0, 1820, 155, 1, 0, 0, 0, 1821, 1822, 5, 100, 0, 0, 1822, 1823, 5, 101, 0, 0, 1823, 1824, 5, 115, 0, 0, 1824, 1825, 5, 99, 0, 0, 1825, 1826, 5, 101, 0, 0, 1826, 1827, 5, 110, 0, 0, 1827, 1828, 5, 100, 0, 0, 1828, 1829, 5, 97, 0, 0, 1829, 1830, 5, 110, 0, 0, 1830, 1831, 5, 116, 0, 0, 1831, 157, 1, 0, 0, 0, 1832, 1833, 5, 100, 0, 0, 1833, 1834, 5, 101, 0, 0, 1834, 1835, 5, 115, 0, 0, 1835, 1836, 5, 99, 0, 0, 1836, 1837, 5, 101, 0, 0, 1837, 1838, 5, 110, 0, 0, 1838, 1839, 5, 100, 0, 0, 1839, 1840, 5, 97, 0, 0, 1840, 1841, 5, 110, 0, 0, 1841, 1842, 5, 116, 0, 0, 1842, 1843, 5, 45, 0, 0, 1843, 1844, 5, 111, 0, 0, 1844, 1845, 5, 114, 0, 0, 1845, 1846, 5, 45, 0, 0, 1846, 1847, 5, 115, 0, 0, 1847, 1848, 5, 101, 0, 0, 1848, 1849, 5, 108, 0, 0, 1849, 1850, 5, 102, 0, 0, 1850, 159, 1, 0, 0, 0, 1851, 1852, 5, 100, 0, 0, 1852, 1853, 5, 101, 0, 0, 1853, 1854, 5, 115, 0, 0, 1854, 1855, 5, 99, 0, 0, 1855, 1856, 5, 101, 0, 0, 1856, 1857, 5, 110, 0, 0, 1857, 1858, 5, 100, 0, 0, 1858, 1859, 5, 105, 0, 0, 1859, 1860, 5, 110, 0, 0, 1860, 1861, 5, 103, 0, 0, 1861, 161, 1, 0, 0, 0, 1862, 1863, 5, 100, 0, 0, 1863, 1864, 5, 101, 0, 0, 1864, 1865, 5, 99, 0, 0, 1865, 1866, 5, 105, 0, 0, 1866, 1867, 5, 109, 0, 0, 1867, 1868, 5, 97, 0, 0, 1868, 1869, 5, 108, 0, 0, 1869, 1870, 5, 45, 0, 0, 1870, 1871, 5, 102, 0, 0, 1871, 1872, 5, 111, 0, 0, 1872, 1873, 5, 114, 0, 0, 1873, 1874, 5, 109, 0, 0, 1874, 1875, 5, 97, 0, 0, 1875, 1876, 5, 116, 0, 0, 1876, 163, 1, 0, 0, 0, 1877, 1878, 5, 100, 0, 0, 1878, 1879, 5, 105, 0, 0, 1879, 1880, 5, 118, 0, 0, 1880, 165, 1, 0, 0, 0, 1881, 1882, 5, 100, 0, 0, 1882, 1883, 5, 111, 0, 0, 1883, 1884, 5, 99, 0, 0, 1884, 1885, 5, 117, 0, 0, 1885, 1886, 5, 109, 0, 0, 1886, 1887, 5, 101, 0, 0, 1887, 1888, 5, 110, 0, 0, 1888, 1889, 5, 116, 0, 0, 1889, 167, 1, 0, 0, 0, 1890, 1891, 5, 100, 0, 0, 1891, 1892, 5, 111, 0, 0, 1892, 1893, 5, 99, 0, 0, 1893, 1894, 5, 117, 0, 0, 1894, 1895, 5, 109, 0, 0, 1895, 1896, 5, 101, 0, 0, 1896, 1897, 5, 110, 0, 0, 1897, 1898, 5, 116, 0, 0, 1898, 1899, 5, 45, 0, 0, 1899, 1900, 5, 110, 0, 0, 1900, 1901, 5, 111, 0, 0, 1901, 1902, 5, 100, 0, 0, 1902, 1903, 5, 101, 0, 0, 1903, 169, 1, 0, 0, 0, 1904, 1905, 5, 101, 0, 0, 1905, 1906, 5, 108, 0, 0, 1906, 1907, 5, 101, 0, 0, 1907, 1908, 5, 109, 0, 0, 1908, 1909, 5, 101, 0, 0, 1909, 1910, 5, 110, 0, 0, 1910, 1911, 5, 116, 0, 0, 1911, 171, 1, 0, 0, 0, 1912, 1913, 5, 101, 0, 0, 1913, 1914, 5, 108, 0, 0, 1914, 1915, 5, 115, 0, 0, 1915, 1916, 5, 101, 0, 0, 1916, 173, 1, 0, 0, 0, 1917, 1918, 5, 101, 0, 0, 1918, 1919, 5, 109, 0, 0, 1919, 1920, 5, 112, 0, 0, 1920, 1921, 5, 116, 0, 0, 1921, 1922, 5, 121, 0, 0, 1922, 175, 1, 0, 0, 0, 1923, 1924, 5, 101, 0, 0, 1924, 1925, 5, 109, 0, 0, 1925, 1926, 5, 112, 0, 0, 1926, 1927, 5, 116, 0, 0, 1927, 1928, 5, 121, 0, 0, 1928, 1929, 5, 45, 0, 0, 1929, 1930, 5, 115, 0, 0, 1930, 1931, 5, 101, 0, 0, 1931, 1932, 5, 113, 0, 0, 1932, 1933, 5, 117, 0, 0, 1933, 1934, 5, 101, 0, 0, 1934, 1935, 5, 110, 0, 0, 1935, 1936, 5, 99, 0, 0, 1936, 1937, 5, 101, 0, 0, 1937, 177, 1, 0, 0, 0, 1938, 1939, 5, 101, 0, 0, 1939, 1940, 5, 110, 0, 0, 1940, 1941, 5, 99, 0, 0, 1941, 1942, 5, 111, 0, 0, 1942, 1943, 5, 100, 0, 0, 1943, 1944, 5, 105, 0, 0, 1944, 1945, 5, 110, 0, 0, 1945, 1946, 5, 103, 0, 0, 1946, 179, 1, 0, 0, 0, 1947, 1948, 5, 101, 0, 0, 1948, 1949, 5, 110, 0, 0, 1949, 1950, 5, 100, 0, 0, 1950, 181, 1, 0, 0, 0, 1951, 1952, 5, 101, 0, 0, 1952, 1953, 5, 113, 0, 0, 1953, 183, 1, 0, 0, 0, 1954, 1955, 5, 101, 0, 0, 1955, 1956, 5, 118, 0, 0, 1956, 1957, 5, 101, 0, 0, 1957, 1958, 5, 114, 0, 0, 1958, 1959, 5, 121, 0, 0, 1959, 185, 1, 0, 0, 0, 1960, 1961, 5, 101, 0, 0, 1961, 1962, 5, 120, 0, 0, 1962, 1963, 5, 99, 0, 0, 1963, 1964, 5, 101, 0, 0, 1964, 1965, 5, 112, 0, 0, 1965, 1966, 5, 116, 0, 0, 1966, 187, 1, 0, 0, 0, 1967, 1968, 5, 101, 0, 0, 1968, 1969, 5, 120, 0, 0, 1969, 1970, 5, 116, 0, 0, 1970, 1971, 5, 101, 0, 0, 1971, 1972, 5, 114, 0, 0, 1972, 1973, 5, 110, 0, 0, 1973, 1974, 5, 97, 0, 0, 1974, 1975, 5, 108, 0, 0, 1975, 189, 1, 0, 0, 0, 1976, 1977, 5, 102, 0, 0, 1977, 1978, 5, 111, 0, 0, 1978, 1979, 5, 108, 0, 0, 1979, 1980, 5, 108, 0, 0, 1980, 1981, 5, 111, 0, 0, 1981, 1982, 5, 119, 0, 0, 1982, 1983, 5, 105, 0, 0, 1983, 1984, 5, 110, 0, 0, 1984, 1985, 5, 103, 0, 0, 1985, 191, 1, 0, 0, 0, 1986, 1987, 5, 102, 0, 0, 1987, 1988, 5, 111, 0, 0, 1988, 1989, 5, 108, 0, 0, 1989, 1990, 5, 108, 0, 0, 1990, 1991, 5, 111, 0, 0, 1991, 1992, 5, 119, 0, 0, 1992, 1993, 5, 105, 0, 0, 1993, 1994, 5, 110, 0, 0, 1994, 1995, 5, 103, 0, 0, 1995, 1996, 5, 45, 0, 0, 1996, 1997, 5, 115, 0, 0, 1997, 1998, 5, 105, 0, 0, 1998, 1999, 5, 98, 0, 0, 1999, 2000, 5, 108, 0, 0, 2000, 2001, 5, 105, 0, 0, 2001, 2002, 5, 110, 0, 0, 2002, 2003, 5, 103, 0, 0, 2003, 193, 1, 0, 0, 0, 2004, 2005, 5, 102, 0, 0, 2005, 2006, 5, 111, 0, 0, 2006, 2007, 5, 114, 0, 0, 2007, 195, 1, 0, 0, 0, 2008, 2009, 5, 102, 0, 0, 2009, 2010, 5, 117, 0, 0, 2010, 2011, 5, 110, 0, 0, 2011, 2012, 5, 99, 0, 0, 2012, 2013, 5, 116, 0, 0, 2013, 2014, 5, 105, 0, 0, 2014, 2015, 5, 111, 0, 0, 2015, 2016, 5, 110, 0, 0, 2016, 197, 1, 0, 0, 0, 2017, 2018, 5, 103, 0, 0, 2018, 2019, 5, 101, 0, 0, 2019, 199, 1, 0, 0, 0, 2020, 2021, 5, 103, 0, 0, 2021, 2022, 5, 114, 0, 0, 2022, 2023, 5, 101, 0, 0, 2023, 2024, 5, 97, 0, 0, 2024, 2025, 5, 116, 0, 0, 2025, 2026, 5, 101, 0, 0, 2026, 2027, 5, 115, 0, 0, 2027, 2028, 5, 116, 0, 0, 2028, 201, 1, 0, 0, 0, 2029, 2030, 5, 103, 0, 0, 2030, 2031, 5, 114, 0, 0, 2031, 2032, 5, 111, 0, 0, 2032, 2033, 5, 117, 0, 0, 2033, 2034, 5, 112, 0, 0, 2034, 203, 1, 0, 0, 0, 2035, 2036, 5, 103, 0, 0, 2036, 2037, 5, 116, 0, 0, 2037, 205, 1, 0, 0, 0, 2038, 2039, 5, 105, 0, 0, 2039, 2040, 5, 100, 0, 0, 2040, 2041, 5, 105, 0, 0, 2041, 2042, 5, 118, 0, 0, 2042, 207, 1, 0, 0, 0, 2043, 2044, 5, 105, 0, 0, 2044, 2045, 5, 102, 0, 0, 2045, 209, 1, 0, 0, 0, 2046, 2047, 5, 105, 0, 0, 2047, 2048, 5, 109, 0, 0, 2048, 2049, 5, 112, 0, 0, 2049, 2050, 5, 111, 0, 0, 2050, 2051, 5, 114, 0, 0, 2051, 2052, 5, 116, 0, 0, 2052, 211, 1, 0, 0, 0, 2053, 2054, 5, 105, 0, 0, 2054, 2055, 5, 110, 0, 0, 2055, 213, 1, 0, 0, 0, 2056, 2057, 5, 105, 0, 0, 2057, 2058, 5, 110, 0, 0, 2058, 2059, 5, 104, 0, 0, 2059, 2060, 5, 101, 0, 0, 2060, 2061, 5, 114, 0, 0, 2061, 2062, 5, 105, 0, 0, 2062, 2063, 5, 116, 0, 0, 2063, 215, 1, 0, 0, 0, 2064, 2065, 5, 105, 0, 0, 2065, 2066, 5, 110, 0, 0, 2066, 2067, 5, 115, 0, 0, 2067, 2068, 5, 116, 0, 0, 2068, 2069, 5, 97, 0, 0, 2069, 2070, 5, 110, 0, 0, 2070, 2071, 5, 99, 0, 0, 2071, 2072, 5, 101, 0, 0, 2072, 217, 1, 0, 0, 0, 2073, 2074, 5, 105, 0, 0, 2074, 2075, 5, 110, 0, 0, 2075, 2076, 5, 116, 0, 0, 2076, 2077, 5, 101, 0, 0, 2077, 2078, 5, 114, 0, 0, 2078, 2079, 5, 115, 0, 0, 2079, 2080, 5, 101, 0, 0, 2080, 2081, 5, 99, 0, 0, 2081, 2082, 5, 116, 0, 0, 2082, 219, 1, 0, 0, 0, 2083, 2084, 5, 105, 0, 0, 2084, 2085, 5, 115, 0, 0, 2085, 221, 1, 0, 0, 0, 2086, 2087, 5, 105, 0, 0, 2087, 2088, 5, 116, 0, 0, 2088, 2089, 5, 101, 0, 0, 2089, 2090, 5, 109, 0, 0, 2090, 223, 1, 0, 0, 0, 2091, 2092, 5, 108, 0, 0, 2092, 2093, 5, 97, 0, 0, 2093, 2094, 5, 120, 0, 0, 2094, 225, 1, 0, 0, 0, 2095, 2096, 5, 108, 0, 0, 2096, 2097, 5, 101, 0, 0, 2097, 227, 1, 0, 0, 0, 2098, 2099, 5, 108, 0, 0, 2099, 2100, 5, 101, 0, 0, 2100, 2101, 5, 97, 0, 0, 2101, 2102, 5, 115, 0, 0, 2102, 2103, 5, 116, 0, 0, 2103, 229, 1, 0, 0, 0, 2104, 2105, 5, 108, 0, 0, 2105, 2106, 5, 101, 0, 0, 2106, 2107, 5, 116, 0, 0, 2107, 231, 1, 0, 0, 0, 2108, 2109, 5, 108, 0, 0, 2109, 2110, 5, 116, 0, 0, 2110, 233, 1, 0, 0, 0, 2111, 2112, 5, 109, 0, 0, 2112, 2113, 5, 97, 0, 0, 2113, 2114, 5, 112, 0, 0, 2114, 235, 1, 0, 0, 0, 2115, 2116, 5, 109, 0, 0, 2116, 2117, 5, 111, 0, 0, 2117, 2118, 5, 100, 0, 0, 2118, 237, 1, 0, 0, 0, 2119, 2120, 5, 109, 0, 0, 2120, 2121, 5, 111, 0, 0, 2121, 2122, 5, 100, 0, 0, 2122, 2123, 5, 117, 0, 0, 2123, 2124, 5, 108, 0, 0, 2124, 2125, 5, 101, 0, 0, 2125, 239, 1, 0, 0, 0, 2126, 2127, 5, 110, 0, 0, 2127, 2128, 5, 97, 0, 0, 2128, 2129, 5, 109, 0, 0, 2129, 2130, 5, 101, 0, 0, 2130, 2131, 5, 115, 0, 0, 2131, 2132, 5, 112, 0, 0, 2132, 2133, 5, 97, 0, 0, 2133, 2134, 5, 99, 0, 0, 2134, 2135, 5, 101, 0, 0, 2135, 241, 1, 0, 0, 0, 2136, 2137, 5, 110, 0, 0, 2137, 2138, 5, 101, 0, 0, 2138, 243, 1, 0, 0, 0, 2139, 2140, 5, 110, 0, 0, 2140, 2141, 5, 101, 0, 0, 2141, 2142, 5, 120, 0, 0, 2142, 2143, 5, 116, 0, 0, 2143, 245, 1, 0, 0, 0, 2144, 2145, 5, 110, 0, 0, 2145, 2146, 5, 97, 0, 0, 2146, 2147, 5, 109, 0, 0, 2147, 2148, 5, 101, 0, 0, 2148, 2149, 5, 115, 0, 0, 2149, 2150, 5, 112, 0, 0, 2150, 2151, 5, 97, 0, 0, 2151, 2152, 5, 99, 0, 0, 2152, 2153, 5, 101, 0, 0, 2153, 2154, 5, 45, 0, 0, 2154, 2155, 5, 110, 0, 0, 2155, 2156, 5, 111, 0, 0, 2156, 2157, 5, 100, 0, 0, 2157, 2158, 5, 101, 0, 0, 2158, 247, 1, 0, 0, 0, 2159, 2160, 5, 110, 0, 0, 2160, 2161, 5, 111, 0, 0, 2161, 2162, 5, 45, 0, 0, 2162, 2163, 5, 105, 0, 0, 2163, 2164, 5, 110, 0, 0, 2164, 2165, 5, 104, 0, 0, 2165, 2166, 5, 101, 0, 0, 2166, 2167, 5, 114, 0, 0, 2167, 2168, 5, 105, 0, 0, 2168, 2169, 5, 116, 0, 0, 2169, 249, 1, 0, 0, 0, 2170, 2171, 5, 110, 0, 0, 2171, 2172, 5, 111, 0, 0, 2172, 2173, 5, 45, 0, 0, 2173, 2174, 5, 112, 0, 0, 2174, 2175, 5, 114, 0, 0, 2175, 2176, 5, 101, 0, 0, 2176, 2177, 5, 115, 0, 0, 2177, 2178, 5, 101, 0, 0, 2178, 2179, 5, 114, 0, 0, 2179, 2180, 5, 118, 0, 0, 2180, 2181, 5, 101, 0, 0, 2181, 251, 1, 0, 0, 0, 2182, 2183, 5, 110, 0, 0, 2183, 2184, 5, 111, 0, 0, 2184, 2185, 5, 100, 0, 0, 2185, 2186, 5, 101, 0, 0, 2186, 253, 1, 0, 0, 0, 2187, 2188, 5, 111, 0, 0, 2188, 2189, 5, 102, 0, 0, 2189, 255, 1, 0, 0, 0, 2190, 2191, 5, 111, 0, 0, 2191, 2192, 5, 110, 0, 0, 2192, 2193, 5, 108, 0, 0, 2193, 2194, 5, 121, 0, 0, 2194, 257, 1, 0, 0, 0, 2195, 2196, 5, 111, 0, 0, 2196, 2197, 5, 112, 0, 0, 2197, 2198, 5, 116, 0, 0, 2198, 2199, 5, 105, 0, 0, 2199, 2200, 5, 111, 0, 0, 2200, 2201, 5, 110, 0, 0, 2201, 259, 1, 0, 0, 0, 2202, 2203, 5, 111, 0, 0, 2203, 2204, 5, 114, 0, 0, 2204, 261, 1, 0, 0, 0, 2205, 2206, 5, 111, 0, 0, 2206, 2207, 5, 114, 0, 0, 2207, 2208, 5, 100, 0, 0, 2208, 2209, 5, 101, 0, 0, 2209, 2210, 5, 114, 0, 0, 2210, 263, 1, 0, 0, 0, 2211, 2212, 5, 111, 0, 0, 2212, 2213, 5, 114, 0, 0, 2213, 2214, 5, 100, 0, 0, 2214, 2215, 5, 101, 0, 0, 2215, 2216, 5, 114, 0, 0, 2216, 2217, 5, 101, 0, 0, 2217, 2218, 5, 100, 0, 0, 2218, 265, 1, 0, 0, 0, 2219, 2220, 5, 111, 0, 0, 2220, 2221, 5, 114, 0, 0, 2221, 2222, 5, 100, 0, 0, 2222, 2223, 5, 101, 0, 0, 2223, 2224, 5, 114, 0, 0, 2224, 2225, 5, 105, 0, 0, 2225, 2226, 5, 110, 0, 0, 2226, 2227, 5, 103, 0, 0, 2227, 267, 1, 0, 0, 0, 2228, 2229, 5, 112, 0, 0, 2229, 2230, 5, 97, 0, 0, 2230, 2231, 5, 114, 0, 0, 2231, 2232, 5, 101, 0, 0, 2232, 2233, 5, 110, 0, 0, 2233, 2234, 5, 116, 0, 0, 2234, 269, 1, 0, 0, 0, 2235, 2236, 5, 112, 0, 0, 2236, 2237, 5, 114, 0, 0, 2237, 2238, 5, 101, 0, 0, 2238, 2239, 5, 99, 0, 0, 2239, 2240, 5, 101, 0, 0, 2240, 2241, 5, 100, 0, 0, 2241, 2242, 5, 105, 0, 0, 2242, 2243, 5, 110, 0, 0, 2243, 2244, 5, 103, 0, 0, 2244, 271, 1, 0, 0, 0, 2245, 2246, 5, 112, 0, 0, 2246, 2247, 5, 114, 0, 0, 2247, 2248, 5, 101, 0, 0, 2248, 2249, 5, 99, 0, 0, 2249, 2250, 5, 101, 0, 0, 2250, 2251, 5, 100, 0, 0, 2251, 2252, 5, 105, 0, 0, 2252, 2253, 5, 110, 0, 0, 2253, 2254, 5, 103, 0, 0, 2254, 2255, 5, 45, 0, 0, 2255, 2256, 5, 115, 0, 0, 2256, 2257, 5, 105, 0, 0, 2257, 2258, 5, 98, 0, 0, 2258, 2259, 5, 108, 0, 0, 2259, 2260, 5, 105, 0, 0, 2260, 2261, 5, 110, 0, 0, 2261, 2262, 5, 103, 0, 0, 2262, 273, 1, 0, 0, 0, 2263, 2264, 5, 112, 0, 0, 2264, 2265, 5, 114, 0, 0, 2265, 2266, 5, 101, 0, 0, 2266, 2267, 5, 115, 0, 0, 2267, 2268, 5, 101, 0, 0, 2268, 2269, 5, 114, 0, 0, 2269, 2270, 5, 118, 0, 0, 2270, 2271, 5, 101, 0, 0, 2271, 275, 1, 0, 0, 0, 2272, 2273, 5, 112, 0, 0, 2273, 2274, 5, 114, 0, 0, 2274, 2275, 5, 101, 0, 0, 2275, 2276, 5, 118, 0, 0, 2276, 2277, 5, 105, 0, 0, 2277, 2278, 5, 111, 0, 0, 2278, 2279, 5, 117, 0, 0, 2279, 2280, 5, 115, 0, 0, 2280, 277, 1, 0, 0, 0, 2281, 2282, 5, 112, 0, 0, 2282, 2283, 5, 114, 0, 0, 2283, 2284, 5, 111, 0, 0, 2284, 2285, 5, 99, 0, 0, 2285, 2286, 5, 101, 0, 0, 2286, 2287, 5, 115, 0, 0, 2287, 2288, 5, 115, 0, 0, 2288, 2289, 5, 105, 0, 0, 2289, 2290, 5, 110, 0, 0, 2290, 2291, 5, 103, 0, 0, 2291, 2292, 5, 45, 0, 0, 2292, 2293, 5, 105, 0, 0, 2293, 2294, 5, 110, 0, 0, 2294, 2295, 5, 115, 0, 0, 2295, 2296, 5, 116, 0, 0, 2296, 2297, 5, 114, 0, 0, 2297, 2298, 5, 117, 0, 0, 2298, 2299, 5, 99, 0, 0, 2299, 2300, 5, 116, 0, 0, 2300, 2301, 5, 105, 0, 0, 2301, 2302, 5, 111, 0, 0, 2302, 2303, 5, 110, 0, 0, 2303, 279, 1, 0, 0, 0, 2304, 2305, 5, 114, 0, 0, 2305, 2306, 5, 101, 0, 0, 2306, 2307, 5, 116, 0, 0, 2307, 2308, 5, 117, 0, 0, 2308, 2309, 5, 114, 0, 0, 2309, 2310, 5, 110, 0, 0, 2310, 281, 1, 0, 0, 0, 2311, 2312, 5, 115, 0, 0, 2312, 2313, 5, 97, 0, 0, 2313, 2314, 5, 116, 0, 0, 2314, 2315, 5, 105, 0, 0, 2315, 2316, 5, 115, 0, 0, 2316, 2317, 5, 102, 0, 0, 2317, 2318, 5, 105, 0, 0, 2318, 2319, 5, 101, 0, 0, 2319, 2320, 5, 115, 0, 0, 2320, 283, 1, 0, 0, 0, 2321, 2322, 5, 115, 0, 0, 2322, 2323, 5, 99, 0, 0, 2323, 2324, 5, 104, 0, 0, 2324, 2325, 5, 101, 0, 0, 2325, 2326, 5, 109, 0, 0, 2326, 2327, 5, 97, 0, 0, 2327, 285, 1, 0, 0, 0, 2328, 2329, 5, 115, 0, 0, 2329, 2330, 5, 99, 0, 0, 2330, 2331, 5, 104, 0, 0, 2331, 2332, 5, 101, 0, 0, 2332, 2333, 5, 109, 0, 0, 2333, 2334, 5, 97, 0, 0, 2334, 2335, 5, 45, 0, 0, 2335, 2336, 5, 97, 0, 0, 2336, 2337, 5, 116, 0, 0, 2337, 2338, 5, 116, 0, 0, 2338, 2339, 5, 114, 0, 0, 2339, 2340, 5, 105, 0, 0, 2340, 2341, 5, 98, 0, 0, 2341, 2342, 5, 117, 0, 0, 2342, 2343, 5, 116, 0, 0, 2343, 2344, 5, 101, 0, 0, 2344, 287, 1, 0, 0, 0, 2345, 2346, 5, 115, 0, 0, 2346, 2347, 5, 99, 0, 0, 2347, 2348, 5, 104, 0, 0, 2348, 2349, 5, 101, 0, 0, 2349, 2350, 5, 109, 0, 0, 2350, 2351, 5, 97, 0, 0, 2351, 2352, 5, 45, 0, 0, 2352, 2353, 5, 101, 0, 0, 2353, 2354, 5, 108, 0, 0, 2354, 2355, 5, 101, 0, 0, 2355, 2356, 5, 109, 0, 0, 2356, 2357, 5, 101, 0, 0, 2357, 2358, 5, 110, 0, 0, 2358, 2359, 5, 116, 0, 0, 2359, 289, 1, 0, 0, 0, 2360, 2361, 5, 115, 0, 0, 2361, 2362, 5, 101, 0, 0, 2362, 2363, 5, 108, 0, 0, 2363, 2364, 5, 102, 0, 0, 2364, 291, 1, 0, 0, 0, 2365, 2366, 5, 115, 0, 0, 2366, 2367, 5, 108, 0, 0, 2367, 2368, 5, 105, 0, 0, 2368, 2369, 5, 100, 0, 0, 2369, 2370, 5, 105, 0, 0, 2370, 2371, 5, 110, 0, 0, 2371, 2372, 5, 103, 0, 0, 2372, 293, 1, 0, 0, 0, 2373, 2374, 5, 115, 0, 0, 2374, 2375, 5, 111, 0, 0, 2375, 2376, 5, 109, 0, 0, 2376, 2377, 5, 101, 0, 0, 2377, 295, 1, 0, 0, 0, 2378, 2379, 5, 115, 0, 0, 2379, 2380, 5, 116, 0, 0, 2380, 2381, 5, 97, 0, 0, 2381, 2382, 5, 98, 0, 0, 2382, 2383, 5, 108, 0, 0, 2383, 2384, 5, 101, 0, 0, 2384, 297, 1, 0, 0, 0, 2385, 2386, 5, 115, 0, 0, 2386, 2387, 5, 116, 0, 0, 2387, 2388, 5, 97, 0, 0, 2388, 2389, 5, 114, 0, 0, 2389, 2390, 5, 116, 0, 0, 2390, 299, 1, 0, 0, 0, 2391, 2392, 5, 115, 0, 0, 2392, 2393, 5, 116, 0, 0, 2393, 2394, 5, 114, 0, 0, 2394, 2395, 5, 105, 0, 0, 2395, 2396, 5, 99, 0, 0, 2396, 2397, 5, 116, 0, 0, 2397, 301, 1, 0, 0, 0, 2398, 2399, 5, 115, 0, 0, 2399, 2400, 5, 116, 0, 0, 2400, 2401, 5, 114, 0, 0, 2401, 2402, 5, 105, 0, 0, 2402, 2403, 5, 112, 0, 0, 2403, 303, 1, 0, 0, 0, 2404, 2405, 5, 115, 0, 0, 2405, 2406, 5, 119, 0, 0, 2406, 2407, 5, 105, 0, 0, 2407, 2408, 5, 116, 0, 0, 2408, 2409, 5, 99, 0, 0, 2409, 2410, 5, 104, 0, 0, 2410, 305, 1, 0, 0, 0, 2411, 2412, 5, 116, 0, 0, 2412, 2413, 5, 101, 0, 0, 2413, 2414, 5, 120, 0, 0, 2414, 2415, 5, 116, 0, 0, 2415, 307, 1, 0, 0, 0, 2416, 2417, 5, 116, 0, 0, 2417, 2418, 5, 104, 0, 0, 2418, 2419, 5, 101, 0, 0, 2419, 2420, 5, 110, 0, 0, 2420, 309, 1, 0, 0, 0, 2421, 2422, 5, 116, 0, 0, 2422, 2423, 5, 111, 0, 0, 2423, 311, 1, 0, 0, 0, 2424, 2425, 5, 116, 0, 0, 2425, 2426, 5, 114, 0, 0, 2426, 2427, 5, 101, 0, 0, 2427, 2428, 5, 97, 0, 0, 2428, 2429, 5, 116, 0, 0, 2429, 313, 1, 0, 0, 0, 2430, 2431, 5, 116, 0, 0, 2431, 2432, 5, 114, 0, 0, 2432, 2433, 5, 121, 0, 0, 2433, 315, 1, 0, 0, 0, 2434, 2435, 5, 116, 0, 0, 2435, 2436, 5, 117, 0, 0, 2436, 2437, 5, 109, 0, 0, 2437, 2438, 5, 98, 0, 0, 2438, 2439, 5, 108, 0, 0, 2439, 2440, 5, 105, 0, 0, 2440, 2441, 5, 110, 0, 0, 2441, 2442, 5, 103, 0, 0, 2442, 317, 1, 0, 0, 0, 2443, 2444, 5, 116, 0, 0, 2444, 2445, 5, 121, 0, 0, 2445, 2446, 5, 112, 0, 0, 2446, 2447, 5, 101, 0, 0, 2447, 319, 1, 0, 0, 0, 2448, 2449, 5, 116, 0, 0, 2449, 2450, 5, 121, 0, 0, 2450, 2451, 5, 112, 0, 0, 2451, 2452, 5, 101, 0, 0, 2452, 2453, 5, 115, 0, 0, 2453, 2454, 5, 119, 0, 0, 2454, 2455, 5, 105, 0, 0, 2455, 2456, 5, 116, 0, 0, 2456, 2457, 5, 99, 0, 0, 2457, 2458, 5, 104, 0, 0, 2458, 321, 1, 0, 0, 0, 2459, 2460, 5, 117, 0, 0, 2460, 2461, 5, 110, 0, 0, 2461, 2462, 5, 105, 0, 0, 2462, 2463, 5, 111, 0, 0, 2463, 2464, 5, 110, 0, 0, 2464, 323, 1, 0, 0, 0, 2465, 2466, 5, 117, 0, 0, 2466, 2467, 5, 110, 0, 0, 2467, 2468, 5, 111, 0, 0, 2468, 2469, 5, 114, 0, 0, 2469, 2470, 5, 100, 0, 0, 2470, 2471, 5, 101, 0, 0, 2471, 2472, 5, 114, 0, 0, 2472, 2473, 5, 101, 0, 0, 2473, 2474, 5, 100, 0, 0, 2474, 325, 1, 0, 0, 0, 2475, 2476, 5, 117, 0, 0, 2476, 2477, 5, 112, 0, 0, 2477, 2478, 5, 100, 0, 0, 2478, 2479, 5, 97, 0, 0, 2479, 2480, 5, 116, 0, 0, 2480, 2481, 5, 101, 0, 0, 2481, 327, 1, 0, 0, 0, 2482, 2483, 5, 118, 0, 0, 2483, 2484, 5, 97, 0, 0, 2484, 2485, 5, 108, 0, 0, 2485, 2486, 5, 105, 0, 0, 2486, 2487, 5, 100, 0, 0, 2487, 2488, 5, 97, 0, 0, 2488, 2489, 5, 116, 0, 0, 2489, 2490, 5, 101, 0, 0, 2490, 329, 1, 0, 0, 0, 2491, 2492, 5, 118, 0, 0, 2492, 2493, 5, 97, 0, 0, 2493, 2494, 5, 114, 0, 0, 2494, 2495, 5, 105, 0, 0, 2495, 2496, 5, 97, 0, 0, 2496, 2497, 5, 98, 0, 0, 2497, 2498, 5, 108, 0, 0, 2498, 2499, 5, 101, 0, 0, 2499, 331, 1, 0, 0, 0, 2500, 2501, 5, 118, 0, 0, 2501, 2502, 5, 101, 0, 0, 2502, 2503, 5, 114, 0, 0, 2503, 2504, 5, 115, 0, 0, 2504, 2505, 5, 105, 0, 0, 2505, 2506, 5, 111, 0, 0, 2506, 2507, 5, 110, 0, 0, 2507, 333, 1, 0, 0, 0, 2508, 2509, 5, 119, 0, 0, 2509, 2510, 5, 104, 0, 0, 2510, 2511, 5, 101, 0, 0, 2511, 2512, 5, 110, 0, 0, 2512, 335, 1, 0, 0, 0, 2513, 2514, 5, 119, 0, 0, 2514, 2515, 5, 104, 0, 0, 2515, 2516, 5, 101, 0, 0, 2516, 2517, 5, 114, 0, 0, 2517, 2518, 5, 101, 0, 0, 2518, 337, 1, 0, 0, 0, 2519, 2520, 5, 119, 0, 0, 2520, 2521, 5, 105, 0, 0, 2521, 2522, 5, 110, 0, 0, 2522, 2523, 5, 100, 0, 0, 2523, 2524, 5, 111, 0, 0, 2524, 2525, 5, 119, 0, 0, 2525, 339, 1, 0, 0, 0, 2526, 2527, 5, 120, 0, 0, 2527, 2528, 5, 113, 0, 0, 2528, 2529, 5, 117, 0, 0, 2529, 2530, 5, 101, 0, 0, 2530, 2531, 5, 114, 0, 0, 2531, 2532, 5, 121, 0, 0, 2532, 341, 1, 0, 0, 0, 2533, 2534, 5, 97, 0, 0, 2534, 2535, 5, 114, 0, 0, 2535, 2536, 5, 114, 0, 0, 2536, 2537, 5, 97, 0, 0, 2537, 2538, 5, 121, 0, 0, 2538, 2539, 5, 45, 0, 0, 2539, 2540, 5, 110, 0, 0, 2540, 2541, 5, 111, 0, 0, 2541, 2542, 5, 100, 0, 0, 2542, 2543, 5, 101, 0, 0, 2543, 343, 1, 0, 0, 0, 2544, 2545, 5, 98, 0, 0, 2545, 2546, 5, 111, 0, 0, 2546, 2547, 5, 111, 0, 0, 2547, 2548, 5, 108, 0, 0, 2548, 2549, 5, 101, 0, 0, 2549, 2550, 5, 97, 0, 0, 2550, 2551, 5, 110, 0, 0, 2551, 2552, 5, 45, 0, 0, 2552, 2553, 5, 110, 0, 0, 2553, 2554, 5, 111, 0, 0, 2554, 2555, 5, 100, 0, 0, 2555, 2556, 5, 101, 0, 0, 2556, 345, 1, 0, 0, 0, 2557, 2558, 5, 110, 0, 0, 2558, 2559, 5, 117, 0, 0, 2559, 2560, 5, 108, 0, 0, 2560, 2561, 5, 108, 0, 0, 2561, 2562, 5, 45, 0, 0, 2562, 2563, 5, 110, 0, 0, 2563, 2564, 5, 111, 0, 0, 2564, 2565, 5, 100, 0, 0, 2565, 2566, 5, 101, 0, 0, 2566, 347, 1, 0, 0, 0, 2567, 2568, 5, 110, 0, 0, 2568, 2569, 5, 117, 0, 0, 2569, 2570, 5, 109, 0, 0, 2570, 2571, 5, 98, 0, 0, 2571, 2572, 5, 101, 0, 0, 2572, 2573, 5, 114, 0, 0, 2573, 2574, 5, 45, 0, 0, 2574, 2575, 5, 110, 0, 0, 2575, 2576, 5, 111, 0, 0, 2576, 2577, 5, 100, 0, 0, 2577, 2578, 5, 101, 0, 0, 2578, 349, 1, 0, 0, 0, 2579, 2580, 5, 111, 0, 0, 2580, 2581, 5, 98, 0, 0, 2581, 2582, 5, 106, 0, 0, 2582, 2583, 5, 101, 0, 0, 2583, 2584, 5, 99, 0, 0, 2584, 2585, 5, 116, 0, 0, 2585, 2586, 5, 45, 0, 0, 2586, 2587, 5, 110, 0, 0, 2587, 2588, 5, 111, 0, 0, 2588, 2589, 5, 100, 0, 0, 2589, 2590, 5, 101, 0, 0, 2590, 351, 1, 0, 0, 0, 2591, 2592, 5, 114, 0, 0, 2592, 2593, 5, 101, 0, 0, 2593, 2594, 5, 112, 0, 0, 2594, 2595, 5, 108, 0, 0, 2595, 2596, 5, 97, 0, 0, 2596, 2597, 5, 99, 0, 0, 2597, 2598, 5, 101, 0, 0, 2598, 353, 1, 0, 0, 0, 2599, 2600, 5, 119, 0, 0, 2600, 2601, 5, 105, 0, 0, 2601, 2602, 5, 116, 0, 0, 2602, 2603, 5, 104, 0, 0, 2603, 355, 1, 0, 0, 0, 2604, 2605, 5, 118, 0, 0, 2605, 2606, 5, 97, 0, 0, 2606, 2607, 5, 108, 0, 0, 2607, 2608, 5, 117, 0, 0, 2608, 2609, 5, 101, 0, 0, 2609, 357, 1, 0, 0, 0, 2610, 2611, 5, 105, 0, 0, 2611, 2612, 5, 110, 0, 0, 2612, 2613, 5, 115, 0, 0, 2613, 2614, 5, 101, 0, 0, 2614, 2615, 5, 114, 0, 0, 2615, 2616, 5, 116, 0, 0, 2616, 359, 1, 0, 0, 0, 2617, 2618, 5, 105, 0, 0, 2618, 2619, 5, 110, 0, 0, 2619, 2620, 5, 116, 0, 0, 2620, 2621, 5, 111, 0, 0, 2621, 361, 1, 0, 0, 0, 2622, 2623, 5, 100, 0, 0, 2623, 2624, 5, 101, 0, 0, 2624, 2625, 5, 108, 0, 0, 2625, 2626, 5, 101, 0, 0, 2626, 2627, 5, 116, 0, 0, 2627, 2628, 5, 101, 0, 0, 2628, 363, 1, 0, 0, 0, 2629, 2630, 5, 114, 0, 0, 2630, 2631, 5, 101, 0, 0, 2631, 2632, 5, 110, 0, 0, 2632, 2633, 5, 97, 0, 0, 2633, 2634, 5, 109, 0, 0, 2634, 2635, 5, 101, 0, 0, 2635, 365, 1, 0, 0, 0, 2636, 2637, 5, 81, 0, 0, 2637, 2643, 5, 123, 0, 0, 2638, 2642, 3, 16, 5, 0, 2639, 2642, 3, 18, 6, 0, 2640, 2642, 8, 9, 0, 0, 2641, 2638, 1, 0, 0, 0, 2641, 2639, 1, 0, 0, 0, 2641, 2640, 1, 0, 0, 0, 2642, 2645, 1, 0, 0, 0, 2643, 2641, 1, 0, 0, 0, 2643, 2644, 1, 0, 0, 0, 2644, 2646, 1, 0, 0, 0, 2645, 2643, 1, 0, 0, 0, 2646, 2647, 5, 125, 0, 0, 2647, 2648, 3, 374, 184, 0, 2648, 367, 1, 0, 0, 0, 2649, 2650, 3, 374, 184, 0, 2650, 2651, 5, 58, 0, 0, 2651, 2652, 3, 374, 184, 0, 2652, 369, 1, 0, 0, 0, 2653, 2654, 3, 374, 184, 0, 2654, 2655, 5, 58, 0, 0, 2655, 2656, 5, 42, 0, 0, 2656, 371, 1, 0, 0, 0, 2657, 2658, 5, 42, 0, 0, 2658, 2659, 5, 58, 0, 0, 2659, 2660, 3, 374, 184, 0, 2660, 373, 1, 0, 0, 0, 2661, 2665, 3, 376, 185, 0, 2662, 2664, 3, 378, 186, 0, 2663, 2662, 1, 0, 0, 0, 2664, 2667, 1, 0, 0, 0, 2665, 2663, 1, 0, 0, 0, 2665, 2666, 1, 0, 0, 0, 2666, 375, 1, 0, 0, 0, 2667, 2665, 1, 0, 0, 0, 2668, 2670, 7, 10, 0, 0, 2669, 2668, 1, 0, 0, 0, 2670, 377, 1, 0, 0, 0, 2671, 2674, 3, 376, 185, 0, 2672, 2674, 7, 11, 0, 0, 2673, 2671, 1, 0, 0, 0, 2673, 2672, 1, 0, 0, 0, 2674, 379, 1, 0, 0, 0, 2675, 2676, 5, 40, 0, 0, 2676, 2677, 5, 58, 0, 0, 2677, 2678, 5, 126, 0, 0, 2678, 381, 1, 0, 0, 0, 2679, 2681, 5, 58, 0, 0, 2680, 2679, 1, 0, 0, 0, 2681, 2682, 1, 0, 0, 0, 2682, 2680, 1, 0, 0, 0, 2682, 2683, 1, 0, 0, 0, 2683, 2684, 1, 0, 0, 0, 2684, 2685, 5, 41, 0, 0, 2685, 383, 1, 0, 0, 0, 2686, 2687, 5, 40, 0, 0, 2687, 2688, 5, 58, 0, 0, 2688, 2694, 5, 126, 0, 0, 2689, 2693, 3, 388, 191, 0, 2690, 2691, 5, 58, 0, 0, 2691, 2693, 8, 12, 0, 0, 2692, 2689, 1, 0, 0, 0, 2692, 2690, 1, 0, 0, 0, 2693, 2696, 1, 0, 0, 0, 2694, 2692, 1, 0, 0, 0, 2694, 2695, 1, 0, 0, 0, 2695, 2697, 1, 0, 0, 0, 2696, 2694, 1, 0, 0, 0, 2697, 2698, 5, 58, 0, 0, 2698, 2699, 5, 41, 0, 0, 2699, 385, 1, 0, 0, 0, 2700, 2701, 5, 40, 0, 0, 2701, 2702, 5, 58, 0, 0, 2702, 2711, 8, 13, 0, 0, 2703, 2710, 3, 386, 190, 0, 2704, 2705, 5, 40, 0, 0, 2705, 2710, 8, 14, 0, 0, 2706, 2707, 5, 58, 0, 0, 2707, 2710, 8, 12, 0, 0, 2708, 2710, 8, 15, 0, 0, 2709, 2703, 1, 0, 0, 0, 2709, 2704, 1, 0, 0, 0, 2709, 2706, 1, 0, 0, 0, 2709, 2708, 1, 0, 0, 0, 2710, 2713, 1, 0, 0, 0, 2711, 2709, 1, 0, 0, 0, 2711, 2712, 1, 0, 0, 0, 2712, 2717, 1, 0, 0, 0, 2713, 2711, 1, 0, 0, 0, 2714, 2716, 5, 58, 0, 0, 2715, 2714, 1, 0, 0, 0, 2716, 2719, 1, 0, 0, 0, 2717, 2715, 1, 0, 0, 0, 2717, 2718, 1, 0, 0, 0, 2718, 2721, 1, 0, 0, 0, 2719, 2717, 1, 0, 0, 0, 2720, 2722, 5, 58, 0, 0, 2721, 2720, 1, 0, 0, 0, 2722, 2723, 1, 0, 0, 0, 2723, 2721, 1, 0, 0, 0, 2723, 2724, 1, 0, 0, 0, 2724, 2725, 1, 0, 0, 0, 2725, 2726, 5, 41, 0, 0, 2726, 2727, 1, 0, 0, 0, 2727, 2728, 6, 190, 2, 0, 2728, 387, 1, 0, 0, 0, 2729, 2730, 7, 16, 0, 0, 2730, 389, 1, 0, 0, 0, 2731, 2732, 3, 98, 46, 0, 2732, 2733, 3, 98, 46, 0, 2733, 2734, 3, 44, 19, 0, 2734, 2735, 1, 0, 0, 0, 2735, 2736, 6, 192, 3, 0, 2736, 391, 1, 0, 0, 0, 2737, 2738, 3, 50, 22, 0, 2738, 2739, 3, 98, 46, 0, 2739, 2740, 1, 0, 0, 0, 2740, 2741, 6, 193, 4, 0, 2741, 393, 1, 0, 0, 0, 2742, 2743, 8, 17, 0, 0, 2743, 395, 1, 0, 0, 0, 2744, 2745, 7, 18, 0, 0, 2745, 397, 1, 0, 0, 0, 2746, 2747, 5, 96, 0, 0, 2747, 2748, 1, 0, 0, 0, 2748, 2749, 6, 196, 5, 0, 2749, 399, 1, 0, 0, 0, 2750, 2751, 5, 93, 0, 0, 2751, 2752, 1, 0, 0, 0, 2752, 2753, 6, 197, 6, 0, 2753, 401, 1, 0, 0, 0, 2754, 2755, 5, 123, 0, 0, 2755, 2756, 1, 0, 0, 0, 2756, 2757, 6, 198, 7, 0, 2757, 403, 1, 0, 0, 0, 2758, 2759, 3, 98, 46, 0, 2759, 2760, 3, 48, 21, 0, 2760, 2761, 1, 0, 0, 0, 2761, 2762, 6, 199, 8, 0, 2762, 405, 1, 0, 0, 0, 2763, 2764, 3, 46, 20, 0, 2764, 2765, 3, 98, 46, 0, 2765, 2766, 3, 98, 46, 0, 2766, 2767, 1, 0, 0, 0, 2767, 2768, 6, 200, 4, 0, 2768, 407, 1, 0, 0, 0, 2769, 2770, 5, 34, 0, 0, 2770, 2771, 5, 34, 0, 0, 2771, 2772, 1, 0, 0, 0, 2772, 2773, 6, 201, 9, 0, 2773, 409, 1, 0, 0, 0, 2774, 2775, 5, 34, 0, 0, 2775, 2776, 1, 0, 0, 0, 2776, 2777, 6, 202, 10, 0, 2777, 2778, 6, 202, 4, 0, 2778, 411, 1, 0, 0, 0, 2779, 2780, 5, 123, 0, 0, 2780, 2781, 5, 123, 0, 0, 2781, 2782, 1, 0, 0, 0, 2782, 2783, 6, 203, 11, 0, 2783, 413, 1, 0, 0, 0, 2784, 2785, 5, 125, 0, 0, 2785, 2786, 5, 125, 0, 0, 2786, 2787, 1, 0, 0, 0, 2787, 2788, 6, 204, 12, 0, 2788, 415, 1, 0, 0, 0, 2789, 2790, 5, 123, 0, 0, 2790, 2791, 1, 0, 0, 0, 2791, 2792, 6, 205, 7, 0, 2792, 2793, 6, 205, 13, 0, 2793, 417, 1, 0, 0, 0, 2794, 2795, 5, 125, 0, 0, 2795, 2796, 1, 0, 0, 0, 2796, 2797, 6, 206, 14, 0, 2797, 419, 1, 0, 0, 0, 2798, 2814, 5, 38, 0, 0, 2799, 2800, 5, 108, 0, 0, 2800, 2815, 5, 116, 0, 0, 2801, 2802, 5, 103, 0, 0, 2802, 2815, 5, 116, 0, 0, 2803, 2804, 5, 97, 0, 0, 2804, 2805, 5, 109, 0, 0, 2805, 2815, 5, 112, 0, 0, 2806, 2807, 5, 113, 0, 0, 2807, 2808, 5, 117, 0, 0, 2808, 2809, 5, 111, 0, 0, 2809, 2815, 5, 116, 0, 0, 2810, 2811, 5, 97, 0, 0, 2811, 2812, 5, 112, 0, 0, 2812, 2813, 5, 111, 0, 0, 2813, 2815, 5, 115, 0, 0, 2814, 2799, 1, 0, 0, 0, 2814, 2801, 1, 0, 0, 0, 2814, 2803, 1, 0, 0, 0, 2814, 2806, 1, 0, 0, 0, 2814, 2810, 1, 0, 0, 0, 2815, 2816, 1, 0, 0, 0, 2816, 2817, 5, 59, 0, 0, 2817, 2818, 1, 0, 0, 0, 2818, 2819, 6, 207, 15, 0, 2819, 421, 1, 0, 0, 0, 2820, 2821, 5, 38, 0, 0, 2821, 2822, 5, 35, 0, 0, 2822, 2824, 1, 0, 0, 0, 2823, 2825, 7, 0, 0, 0, 2824, 2823, 1, 0, 0, 0, 2825, 2826, 1, 0, 0, 0, 2826, 2824, 1, 0, 0, 0, 2826, 2827, 1, 0, 0, 0, 2827, 2828, 1, 0, 0, 0, 2828, 2840, 5, 59, 0, 0, 2829, 2830, 5, 38, 0, 0, 2830, 2831, 5, 35, 0, 0, 2831, 2832, 5, 120, 0, 0, 2832, 2834, 1, 0, 0, 0, 2833, 2835, 7, 3, 0, 0, 2834, 2833, 1, 0, 0, 0, 2835, 2836, 1, 0, 0, 0, 2836, 2834, 1, 0, 0, 0, 2836, 2837, 1, 0, 0, 0, 2837, 2838, 1, 0, 0, 0, 2838, 2840, 5, 59, 0, 0, 2839, 2820, 1, 0, 0, 0, 2839, 2829, 1, 0, 0, 0, 2840, 2841, 1, 0, 0, 0, 2841, 2842, 6, 208, 16, 0, 2842, 423, 1, 0, 0, 0, 2843, 2844, 8, 19, 0, 0, 2844, 2845, 1, 0, 0, 0, 2845, 2846, 6, 209, 17, 0, 2846, 425, 1, 0, 0, 0, 2847, 2848, 5, 39, 0, 0, 2848, 2849, 5, 39, 0, 0, 2849, 2850, 1, 0, 0, 0, 2850, 2851, 6, 210, 18, 0, 2851, 427, 1, 0, 0, 0, 2852, 2853, 5, 39, 0, 0, 2853, 2854, 1, 0, 0, 0, 2854, 2855, 6, 211, 19, 0, 2855, 2856, 6, 211, 4, 0, 2856, 429, 1, 0, 0, 0, 2857, 2858, 5, 123, 0, 0, 2858, 2859, 5, 123, 0, 0, 2859, 2860, 1, 0, 0, 0, 2860, 2861, 6, 212, 11, 0, 2861, 431, 1, 0, 0, 0, 2862, 2863, 5, 125, 0, 0, 2863, 2864, 5, 125, 0, 0, 2864, 2865, 1, 0, 0, 0, 2865, 2866, 6, 213, 12, 0, 2866, 433, 1, 0, 0, 0, 2867, 2868, 5, 123, 0, 0, 2868, 2869, 1, 0, 0, 0, 2869, 2870, 6, 214, 7, 0, 2870, 2871, 6, 214, 20, 0, 2871, 435, 1, 0, 0, 0, 2872, 2873, 5, 125, 0, 0, 2873, 2874, 1, 0, 0, 0, 2874, 2875, 6, 215, 14, 0, 2875, 437, 1, 0, 0, 0, 2876, 2892, 5, 38, 0, 0, 2877, 2878, 5, 108, 0, 0, 2878, 2893, 5, 116, 0, 0, 2879, 2880, 5, 103, 0, 0, 2880, 2893, 5, 116, 0, 0, 2881, 2882, 5, 97, 0, 0, 2882, 2883, 5, 109, 0, 0, 2883, 2893, 5, 112, 0, 0, 2884, 2885, 5, 113, 0, 0, 2885, 2886, 5, 117, 0, 0, 2886, 2887, 5, 111, 0, 0, 2887, 2893, 5, 116, 0, 0, 2888, 2889, 5, 97, 0, 0, 2889, 2890, 5, 112, 0, 0, 2890, 2891, 5, 111, 0, 0, 2891, 2893, 5, 115, 0, 0, 2892, 2877, 1, 0, 0, 0, 2892, 2879, 1, 0, 0, 0, 2892, 2881, 1, 0, 0, 0, 2892, 2884, 1, 0, 0, 0, 2892, 2888, 1, 0, 0, 0, 2893, 2894, 1, 0, 0, 0, 2894, 2895, 5, 59, 0, 0, 2895, 2896, 1, 0, 0, 0, 2896, 2897, 6, 216, 15, 0, 2897, 439, 1, 0, 0, 0, 2898, 2899, 5, 38, 0, 0, 2899, 2900, 5, 35, 0, 0, 2900, 2902, 1, 0, 0, 0, 2901, 2903, 7, 0, 0, 0, 2902, 2901, 1, 0, 0, 0, 2903, 2904, 1, 0, 0, 0, 2904, 2902, 1, 0, 0, 0, 2904, 2905, 1, 0, 0, 0, 2905, 2906, 1, 0, 0, 0, 2906, 2918, 5, 59, 0, 0, 2907, 2908, 5, 38, 0, 0, 2908, 2909, 5, 35, 0, 0, 2909, 2910, 5, 120, 0, 0, 2910, 2912, 1, 0, 0, 0, 2911, 2913, 7, 3, 0, 0, 2912, 2911, 1, 0, 0, 0, 2913, 2914, 1, 0, 0, 0, 2914, 2912, 1, 0, 0, 0, 2914, 2915, 1, 0, 0, 0, 2915, 2916, 1, 0, 0, 0, 2916, 2918, 5, 59, 0, 0, 2917, 2898, 1, 0, 0, 0, 2917, 2907, 1, 0, 0, 0, 2918, 2919, 1, 0, 0, 0, 2919, 2920, 6, 217, 16, 0, 2920, 441, 1, 0, 0, 0, 2921, 2922, 8, 20, 0, 0, 2922, 2923, 1, 0, 0, 0, 2923, 2924, 6, 218, 17, 0, 2924, 443, 1, 0, 0, 0, 2925, 2926, 3, 14, 4, 0, 2926, 2927, 1, 0, 0, 0, 2927, 2928, 6, 219, 21, 0, 2928, 445, 1, 0, 0, 0, 2929, 2930, 5, 46, 0, 0, 2930, 2940, 3, 14, 4, 0, 2931, 2932, 3, 14, 4, 0, 2932, 2936, 5, 46, 0, 0, 2933, 2935, 7, 0, 0, 0, 2934, 2933, 1, 0, 0, 0, 2935, 2938, 1, 0, 0, 0, 2936, 2934, 1, 0, 0, 0, 2936, 2937, 1, 0, 0, 0, 2937, 2940, 1, 0, 0, 0, 2938, 2936, 1, 0, 0, 0, 2939, 2929, 1, 0, 0, 0, 2939, 2931, 1, 0, 0, 0, 2940, 2941, 1, 0, 0, 0, 2941, 2942, 6, 220, 22, 0, 2942, 447, 1, 0, 0, 0, 2943, 2944, 5, 46, 0, 0, 2944, 2956, 3, 14, 4, 0, 2945, 2953, 3, 14, 4, 0, 2946, 2950, 5, 46, 0, 0, 2947, 2949, 7, 0, 0, 0, 2948, 2947, 1, 0, 0, 0, 2949, 2952, 1, 0, 0, 0, 2950, 2948, 1, 0, 0, 0, 2950, 2951, 1, 0, 0, 0, 2951, 2954, 1, 0, 0, 0, 2952, 2950, 1, 0, 0, 0, 2953, 2946, 1, 0, 0, 0, 2953, 2954, 1, 0, 0, 0, 2954, 2956, 1, 0, 0, 0, 2955, 2943, 1, 0, 0, 0, 2955, 2945, 1, 0, 0, 0, 2956, 2957, 1, 0, 0, 0, 2957, 2959, 7, 1, 0, 0, 2958, 2960, 7, 2, 0, 0, 2959, 2958, 1, 0, 0, 0, 2959, 2960, 1, 0, 0, 0, 2960, 2961, 1, 0, 0, 0, 2961, 2962, 3, 14, 4, 0, 2962, 2963, 1, 0, 0, 0, 2963, 2964, 6, 221, 23, 0, 2964, 449, 1, 0, 0, 0, 2965, 2966, 5, 100, 0, 0, 2966, 2967, 5, 101, 0, 0, 2967, 2968, 5, 99, 0, 0, 2968, 2969, 5, 105, 0, 0, 2969, 2970, 5, 109, 0, 0, 2970, 2971, 5, 97, 0, 0, 2971, 2972, 5, 108, 0, 0, 2972, 2973, 5, 45, 0, 0, 2973, 2974, 5, 115, 0, 0, 2974, 2975, 5, 101, 0, 0, 2975, 2976, 5, 112, 0, 0, 2976, 2977, 5, 97, 0, 0, 2977, 2978, 5, 114, 0, 0, 2978, 2979, 5, 97, 0, 0, 2979, 2980, 5, 116, 0, 0, 2980, 2981, 5, 111, 0, 0, 2981, 3088, 5, 114, 0, 0, 2982, 2983, 5, 103, 0, 0, 2983, 2984, 5, 114, 0, 0, 2984, 2985, 5, 111, 0, 0, 2985, 2986, 5, 117, 0, 0, 2986, 2987, 5, 112, 0, 0, 2987, 2988, 5, 105, 0, 0, 2988, 2989, 5, 110, 0, 0, 2989, 2990, 5, 103, 0, 0, 2990, 2991, 5, 45, 0, 0, 2991, 2992, 5, 115, 0, 0, 2992, 2993, 5, 101, 0, 0, 2993, 2994, 5, 112, 0, 0, 2994, 2995, 5, 97, 0, 0, 2995, 2996, 5, 114, 0, 0, 2996, 2997, 5, 97, 0, 0, 2997, 2998, 5, 116, 0, 0, 2998, 2999, 5, 111, 0, 0, 2999, 3088, 5, 114, 0, 0, 3000, 3001, 5, 105, 0, 0, 3001, 3002, 5, 110, 0, 0, 3002, 3003, 5, 102, 0, 0, 3003, 3004, 5, 105, 0, 0, 3004, 3005, 5, 110, 0, 0, 3005, 3006, 5, 105, 0, 0, 3006, 3007, 5, 116, 0, 0, 3007, 3088, 5, 121, 0, 0, 3008, 3009, 5, 109, 0, 0, 3009, 3010, 5, 105, 0, 0, 3010, 3011, 5, 110, 0, 0, 3011, 3012, 5, 117, 0, 0, 3012, 3013, 5, 115, 0, 0, 3013, 3014, 5, 45, 0, 0, 3014, 3015, 5, 115, 0, 0, 3015, 3016, 5, 105, 0, 0, 3016, 3017, 5, 103, 0, 0, 3017, 3088, 5, 110, 0, 0, 3018, 3019, 5, 78, 0, 0, 3019, 3020, 5, 97, 0, 0, 3020, 3088, 5, 78, 0, 0, 3021, 3022, 5, 112, 0, 0, 3022, 3023, 5, 101, 0, 0, 3023, 3024, 5, 114, 0, 0, 3024, 3025, 5, 99, 0, 0, 3025, 3026, 5, 101, 0, 0, 3026, 3027, 5, 110, 0, 0, 3027, 3088, 5, 116, 0, 0, 3028, 3029, 5, 112, 0, 0, 3029, 3030, 5, 101, 0, 0, 3030, 3031, 5, 114, 0, 0, 3031, 3032, 5, 45, 0, 0, 3032, 3033, 5, 109, 0, 0, 3033, 3034, 5, 105, 0, 0, 3034, 3035, 5, 108, 0, 0, 3035, 3036, 5, 108, 0, 0, 3036, 3088, 5, 101, 0, 0, 3037, 3038, 5, 122, 0, 0, 3038, 3039, 5, 101, 0, 0, 3039, 3040, 5, 114, 0, 0, 3040, 3041, 5, 111, 0, 0, 3041, 3042, 5, 45, 0, 0, 3042, 3043, 5, 100, 0, 0, 3043, 3044, 5, 105, 0, 0, 3044, 3045, 5, 103, 0, 0, 3045, 3046, 5, 105, 0, 0, 3046, 3088, 5, 116, 0, 0, 3047, 3048, 5, 100, 0, 0, 3048, 3049, 5, 105, 0, 0, 3049, 3050, 5, 103, 0, 0, 3050, 3051, 5, 105, 0, 0, 3051, 3088, 5, 116, 0, 0, 3052, 3053, 5, 112, 0, 0, 3053, 3054, 5, 97, 0, 0, 3054, 3055, 5, 116, 0, 0, 3055, 3056, 5, 116, 0, 0, 3056, 3057, 5, 101, 0, 0, 3057, 3058, 5, 114, 0, 0, 3058, 3059, 5, 110, 0, 0, 3059, 3060, 5, 45, 0, 0, 3060, 3061, 5, 115, 0, 0, 3061, 3062, 5, 101, 0, 0, 3062, 3063, 5, 112, 0, 0, 3063, 3064, 5, 97, 0, 0, 3064, 3065, 5, 114, 0, 0, 3065, 3066, 5, 97, 0, 0, 3066, 3067, 5, 116, 0, 0, 3067, 3068, 5, 111, 0, 0, 3068, 3088, 5, 114, 0, 0, 3069, 3070, 5, 101, 0, 0, 3070, 3071, 5, 120, 0, 0, 3071, 3072, 5, 112, 0, 0, 3072, 3073, 5, 111, 0, 0, 3073, 3074, 5, 110, 0, 0, 3074, 3075, 5, 101, 0, 0, 3075, 3076, 5, 110, 0, 0, 3076, 3077, 5, 116, 0, 0, 3077, 3078, 5, 45, 0, 0, 3078, 3079, 5, 115, 0, 0, 3079, 3080, 5, 101, 0, 0, 3080, 3081, 5, 112, 0, 0, 3081, 3082, 5, 97, 0, 0, 3082, 3083, 5, 114, 0, 0, 3083, 3084, 5, 97, 0, 0, 3084, 3085, 5, 116, 0, 0, 3085, 3086, 5, 111, 0, 0, 3086, 3088, 5, 114, 0, 0, 3087, 2965, 1, 0, 0, 0, 3087, 2982, 1, 0, 0, 0, 3087, 3000, 1, 0, 0, 0, 3087, 3008, 1, 0, 0, 0, 3087, 3018, 1, 0, 0, 0, 3087, 3021, 1, 0, 0, 0, 3087, 3028, 1, 0, 0, 0, 3087, 3037, 1, 0, 0, 0, 3087, 3047, 1, 0, 0, 0, 3087, 3052, 1, 0, 0, 0, 3087, 3069, 1, 0, 0, 0, 3088, 3089, 1, 0, 0, 0, 3089, 3090, 6, 222, 24, 0, 3090, 451, 1, 0, 0, 0, 3091, 3107, 5, 38, 0, 0, 3092, 3093, 5, 108, 0, 0, 3093, 3108, 5, 116, 0, 0, 3094, 3095, 5, 103, 0, 0, 3095, 3108, 5, 116, 0, 0, 3096, 3097, 5, 97, 0, 0, 3097, 3098, 5, 109, 0, 0, 3098, 3108, 5, 112, 0, 0, 3099, 3100, 5, 113, 0, 0, 3100, 3101, 5, 117, 0, 0, 3101, 3102, 5, 111, 0, 0, 3102, 3108, 5, 116, 0, 0, 3103, 3104, 5, 97, 0, 0, 3104, 3105, 5, 112, 0, 0, 3105, 3106, 5, 111, 0, 0, 3106, 3108, 5, 115, 0, 0, 3107, 3092, 1, 0, 0, 0, 3107, 3094, 1, 0, 0, 0, 3107, 3096, 1, 0, 0, 0, 3107, 3099, 1, 0, 0, 0, 3107, 3103, 1, 0, 0, 0, 3108, 3109, 1, 0, 0, 0, 3109, 3110, 5, 59, 0, 0, 3110, 3111, 1, 0, 0, 0, 3111, 3112, 6, 223, 15, 0, 3112, 453, 1, 0, 0, 0, 3113, 3114, 5, 38, 0, 0, 3114, 3115, 5, 35, 0, 0, 3115, 3117, 1, 0, 0, 0, 3116, 3118, 7, 0, 0, 0, 3117, 3116, 1, 0, 0, 0, 3118, 3119, 1, 0, 0, 0, 3119, 3117, 1, 0, 0, 0, 3119, 3120, 1, 0, 0, 0, 3120, 3121, 1, 0, 0, 0, 3121, 3133, 5, 59, 0, 0, 3122, 3123, 5, 38, 0, 0, 3123, 3124, 5, 35, 0, 0, 3124, 3125, 5, 120, 0, 0, 3125, 3127, 1, 0, 0, 0, 3126, 3128, 7, 3, 0, 0, 3127, 3126, 1, 0, 0, 0, 3128, 3129, 1, 0, 0, 0, 3129, 3127, 1, 0, 0, 0, 3129, 3130, 1, 0, 0, 0, 3130, 3131, 1, 0, 0, 0, 3131, 3133, 5, 59, 0, 0, 3132, 3113, 1, 0, 0, 0, 3132, 3122, 1, 0, 0, 0, 3133, 3134, 1, 0, 0, 0, 3134, 3135, 6, 224, 16, 0, 3135, 455, 1, 0, 0, 0, 3136, 3137, 5, 34, 0, 0, 3137, 3138, 5, 34, 0, 0, 3138, 3139, 1, 0, 0, 0, 3139, 3140, 6, 225, 9, 0, 3140, 457, 1, 0, 0, 0, 3141, 3142, 5, 39, 0, 0, 3142, 3143, 1, 0, 0, 0, 3143, 3144, 6, 226, 1, 0, 3144, 3145, 6, 226, 19, 0, 3145, 459, 1, 0, 0, 0, 3146, 3147, 5, 34, 0, 0, 3147, 3148, 1, 0, 0, 0, 3148, 3149, 6, 227, 10, 0, 3149, 3150, 6, 227, 4, 0, 3150, 3151, 6, 227, 4, 0, 3151, 461, 1, 0, 0, 0, 3152, 3153, 5, 60, 0, 0, 3153, 3154, 5, 33, 0, 0, 3154, 3155, 5, 45, 0, 0, 3155, 3156, 5, 45, 0, 0, 3156, 3162, 1, 0, 0, 0, 3157, 3158, 5, 45, 0, 0, 3158, 3161, 8, 4, 0, 0, 3159, 3161, 8, 4, 0, 0, 3160, 3157, 1, 0, 0, 0, 3160, 3159, 1, 0, 0, 0, 3161, 3164, 1, 0, 0, 0, 3162, 3160, 1, 0, 0, 0, 3162, 3163, 1, 0, 0, 0, 3163, 3165, 1, 0, 0, 0, 3164, 3162, 1, 0, 0, 0, 3165, 3166, 5, 45, 0, 0, 3166, 3167, 5, 45, 0, 0, 3167, 3168, 5, 62, 0, 0, 3168, 3169, 1, 0, 0, 0, 3169, 3170, 6, 228, 25, 0, 3170, 463, 1, 0, 0, 0, 3171, 3172, 5, 60, 0, 0, 3172, 3173, 5, 63, 0, 0, 3173, 3174, 1, 0, 0, 0, 3174, 3175, 7, 5, 0, 0, 3175, 3176, 7, 6, 0, 0, 3176, 3184, 7, 7, 0, 0, 3177, 3181, 7, 8, 0, 0, 3178, 3180, 9, 0, 0, 0, 3179, 3178, 1, 0, 0, 0, 3180, 3183, 1, 0, 0, 0, 3181, 3182, 1, 0, 0, 0, 3181, 3179, 1, 0, 0, 0, 3182, 3185, 1, 0, 0, 0, 3183, 3181, 1, 0, 0, 0, 3184, 3177, 1, 0, 0, 0, 3184, 3185, 1, 0, 0, 0, 3185, 3186, 1, 0, 0, 0, 3186, 3187, 5, 63, 0, 0, 3187, 3188, 5, 62, 0, 0, 3188, 3189, 1, 0, 0, 0, 3189, 3190, 6, 229, 26, 0, 3190, 465, 1, 0, 0, 0, 3191, 3192, 5, 60, 0, 0, 3192, 3193, 5, 63, 0, 0, 3193, 3194, 1, 0, 0, 0, 3194, 3202, 3, 374, 184, 0, 3195, 3199, 7, 8, 0, 0, 3196, 3198, 9, 0, 0, 0, 3197, 3196, 1, 0, 0, 0, 3198, 3201, 1, 0, 0, 0, 3199, 3200, 1, 0, 0, 0, 3199, 3197, 1, 0, 0, 0, 3200, 3203, 1, 0, 0, 0, 3201, 3199, 1, 0, 0, 0, 3202, 3195, 1, 0, 0, 0, 3202, 3203, 1, 0, 0, 0, 3203, 3204, 1, 0, 0, 0, 3204, 3205, 5, 63, 0, 0, 3205, 3206, 5, 62, 0, 0, 3206, 3207, 1, 0, 0, 0, 3207, 3208, 6, 230, 27, 0, 3208, 467, 1, 0, 0, 0, 3209, 3210, 5, 60, 0, 0, 3210, 3211, 5, 33, 0, 0, 3211, 3212, 5, 91, 0, 0, 3212, 3213, 5, 67, 0, 0, 3213, 3214, 5, 68, 0, 0, 3214, 3215, 5, 65, 0, 0, 3215, 3216, 5, 84, 0, 0, 3216, 3217, 5, 65, 0, 0, 3217, 3218, 5, 91, 0, 0, 3218, 3222, 1, 0, 0, 0, 3219, 3221, 9, 0, 0, 0, 3220, 3219, 1, 0, 0, 0, 3221, 3224, 1, 0, 0, 0, 3222, 3223, 1, 0, 0, 0, 3222, 3220, 1, 0, 0, 0, 3223, 3225, 1, 0, 0, 0, 3224, 3222, 1, 0, 0, 0, 3225, 3226, 5, 93, 0, 0, 3226, 3227, 5, 93, 0, 0, 3227, 3228, 5, 62, 0, 0, 3228, 3229, 1, 0, 0, 0, 3229, 3230, 6, 231, 28, 0, 3230, 469, 1, 0, 0, 0, 3231, 3232, 5, 40, 0, 0, 3232, 3233, 5, 35, 0, 0, 3233, 3235, 1, 0, 0, 0, 3234, 3236, 3, 34, 14, 0, 3235, 3234, 1, 0, 0, 0, 3235, 3236, 1, 0, 0, 0, 3236, 3240, 1, 0, 0, 0, 3237, 3238, 3, 374, 184, 0, 3238, 3239, 5, 58, 0, 0, 3239, 3241, 1, 0, 0, 0, 3240, 3237, 1, 0, 0, 0, 3240, 3241, 1, 0, 0, 0, 3241, 3242, 1, 0, 0, 0, 3242, 3250, 3, 374, 184, 0, 3243, 3247, 3, 34, 14, 0, 3244, 3246, 9, 0, 0, 0, 3245, 3244, 1, 0, 0, 0, 3246, 3249, 1, 0, 0, 0, 3247, 3248, 1, 0, 0, 0, 3247, 3245, 1, 0, 0, 0, 3248, 3251, 1, 0, 0, 0, 3249, 3247, 1, 0, 0, 0, 3250, 3243, 1, 0, 0, 0, 3250, 3251, 1, 0, 0, 0, 3251, 3252, 1, 0, 0, 0, 3252, 3253, 5, 35, 0, 0, 3253, 3254, 5, 41, 0, 0, 3254, 3255, 1, 0, 0, 0, 3255, 3256, 6, 232, 29, 0, 3256, 471, 1, 0, 0, 0, 3257, 3259, 7, 8, 0, 0, 3258, 3257, 1, 0, 0, 0, 3259, 3260, 1, 0, 0, 0, 3260, 3258, 1, 0, 0, 0, 3260, 3261, 1, 0, 0, 0, 3261, 3262, 1, 0, 0, 0, 3262, 3263, 6, 233, 2, 0, 3263, 3264, 6, 233, 30, 0, 3264, 473, 1, 0, 0, 0, 3265, 3266, 5, 61, 0, 0, 3266, 3267, 1, 0, 0, 0, 3267, 3268, 6, 234, 31, 0, 3268, 475, 1, 0, 0, 0, 3269, 3270, 5, 33, 0, 0, 3270, 3271, 5, 61, 0, 0, 3271, 3272, 1, 0, 0, 0, 3272, 3273, 6, 235, 32, 0, 3273, 477, 1, 0, 0, 0, 3274, 3275, 5, 40, 0, 0, 3275, 3276, 1, 0, 0, 0, 3276, 3277, 6, 236, 33, 0, 3277, 479, 1, 0, 0, 0, 3278, 3279, 5, 41, 0, 0, 3279, 3280, 1, 0, 0, 0, 3280, 3281, 6, 237, 34, 0, 3281, 481, 1, 0, 0, 0, 3282, 3283, 5, 91, 0, 0, 3283, 3284, 1, 0, 0, 0, 3284, 3285, 6, 238, 35, 0, 3285, 483, 1, 0, 0, 0, 3286, 3287, 5, 93, 0, 0, 3287, 3288, 1, 0, 0, 0, 3288, 3289, 6, 239, 6, 0, 3289, 485, 1, 0, 0, 0, 3290, 3291, 5, 123, 0, 0, 3291, 3292, 6, 240, 36, 0, 3292, 3293, 1, 0, 0, 0, 3293, 3294, 6, 240, 7, 0, 3294, 487, 1, 0, 0, 0, 3295, 3296, 4, 241, 0, 0, 3296, 3297, 5, 125, 0, 0, 3297, 3298, 1, 0, 0, 0, 3298, 3299, 6, 241, 14, 0, 3299, 3300, 6, 241, 4, 0, 3300, 489, 1, 0, 0, 0, 3301, 3302, 4, 242, 1, 0, 3302, 3303, 5, 125, 0, 0, 3303, 3304, 6, 242, 37, 0, 3304, 3305, 1, 0, 0, 0, 3305, 3306, 6, 242, 14, 0, 3306, 491, 1, 0, 0, 0, 3307, 3308, 5, 42, 0, 0, 3308, 3309, 1, 0, 0, 0, 3309, 3310, 6, 243, 38, 0, 3310, 493, 1, 0, 0, 0, 3311, 3312, 5, 43, 0, 0, 3312, 3313, 1, 0, 0, 0, 3313, 3314, 6, 244, 39, 0, 3314, 495, 1, 0, 0, 0, 3315, 3316, 5, 45, 0, 0, 3316, 3317, 1, 0, 0, 0, 3317, 3318, 6, 245, 40, 0, 3318, 497, 1, 0, 0, 0, 3319, 3320, 5, 44, 0, 0, 3320, 3321, 1, 0, 0, 0, 3321, 3322, 6, 246, 41, 0, 3322, 499, 1, 0, 0, 0, 3323, 3324, 5, 46, 0, 0, 3324, 3325, 1, 0, 0, 0, 3325, 3326, 6, 247, 42, 0, 3326, 501, 1, 0, 0, 0, 3327, 3328, 5, 46, 0, 0, 3328, 3329, 5, 46, 0, 0, 3329, 3330, 1, 0, 0, 0, 3330, 3331, 6, 248, 43, 0, 3331, 503, 1, 0, 0, 0, 3332, 3333, 5, 58, 0, 0, 3333, 3334, 1, 0, 0, 0, 3334, 3335, 6, 249, 44, 0, 3335, 505, 1, 0, 0, 0, 3336, 3337, 5, 58, 0, 0, 3337, 3338, 5, 61, 0, 0, 3338, 3339, 1, 0, 0, 0, 3339, 3340, 6, 250, 45, 0, 3340, 507, 1, 0, 0, 0, 3341, 3342, 5, 59, 0, 0, 3342, 3343, 1, 0, 0, 0, 3343, 3344, 6, 251, 46, 0, 3344, 509, 1, 0, 0, 0, 3345, 3346, 5, 47, 0, 0, 3346, 3347, 1, 0, 0, 0, 3347, 3348, 6, 252, 47, 0, 3348, 511, 1, 0, 0, 0, 3349, 3350, 5, 47, 0, 0, 3350, 3351, 5, 47, 0, 0, 3351, 3352, 1, 0, 0, 0, 3352, 3353, 6, 253, 48, 0, 3353, 513, 1, 0, 0, 0, 3354, 3355, 5, 92, 0, 0, 3355, 3356, 1, 0, 0, 0, 3356, 3357, 6, 254, 49, 0, 3357, 515, 1, 0, 0, 0, 3358, 3359, 5, 124, 0, 0, 3359, 3360, 1, 0, 0, 0, 3360, 3361, 6, 255, 50, 0, 3361, 517, 1, 0, 0, 0, 3362, 3363, 5, 60, 0, 0, 3363, 3364, 1, 0, 0, 0, 3364, 3365, 6, 256, 51, 0, 3365, 519, 1, 0, 0, 0, 3366, 3367, 5, 62, 0, 0, 3367, 3368, 1, 0, 0, 0, 3368, 3369, 6, 257, 52, 0, 3369, 521, 1, 0, 0, 0, 3370, 3371, 5, 63, 0, 0, 3371, 3372, 1, 0, 0, 0, 3372, 3373, 6, 258, 53, 0, 3373, 523, 1, 0, 0, 0, 3374, 3375, 5, 64, 0, 0, 3375, 3376, 1, 0, 0, 0, 3376, 3377, 6, 259, 54, 0, 3377, 525, 1, 0, 0, 0, 3378, 3379, 5, 36, 0, 0, 3379, 3380, 1, 0, 0, 0, 3380, 3381, 6, 260, 55, 0, 3381, 527, 1, 0, 0, 0, 3382, 3383, 5, 37, 0, 0, 3383, 3384, 1, 0, 0, 0, 3384, 3385, 6, 261, 56, 0, 3385, 529, 1, 0, 0, 0, 3386, 3387, 5, 33, 0, 0, 3387, 3388, 1, 0, 0, 0, 3388, 3389, 6, 262, 57, 0, 3389, 531, 1, 0, 0, 0, 3390, 3391, 5, 35, 0, 0, 3391, 3392, 1, 0, 0, 0, 3392, 3393, 6, 263, 58, 0, 3393, 533, 1, 0, 0, 0, 3394, 3395, 5, 94, 0, 0, 3395, 3396, 1, 0, 0, 0, 3396, 3397, 6, 264, 59, 0, 3397, 535, 1, 0, 0, 0, 3398, 3399, 5, 61, 0, 0, 3399, 3400, 5, 62, 0, 0, 3400, 3401, 1, 0, 0, 0, 3401, 3402, 6, 265, 60, 0, 3402, 537, 1, 0, 0, 0, 3403, 3404, 5, 96, 0, 0, 3404, 3405, 1, 0, 0, 0, 3405, 3406, 6, 266, 5, 0, 3406, 539, 1, 0, 0, 0, 3407, 3408, 5, 124, 0, 0, 3408, 3409, 5, 124, 0, 0, 3409, 3410, 1, 0, 0, 0, 3410, 3411, 6, 267, 61, 0, 3411, 541, 1, 0, 0, 0, 3412, 3413, 5, 126, 0, 0, 3413, 3414, 1, 0, 0, 0, 3414, 3415, 6, 268, 62, 0, 3415, 543, 1, 0, 0, 0, 3416, 3417, 5, 97, 0, 0, 3417, 3418, 5, 108, 0, 0, 3418, 3419, 5, 108, 0, 0, 3419, 3420, 5, 111, 0, 0, 3420, 3421, 5, 119, 0, 0, 3421, 3422, 5, 105, 0, 0, 3422, 3423, 5, 110, 0, 0, 3423, 3424, 5, 103, 0, 0, 3424, 3425, 1, 0, 0, 0, 3425, 3426, 6, 269, 63, 0, 3426, 545, 1, 0, 0, 0, 3427, 3428, 5, 97, 0, 0, 3428, 3429, 5, 110, 0, 0, 3429, 3430, 5, 99, 0, 0, 3430, 3431, 5, 101, 0, 0, 3431, 3432, 5, 115, 0, 0, 3432, 3433, 5, 116, 0, 0, 3433, 3434, 5, 111, 0, 0, 3434, 3435, 5, 114, 0, 0, 3435, 3436, 1, 0, 0, 0, 3436, 3437, 6, 270, 64, 0, 3437, 547, 1, 0, 0, 0, 3438, 3439, 5, 97, 0, 0, 3439, 3440, 5, 110, 0, 0, 3440, 3441, 5, 99, 0, 0, 3441, 3442, 5, 101, 0, 0, 3442, 3443, 5, 115, 0, 0, 3443, 3444, 5, 116, 0, 0, 3444, 3445, 5, 111, 0, 0, 3445, 3446, 5, 114, 0, 0, 3446, 3447, 5, 45, 0, 0, 3447, 3448, 5, 111, 0, 0, 3448, 3449, 5, 114, 0, 0, 3449, 3450, 5, 45, 0, 0, 3450, 3451, 5, 115, 0, 0, 3451, 3452, 5, 101, 0, 0, 3452, 3453, 5, 108, 0, 0, 3453, 3454, 5, 102, 0, 0, 3454, 3455, 1, 0, 0, 0, 3455, 3456, 6, 271, 65, 0, 3456, 549, 1, 0, 0, 0, 3457, 3458, 5, 97, 0, 0, 3458, 3459, 5, 110, 0, 0, 3459, 3460, 5, 100, 0, 0, 3460, 3461, 1, 0, 0, 0, 3461, 3462, 6, 272, 66, 0, 3462, 551, 1, 0, 0, 0, 3463, 3464, 5, 97, 0, 0, 3464, 3465, 5, 114, 0, 0, 3465, 3466, 5, 114, 0, 0, 3466, 3467, 5, 97, 0, 0, 3467, 3468, 5, 121, 0, 0, 3468, 3469, 1, 0, 0, 0, 3469, 3470, 6, 273, 67, 0, 3470, 553, 1, 0, 0, 0, 3471, 3472, 5, 97, 0, 0, 3472, 3473, 5, 115, 0, 0, 3473, 3474, 1, 0, 0, 0, 3474, 3475, 6, 274, 68, 0, 3475, 555, 1, 0, 0, 0, 3476, 3477, 5, 97, 0, 0, 3477, 3478, 5, 115, 0, 0, 3478, 3479, 5, 99, 0, 0, 3479, 3480, 5, 101, 0, 0, 3480, 3481, 5, 110, 0, 0, 3481, 3482, 5, 100, 0, 0, 3482, 3483, 5, 105, 0, 0, 3483, 3484, 5, 110, 0, 0, 3484, 3485, 5, 103, 0, 0, 3485, 3486, 1, 0, 0, 0, 3486, 3487, 6, 275, 69, 0, 3487, 557, 1, 0, 0, 0, 3488, 3489, 5, 97, 0, 0, 3489, 3490, 5, 116, 0, 0, 3490, 3491, 1, 0, 0, 0, 3491, 3492, 6, 276, 70, 0, 3492, 559, 1, 0, 0, 0, 3493, 3494, 5, 97, 0, 0, 3494, 3495, 5, 116, 0, 0, 3495, 3496, 5, 116, 0, 0, 3496, 3497, 5, 114, 0, 0, 3497, 3498, 5, 105, 0, 0, 3498, 3499, 5, 98, 0, 0, 3499, 3500, 5, 117, 0, 0, 3500, 3501, 5, 116, 0, 0, 3501, 3502, 5, 101, 0, 0, 3502, 3503, 1, 0, 0, 0, 3503, 3504, 6, 277, 71, 0, 3504, 561, 1, 0, 0, 0, 3505, 3506, 5, 98, 0, 0, 3506, 3507, 5, 97, 0, 0, 3507, 3508, 5, 115, 0, 0, 3508, 3509, 5, 101, 0, 0, 3509, 3510, 5, 45, 0, 0, 3510, 3511, 5, 117, 0, 0, 3511, 3512, 5, 114, 0, 0, 3512, 3513, 5, 105, 0, 0, 3513, 3514, 1, 0, 0, 0, 3514, 3515, 6, 278, 72, 0, 3515, 563, 1, 0, 0, 0, 3516, 3517, 5, 98, 0, 0, 3517, 3518, 5, 111, 0, 0, 3518, 3519, 5, 117, 0, 0, 3519, 3520, 5, 110, 0, 0, 3520, 3521, 5, 100, 0, 0, 3521, 3522, 5, 97, 0, 0, 3522, 3523, 5, 114, 0, 0, 3523, 3524, 5, 121, 0, 0, 3524, 3525, 5, 45, 0, 0, 3525, 3526, 5, 115, 0, 0, 3526, 3527, 5, 112, 0, 0, 3527, 3528, 5, 97, 0, 0, 3528, 3529, 5, 99, 0, 0, 3529, 3530, 5, 101, 0, 0, 3530, 3531, 1, 0, 0, 0, 3531, 3532, 6, 279, 73, 0, 3532, 565, 1, 0, 0, 0, 3533, 3534, 5, 98, 0, 0, 3534, 3535, 5, 105, 0, 0, 3535, 3536, 5, 110, 0, 0, 3536, 3537, 5, 97, 0, 0, 3537, 3538, 5, 114, 0, 0, 3538, 3539, 5, 121, 0, 0, 3539, 3540, 1, 0, 0, 0, 3540, 3541, 6, 280, 74, 0, 3541, 567, 1, 0, 0, 0, 3542, 3543, 5, 98, 0, 0, 3543, 3544, 5, 121, 0, 0, 3544, 3545, 1, 0, 0, 0, 3545, 3546, 6, 281, 75, 0, 3546, 569, 1, 0, 0, 0, 3547, 3548, 5, 99, 0, 0, 3548, 3549, 5, 97, 0, 0, 3549, 3550, 5, 115, 0, 0, 3550, 3551, 5, 101, 0, 0, 3551, 3552, 1, 0, 0, 0, 3552, 3553, 6, 282, 76, 0, 3553, 571, 1, 0, 0, 0, 3554, 3555, 5, 99, 0, 0, 3555, 3556, 5, 97, 0, 0, 3556, 3557, 5, 115, 0, 0, 3557, 3558, 5, 116, 0, 0, 3558, 3559, 1, 0, 0, 0, 3559, 3560, 6, 283, 77, 0, 3560, 573, 1, 0, 0, 0, 3561, 3562, 5, 99, 0, 0, 3562, 3563, 5, 97, 0, 0, 3563, 3564, 5, 115, 0, 0, 3564, 3565, 5, 116, 0, 0, 3565, 3566, 5, 97, 0, 0, 3566, 3567, 5, 98, 0, 0, 3567, 3568, 5, 108, 0, 0, 3568, 3569, 5, 101, 0, 0, 3569, 3570, 1, 0, 0, 0, 3570, 3571, 6, 284, 78, 0, 3571, 575, 1, 0, 0, 0, 3572, 3573, 5, 99, 0, 0, 3573, 3574, 5, 97, 0, 0, 3574, 3575, 5, 116, 0, 0, 3575, 3576, 5, 99, 0, 0, 3576, 3577, 5, 104, 0, 0, 3577, 3578, 1, 0, 0, 0, 3578, 3579, 6, 285, 79, 0, 3579, 577, 1, 0, 0, 0, 3580, 3581, 5, 99, 0, 0, 3581, 3582, 5, 104, 0, 0, 3582, 3583, 5, 105, 0, 0, 3583, 3584, 5, 108, 0, 0, 3584, 3585, 5, 100, 0, 0, 3585, 3586, 1, 0, 0, 0, 3586, 3587, 6, 286, 80, 0, 3587, 579, 1, 0, 0, 0, 3588, 3589, 5, 99, 0, 0, 3589, 3590, 5, 111, 0, 0, 3590, 3591, 5, 108, 0, 0, 3591, 3592, 5, 108, 0, 0, 3592, 3593, 5, 97, 0, 0, 3593, 3594, 5, 116, 0, 0, 3594, 3595, 5, 105, 0, 0, 3595, 3596, 5, 111, 0, 0, 3596, 3597, 5, 110, 0, 0, 3597, 3598, 1, 0, 0, 0, 3598, 3599, 6, 287, 81, 0, 3599, 581, 1, 0, 0, 0, 3600, 3601, 5, 99, 0, 0, 3601, 3602, 5, 111, 0, 0, 3602, 3603, 5, 109, 0, 0, 3603, 3604, 5, 109, 0, 0, 3604, 3605, 5, 101, 0, 0, 3605, 3606, 5, 110, 0, 0, 3606, 3607, 5, 116, 0, 0, 3607, 3608, 1, 0, 0, 0, 3608, 3609, 6, 288, 82, 0, 3609, 583, 1, 0, 0, 0, 3610, 3611, 5, 99, 0, 0, 3611, 3612, 5, 111, 0, 0, 3612, 3613, 5, 110, 0, 0, 3613, 3614, 5, 115, 0, 0, 3614, 3615, 5, 116, 0, 0, 3615, 3616, 5, 114, 0, 0, 3616, 3617, 5, 117, 0, 0, 3617, 3618, 5, 99, 0, 0, 3618, 3619, 5, 116, 0, 0, 3619, 3620, 5, 105, 0, 0, 3620, 3621, 5, 111, 0, 0, 3621, 3622, 5, 110, 0, 0, 3622, 3623, 1, 0, 0, 0, 3623, 3624, 6, 289, 83, 0, 3624, 585, 1, 0, 0, 0, 3625, 3626, 5, 99, 0, 0, 3626, 3627, 5, 111, 0, 0, 3627, 3628, 5, 110, 0, 0, 3628, 3629, 5, 116, 0, 0, 3629, 3630, 5, 101, 0, 0, 3630, 3631, 5, 120, 0, 0, 3631, 3632, 5, 116, 0, 0, 3632, 3633, 1, 0, 0, 0, 3633, 3634, 6, 290, 84, 0, 3634, 587, 1, 0, 0, 0, 3635, 3636, 5, 99, 0, 0, 3636, 3637, 5, 111, 0, 0, 3637, 3638, 5, 112, 0, 0, 3638, 3639, 5, 121, 0, 0, 3639, 3640, 5, 45, 0, 0, 3640, 3641, 5, 110, 0, 0, 3641, 3642, 5, 97, 0, 0, 3642, 3643, 5, 109, 0, 0, 3643, 3644, 5, 101, 0, 0, 3644, 3645, 5, 115, 0, 0, 3645, 3646, 5, 112, 0, 0, 3646, 3647, 5, 97, 0, 0, 3647, 3648, 5, 99, 0, 0, 3648, 3649, 5, 101, 0, 0, 3649, 3650, 5, 115, 0, 0, 3650, 3651, 1, 0, 0, 0, 3651, 3652, 6, 291, 85, 0, 3652, 589, 1, 0, 0, 0, 3653, 3654, 5, 99, 0, 0, 3654, 3655, 5, 111, 0, 0, 3655, 3656, 5, 117, 0, 0, 3656, 3657, 5, 110, 0, 0, 3657, 3658, 5, 116, 0, 0, 3658, 3659, 1, 0, 0, 0, 3659, 3660, 6, 292, 86, 0, 3660, 591, 1, 0, 0, 0, 3661, 3662, 5, 100, 0, 0, 3662, 3663, 5, 101, 0, 0, 3663, 3664, 5, 99, 0, 0, 3664, 3665, 5, 108, 0, 0, 3665, 3666, 5, 97, 0, 0, 3666, 3667, 5, 114, 0, 0, 3667, 3668, 5, 101, 0, 0, 3668, 3669, 1, 0, 0, 0, 3669, 3670, 6, 293, 87, 0, 3670, 593, 1, 0, 0, 0, 3671, 3672, 5, 100, 0, 0, 3672, 3673, 5, 101, 0, 0, 3673, 3674, 5, 102, 0, 0, 3674, 3675, 5, 97, 0, 0, 3675, 3676, 5, 117, 0, 0, 3676, 3677, 5, 108, 0, 0, 3677, 3678, 5, 116, 0, 0, 3678, 3679, 1, 0, 0, 0, 3679, 3680, 6, 294, 88, 0, 3680, 595, 1, 0, 0, 0, 3681, 3682, 5, 100, 0, 0, 3682, 3683, 5, 101, 0, 0, 3683, 3684, 5, 115, 0, 0, 3684, 3685, 5, 99, 0, 0, 3685, 3686, 5, 101, 0, 0, 3686, 3687, 5, 110, 0, 0, 3687, 3688, 5, 100, 0, 0, 3688, 3689, 5, 97, 0, 0, 3689, 3690, 5, 110, 0, 0, 3690, 3691, 5, 116, 0, 0, 3691, 3692, 1, 0, 0, 0, 3692, 3693, 6, 295, 89, 0, 3693, 597, 1, 0, 0, 0, 3694, 3695, 5, 100, 0, 0, 3695, 3696, 5, 101, 0, 0, 3696, 3697, 5, 115, 0, 0, 3697, 3698, 5, 99, 0, 0, 3698, 3699, 5, 101, 0, 0, 3699, 3700, 5, 110, 0, 0, 3700, 3701, 5, 100, 0, 0, 3701, 3702, 5, 97, 0, 0, 3702, 3703, 5, 110, 0, 0, 3703, 3704, 5, 116, 0, 0, 3704, 3705, 5, 45, 0, 0, 3705, 3706, 5, 111, 0, 0, 3706, 3707, 5, 114, 0, 0, 3707, 3708, 5, 45, 0, 0, 3708, 3709, 5, 115, 0, 0, 3709, 3710, 5, 101, 0, 0, 3710, 3711, 5, 108, 0, 0, 3711, 3712, 5, 102, 0, 0, 3712, 3713, 1, 0, 0, 0, 3713, 3714, 6, 296, 90, 0, 3714, 599, 1, 0, 0, 0, 3715, 3716, 5, 100, 0, 0, 3716, 3717, 5, 101, 0, 0, 3717, 3718, 5, 115, 0, 0, 3718, 3719, 5, 99, 0, 0, 3719, 3720, 5, 101, 0, 0, 3720, 3721, 5, 110, 0, 0, 3721, 3722, 5, 100, 0, 0, 3722, 3723, 5, 105, 0, 0, 3723, 3724, 5, 110, 0, 0, 3724, 3725, 5, 103, 0, 0, 3725, 3726, 1, 0, 0, 0, 3726, 3727, 6, 297, 91, 0, 3727, 601, 1, 0, 0, 0, 3728, 3729, 5, 100, 0, 0, 3729, 3730, 5, 101, 0, 0, 3730, 3731, 5, 99, 0, 0, 3731, 3732, 5, 105, 0, 0, 3732, 3733, 5, 109, 0, 0, 3733, 3734, 5, 97, 0, 0, 3734, 3735, 5, 108, 0, 0, 3735, 3736, 5, 45, 0, 0, 3736, 3737, 5, 102, 0, 0, 3737, 3738, 5, 111, 0, 0, 3738, 3739, 5, 114, 0, 0, 3739, 3740, 5, 109, 0, 0, 3740, 3741, 5, 97, 0, 0, 3741, 3742, 5, 116, 0, 0, 3742, 3743, 1, 0, 0, 0, 3743, 3744, 6, 298, 92, 0, 3744, 603, 1, 0, 0, 0, 3745, 3746, 5, 100, 0, 0, 3746, 3747, 5, 105, 0, 0, 3747, 3748, 5, 118, 0, 0, 3748, 3749, 1, 0, 0, 0, 3749, 3750, 6, 299, 93, 0, 3750, 605, 1, 0, 0, 0, 3751, 3752, 5, 100, 0, 0, 3752, 3753, 5, 111, 0, 0, 3753, 3754, 5, 99, 0, 0, 3754, 3755, 5, 117, 0, 0, 3755, 3756, 5, 109, 0, 0, 3756, 3757, 5, 101, 0, 0, 3757, 3758, 5, 110, 0, 0, 3758, 3759, 5, 116, 0, 0, 3759, 3760, 1, 0, 0, 0, 3760, 3761, 6, 300, 94, 0, 3761, 607, 1, 0, 0, 0, 3762, 3763, 5, 100, 0, 0, 3763, 3764, 5, 111, 0, 0, 3764, 3765, 5, 99, 0, 0, 3765, 3766, 5, 117, 0, 0, 3766, 3767, 5, 109, 0, 0, 3767, 3768, 5, 101, 0, 0, 3768, 3769, 5, 110, 0, 0, 3769, 3770, 5, 116, 0, 0, 3770, 3771, 5, 45, 0, 0, 3771, 3772, 5, 110, 0, 0, 3772, 3773, 5, 111, 0, 0, 3773, 3774, 5, 100, 0, 0, 3774, 3775, 5, 101, 0, 0, 3775, 3776, 1, 0, 0, 0, 3776, 3777, 6, 301, 95, 0, 3777, 609, 1, 0, 0, 0, 3778, 3779, 5, 101, 0, 0, 3779, 3780, 5, 108, 0, 0, 3780, 3781, 5, 101, 0, 0, 3781, 3782, 5, 109, 0, 0, 3782, 3783, 5, 101, 0, 0, 3783, 3784, 5, 110, 0, 0, 3784, 3785, 5, 116, 0, 0, 3785, 3786, 1, 0, 0, 0, 3786, 3787, 6, 302, 96, 0, 3787, 611, 1, 0, 0, 0, 3788, 3789, 5, 101, 0, 0, 3789, 3790, 5, 108, 0, 0, 3790, 3791, 5, 115, 0, 0, 3791, 3792, 5, 101, 0, 0, 3792, 3793, 1, 0, 0, 0, 3793, 3794, 6, 303, 97, 0, 3794, 613, 1, 0, 0, 0, 3795, 3796, 5, 101, 0, 0, 3796, 3797, 5, 109, 0, 0, 3797, 3798, 5, 112, 0, 0, 3798, 3799, 5, 116, 0, 0, 3799, 3800, 5, 121, 0, 0, 3800, 3801, 1, 0, 0, 0, 3801, 3802, 6, 304, 98, 0, 3802, 615, 1, 0, 0, 0, 3803, 3804, 5, 101, 0, 0, 3804, 3805, 5, 109, 0, 0, 3805, 3806, 5, 112, 0, 0, 3806, 3807, 5, 116, 0, 0, 3807, 3808, 5, 121, 0, 0, 3808, 3809, 5, 45, 0, 0, 3809, 3810, 5, 115, 0, 0, 3810, 3811, 5, 101, 0, 0, 3811, 3812, 5, 113, 0, 0, 3812, 3813, 5, 117, 0, 0, 3813, 3814, 5, 101, 0, 0, 3814, 3815, 5, 110, 0, 0, 3815, 3816, 5, 99, 0, 0, 3816, 3817, 5, 101, 0, 0, 3817, 3818, 1, 0, 0, 0, 3818, 3819, 6, 305, 99, 0, 3819, 617, 1, 0, 0, 0, 3820, 3821, 5, 101, 0, 0, 3821, 3822, 5, 110, 0, 0, 3822, 3823, 5, 99, 0, 0, 3823, 3824, 5, 111, 0, 0, 3824, 3825, 5, 100, 0, 0, 3825, 3826, 5, 105, 0, 0, 3826, 3827, 5, 110, 0, 0, 3827, 3828, 5, 103, 0, 0, 3828, 3829, 1, 0, 0, 0, 3829, 3830, 6, 306, 100, 0, 3830, 619, 1, 0, 0, 0, 3831, 3832, 5, 101, 0, 0, 3832, 3833, 5, 110, 0, 0, 3833, 3834, 5, 100, 0, 0, 3834, 3835, 1, 0, 0, 0, 3835, 3836, 6, 307, 101, 0, 3836, 621, 1, 0, 0, 0, 3837, 3838, 5, 101, 0, 0, 3838, 3839, 5, 113, 0, 0, 3839, 3840, 1, 0, 0, 0, 3840, 3841, 6, 308, 102, 0, 3841, 623, 1, 0, 0, 0, 3842, 3843, 5, 101, 0, 0, 3843, 3844, 5, 118, 0, 0, 3844, 3845, 5, 101, 0, 0, 3845, 3846, 5, 114, 0, 0, 3846, 3847, 5, 121, 0, 0, 3847, 3848, 1, 0, 0, 0, 3848, 3849, 6, 309, 103, 0, 3849, 625, 1, 0, 0, 0, 3850, 3851, 5, 101, 0, 0, 3851, 3852, 5, 120, 0, 0, 3852, 3853, 5, 99, 0, 0, 3853, 3854, 5, 101, 0, 0, 3854, 3855, 5, 112, 0, 0, 3855, 3856, 5, 116, 0, 0, 3856, 3857, 1, 0, 0, 0, 3857, 3858, 6, 310, 104, 0, 3858, 627, 1, 0, 0, 0, 3859, 3860, 5, 101, 0, 0, 3860, 3861, 5, 120, 0, 0, 3861, 3862, 5, 116, 0, 0, 3862, 3863, 5, 101, 0, 0, 3863, 3864, 5, 114, 0, 0, 3864, 3865, 5, 110, 0, 0, 3865, 3866, 5, 97, 0, 0, 3866, 3867, 5, 108, 0, 0, 3867, 3868, 1, 0, 0, 0, 3868, 3869, 6, 311, 105, 0, 3869, 629, 1, 0, 0, 0, 3870, 3871, 5, 102, 0, 0, 3871, 3872, 5, 111, 0, 0, 3872, 3873, 5, 108, 0, 0, 3873, 3874, 5, 108, 0, 0, 3874, 3875, 5, 111, 0, 0, 3875, 3876, 5, 119, 0, 0, 3876, 3877, 5, 105, 0, 0, 3877, 3878, 5, 110, 0, 0, 3878, 3879, 5, 103, 0, 0, 3879, 3880, 1, 0, 0, 0, 3880, 3881, 6, 312, 106, 0, 3881, 631, 1, 0, 0, 0, 3882, 3883, 5, 102, 0, 0, 3883, 3884, 5, 111, 0, 0, 3884, 3885, 5, 108, 0, 0, 3885, 3886, 5, 108, 0, 0, 3886, 3887, 5, 111, 0, 0, 3887, 3888, 5, 119, 0, 0, 3888, 3889, 5, 105, 0, 0, 3889, 3890, 5, 110, 0, 0, 3890, 3891, 5, 103, 0, 0, 3891, 3892, 5, 45, 0, 0, 3892, 3893, 5, 115, 0, 0, 3893, 3894, 5, 105, 0, 0, 3894, 3895, 5, 98, 0, 0, 3895, 3896, 5, 108, 0, 0, 3896, 3897, 5, 105, 0, 0, 3897, 3898, 5, 110, 0, 0, 3898, 3899, 5, 103, 0, 0, 3899, 3900, 1, 0, 0, 0, 3900, 3901, 6, 313, 107, 0, 3901, 633, 1, 0, 0, 0, 3902, 3903, 5, 102, 0, 0, 3903, 3904, 5, 111, 0, 0, 3904, 3905, 5, 114, 0, 0, 3905, 3906, 1, 0, 0, 0, 3906, 3907, 6, 314, 108, 0, 3907, 635, 1, 0, 0, 0, 3908, 3909, 5, 102, 0, 0, 3909, 3910, 5, 117, 0, 0, 3910, 3911, 5, 110, 0, 0, 3911, 3912, 5, 99, 0, 0, 3912, 3913, 5, 116, 0, 0, 3913, 3914, 5, 105, 0, 0, 3914, 3915, 5, 111, 0, 0, 3915, 3916, 5, 110, 0, 0, 3916, 3917, 1, 0, 0, 0, 3917, 3918, 6, 315, 109, 0, 3918, 637, 1, 0, 0, 0, 3919, 3920, 5, 103, 0, 0, 3920, 3921, 5, 101, 0, 0, 3921, 3922, 1, 0, 0, 0, 3922, 3923, 6, 316, 110, 0, 3923, 639, 1, 0, 0, 0, 3924, 3925, 5, 103, 0, 0, 3925, 3926, 5, 114, 0, 0, 3926, 3927, 5, 101, 0, 0, 3927, 3928, 5, 97, 0, 0, 3928, 3929, 5, 116, 0, 0, 3929, 3930, 5, 101, 0, 0, 3930, 3931, 5, 115, 0, 0, 3931, 3932, 5, 116, 0, 0, 3932, 3933, 1, 0, 0, 0, 3933, 3934, 6, 317, 111, 0, 3934, 641, 1, 0, 0, 0, 3935, 3936, 5, 103, 0, 0, 3936, 3937, 5, 114, 0, 0, 3937, 3938, 5, 111, 0, 0, 3938, 3939, 5, 117, 0, 0, 3939, 3940, 5, 112, 0, 0, 3940, 3941, 1, 0, 0, 0, 3941, 3942, 6, 318, 112, 0, 3942, 643, 1, 0, 0, 0, 3943, 3944, 5, 103, 0, 0, 3944, 3945, 5, 116, 0, 0, 3945, 3946, 1, 0, 0, 0, 3946, 3947, 6, 319, 113, 0, 3947, 645, 1, 0, 0, 0, 3948, 3949, 5, 105, 0, 0, 3949, 3950, 5, 100, 0, 0, 3950, 3951, 5, 105, 0, 0, 3951, 3952, 5, 118, 0, 0, 3952, 3953, 1, 0, 0, 0, 3953, 3954, 6, 320, 114, 0, 3954, 647, 1, 0, 0, 0, 3955, 3956, 5, 105, 0, 0, 3956, 3957, 5, 102, 0, 0, 3957, 3958, 1, 0, 0, 0, 3958, 3959, 6, 321, 115, 0, 3959, 649, 1, 0, 0, 0, 3960, 3961, 5, 105, 0, 0, 3961, 3962, 5, 109, 0, 0, 3962, 3963, 5, 112, 0, 0, 3963, 3964, 5, 111, 0, 0, 3964, 3965, 5, 114, 0, 0, 3965, 3966, 5, 116, 0, 0, 3966, 3967, 1, 0, 0, 0, 3967, 3968, 6, 322, 116, 0, 3968, 651, 1, 0, 0, 0, 3969, 3970, 5, 105, 0, 0, 3970, 3971, 5, 110, 0, 0, 3971, 3972, 1, 0, 0, 0, 3972, 3973, 6, 323, 117, 0, 3973, 653, 1, 0, 0, 0, 3974, 3975, 5, 105, 0, 0, 3975, 3976, 5, 110, 0, 0, 3976, 3977, 5, 104, 0, 0, 3977, 3978, 5, 101, 0, 0, 3978, 3979, 5, 114, 0, 0, 3979, 3980, 5, 105, 0, 0, 3980, 3981, 5, 116, 0, 0, 3981, 3982, 1, 0, 0, 0, 3982, 3983, 6, 324, 118, 0, 3983, 655, 1, 0, 0, 0, 3984, 3985, 5, 105, 0, 0, 3985, 3986, 5, 110, 0, 0, 3986, 3987, 5, 115, 0, 0, 3987, 3988, 5, 116, 0, 0, 3988, 3989, 5, 97, 0, 0, 3989, 3990, 5, 110, 0, 0, 3990, 3991, 5, 99, 0, 0, 3991, 3992, 5, 101, 0, 0, 3992, 3993, 1, 0, 0, 0, 3993, 3994, 6, 325, 119, 0, 3994, 657, 1, 0, 0, 0, 3995, 3996, 5, 105, 0, 0, 3996, 3997, 5, 110, 0, 0, 3997, 3998, 5, 116, 0, 0, 3998, 3999, 5, 101, 0, 0, 3999, 4000, 5, 114, 0, 0, 4000, 4001, 5, 115, 0, 0, 4001, 4002, 5, 101, 0, 0, 4002, 4003, 5, 99, 0, 0, 4003, 4004, 5, 116, 0, 0, 4004, 4005, 1, 0, 0, 0, 4005, 4006, 6, 326, 120, 0, 4006, 659, 1, 0, 0, 0, 4007, 4008, 5, 105, 0, 0, 4008, 4009, 5, 115, 0, 0, 4009, 4010, 1, 0, 0, 0, 4010, 4011, 6, 327, 121, 0, 4011, 661, 1, 0, 0, 0, 4012, 4013, 5, 105, 0, 0, 4013, 4014, 5, 116, 0, 0, 4014, 4015, 5, 101, 0, 0, 4015, 4016, 5, 109, 0, 0, 4016, 4017, 1, 0, 0, 0, 4017, 4018, 6, 328, 122, 0, 4018, 663, 1, 0, 0, 0, 4019, 4020, 5, 108, 0, 0, 4020, 4021, 5, 97, 0, 0, 4021, 4022, 5, 120, 0, 0, 4022, 4023, 1, 0, 0, 0, 4023, 4024, 6, 329, 123, 0, 4024, 665, 1, 0, 0, 0, 4025, 4026, 5, 108, 0, 0, 4026, 4027, 5, 101, 0, 0, 4027, 4028, 1, 0, 0, 0, 4028, 4029, 6, 330, 124, 0, 4029, 667, 1, 0, 0, 0, 4030, 4031, 5, 108, 0, 0, 4031, 4032, 5, 101, 0, 0, 4032, 4033, 5, 97, 0, 0, 4033, 4034, 5, 115, 0, 0, 4034, 4035, 5, 116, 0, 0, 4035, 4036, 1, 0, 0, 0, 4036, 4037, 6, 331, 125, 0, 4037, 669, 1, 0, 0, 0, 4038, 4039, 5, 108, 0, 0, 4039, 4040, 5, 101, 0, 0, 4040, 4041, 5, 116, 0, 0, 4041, 4042, 1, 0, 0, 0, 4042, 4043, 6, 332, 126, 0, 4043, 671, 1, 0, 0, 0, 4044, 4045, 5, 108, 0, 0, 4045, 4046, 5, 116, 0, 0, 4046, 4047, 1, 0, 0, 0, 4047, 4048, 6, 333, 127, 0, 4048, 673, 1, 0, 0, 0, 4049, 4050, 5, 109, 0, 0, 4050, 4051, 5, 97, 0, 0, 4051, 4052, 5, 112, 0, 0, 4052, 4053, 1, 0, 0, 0, 4053, 4054, 6, 334, 128, 0, 4054, 675, 1, 0, 0, 0, 4055, 4056, 5, 109, 0, 0, 4056, 4057, 5, 111, 0, 0, 4057, 4058, 5, 100, 0, 0, 4058, 4059, 1, 0, 0, 0, 4059, 4060, 6, 335, 129, 0, 4060, 677, 1, 0, 0, 0, 4061, 4062, 5, 109, 0, 0, 4062, 4063, 5, 111, 0, 0, 4063, 4064, 5, 100, 0, 0, 4064, 4065, 5, 117, 0, 0, 4065, 4066, 5, 108, 0, 0, 4066, 4067, 5, 101, 0, 0, 4067, 4068, 1, 0, 0, 0, 4068, 4069, 6, 336, 130, 0, 4069, 679, 1, 0, 0, 0, 4070, 4071, 5, 110, 0, 0, 4071, 4072, 5, 97, 0, 0, 4072, 4073, 5, 109, 0, 0, 4073, 4074, 5, 101, 0, 0, 4074, 4075, 5, 115, 0, 0, 4075, 4076, 5, 112, 0, 0, 4076, 4077, 5, 97, 0, 0, 4077, 4078, 5, 99, 0, 0, 4078, 4079, 5, 101, 0, 0, 4079, 4080, 1, 0, 0, 0, 4080, 4081, 6, 337, 131, 0, 4081, 681, 1, 0, 0, 0, 4082, 4083, 5, 110, 0, 0, 4083, 4084, 5, 101, 0, 0, 4084, 4085, 1, 0, 0, 0, 4085, 4086, 6, 338, 132, 0, 4086, 683, 1, 0, 0, 0, 4087, 4088, 5, 110, 0, 0, 4088, 4089, 5, 101, 0, 0, 4089, 4090, 5, 120, 0, 0, 4090, 4091, 5, 116, 0, 0, 4091, 4092, 1, 0, 0, 0, 4092, 4093, 6, 339, 133, 0, 4093, 685, 1, 0, 0, 0, 4094, 4095, 5, 110, 0, 0, 4095, 4096, 5, 97, 0, 0, 4096, 4097, 5, 109, 0, 0, 4097, 4098, 5, 101, 0, 0, 4098, 4099, 5, 115, 0, 0, 4099, 4100, 5, 112, 0, 0, 4100, 4101, 5, 97, 0, 0, 4101, 4102, 5, 99, 0, 0, 4102, 4103, 5, 101, 0, 0, 4103, 4104, 5, 45, 0, 0, 4104, 4105, 5, 110, 0, 0, 4105, 4106, 5, 111, 0, 0, 4106, 4107, 5, 100, 0, 0, 4107, 4108, 5, 101, 0, 0, 4108, 4109, 1, 0, 0, 0, 4109, 4110, 6, 340, 134, 0, 4110, 687, 1, 0, 0, 0, 4111, 4112, 5, 110, 0, 0, 4112, 4113, 5, 111, 0, 0, 4113, 4114, 5, 45, 0, 0, 4114, 4115, 5, 105, 0, 0, 4115, 4116, 5, 110, 0, 0, 4116, 4117, 5, 104, 0, 0, 4117, 4118, 5, 101, 0, 0, 4118, 4119, 5, 114, 0, 0, 4119, 4120, 5, 105, 0, 0, 4120, 4121, 5, 116, 0, 0, 4121, 4122, 1, 0, 0, 0, 4122, 4123, 6, 341, 135, 0, 4123, 689, 1, 0, 0, 0, 4124, 4125, 5, 110, 0, 0, 4125, 4126, 5, 111, 0, 0, 4126, 4127, 5, 45, 0, 0, 4127, 4128, 5, 112, 0, 0, 4128, 4129, 5, 114, 0, 0, 4129, 4130, 5, 101, 0, 0, 4130, 4131, 5, 115, 0, 0, 4131, 4132, 5, 101, 0, 0, 4132, 4133, 5, 114, 0, 0, 4133, 4134, 5, 118, 0, 0, 4134, 4135, 5, 101, 0, 0, 4135, 4136, 1, 0, 0, 0, 4136, 4137, 6, 342, 136, 0, 4137, 691, 1, 0, 0, 0, 4138, 4139, 5, 110, 0, 0, 4139, 4140, 5, 111, 0, 0, 4140, 4141, 5, 100, 0, 0, 4141, 4142, 5, 101, 0, 0, 4142, 4143, 1, 0, 0, 0, 4143, 4144, 6, 343, 137, 0, 4144, 693, 1, 0, 0, 0, 4145, 4146, 5, 111, 0, 0, 4146, 4147, 5, 102, 0, 0, 4147, 4148, 1, 0, 0, 0, 4148, 4149, 6, 344, 138, 0, 4149, 695, 1, 0, 0, 0, 4150, 4151, 5, 111, 0, 0, 4151, 4152, 5, 110, 0, 0, 4152, 4153, 5, 108, 0, 0, 4153, 4154, 5, 121, 0, 0, 4154, 4155, 1, 0, 0, 0, 4155, 4156, 6, 345, 139, 0, 4156, 697, 1, 0, 0, 0, 4157, 4158, 5, 111, 0, 0, 4158, 4159, 5, 112, 0, 0, 4159, 4160, 5, 116, 0, 0, 4160, 4161, 5, 105, 0, 0, 4161, 4162, 5, 111, 0, 0, 4162, 4163, 5, 110, 0, 0, 4163, 4164, 1, 0, 0, 0, 4164, 4165, 6, 346, 140, 0, 4165, 699, 1, 0, 0, 0, 4166, 4167, 5, 111, 0, 0, 4167, 4168, 5, 114, 0, 0, 4168, 4169, 1, 0, 0, 0, 4169, 4170, 6, 347, 141, 0, 4170, 701, 1, 0, 0, 0, 4171, 4172, 5, 111, 0, 0, 4172, 4173, 5, 114, 0, 0, 4173, 4174, 5, 100, 0, 0, 4174, 4175, 5, 101, 0, 0, 4175, 4176, 5, 114, 0, 0, 4176, 4177, 1, 0, 0, 0, 4177, 4178, 6, 348, 142, 0, 4178, 703, 1, 0, 0, 0, 4179, 4180, 5, 111, 0, 0, 4180, 4181, 5, 114, 0, 0, 4181, 4182, 5, 100, 0, 0, 4182, 4183, 5, 101, 0, 0, 4183, 4184, 5, 114, 0, 0, 4184, 4185, 5, 101, 0, 0, 4185, 4186, 5, 100, 0, 0, 4186, 4187, 1, 0, 0, 0, 4187, 4188, 6, 349, 143, 0, 4188, 705, 1, 0, 0, 0, 4189, 4190, 5, 111, 0, 0, 4190, 4191, 5, 114, 0, 0, 4191, 4192, 5, 100, 0, 0, 4192, 4193, 5, 101, 0, 0, 4193, 4194, 5, 114, 0, 0, 4194, 4195, 5, 105, 0, 0, 4195, 4196, 5, 110, 0, 0, 4196, 4197, 5, 103, 0, 0, 4197, 4198, 1, 0, 0, 0, 4198, 4199, 6, 350, 144, 0, 4199, 707, 1, 0, 0, 0, 4200, 4201, 5, 112, 0, 0, 4201, 4202, 5, 97, 0, 0, 4202, 4203, 5, 114, 0, 0, 4203, 4204, 5, 101, 0, 0, 4204, 4205, 5, 110, 0, 0, 4205, 4206, 5, 116, 0, 0, 4206, 4207, 1, 0, 0, 0, 4207, 4208, 6, 351, 145, 0, 4208, 709, 1, 0, 0, 0, 4209, 4210, 5, 112, 0, 0, 4210, 4211, 5, 114, 0, 0, 4211, 4212, 5, 101, 0, 0, 4212, 4213, 5, 99, 0, 0, 4213, 4214, 5, 101, 0, 0, 4214, 4215, 5, 100, 0, 0, 4215, 4216, 5, 105, 0, 0, 4216, 4217, 5, 110, 0, 0, 4217, 4218, 5, 103, 0, 0, 4218, 4219, 1, 0, 0, 0, 4219, 4220, 6, 352, 146, 0, 4220, 711, 1, 0, 0, 0, 4221, 4222, 5, 112, 0, 0, 4222, 4223, 5, 114, 0, 0, 4223, 4224, 5, 101, 0, 0, 4224, 4225, 5, 99, 0, 0, 4225, 4226, 5, 101, 0, 0, 4226, 4227, 5, 100, 0, 0, 4227, 4228, 5, 105, 0, 0, 4228, 4229, 5, 110, 0, 0, 4229, 4230, 5, 103, 0, 0, 4230, 4231, 5, 45, 0, 0, 4231, 4232, 5, 115, 0, 0, 4232, 4233, 5, 105, 0, 0, 4233, 4234, 5, 98, 0, 0, 4234, 4235, 5, 108, 0, 0, 4235, 4236, 5, 105, 0, 0, 4236, 4237, 5, 110, 0, 0, 4237, 4238, 5, 103, 0, 0, 4238, 4239, 1, 0, 0, 0, 4239, 4240, 6, 353, 147, 0, 4240, 713, 1, 0, 0, 0, 4241, 4242, 5, 112, 0, 0, 4242, 4243, 5, 114, 0, 0, 4243, 4244, 5, 101, 0, 0, 4244, 4245, 5, 115, 0, 0, 4245, 4246, 5, 101, 0, 0, 4246, 4247, 5, 114, 0, 0, 4247, 4248, 5, 118, 0, 0, 4248, 4249, 5, 101, 0, 0, 4249, 4250, 1, 0, 0, 0, 4250, 4251, 6, 354, 148, 0, 4251, 715, 1, 0, 0, 0, 4252, 4253, 5, 112, 0, 0, 4253, 4254, 5, 114, 0, 0, 4254, 4255, 5, 101, 0, 0, 4255, 4256, 5, 118, 0, 0, 4256, 4257, 5, 105, 0, 0, 4257, 4258, 5, 111, 0, 0, 4258, 4259, 5, 117, 0, 0, 4259, 4260, 5, 115, 0, 0, 4260, 4261, 1, 0, 0, 0, 4261, 4262, 6, 355, 149, 0, 4262, 717, 1, 0, 0, 0, 4263, 4264, 5, 112, 0, 0, 4264, 4265, 5, 114, 0, 0, 4265, 4266, 5, 111, 0, 0, 4266, 4267, 5, 99, 0, 0, 4267, 4268, 5, 101, 0, 0, 4268, 4269, 5, 115, 0, 0, 4269, 4270, 5, 115, 0, 0, 4270, 4271, 5, 105, 0, 0, 4271, 4272, 5, 110, 0, 0, 4272, 4273, 5, 103, 0, 0, 4273, 4274, 5, 45, 0, 0, 4274, 4275, 5, 105, 0, 0, 4275, 4276, 5, 110, 0, 0, 4276, 4277, 5, 115, 0, 0, 4277, 4278, 5, 116, 0, 0, 4278, 4279, 5, 114, 0, 0, 4279, 4280, 5, 117, 0, 0, 4280, 4281, 5, 99, 0, 0, 4281, 4282, 5, 116, 0, 0, 4282, 4283, 5, 105, 0, 0, 4283, 4284, 5, 111, 0, 0, 4284, 4285, 5, 110, 0, 0, 4285, 4286, 1, 0, 0, 0, 4286, 4287, 6, 356, 150, 0, 4287, 719, 1, 0, 0, 0, 4288, 4289, 5, 114, 0, 0, 4289, 4290, 5, 101, 0, 0, 4290, 4291, 5, 116, 0, 0, 4291, 4292, 5, 117, 0, 0, 4292, 4293, 5, 114, 0, 0, 4293, 4294, 5, 110, 0, 0, 4294, 4295, 1, 0, 0, 0, 4295, 4296, 6, 357, 151, 0, 4296, 721, 1, 0, 0, 0, 4297, 4298, 5, 115, 0, 0, 4298, 4299, 5, 97, 0, 0, 4299, 4300, 5, 116, 0, 0, 4300, 4301, 5, 105, 0, 0, 4301, 4302, 5, 115, 0, 0, 4302, 4303, 5, 102, 0, 0, 4303, 4304, 5, 105, 0, 0, 4304, 4305, 5, 101, 0, 0, 4305, 4306, 5, 115, 0, 0, 4306, 4307, 1, 0, 0, 0, 4307, 4308, 6, 358, 152, 0, 4308, 723, 1, 0, 0, 0, 4309, 4310, 5, 115, 0, 0, 4310, 4311, 5, 99, 0, 0, 4311, 4312, 5, 104, 0, 0, 4312, 4313, 5, 101, 0, 0, 4313, 4314, 5, 109, 0, 0, 4314, 4315, 5, 97, 0, 0, 4315, 4316, 1, 0, 0, 0, 4316, 4317, 6, 359, 153, 0, 4317, 725, 1, 0, 0, 0, 4318, 4319, 5, 115, 0, 0, 4319, 4320, 5, 99, 0, 0, 4320, 4321, 5, 104, 0, 0, 4321, 4322, 5, 101, 0, 0, 4322, 4323, 5, 109, 0, 0, 4323, 4324, 5, 97, 0, 0, 4324, 4325, 5, 45, 0, 0, 4325, 4326, 5, 97, 0, 0, 4326, 4327, 5, 116, 0, 0, 4327, 4328, 5, 116, 0, 0, 4328, 4329, 5, 114, 0, 0, 4329, 4330, 5, 105, 0, 0, 4330, 4331, 5, 98, 0, 0, 4331, 4332, 5, 117, 0, 0, 4332, 4333, 5, 116, 0, 0, 4333, 4334, 5, 101, 0, 0, 4334, 4335, 1, 0, 0, 0, 4335, 4336, 6, 360, 154, 0, 4336, 727, 1, 0, 0, 0, 4337, 4338, 5, 115, 0, 0, 4338, 4339, 5, 99, 0, 0, 4339, 4340, 5, 104, 0, 0, 4340, 4341, 5, 101, 0, 0, 4341, 4342, 5, 109, 0, 0, 4342, 4343, 5, 97, 0, 0, 4343, 4344, 5, 45, 0, 0, 4344, 4345, 5, 101, 0, 0, 4345, 4346, 5, 108, 0, 0, 4346, 4347, 5, 101, 0, 0, 4347, 4348, 5, 109, 0, 0, 4348, 4349, 5, 101, 0, 0, 4349, 4350, 5, 110, 0, 0, 4350, 4351, 5, 116, 0, 0, 4351, 4352, 1, 0, 0, 0, 4352, 4353, 6, 361, 155, 0, 4353, 729, 1, 0, 0, 0, 4354, 4355, 5, 115, 0, 0, 4355, 4356, 5, 101, 0, 0, 4356, 4357, 5, 108, 0, 0, 4357, 4358, 5, 102, 0, 0, 4358, 4359, 1, 0, 0, 0, 4359, 4360, 6, 362, 156, 0, 4360, 731, 1, 0, 0, 0, 4361, 4362, 5, 115, 0, 0, 4362, 4363, 5, 108, 0, 0, 4363, 4364, 5, 105, 0, 0, 4364, 4365, 5, 100, 0, 0, 4365, 4366, 5, 105, 0, 0, 4366, 4367, 5, 110, 0, 0, 4367, 4368, 5, 103, 0, 0, 4368, 4369, 1, 0, 0, 0, 4369, 4370, 6, 363, 157, 0, 4370, 733, 1, 0, 0, 0, 4371, 4372, 5, 115, 0, 0, 4372, 4373, 5, 111, 0, 0, 4373, 4374, 5, 109, 0, 0, 4374, 4375, 5, 101, 0, 0, 4375, 4376, 1, 0, 0, 0, 4376, 4377, 6, 364, 158, 0, 4377, 735, 1, 0, 0, 0, 4378, 4379, 5, 115, 0, 0, 4379, 4380, 5, 116, 0, 0, 4380, 4381, 5, 97, 0, 0, 4381, 4382, 5, 98, 0, 0, 4382, 4383, 5, 108, 0, 0, 4383, 4384, 5, 101, 0, 0, 4384, 4385, 1, 0, 0, 0, 4385, 4386, 6, 365, 159, 0, 4386, 737, 1, 0, 0, 0, 4387, 4388, 5, 115, 0, 0, 4388, 4389, 5, 116, 0, 0, 4389, 4390, 5, 97, 0, 0, 4390, 4391, 5, 114, 0, 0, 4391, 4392, 5, 116, 0, 0, 4392, 4393, 1, 0, 0, 0, 4393, 4394, 6, 366, 160, 0, 4394, 739, 1, 0, 0, 0, 4395, 4396, 5, 115, 0, 0, 4396, 4397, 5, 116, 0, 0, 4397, 4398, 5, 114, 0, 0, 4398, 4399, 5, 105, 0, 0, 4399, 4400, 5, 99, 0, 0, 4400, 4401, 5, 116, 0, 0, 4401, 4402, 1, 0, 0, 0, 4402, 4403, 6, 367, 161, 0, 4403, 741, 1, 0, 0, 0, 4404, 4405, 5, 115, 0, 0, 4405, 4406, 5, 116, 0, 0, 4406, 4407, 5, 114, 0, 0, 4407, 4408, 5, 105, 0, 0, 4408, 4409, 5, 112, 0, 0, 4409, 4410, 1, 0, 0, 0, 4410, 4411, 6, 368, 162, 0, 4411, 743, 1, 0, 0, 0, 4412, 4413, 5, 115, 0, 0, 4413, 4414, 5, 119, 0, 0, 4414, 4415, 5, 105, 0, 0, 4415, 4416, 5, 116, 0, 0, 4416, 4417, 5, 99, 0, 0, 4417, 4418, 5, 104, 0, 0, 4418, 4419, 1, 0, 0, 0, 4419, 4420, 6, 369, 163, 0, 4420, 745, 1, 0, 0, 0, 4421, 4422, 5, 116, 0, 0, 4422, 4423, 5, 101, 0, 0, 4423, 4424, 5, 120, 0, 0, 4424, 4425, 5, 116, 0, 0, 4425, 4426, 1, 0, 0, 0, 4426, 4427, 6, 370, 164, 0, 4427, 747, 1, 0, 0, 0, 4428, 4429, 5, 116, 0, 0, 4429, 4430, 5, 104, 0, 0, 4430, 4431, 5, 101, 0, 0, 4431, 4432, 5, 110, 0, 0, 4432, 4433, 1, 0, 0, 0, 4433, 4434, 6, 371, 165, 0, 4434, 749, 1, 0, 0, 0, 4435, 4436, 5, 116, 0, 0, 4436, 4437, 5, 111, 0, 0, 4437, 4438, 1, 0, 0, 0, 4438, 4439, 6, 372, 166, 0, 4439, 751, 1, 0, 0, 0, 4440, 4441, 5, 116, 0, 0, 4441, 4442, 5, 114, 0, 0, 4442, 4443, 5, 101, 0, 0, 4443, 4444, 5, 97, 0, 0, 4444, 4445, 5, 116, 0, 0, 4445, 4446, 1, 0, 0, 0, 4446, 4447, 6, 373, 167, 0, 4447, 753, 1, 0, 0, 0, 4448, 4449, 5, 116, 0, 0, 4449, 4450, 5, 114, 0, 0, 4450, 4451, 5, 121, 0, 0, 4451, 4452, 1, 0, 0, 0, 4452, 4453, 6, 374, 168, 0, 4453, 755, 1, 0, 0, 0, 4454, 4455, 5, 116, 0, 0, 4455, 4456, 5, 117, 0, 0, 4456, 4457, 5, 109, 0, 0, 4457, 4458, 5, 98, 0, 0, 4458, 4459, 5, 108, 0, 0, 4459, 4460, 5, 105, 0, 0, 4460, 4461, 5, 110, 0, 0, 4461, 4462, 5, 103, 0, 0, 4462, 4463, 1, 0, 0, 0, 4463, 4464, 6, 375, 169, 0, 4464, 757, 1, 0, 0, 0, 4465, 4466, 5, 116, 0, 0, 4466, 4467, 5, 121, 0, 0, 4467, 4468, 5, 112, 0, 0, 4468, 4469, 5, 101, 0, 0, 4469, 4470, 1, 0, 0, 0, 4470, 4471, 6, 376, 170, 0, 4471, 759, 1, 0, 0, 0, 4472, 4473, 5, 116, 0, 0, 4473, 4474, 5, 121, 0, 0, 4474, 4475, 5, 112, 0, 0, 4475, 4476, 5, 101, 0, 0, 4476, 4477, 5, 115, 0, 0, 4477, 4478, 5, 119, 0, 0, 4478, 4479, 5, 105, 0, 0, 4479, 4480, 5, 116, 0, 0, 4480, 4481, 5, 99, 0, 0, 4481, 4482, 5, 104, 0, 0, 4482, 4483, 1, 0, 0, 0, 4483, 4484, 6, 377, 171, 0, 4484, 761, 1, 0, 0, 0, 4485, 4486, 5, 117, 0, 0, 4486, 4487, 5, 110, 0, 0, 4487, 4488, 5, 105, 0, 0, 4488, 4489, 5, 111, 0, 0, 4489, 4490, 5, 110, 0, 0, 4490, 4491, 1, 0, 0, 0, 4491, 4492, 6, 378, 172, 0, 4492, 763, 1, 0, 0, 0, 4493, 4494, 5, 117, 0, 0, 4494, 4495, 5, 110, 0, 0, 4495, 4496, 5, 111, 0, 0, 4496, 4497, 5, 114, 0, 0, 4497, 4498, 5, 100, 0, 0, 4498, 4499, 5, 101, 0, 0, 4499, 4500, 5, 114, 0, 0, 4500, 4501, 5, 101, 0, 0, 4501, 4502, 5, 100, 0, 0, 4502, 4503, 1, 0, 0, 0, 4503, 4504, 6, 379, 173, 0, 4504, 765, 1, 0, 0, 0, 4505, 4506, 5, 117, 0, 0, 4506, 4507, 5, 112, 0, 0, 4507, 4508, 5, 100, 0, 0, 4508, 4509, 5, 97, 0, 0, 4509, 4510, 5, 116, 0, 0, 4510, 4511, 5, 101, 0, 0, 4511, 4512, 1, 0, 0, 0, 4512, 4513, 6, 380, 174, 0, 4513, 767, 1, 0, 0, 0, 4514, 4515, 5, 118, 0, 0, 4515, 4516, 5, 97, 0, 0, 4516, 4517, 5, 108, 0, 0, 4517, 4518, 5, 105, 0, 0, 4518, 4519, 5, 100, 0, 0, 4519, 4520, 5, 97, 0, 0, 4520, 4521, 5, 116, 0, 0, 4521, 4522, 5, 101, 0, 0, 4522, 4523, 1, 0, 0, 0, 4523, 4524, 6, 381, 175, 0, 4524, 769, 1, 0, 0, 0, 4525, 4526, 5, 118, 0, 0, 4526, 4527, 5, 97, 0, 0, 4527, 4528, 5, 114, 0, 0, 4528, 4529, 5, 105, 0, 0, 4529, 4530, 5, 97, 0, 0, 4530, 4531, 5, 98, 0, 0, 4531, 4532, 5, 108, 0, 0, 4532, 4533, 5, 101, 0, 0, 4533, 4534, 1, 0, 0, 0, 4534, 4535, 6, 382, 176, 0, 4535, 771, 1, 0, 0, 0, 4536, 4537, 5, 118, 0, 0, 4537, 4538, 5, 101, 0, 0, 4538, 4539, 5, 114, 0, 0, 4539, 4540, 5, 115, 0, 0, 4540, 4541, 5, 105, 0, 0, 4541, 4542, 5, 111, 0, 0, 4542, 4543, 5, 110, 0, 0, 4543, 4544, 1, 0, 0, 0, 4544, 4545, 6, 383, 177, 0, 4545, 773, 1, 0, 0, 0, 4546, 4547, 5, 119, 0, 0, 4547, 4548, 5, 104, 0, 0, 4548, 4549, 5, 101, 0, 0, 4549, 4550, 5, 110, 0, 0, 4550, 4551, 1, 0, 0, 0, 4551, 4552, 6, 384, 178, 0, 4552, 775, 1, 0, 0, 0, 4553, 4554, 5, 119, 0, 0, 4554, 4555, 5, 104, 0, 0, 4555, 4556, 5, 101, 0, 0, 4556, 4557, 5, 114, 0, 0, 4557, 4558, 5, 101, 0, 0, 4558, 4559, 1, 0, 0, 0, 4559, 4560, 6, 385, 179, 0, 4560, 777, 1, 0, 0, 0, 4561, 4562, 5, 119, 0, 0, 4562, 4563, 5, 105, 0, 0, 4563, 4564, 5, 110, 0, 0, 4564, 4565, 5, 100, 0, 0, 4565, 4566, 5, 111, 0, 0, 4566, 4567, 5, 119, 0, 0, 4567, 4568, 1, 0, 0, 0, 4568, 4569, 6, 386, 180, 0, 4569, 779, 1, 0, 0, 0, 4570, 4571, 5, 120, 0, 0, 4571, 4572, 5, 113, 0, 0, 4572, 4573, 5, 117, 0, 0, 4573, 4574, 5, 101, 0, 0, 4574, 4575, 5, 114, 0, 0, 4575, 4576, 5, 121, 0, 0, 4576, 4577, 1, 0, 0, 0, 4577, 4578, 6, 387, 181, 0, 4578, 781, 1, 0, 0, 0, 4579, 4580, 5, 97, 0, 0, 4580, 4581, 5, 114, 0, 0, 4581, 4582, 5, 114, 0, 0, 4582, 4583, 5, 97, 0, 0, 4583, 4584, 5, 121, 0, 0, 4584, 4585, 5, 45, 0, 0, 4585, 4586, 5, 110, 0, 0, 4586, 4587, 5, 111, 0, 0, 4587, 4588, 5, 100, 0, 0, 4588, 4589, 5, 101, 0, 0, 4589, 4590, 1, 0, 0, 0, 4590, 4591, 6, 388, 182, 0, 4591, 783, 1, 0, 0, 0, 4592, 4593, 5, 98, 0, 0, 4593, 4594, 5, 111, 0, 0, 4594, 4595, 5, 111, 0, 0, 4595, 4596, 5, 108, 0, 0, 4596, 4597, 5, 101, 0, 0, 4597, 4598, 5, 97, 0, 0, 4598, 4599, 5, 110, 0, 0, 4599, 4600, 5, 45, 0, 0, 4600, 4601, 5, 110, 0, 0, 4601, 4602, 5, 111, 0, 0, 4602, 4603, 5, 100, 0, 0, 4603, 4604, 5, 101, 0, 0, 4604, 4605, 1, 0, 0, 0, 4605, 4606, 6, 389, 183, 0, 4606, 785, 1, 0, 0, 0, 4607, 4608, 5, 110, 0, 0, 4608, 4609, 5, 117, 0, 0, 4609, 4610, 5, 108, 0, 0, 4610, 4611, 5, 108, 0, 0, 4611, 4612, 5, 45, 0, 0, 4612, 4613, 5, 110, 0, 0, 4613, 4614, 5, 111, 0, 0, 4614, 4615, 5, 100, 0, 0, 4615, 4616, 5, 101, 0, 0, 4616, 4617, 1, 0, 0, 0, 4617, 4618, 6, 390, 184, 0, 4618, 787, 1, 0, 0, 0, 4619, 4620, 5, 110, 0, 0, 4620, 4621, 5, 117, 0, 0, 4621, 4622, 5, 109, 0, 0, 4622, 4623, 5, 98, 0, 0, 4623, 4624, 5, 101, 0, 0, 4624, 4625, 5, 114, 0, 0, 4625, 4626, 5, 45, 0, 0, 4626, 4627, 5, 110, 0, 0, 4627, 4628, 5, 111, 0, 0, 4628, 4629, 5, 100, 0, 0, 4629, 4630, 5, 101, 0, 0, 4630, 4631, 1, 0, 0, 0, 4631, 4632, 6, 391, 185, 0, 4632, 789, 1, 0, 0, 0, 4633, 4634, 5, 111, 0, 0, 4634, 4635, 5, 98, 0, 0, 4635, 4636, 5, 106, 0, 0, 4636, 4637, 5, 101, 0, 0, 4637, 4638, 5, 99, 0, 0, 4638, 4639, 5, 116, 0, 0, 4639, 4640, 5, 45, 0, 0, 4640, 4641, 5, 110, 0, 0, 4641, 4642, 5, 111, 0, 0, 4642, 4643, 5, 100, 0, 0, 4643, 4644, 5, 101, 0, 0, 4644, 4645, 1, 0, 0, 0, 4645, 4646, 6, 392, 186, 0, 4646, 791, 1, 0, 0, 0, 4647, 4648, 5, 114, 0, 0, 4648, 4649, 5, 101, 0, 0, 4649, 4650, 5, 112, 0, 0, 4650, 4651, 5, 108, 0, 0, 4651, 4652, 5, 97, 0, 0, 4652, 4653, 5, 99, 0, 0, 4653, 4654, 5, 101, 0, 0, 4654, 4655, 1, 0, 0, 0, 4655, 4656, 6, 393, 187, 0, 4656, 793, 1, 0, 0, 0, 4657, 4658, 5, 119, 0, 0, 4658, 4659, 5, 105, 0, 0, 4659, 4660, 5, 116, 0, 0, 4660, 4661, 5, 104, 0, 0, 4661, 4662, 1, 0, 0, 0, 4662, 4663, 6, 394, 188, 0, 4663, 795, 1, 0, 0, 0, 4664, 4665, 5, 118, 0, 0, 4665, 4666, 5, 97, 0, 0, 4666, 4667, 5, 108, 0, 0, 4667, 4668, 5, 117, 0, 0, 4668, 4669, 5, 101, 0, 0, 4669, 4670, 1, 0, 0, 0, 4670, 4671, 6, 395, 189, 0, 4671, 797, 1, 0, 0, 0, 4672, 4673, 5, 105, 0, 0, 4673, 4674, 5, 110, 0, 0, 4674, 4675, 5, 115, 0, 0, 4675, 4676, 5, 101, 0, 0, 4676, 4677, 5, 114, 0, 0, 4677, 4678, 5, 116, 0, 0, 4678, 4679, 1, 0, 0, 0, 4679, 4680, 6, 396, 190, 0, 4680, 799, 1, 0, 0, 0, 4681, 4682, 5, 105, 0, 0, 4682, 4683, 5, 110, 0, 0, 4683, 4684, 5, 116, 0, 0, 4684, 4685, 5, 111, 0, 0, 4685, 4686, 1, 0, 0, 0, 4686, 4687, 6, 397, 191, 0, 4687, 801, 1, 0, 0, 0, 4688, 4689, 5, 100, 0, 0, 4689, 4690, 5, 101, 0, 0, 4690, 4691, 5, 108, 0, 0, 4691, 4692, 5, 101, 0, 0, 4692, 4693, 5, 116, 0, 0, 4693, 4694, 5, 101, 0, 0, 4694, 4695, 1, 0, 0, 0, 4695, 4696, 6, 398, 192, 0, 4696, 803, 1, 0, 0, 0, 4697, 4698, 5, 114, 0, 0, 4698, 4699, 5, 101, 0, 0, 4699, 4700, 5, 110, 0, 0, 4700, 4701, 5, 97, 0, 0, 4701, 4702, 5, 109, 0, 0, 4702, 4703, 5, 101, 0, 0, 4703, 4704, 1, 0, 0, 0, 4704, 4705, 6, 399, 193, 0, 4705, 805, 1, 0, 0, 0, 4706, 4707, 5, 81, 0, 0, 4707, 4713, 5, 123, 0, 0, 4708, 4712, 3, 16, 5, 0, 4709, 4712, 3, 18, 6, 0, 4710, 4712, 8, 9, 0, 0, 4711, 4708, 1, 0, 0, 0, 4711, 4709, 1, 0, 0, 0, 4711, 4710, 1, 0, 0, 0, 4712, 4715, 1, 0, 0, 0, 4713, 4711, 1, 0, 0, 0, 4713, 4714, 1, 0, 0, 0, 4714, 4716, 1, 0, 0, 0, 4715, 4713, 1, 0, 0, 0, 4716, 4717, 5, 125, 0, 0, 4717, 4718, 3, 374, 184, 0, 4718, 4719, 1, 0, 0, 0, 4719, 4720, 6, 400, 194, 0, 4720, 807, 1, 0, 0, 0, 4721, 4722, 3, 374, 184, 0, 4722, 4723, 5, 58, 0, 0, 4723, 4724, 3, 374, 184, 0, 4724, 4725, 1, 0, 0, 0, 4725, 4726, 6, 401, 195, 0, 4726, 809, 1, 0, 0, 0, 4727, 4728, 3, 374, 184, 0, 4728, 4729, 5, 58, 0, 0, 4729, 4730, 5, 42, 0, 0, 4730, 4731, 1, 0, 0, 0, 4731, 4732, 6, 402, 196, 0, 4732, 811, 1, 0, 0, 0, 4733, 4734, 5, 42, 0, 0, 4734, 4735, 5, 58, 0, 0, 4735, 4736, 3, 374, 184, 0, 4736, 4737, 1, 0, 0, 0, 4737, 4738, 6, 403, 197, 0, 4738, 813, 1, 0, 0, 0, 4739, 4743, 3, 376, 185, 0, 4740, 4742, 3, 378, 186, 0, 4741, 4740, 1, 0, 0, 0, 4742, 4745, 1, 0, 0, 0, 4743, 4741, 1, 0, 0, 0, 4743, 4744, 1, 0, 0, 0, 4744, 4746, 1, 0, 0, 0, 4745, 4743, 1, 0, 0, 0, 4746, 4747, 6, 404, 198, 0, 4747, 815, 1, 0, 0, 0, 4748, 4749, 5, 40, 0, 0, 4749, 4750, 5, 58, 0, 0, 4750, 4751, 5, 126, 0, 0, 4751, 4752, 1, 0, 0, 0, 4752, 4753, 6, 405, 199, 0, 4753, 817, 1, 0, 0, 0, 4754, 4756, 5, 58, 0, 0, 4755, 4754, 1, 0, 0, 0, 4756, 4757, 1, 0, 0, 0, 4757, 4755, 1, 0, 0, 0, 4757, 4758, 1, 0, 0, 0, 4758, 4759, 1, 0, 0, 0, 4759, 4760, 5, 41, 0, 0, 4760, 4761, 1, 0, 0, 0, 4761, 4762, 6, 406, 200, 0, 4762, 819, 1, 0, 0, 0, 4763, 4764, 5, 40, 0, 0, 4764, 4765, 5, 58, 0, 0, 4765, 4771, 5, 126, 0, 0, 4766, 4770, 3, 388, 191, 0, 4767, 4768, 5, 58, 0, 0, 4768, 4770, 8, 12, 0, 0, 4769, 4766, 1, 0, 0, 0, 4769, 4767, 1, 0, 0, 0, 4770, 4773, 1, 0, 0, 0, 4771, 4769, 1, 0, 0, 0, 4771, 4772, 1, 0, 0, 0, 4772, 4774, 1, 0, 0, 0, 4773, 4771, 1, 0, 0, 0, 4774, 4775, 5, 58, 0, 0, 4775, 4776, 5, 41, 0, 0, 4776, 4777, 1, 0, 0, 0, 4777, 4778, 6, 407, 201, 0, 4778, 821, 1, 0, 0, 0, 4779, 4780, 5, 40, 0, 0, 4780, 4781, 5, 58, 0, 0, 4781, 4790, 8, 13, 0, 0, 4782, 4789, 3, 386, 190, 0, 4783, 4784, 5, 40, 0, 0, 4784, 4789, 8, 14, 0, 0, 4785, 4786, 5, 58, 0, 0, 4786, 4789, 8, 12, 0, 0, 4787, 4789, 8, 15, 0, 0, 4788, 4782, 1, 0, 0, 0, 4788, 4783, 1, 0, 0, 0, 4788, 4785, 1, 0, 0, 0, 4788, 4787, 1, 0, 0, 0, 4789, 4792, 1, 0, 0, 0, 4790, 4788, 1, 0, 0, 0, 4790, 4791, 1, 0, 0, 0, 4791, 4796, 1, 0, 0, 0, 4792, 4790, 1, 0, 0, 0, 4793, 4795, 5, 58, 0, 0, 4794, 4793, 1, 0, 0, 0, 4795, 4798, 1, 0, 0, 0, 4796, 4794, 1, 0, 0, 0, 4796, 4797, 1, 0, 0, 0, 4797, 4800, 1, 0, 0, 0, 4798, 4796, 1, 0, 0, 0, 4799, 4801, 5, 58, 0, 0, 4800, 4799, 1, 0, 0, 0, 4801, 4802, 1, 0, 0, 0, 4802, 4800, 1, 0, 0, 0, 4802, 4803, 1, 0, 0, 0, 4803, 4804, 1, 0, 0, 0, 4804, 4805, 5, 41, 0, 0, 4805, 4806, 1, 0, 0, 0, 4806, 4807, 6, 408, 2, 0, 4807, 4808, 6, 408, 202, 0, 4808, 823, 1, 0, 0, 0, 4809, 4810, 7, 16, 0, 0, 4810, 4811, 1, 0, 0, 0, 4811, 4812, 6, 409, 203, 0, 4812, 825, 1, 0, 0, 0, 4813, 4814, 3, 98, 46, 0, 4814, 4815, 3, 98, 46, 0, 4815, 4816, 3, 44, 19, 0, 4816, 4817, 1, 0, 0, 0, 4817, 4818, 6, 410, 3, 0, 4818, 4819, 6, 410, 204, 0, 4819, 827, 1, 0, 0, 0, 4820, 4821, 3, 50, 22, 0, 4821, 4822, 3, 98, 46, 0, 4822, 4823, 1, 0, 0, 0, 4823, 4824, 6, 411, 4, 0, 4824, 4825, 6, 411, 205, 0, 4825, 829, 1, 0, 0, 0, 4826, 4827, 8, 17, 0, 0, 4827, 4828, 1, 0, 0, 0, 4828, 4829, 6, 412, 17, 0, 4829, 831, 1, 0, 0, 0, 4830, 4831, 3, 14, 4, 0, 4831, 4832, 1, 0, 0, 0, 4832, 4833, 6, 413, 21, 0, 4833, 833, 1, 0, 0, 0, 4834, 4835, 5, 46, 0, 0, 4835, 4845, 3, 14, 4, 0, 4836, 4837, 3, 14, 4, 0, 4837, 4841, 5, 46, 0, 0, 4838, 4840, 7, 0, 0, 0, 4839, 4838, 1, 0, 0, 0, 4840, 4843, 1, 0, 0, 0, 4841, 4839, 1, 0, 0, 0, 4841, 4842, 1, 0, 0, 0, 4842, 4845, 1, 0, 0, 0, 4843, 4841, 1, 0, 0, 0, 4844, 4834, 1, 0, 0, 0, 4844, 4836, 1, 0, 0, 0, 4845, 4846, 1, 0, 0, 0, 4846, 4847, 6, 414, 22, 0, 4847, 835, 1, 0, 0, 0, 4848, 4849, 5, 46, 0, 0, 4849, 4861, 3, 14, 4, 0, 4850, 4858, 3, 14, 4, 0, 4851, 4855, 5, 46, 0, 0, 4852, 4854, 7, 0, 0, 0, 4853, 4852, 1, 0, 0, 0, 4854, 4857, 1, 0, 0, 0, 4855, 4853, 1, 0, 0, 0, 4855, 4856, 1, 0, 0, 0, 4856, 4859, 1, 0, 0, 0, 4857, 4855, 1, 0, 0, 0, 4858, 4851, 1, 0, 0, 0, 4858, 4859, 1, 0, 0, 0, 4859, 4861, 1, 0, 0, 0, 4860, 4848, 1, 0, 0, 0, 4860, 4850, 1, 0, 0, 0, 4861, 4862, 1, 0, 0, 0, 4862, 4864, 7, 1, 0, 0, 4863, 4865, 7, 2, 0, 0, 4864, 4863, 1, 0, 0, 0, 4864, 4865, 1, 0, 0, 0, 4865, 4866, 1, 0, 0, 0, 4866, 4867, 3, 14, 4, 0, 4867, 4868, 1, 0, 0, 0, 4868, 4869, 6, 415, 23, 0, 4869, 837, 1, 0, 0, 0, 4870, 4871, 5, 100, 0, 0, 4871, 4872, 5, 101, 0, 0, 4872, 4873, 5, 99, 0, 0, 4873, 4874, 5, 105, 0, 0, 4874, 4875, 5, 109, 0, 0, 4875, 4876, 5, 97, 0, 0, 4876, 4877, 5, 108, 0, 0, 4877, 4878, 5, 45, 0, 0, 4878, 4879, 5, 115, 0, 0, 4879, 4880, 5, 101, 0, 0, 4880, 4881, 5, 112, 0, 0, 4881, 4882, 5, 97, 0, 0, 4882, 4883, 5, 114, 0, 0, 4883, 4884, 5, 97, 0, 0, 4884, 4885, 5, 116, 0, 0, 4885, 4886, 5, 111, 0, 0, 4886, 4993, 5, 114, 0, 0, 4887, 4888, 5, 103, 0, 0, 4888, 4889, 5, 114, 0, 0, 4889, 4890, 5, 111, 0, 0, 4890, 4891, 5, 117, 0, 0, 4891, 4892, 5, 112, 0, 0, 4892, 4893, 5, 105, 0, 0, 4893, 4894, 5, 110, 0, 0, 4894, 4895, 5, 103, 0, 0, 4895, 4896, 5, 45, 0, 0, 4896, 4897, 5, 115, 0, 0, 4897, 4898, 5, 101, 0, 0, 4898, 4899, 5, 112, 0, 0, 4899, 4900, 5, 97, 0, 0, 4900, 4901, 5, 114, 0, 0, 4901, 4902, 5, 97, 0, 0, 4902, 4903, 5, 116, 0, 0, 4903, 4904, 5, 111, 0, 0, 4904, 4993, 5, 114, 0, 0, 4905, 4906, 5, 105, 0, 0, 4906, 4907, 5, 110, 0, 0, 4907, 4908, 5, 102, 0, 0, 4908, 4909, 5, 105, 0, 0, 4909, 4910, 5, 110, 0, 0, 4910, 4911, 5, 105, 0, 0, 4911, 4912, 5, 116, 0, 0, 4912, 4993, 5, 121, 0, 0, 4913, 4914, 5, 109, 0, 0, 4914, 4915, 5, 105, 0, 0, 4915, 4916, 5, 110, 0, 0, 4916, 4917, 5, 117, 0, 0, 4917, 4918, 5, 115, 0, 0, 4918, 4919, 5, 45, 0, 0, 4919, 4920, 5, 115, 0, 0, 4920, 4921, 5, 105, 0, 0, 4921, 4922, 5, 103, 0, 0, 4922, 4993, 5, 110, 0, 0, 4923, 4924, 5, 78, 0, 0, 4924, 4925, 5, 97, 0, 0, 4925, 4993, 5, 78, 0, 0, 4926, 4927, 5, 112, 0, 0, 4927, 4928, 5, 101, 0, 0, 4928, 4929, 5, 114, 0, 0, 4929, 4930, 5, 99, 0, 0, 4930, 4931, 5, 101, 0, 0, 4931, 4932, 5, 110, 0, 0, 4932, 4993, 5, 116, 0, 0, 4933, 4934, 5, 112, 0, 0, 4934, 4935, 5, 101, 0, 0, 4935, 4936, 5, 114, 0, 0, 4936, 4937, 5, 45, 0, 0, 4937, 4938, 5, 109, 0, 0, 4938, 4939, 5, 105, 0, 0, 4939, 4940, 5, 108, 0, 0, 4940, 4941, 5, 108, 0, 0, 4941, 4993, 5, 101, 0, 0, 4942, 4943, 5, 122, 0, 0, 4943, 4944, 5, 101, 0, 0, 4944, 4945, 5, 114, 0, 0, 4945, 4946, 5, 111, 0, 0, 4946, 4947, 5, 45, 0, 0, 4947, 4948, 5, 100, 0, 0, 4948, 4949, 5, 105, 0, 0, 4949, 4950, 5, 103, 0, 0, 4950, 4951, 5, 105, 0, 0, 4951, 4993, 5, 116, 0, 0, 4952, 4953, 5, 100, 0, 0, 4953, 4954, 5, 105, 0, 0, 4954, 4955, 5, 103, 0, 0, 4955, 4956, 5, 105, 0, 0, 4956, 4993, 5, 116, 0, 0, 4957, 4958, 5, 112, 0, 0, 4958, 4959, 5, 97, 0, 0, 4959, 4960, 5, 116, 0, 0, 4960, 4961, 5, 116, 0, 0, 4961, 4962, 5, 101, 0, 0, 4962, 4963, 5, 114, 0, 0, 4963, 4964, 5, 110, 0, 0, 4964, 4965, 5, 45, 0, 0, 4965, 4966, 5, 115, 0, 0, 4966, 4967, 5, 101, 0, 0, 4967, 4968, 5, 112, 0, 0, 4968, 4969, 5, 97, 0, 0, 4969, 4970, 5, 114, 0, 0, 4970, 4971, 5, 97, 0, 0, 4971, 4972, 5, 116, 0, 0, 4972, 4973, 5, 111, 0, 0, 4973, 4993, 5, 114, 0, 0, 4974, 4975, 5, 101, 0, 0, 4975, 4976, 5, 120, 0, 0, 4976, 4977, 5, 112, 0, 0, 4977, 4978, 5, 111, 0, 0, 4978, 4979, 5, 110, 0, 0, 4979, 4980, 5, 101, 0, 0, 4980, 4981, 5, 110, 0, 0, 4981, 4982, 5, 116, 0, 0, 4982, 4983, 5, 45, 0, 0, 4983, 4984, 5, 115, 0, 0, 4984, 4985, 5, 101, 0, 0, 4985, 4986, 5, 112, 0, 0, 4986, 4987, 5, 97, 0, 0, 4987, 4988, 5, 114, 0, 0, 4988, 4989, 5, 97, 0, 0, 4989, 4990, 5, 116, 0, 0, 4990, 4991, 5, 111, 0, 0, 4991, 4993, 5, 114, 0, 0, 4992, 4870, 1, 0, 0, 0, 4992, 4887, 1, 0, 0, 0, 4992, 4905, 1, 0, 0, 0, 4992, 4913, 1, 0, 0, 0, 4992, 4923, 1, 0, 0, 0, 4992, 4926, 1, 0, 0, 0, 4992, 4933, 1, 0, 0, 0, 4992, 4942, 1, 0, 0, 0, 4992, 4952, 1, 0, 0, 0, 4992, 4957, 1, 0, 0, 0, 4992, 4974, 1, 0, 0, 0, 4993, 4994, 1, 0, 0, 0, 4994, 4995, 6, 416, 24, 0, 4995, 839, 1, 0, 0, 0, 4996, 5012, 5, 38, 0, 0, 4997, 4998, 5, 108, 0, 0, 4998, 5013, 5, 116, 0, 0, 4999, 5000, 5, 103, 0, 0, 5000, 5013, 5, 116, 0, 0, 5001, 5002, 5, 97, 0, 0, 5002, 5003, 5, 109, 0, 0, 5003, 5013, 5, 112, 0, 0, 5004, 5005, 5, 113, 0, 0, 5005, 5006, 5, 117, 0, 0, 5006, 5007, 5, 111, 0, 0, 5007, 5013, 5, 116, 0, 0, 5008, 5009, 5, 97, 0, 0, 5009, 5010, 5, 112, 0, 0, 5010, 5011, 5, 111, 0, 0, 5011, 5013, 5, 115, 0, 0, 5012, 4997, 1, 0, 0, 0, 5012, 4999, 1, 0, 0, 0, 5012, 5001, 1, 0, 0, 0, 5012, 5004, 1, 0, 0, 0, 5012, 5008, 1, 0, 0, 0, 5013, 5014, 1, 0, 0, 0, 5014, 5015, 5, 59, 0, 0, 5015, 5016, 1, 0, 0, 0, 5016, 5017, 6, 417, 15, 0, 5017, 841, 1, 0, 0, 0, 5018, 5019, 5, 38, 0, 0, 5019, 5020, 5, 35, 0, 0, 5020, 5022, 1, 0, 0, 0, 5021, 5023, 7, 0, 0, 0, 5022, 5021, 1, 0, 0, 0, 5023, 5024, 1, 0, 0, 0, 5024, 5022, 1, 0, 0, 0, 5024, 5025, 1, 0, 0, 0, 5025, 5026, 1, 0, 0, 0, 5026, 5038, 5, 59, 0, 0, 5027, 5028, 5, 38, 0, 0, 5028, 5029, 5, 35, 0, 0, 5029, 5030, 5, 120, 0, 0, 5030, 5032, 1, 0, 0, 0, 5031, 5033, 7, 3, 0, 0, 5032, 5031, 1, 0, 0, 0, 5033, 5034, 1, 0, 0, 0, 5034, 5032, 1, 0, 0, 0, 5034, 5035, 1, 0, 0, 0, 5035, 5036, 1, 0, 0, 0, 5036, 5038, 5, 59, 0, 0, 5037, 5018, 1, 0, 0, 0, 5037, 5027, 1, 0, 0, 0, 5038, 5039, 1, 0, 0, 0, 5039, 5040, 6, 418, 16, 0, 5040, 843, 1, 0, 0, 0, 5041, 5042, 5, 39, 0, 0, 5042, 5043, 5, 39, 0, 0, 5043, 5044, 1, 0, 0, 0, 5044, 5045, 6, 419, 18, 0, 5045, 845, 1, 0, 0, 0, 5046, 5047, 5, 34, 0, 0, 5047, 5048, 1, 0, 0, 0, 5048, 5049, 6, 420, 0, 0, 5049, 5050, 6, 420, 10, 0, 5050, 847, 1, 0, 0, 0, 5051, 5052, 5, 39, 0, 0, 5052, 5053, 1, 0, 0, 0, 5053, 5054, 6, 421, 19, 0, 5054, 5055, 6, 421, 4, 0, 5055, 5056, 6, 421, 4, 0, 5056, 849, 1, 0, 0, 0, 5057, 5058, 5, 60, 0, 0, 5058, 5059, 5, 33, 0, 0, 5059, 5060, 5, 45, 0, 0, 5060, 5061, 5, 45, 0, 0, 5061, 5067, 1, 0, 0, 0, 5062, 5063, 5, 45, 0, 0, 5063, 5066, 8, 4, 0, 0, 5064, 5066, 8, 4, 0, 0, 5065, 5062, 1, 0, 0, 0, 5065, 5064, 1, 0, 0, 0, 5066, 5069, 1, 0, 0, 0, 5067, 5065, 1, 0, 0, 0, 5067, 5068, 1, 0, 0, 0, 5068, 5070, 1, 0, 0, 0, 5069, 5067, 1, 0, 0, 0, 5070, 5071, 5, 45, 0, 0, 5071, 5072, 5, 45, 0, 0, 5072, 5073, 5, 62, 0, 0, 5073, 5074, 1, 0, 0, 0, 5074, 5075, 6, 422, 25, 0, 5075, 851, 1, 0, 0, 0, 5076, 5077, 5, 60, 0, 0, 5077, 5078, 5, 63, 0, 0, 5078, 5079, 1, 0, 0, 0, 5079, 5080, 7, 5, 0, 0, 5080, 5081, 7, 6, 0, 0, 5081, 5089, 7, 7, 0, 0, 5082, 5086, 7, 8, 0, 0, 5083, 5085, 9, 0, 0, 0, 5084, 5083, 1, 0, 0, 0, 5085, 5088, 1, 0, 0, 0, 5086, 5087, 1, 0, 0, 0, 5086, 5084, 1, 0, 0, 0, 5087, 5090, 1, 0, 0, 0, 5088, 5086, 1, 0, 0, 0, 5089, 5082, 1, 0, 0, 0, 5089, 5090, 1, 0, 0, 0, 5090, 5091, 1, 0, 0, 0, 5091, 5092, 5, 63, 0, 0, 5092, 5093, 5, 62, 0, 0, 5093, 5094, 1, 0, 0, 0, 5094, 5095, 6, 423, 26, 0, 5095, 853, 1, 0, 0, 0, 5096, 5097, 5, 60, 0, 0, 5097, 5098, 5, 63, 0, 0, 5098, 5099, 1, 0, 0, 0, 5099, 5107, 3, 374, 184, 0, 5100, 5104, 7, 8, 0, 0, 5101, 5103, 9, 0, 0, 0, 5102, 5101, 1, 0, 0, 0, 5103, 5106, 1, 0, 0, 0, 5104, 5105, 1, 0, 0, 0, 5104, 5102, 1, 0, 0, 0, 5105, 5108, 1, 0, 0, 0, 5106, 5104, 1, 0, 0, 0, 5107, 5100, 1, 0, 0, 0, 5107, 5108, 1, 0, 0, 0, 5108, 5109, 1, 0, 0, 0, 5109, 5110, 5, 63, 0, 0, 5110, 5111, 5, 62, 0, 0, 5111, 5112, 1, 0, 0, 0, 5112, 5113, 6, 424, 27, 0, 5113, 855, 1, 0, 0, 0, 5114, 5115, 5, 60, 0, 0, 5115, 5116, 5, 33, 0, 0, 5116, 5117, 5, 91, 0, 0, 5117, 5118, 5, 67, 0, 0, 5118, 5119, 5, 68, 0, 0, 5119, 5120, 5, 65, 0, 0, 5120, 5121, 5, 84, 0, 0, 5121, 5122, 5, 65, 0, 0, 5122, 5123, 5, 91, 0, 0, 5123, 5127, 1, 0, 0, 0, 5124, 5126, 9, 0, 0, 0, 5125, 5124, 1, 0, 0, 0, 5126, 5129, 1, 0, 0, 0, 5127, 5128, 1, 0, 0, 0, 5127, 5125, 1, 0, 0, 0, 5128, 5130, 1, 0, 0, 0, 5129, 5127, 1, 0, 0, 0, 5130, 5131, 5, 93, 0, 0, 5131, 5132, 5, 93, 0, 0, 5132, 5133, 5, 62, 0, 0, 5133, 5134, 1, 0, 0, 0, 5134, 5135, 6, 425, 28, 0, 5135, 857, 1, 0, 0, 0, 5136, 5137, 5, 40, 0, 0, 5137, 5138, 5, 35, 0, 0, 5138, 5140, 1, 0, 0, 0, 5139, 5141, 3, 34, 14, 0, 5140, 5139, 1, 0, 0, 0, 5140, 5141, 1, 0, 0, 0, 5141, 5145, 1, 0, 0, 0, 5142, 5143, 3, 374, 184, 0, 5143, 5144, 5, 58, 0, 0, 5144, 5146, 1, 0, 0, 0, 5145, 5142, 1, 0, 0, 0, 5145, 5146, 1, 0, 0, 0, 5146, 5147, 1, 0, 0, 0, 5147, 5155, 3, 374, 184, 0, 5148, 5152, 3, 34, 14, 0, 5149, 5151, 9, 0, 0, 0, 5150, 5149, 1, 0, 0, 0, 5151, 5154, 1, 0, 0, 0, 5152, 5153, 1, 0, 0, 0, 5152, 5150, 1, 0, 0, 0, 5153, 5156, 1, 0, 0, 0, 5154, 5152, 1, 0, 0, 0, 5155, 5148, 1, 0, 0, 0, 5155, 5156, 1, 0, 0, 0, 5156, 5157, 1, 0, 0, 0, 5157, 5158, 5, 35, 0, 0, 5158, 5159, 5, 41, 0, 0, 5159, 5160, 1, 0, 0, 0, 5160, 5161, 6, 426, 29, 0, 5161, 859, 1, 0, 0, 0, 5162, 5164, 7, 8, 0, 0, 5163, 5162, 1, 0, 0, 0, 5164, 5165, 1, 0, 0, 0, 5165, 5163, 1, 0, 0, 0, 5165, 5166, 1, 0, 0, 0, 5166, 5167, 1, 0, 0, 0, 5167, 5168, 6, 427, 2, 0, 5168, 5169, 6, 427, 30, 0, 5169, 861, 1, 0, 0, 0, 5170, 5171, 5, 61, 0, 0, 5171, 5172, 1, 0, 0, 0, 5172, 5173, 6, 428, 31, 0, 5173, 863, 1, 0, 0, 0, 5174, 5175, 5, 33, 0, 0, 5175, 5176, 5, 61, 0, 0, 5176, 5177, 1, 0, 0, 0, 5177, 5178, 6, 429, 32, 0, 5178, 865, 1, 0, 0, 0, 5179, 5180, 5, 40, 0, 0, 5180, 5181, 1, 0, 0, 0, 5181, 5182, 6, 430, 33, 0, 5182, 867, 1, 0, 0, 0, 5183, 5184, 5, 41, 0, 0, 5184, 5185, 1, 0, 0, 0, 5185, 5186, 6, 431, 34, 0, 5186, 869, 1, 0, 0, 0, 5187, 5188, 5, 91, 0, 0, 5188, 5189, 1, 0, 0, 0, 5189, 5190, 6, 432, 35, 0, 5190, 871, 1, 0, 0, 0, 5191, 5192, 5, 93, 0, 0, 5192, 5193, 1, 0, 0, 0, 5193, 5194, 6, 433, 6, 0, 5194, 873, 1, 0, 0, 0, 5195, 5196, 5, 123, 0, 0, 5196, 5197, 6, 434, 206, 0, 5197, 5198, 1, 0, 0, 0, 5198, 5199, 6, 434, 7, 0, 5199, 875, 1, 0, 0, 0, 5200, 5201, 4, 435, 2, 0, 5201, 5202, 5, 125, 0, 0, 5202, 5203, 1, 0, 0, 0, 5203, 5204, 6, 435, 14, 0, 5204, 5205, 6, 435, 4, 0, 5205, 877, 1, 0, 0, 0, 5206, 5207, 4, 436, 3, 0, 5207, 5208, 5, 125, 0, 0, 5208, 5209, 6, 436, 207, 0, 5209, 5210, 1, 0, 0, 0, 5210, 5211, 6, 436, 14, 0, 5211, 879, 1, 0, 0, 0, 5212, 5213, 5, 42, 0, 0, 5213, 5214, 1, 0, 0, 0, 5214, 5215, 6, 437, 38, 0, 5215, 881, 1, 0, 0, 0, 5216, 5217, 5, 43, 0, 0, 5217, 5218, 1, 0, 0, 0, 5218, 5219, 6, 438, 39, 0, 5219, 883, 1, 0, 0, 0, 5220, 5221, 5, 45, 0, 0, 5221, 5222, 1, 0, 0, 0, 5222, 5223, 6, 439, 40, 0, 5223, 885, 1, 0, 0, 0, 5224, 5225, 5, 44, 0, 0, 5225, 5226, 1, 0, 0, 0, 5226, 5227, 6, 440, 41, 0, 5227, 887, 1, 0, 0, 0, 5228, 5229, 5, 46, 0, 0, 5229, 5230, 1, 0, 0, 0, 5230, 5231, 6, 441, 42, 0, 5231, 889, 1, 0, 0, 0, 5232, 5233, 5, 46, 0, 0, 5233, 5234, 5, 46, 0, 0, 5234, 5235, 1, 0, 0, 0, 5235, 5236, 6, 442, 43, 0, 5236, 891, 1, 0, 0, 0, 5237, 5238, 5, 58, 0, 0, 5238, 5239, 1, 0, 0, 0, 5239, 5240, 6, 443, 44, 0, 5240, 893, 1, 0, 0, 0, 5241, 5242, 5, 58, 0, 0, 5242, 5243, 5, 61, 0, 0, 5243, 5244, 1, 0, 0, 0, 5244, 5245, 6, 444, 45, 0, 5245, 895, 1, 0, 0, 0, 5246, 5247, 5, 59, 0, 0, 5247, 5248, 1, 0, 0, 0, 5248, 5249, 6, 445, 46, 0, 5249, 897, 1, 0, 0, 0, 5250, 5251, 5, 47, 0, 0, 5251, 5252, 1, 0, 0, 0, 5252, 5253, 6, 446, 47, 0, 5253, 899, 1, 0, 0, 0, 5254, 5255, 5, 47, 0, 0, 5255, 5256, 5, 47, 0, 0, 5256, 5257, 1, 0, 0, 0, 5257, 5258, 6, 447, 48, 0, 5258, 901, 1, 0, 0, 0, 5259, 5260, 5, 92, 0, 0, 5260, 5261, 1, 0, 0, 0, 5261, 5262, 6, 448, 49, 0, 5262, 903, 1, 0, 0, 0, 5263, 5264, 5, 124, 0, 0, 5264, 5265, 1, 0, 0, 0, 5265, 5266, 6, 449, 50, 0, 5266, 905, 1, 0, 0, 0, 5267, 5268, 5, 60, 0, 0, 5268, 5269, 1, 0, 0, 0, 5269, 5270, 6, 450, 51, 0, 5270, 907, 1, 0, 0, 0, 5271, 5272, 5, 62, 0, 0, 5272, 5273, 1, 0, 0, 0, 5273, 5274, 6, 451, 52, 0, 5274, 909, 1, 0, 0, 0, 5275, 5276, 5, 63, 0, 0, 5276, 5277, 1, 0, 0, 0, 5277, 5278, 6, 452, 53, 0, 5278, 911, 1, 0, 0, 0, 5279, 5280, 5, 64, 0, 0, 5280, 5281, 1, 0, 0, 0, 5281, 5282, 6, 453, 54, 0, 5282, 913, 1, 0, 0, 0, 5283, 5284, 5, 36, 0, 0, 5284, 5285, 1, 0, 0, 0, 5285, 5286, 6, 454, 55, 0, 5286, 915, 1, 0, 0, 0, 5287, 5288, 5, 37, 0, 0, 5288, 5289, 1, 0, 0, 0, 5289, 5290, 6, 455, 56, 0, 5290, 917, 1, 0, 0, 0, 5291, 5292, 5, 33, 0, 0, 5292, 5293, 1, 0, 0, 0, 5293, 5294, 6, 456, 57, 0, 5294, 919, 1, 0, 0, 0, 5295, 5296, 5, 35, 0, 0, 5296, 5297, 1, 0, 0, 0, 5297, 5298, 6, 457, 58, 0, 5298, 921, 1, 0, 0, 0, 5299, 5300, 5, 94, 0, 0, 5300, 5301, 1, 0, 0, 0, 5301, 5302, 6, 458, 59, 0, 5302, 923, 1, 0, 0, 0, 5303, 5304, 5, 61, 0, 0, 5304, 5305, 5, 62, 0, 0, 5305, 5306, 1, 0, 0, 0, 5306, 5307, 6, 459, 60, 0, 5307, 925, 1, 0, 0, 0, 5308, 5309, 5, 96, 0, 0, 5309, 5310, 1, 0, 0, 0, 5310, 5311, 6, 460, 5, 0, 5311, 927, 1, 0, 0, 0, 5312, 5313, 5, 124, 0, 0, 5313, 5314, 5, 124, 0, 0, 5314, 5315, 1, 0, 0, 0, 5315, 5316, 6, 461, 61, 0, 5316, 929, 1, 0, 0, 0, 5317, 5318, 5, 126, 0, 0, 5318, 5319, 1, 0, 0, 0, 5319, 5320, 6, 462, 62, 0, 5320, 931, 1, 0, 0, 0, 5321, 5322, 5, 97, 0, 0, 5322, 5323, 5, 108, 0, 0, 5323, 5324, 5, 108, 0, 0, 5324, 5325, 5, 111, 0, 0, 5325, 5326, 5, 119, 0, 0, 5326, 5327, 5, 105, 0, 0, 5327, 5328, 5, 110, 0, 0, 5328, 5329, 5, 103, 0, 0, 5329, 5330, 1, 0, 0, 0, 5330, 5331, 6, 463, 63, 0, 5331, 933, 1, 0, 0, 0, 5332, 5333, 5, 97, 0, 0, 5333, 5334, 5, 110, 0, 0, 5334, 5335, 5, 99, 0, 0, 5335, 5336, 5, 101, 0, 0, 5336, 5337, 5, 115, 0, 0, 5337, 5338, 5, 116, 0, 0, 5338, 5339, 5, 111, 0, 0, 5339, 5340, 5, 114, 0, 0, 5340, 5341, 1, 0, 0, 0, 5341, 5342, 6, 464, 64, 0, 5342, 935, 1, 0, 0, 0, 5343, 5344, 5, 97, 0, 0, 5344, 5345, 5, 110, 0, 0, 5345, 5346, 5, 99, 0, 0, 5346, 5347, 5, 101, 0, 0, 5347, 5348, 5, 115, 0, 0, 5348, 5349, 5, 116, 0, 0, 5349, 5350, 5, 111, 0, 0, 5350, 5351, 5, 114, 0, 0, 5351, 5352, 5, 45, 0, 0, 5352, 5353, 5, 111, 0, 0, 5353, 5354, 5, 114, 0, 0, 5354, 5355, 5, 45, 0, 0, 5355, 5356, 5, 115, 0, 0, 5356, 5357, 5, 101, 0, 0, 5357, 5358, 5, 108, 0, 0, 5358, 5359, 5, 102, 0, 0, 5359, 5360, 1, 0, 0, 0, 5360, 5361, 6, 465, 65, 0, 5361, 937, 1, 0, 0, 0, 5362, 5363, 5, 97, 0, 0, 5363, 5364, 5, 110, 0, 0, 5364, 5365, 5, 100, 0, 0, 5365, 5366, 1, 0, 0, 0, 5366, 5367, 6, 466, 66, 0, 5367, 939, 1, 0, 0, 0, 5368, 5369, 5, 97, 0, 0, 5369, 5370, 5, 114, 0, 0, 5370, 5371, 5, 114, 0, 0, 5371, 5372, 5, 97, 0, 0, 5372, 5373, 5, 121, 0, 0, 5373, 5374, 1, 0, 0, 0, 5374, 5375, 6, 467, 67, 0, 5375, 941, 1, 0, 0, 0, 5376, 5377, 5, 97, 0, 0, 5377, 5378, 5, 115, 0, 0, 5378, 5379, 1, 0, 0, 0, 5379, 5380, 6, 468, 68, 0, 5380, 943, 1, 0, 0, 0, 5381, 5382, 5, 97, 0, 0, 5382, 5383, 5, 115, 0, 0, 5383, 5384, 5, 99, 0, 0, 5384, 5385, 5, 101, 0, 0, 5385, 5386, 5, 110, 0, 0, 5386, 5387, 5, 100, 0, 0, 5387, 5388, 5, 105, 0, 0, 5388, 5389, 5, 110, 0, 0, 5389, 5390, 5, 103, 0, 0, 5390, 5391, 1, 0, 0, 0, 5391, 5392, 6, 469, 69, 0, 5392, 945, 1, 0, 0, 0, 5393, 5394, 5, 97, 0, 0, 5394, 5395, 5, 116, 0, 0, 5395, 5396, 1, 0, 0, 0, 5396, 5397, 6, 470, 70, 0, 5397, 947, 1, 0, 0, 0, 5398, 5399, 5, 97, 0, 0, 5399, 5400, 5, 116, 0, 0, 5400, 5401, 5, 116, 0, 0, 5401, 5402, 5, 114, 0, 0, 5402, 5403, 5, 105, 0, 0, 5403, 5404, 5, 98, 0, 0, 5404, 5405, 5, 117, 0, 0, 5405, 5406, 5, 116, 0, 0, 5406, 5407, 5, 101, 0, 0, 5407, 5408, 1, 0, 0, 0, 5408, 5409, 6, 471, 71, 0, 5409, 949, 1, 0, 0, 0, 5410, 5411, 5, 98, 0, 0, 5411, 5412, 5, 97, 0, 0, 5412, 5413, 5, 115, 0, 0, 5413, 5414, 5, 101, 0, 0, 5414, 5415, 5, 45, 0, 0, 5415, 5416, 5, 117, 0, 0, 5416, 5417, 5, 114, 0, 0, 5417, 5418, 5, 105, 0, 0, 5418, 5419, 1, 0, 0, 0, 5419, 5420, 6, 472, 72, 0, 5420, 951, 1, 0, 0, 0, 5421, 5422, 5, 98, 0, 0, 5422, 5423, 5, 111, 0, 0, 5423, 5424, 5, 117, 0, 0, 5424, 5425, 5, 110, 0, 0, 5425, 5426, 5, 100, 0, 0, 5426, 5427, 5, 97, 0, 0, 5427, 5428, 5, 114, 0, 0, 5428, 5429, 5, 121, 0, 0, 5429, 5430, 5, 45, 0, 0, 5430, 5431, 5, 115, 0, 0, 5431, 5432, 5, 112, 0, 0, 5432, 5433, 5, 97, 0, 0, 5433, 5434, 5, 99, 0, 0, 5434, 5435, 5, 101, 0, 0, 5435, 5436, 1, 0, 0, 0, 5436, 5437, 6, 473, 73, 0, 5437, 953, 1, 0, 0, 0, 5438, 5439, 5, 98, 0, 0, 5439, 5440, 5, 105, 0, 0, 5440, 5441, 5, 110, 0, 0, 5441, 5442, 5, 97, 0, 0, 5442, 5443, 5, 114, 0, 0, 5443, 5444, 5, 121, 0, 0, 5444, 5445, 1, 0, 0, 0, 5445, 5446, 6, 474, 74, 0, 5446, 955, 1, 0, 0, 0, 5447, 5448, 5, 98, 0, 0, 5448, 5449, 5, 121, 0, 0, 5449, 5450, 1, 0, 0, 0, 5450, 5451, 6, 475, 75, 0, 5451, 957, 1, 0, 0, 0, 5452, 5453, 5, 99, 0, 0, 5453, 5454, 5, 97, 0, 0, 5454, 5455, 5, 115, 0, 0, 5455, 5456, 5, 101, 0, 0, 5456, 5457, 1, 0, 0, 0, 5457, 5458, 6, 476, 76, 0, 5458, 959, 1, 0, 0, 0, 5459, 5460, 5, 99, 0, 0, 5460, 5461, 5, 97, 0, 0, 5461, 5462, 5, 115, 0, 0, 5462, 5463, 5, 116, 0, 0, 5463, 5464, 1, 0, 0, 0, 5464, 5465, 6, 477, 77, 0, 5465, 961, 1, 0, 0, 0, 5466, 5467, 5, 99, 0, 0, 5467, 5468, 5, 97, 0, 0, 5468, 5469, 5, 115, 0, 0, 5469, 5470, 5, 116, 0, 0, 5470, 5471, 5, 97, 0, 0, 5471, 5472, 5, 98, 0, 0, 5472, 5473, 5, 108, 0, 0, 5473, 5474, 5, 101, 0, 0, 5474, 5475, 1, 0, 0, 0, 5475, 5476, 6, 478, 78, 0, 5476, 963, 1, 0, 0, 0, 5477, 5478, 5, 99, 0, 0, 5478, 5479, 5, 97, 0, 0, 5479, 5480, 5, 116, 0, 0, 5480, 5481, 5, 99, 0, 0, 5481, 5482, 5, 104, 0, 0, 5482, 5483, 1, 0, 0, 0, 5483, 5484, 6, 479, 79, 0, 5484, 965, 1, 0, 0, 0, 5485, 5486, 5, 99, 0, 0, 5486, 5487, 5, 104, 0, 0, 5487, 5488, 5, 105, 0, 0, 5488, 5489, 5, 108, 0, 0, 5489, 5490, 5, 100, 0, 0, 5490, 5491, 1, 0, 0, 0, 5491, 5492, 6, 480, 80, 0, 5492, 967, 1, 0, 0, 0, 5493, 5494, 5, 99, 0, 0, 5494, 5495, 5, 111, 0, 0, 5495, 5496, 5, 108, 0, 0, 5496, 5497, 5, 108, 0, 0, 5497, 5498, 5, 97, 0, 0, 5498, 5499, 5, 116, 0, 0, 5499, 5500, 5, 105, 0, 0, 5500, 5501, 5, 111, 0, 0, 5501, 5502, 5, 110, 0, 0, 5502, 5503, 1, 0, 0, 0, 5503, 5504, 6, 481, 81, 0, 5504, 969, 1, 0, 0, 0, 5505, 5506, 5, 99, 0, 0, 5506, 5507, 5, 111, 0, 0, 5507, 5508, 5, 109, 0, 0, 5508, 5509, 5, 109, 0, 0, 5509, 5510, 5, 101, 0, 0, 5510, 5511, 5, 110, 0, 0, 5511, 5512, 5, 116, 0, 0, 5512, 5513, 1, 0, 0, 0, 5513, 5514, 6, 482, 82, 0, 5514, 971, 1, 0, 0, 0, 5515, 5516, 5, 99, 0, 0, 5516, 5517, 5, 111, 0, 0, 5517, 5518, 5, 110, 0, 0, 5518, 5519, 5, 115, 0, 0, 5519, 5520, 5, 116, 0, 0, 5520, 5521, 5, 114, 0, 0, 5521, 5522, 5, 117, 0, 0, 5522, 5523, 5, 99, 0, 0, 5523, 5524, 5, 116, 0, 0, 5524, 5525, 5, 105, 0, 0, 5525, 5526, 5, 111, 0, 0, 5526, 5527, 5, 110, 0, 0, 5527, 5528, 1, 0, 0, 0, 5528, 5529, 6, 483, 83, 0, 5529, 973, 1, 0, 0, 0, 5530, 5531, 5, 99, 0, 0, 5531, 5532, 5, 111, 0, 0, 5532, 5533, 5, 110, 0, 0, 5533, 5534, 5, 116, 0, 0, 5534, 5535, 5, 101, 0, 0, 5535, 5536, 5, 120, 0, 0, 5536, 5537, 5, 116, 0, 0, 5537, 5538, 1, 0, 0, 0, 5538, 5539, 6, 484, 84, 0, 5539, 975, 1, 0, 0, 0, 5540, 5541, 5, 99, 0, 0, 5541, 5542, 5, 111, 0, 0, 5542, 5543, 5, 112, 0, 0, 5543, 5544, 5, 121, 0, 0, 5544, 5545, 5, 45, 0, 0, 5545, 5546, 5, 110, 0, 0, 5546, 5547, 5, 97, 0, 0, 5547, 5548, 5, 109, 0, 0, 5548, 5549, 5, 101, 0, 0, 5549, 5550, 5, 115, 0, 0, 5550, 5551, 5, 112, 0, 0, 5551, 5552, 5, 97, 0, 0, 5552, 5553, 5, 99, 0, 0, 5553, 5554, 5, 101, 0, 0, 5554, 5555, 5, 115, 0, 0, 5555, 5556, 1, 0, 0, 0, 5556, 5557, 6, 485, 85, 0, 5557, 977, 1, 0, 0, 0, 5558, 5559, 5, 99, 0, 0, 5559, 5560, 5, 111, 0, 0, 5560, 5561, 5, 117, 0, 0, 5561, 5562, 5, 110, 0, 0, 5562, 5563, 5, 116, 0, 0, 5563, 5564, 1, 0, 0, 0, 5564, 5565, 6, 486, 86, 0, 5565, 979, 1, 0, 0, 0, 5566, 5567, 5, 100, 0, 0, 5567, 5568, 5, 101, 0, 0, 5568, 5569, 5, 99, 0, 0, 5569, 5570, 5, 108, 0, 0, 5570, 5571, 5, 97, 0, 0, 5571, 5572, 5, 114, 0, 0, 5572, 5573, 5, 101, 0, 0, 5573, 5574, 1, 0, 0, 0, 5574, 5575, 6, 487, 87, 0, 5575, 981, 1, 0, 0, 0, 5576, 5577, 5, 100, 0, 0, 5577, 5578, 5, 101, 0, 0, 5578, 5579, 5, 102, 0, 0, 5579, 5580, 5, 97, 0, 0, 5580, 5581, 5, 117, 0, 0, 5581, 5582, 5, 108, 0, 0, 5582, 5583, 5, 116, 0, 0, 5583, 5584, 1, 0, 0, 0, 5584, 5585, 6, 488, 88, 0, 5585, 983, 1, 0, 0, 0, 5586, 5587, 5, 100, 0, 0, 5587, 5588, 5, 101, 0, 0, 5588, 5589, 5, 115, 0, 0, 5589, 5590, 5, 99, 0, 0, 5590, 5591, 5, 101, 0, 0, 5591, 5592, 5, 110, 0, 0, 5592, 5593, 5, 100, 0, 0, 5593, 5594, 5, 97, 0, 0, 5594, 5595, 5, 110, 0, 0, 5595, 5596, 5, 116, 0, 0, 5596, 5597, 1, 0, 0, 0, 5597, 5598, 6, 489, 89, 0, 5598, 985, 1, 0, 0, 0, 5599, 5600, 5, 100, 0, 0, 5600, 5601, 5, 101, 0, 0, 5601, 5602, 5, 115, 0, 0, 5602, 5603, 5, 99, 0, 0, 5603, 5604, 5, 101, 0, 0, 5604, 5605, 5, 110, 0, 0, 5605, 5606, 5, 100, 0, 0, 5606, 5607, 5, 97, 0, 0, 5607, 5608, 5, 110, 0, 0, 5608, 5609, 5, 116, 0, 0, 5609, 5610, 5, 45, 0, 0, 5610, 5611, 5, 111, 0, 0, 5611, 5612, 5, 114, 0, 0, 5612, 5613, 5, 45, 0, 0, 5613, 5614, 5, 115, 0, 0, 5614, 5615, 5, 101, 0, 0, 5615, 5616, 5, 108, 0, 0, 5616, 5617, 5, 102, 0, 0, 5617, 5618, 1, 0, 0, 0, 5618, 5619, 6, 490, 90, 0, 5619, 987, 1, 0, 0, 0, 5620, 5621, 5, 100, 0, 0, 5621, 5622, 5, 101, 0, 0, 5622, 5623, 5, 115, 0, 0, 5623, 5624, 5, 99, 0, 0, 5624, 5625, 5, 101, 0, 0, 5625, 5626, 5, 110, 0, 0, 5626, 5627, 5, 100, 0, 0, 5627, 5628, 5, 105, 0, 0, 5628, 5629, 5, 110, 0, 0, 5629, 5630, 5, 103, 0, 0, 5630, 5631, 1, 0, 0, 0, 5631, 5632, 6, 491, 91, 0, 5632, 989, 1, 0, 0, 0, 5633, 5634, 5, 100, 0, 0, 5634, 5635, 5, 101, 0, 0, 5635, 5636, 5, 99, 0, 0, 5636, 5637, 5, 105, 0, 0, 5637, 5638, 5, 109, 0, 0, 5638, 5639, 5, 97, 0, 0, 5639, 5640, 5, 108, 0, 0, 5640, 5641, 5, 45, 0, 0, 5641, 5642, 5, 102, 0, 0, 5642, 5643, 5, 111, 0, 0, 5643, 5644, 5, 114, 0, 0, 5644, 5645, 5, 109, 0, 0, 5645, 5646, 5, 97, 0, 0, 5646, 5647, 5, 116, 0, 0, 5647, 5648, 1, 0, 0, 0, 5648, 5649, 6, 492, 92, 0, 5649, 991, 1, 0, 0, 0, 5650, 5651, 5, 100, 0, 0, 5651, 5652, 5, 105, 0, 0, 5652, 5653, 5, 118, 0, 0, 5653, 5654, 1, 0, 0, 0, 5654, 5655, 6, 493, 93, 0, 5655, 993, 1, 0, 0, 0, 5656, 5657, 5, 100, 0, 0, 5657, 5658, 5, 111, 0, 0, 5658, 5659, 5, 99, 0, 0, 5659, 5660, 5, 117, 0, 0, 5660, 5661, 5, 109, 0, 0, 5661, 5662, 5, 101, 0, 0, 5662, 5663, 5, 110, 0, 0, 5663, 5664, 5, 116, 0, 0, 5664, 5665, 1, 0, 0, 0, 5665, 5666, 6, 494, 94, 0, 5666, 995, 1, 0, 0, 0, 5667, 5668, 5, 100, 0, 0, 5668, 5669, 5, 111, 0, 0, 5669, 5670, 5, 99, 0, 0, 5670, 5671, 5, 117, 0, 0, 5671, 5672, 5, 109, 0, 0, 5672, 5673, 5, 101, 0, 0, 5673, 5674, 5, 110, 0, 0, 5674, 5675, 5, 116, 0, 0, 5675, 5676, 5, 45, 0, 0, 5676, 5677, 5, 110, 0, 0, 5677, 5678, 5, 111, 0, 0, 5678, 5679, 5, 100, 0, 0, 5679, 5680, 5, 101, 0, 0, 5680, 5681, 1, 0, 0, 0, 5681, 5682, 6, 495, 95, 0, 5682, 997, 1, 0, 0, 0, 5683, 5684, 5, 101, 0, 0, 5684, 5685, 5, 108, 0, 0, 5685, 5686, 5, 101, 0, 0, 5686, 5687, 5, 109, 0, 0, 5687, 5688, 5, 101, 0, 0, 5688, 5689, 5, 110, 0, 0, 5689, 5690, 5, 116, 0, 0, 5690, 5691, 1, 0, 0, 0, 5691, 5692, 6, 496, 96, 0, 5692, 999, 1, 0, 0, 0, 5693, 5694, 5, 101, 0, 0, 5694, 5695, 5, 108, 0, 0, 5695, 5696, 5, 115, 0, 0, 5696, 5697, 5, 101, 0, 0, 5697, 5698, 1, 0, 0, 0, 5698, 5699, 6, 497, 97, 0, 5699, 1001, 1, 0, 0, 0, 5700, 5701, 5, 101, 0, 0, 5701, 5702, 5, 109, 0, 0, 5702, 5703, 5, 112, 0, 0, 5703, 5704, 5, 116, 0, 0, 5704, 5705, 5, 121, 0, 0, 5705, 5706, 1, 0, 0, 0, 5706, 5707, 6, 498, 98, 0, 5707, 1003, 1, 0, 0, 0, 5708, 5709, 5, 101, 0, 0, 5709, 5710, 5, 109, 0, 0, 5710, 5711, 5, 112, 0, 0, 5711, 5712, 5, 116, 0, 0, 5712, 5713, 5, 121, 0, 0, 5713, 5714, 5, 45, 0, 0, 5714, 5715, 5, 115, 0, 0, 5715, 5716, 5, 101, 0, 0, 5716, 5717, 5, 113, 0, 0, 5717, 5718, 5, 117, 0, 0, 5718, 5719, 5, 101, 0, 0, 5719, 5720, 5, 110, 0, 0, 5720, 5721, 5, 99, 0, 0, 5721, 5722, 5, 101, 0, 0, 5722, 5723, 1, 0, 0, 0, 5723, 5724, 6, 499, 99, 0, 5724, 1005, 1, 0, 0, 0, 5725, 5726, 5, 101, 0, 0, 5726, 5727, 5, 110, 0, 0, 5727, 5728, 5, 99, 0, 0, 5728, 5729, 5, 111, 0, 0, 5729, 5730, 5, 100, 0, 0, 5730, 5731, 5, 105, 0, 0, 5731, 5732, 5, 110, 0, 0, 5732, 5733, 5, 103, 0, 0, 5733, 5734, 1, 0, 0, 0, 5734, 5735, 6, 500, 100, 0, 5735, 1007, 1, 0, 0, 0, 5736, 5737, 5, 101, 0, 0, 5737, 5738, 5, 110, 0, 0, 5738, 5739, 5, 100, 0, 0, 5739, 5740, 1, 0, 0, 0, 5740, 5741, 6, 501, 101, 0, 5741, 1009, 1, 0, 0, 0, 5742, 5743, 5, 101, 0, 0, 5743, 5744, 5, 113, 0, 0, 5744, 5745, 1, 0, 0, 0, 5745, 5746, 6, 502, 102, 0, 5746, 1011, 1, 0, 0, 0, 5747, 5748, 5, 101, 0, 0, 5748, 5749, 5, 118, 0, 0, 5749, 5750, 5, 101, 0, 0, 5750, 5751, 5, 114, 0, 0, 5751, 5752, 5, 121, 0, 0, 5752, 5753, 1, 0, 0, 0, 5753, 5754, 6, 503, 103, 0, 5754, 1013, 1, 0, 0, 0, 5755, 5756, 5, 101, 0, 0, 5756, 5757, 5, 120, 0, 0, 5757, 5758, 5, 99, 0, 0, 5758, 5759, 5, 101, 0, 0, 5759, 5760, 5, 112, 0, 0, 5760, 5761, 5, 116, 0, 0, 5761, 5762, 1, 0, 0, 0, 5762, 5763, 6, 504, 104, 0, 5763, 1015, 1, 0, 0, 0, 5764, 5765, 5, 101, 0, 0, 5765, 5766, 5, 120, 0, 0, 5766, 5767, 5, 116, 0, 0, 5767, 5768, 5, 101, 0, 0, 5768, 5769, 5, 114, 0, 0, 5769, 5770, 5, 110, 0, 0, 5770, 5771, 5, 97, 0, 0, 5771, 5772, 5, 108, 0, 0, 5772, 5773, 1, 0, 0, 0, 5773, 5774, 6, 505, 105, 0, 5774, 1017, 1, 0, 0, 0, 5775, 5776, 5, 102, 0, 0, 5776, 5777, 5, 111, 0, 0, 5777, 5778, 5, 108, 0, 0, 5778, 5779, 5, 108, 0, 0, 5779, 5780, 5, 111, 0, 0, 5780, 5781, 5, 119, 0, 0, 5781, 5782, 5, 105, 0, 0, 5782, 5783, 5, 110, 0, 0, 5783, 5784, 5, 103, 0, 0, 5784, 5785, 1, 0, 0, 0, 5785, 5786, 6, 506, 106, 0, 5786, 1019, 1, 0, 0, 0, 5787, 5788, 5, 102, 0, 0, 5788, 5789, 5, 111, 0, 0, 5789, 5790, 5, 108, 0, 0, 5790, 5791, 5, 108, 0, 0, 5791, 5792, 5, 111, 0, 0, 5792, 5793, 5, 119, 0, 0, 5793, 5794, 5, 105, 0, 0, 5794, 5795, 5, 110, 0, 0, 5795, 5796, 5, 103, 0, 0, 5796, 5797, 5, 45, 0, 0, 5797, 5798, 5, 115, 0, 0, 5798, 5799, 5, 105, 0, 0, 5799, 5800, 5, 98, 0, 0, 5800, 5801, 5, 108, 0, 0, 5801, 5802, 5, 105, 0, 0, 5802, 5803, 5, 110, 0, 0, 5803, 5804, 5, 103, 0, 0, 5804, 5805, 1, 0, 0, 0, 5805, 5806, 6, 507, 107, 0, 5806, 1021, 1, 0, 0, 0, 5807, 5808, 5, 102, 0, 0, 5808, 5809, 5, 111, 0, 0, 5809, 5810, 5, 114, 0, 0, 5810, 5811, 1, 0, 0, 0, 5811, 5812, 6, 508, 108, 0, 5812, 1023, 1, 0, 0, 0, 5813, 5814, 5, 102, 0, 0, 5814, 5815, 5, 117, 0, 0, 5815, 5816, 5, 110, 0, 0, 5816, 5817, 5, 99, 0, 0, 5817, 5818, 5, 116, 0, 0, 5818, 5819, 5, 105, 0, 0, 5819, 5820, 5, 111, 0, 0, 5820, 5821, 5, 110, 0, 0, 5821, 5822, 1, 0, 0, 0, 5822, 5823, 6, 509, 109, 0, 5823, 1025, 1, 0, 0, 0, 5824, 5825, 5, 103, 0, 0, 5825, 5826, 5, 101, 0, 0, 5826, 5827, 1, 0, 0, 0, 5827, 5828, 6, 510, 110, 0, 5828, 1027, 1, 0, 0, 0, 5829, 5830, 5, 103, 0, 0, 5830, 5831, 5, 114, 0, 0, 5831, 5832, 5, 101, 0, 0, 5832, 5833, 5, 97, 0, 0, 5833, 5834, 5, 116, 0, 0, 5834, 5835, 5, 101, 0, 0, 5835, 5836, 5, 115, 0, 0, 5836, 5837, 5, 116, 0, 0, 5837, 5838, 1, 0, 0, 0, 5838, 5839, 6, 511, 111, 0, 5839, 1029, 1, 0, 0, 0, 5840, 5841, 5, 103, 0, 0, 5841, 5842, 5, 114, 0, 0, 5842, 5843, 5, 111, 0, 0, 5843, 5844, 5, 117, 0, 0, 5844, 5845, 5, 112, 0, 0, 5845, 5846, 1, 0, 0, 0, 5846, 5847, 6, 512, 112, 0, 5847, 1031, 1, 0, 0, 0, 5848, 5849, 5, 103, 0, 0, 5849, 5850, 5, 116, 0, 0, 5850, 5851, 1, 0, 0, 0, 5851, 5852, 6, 513, 113, 0, 5852, 1033, 1, 0, 0, 0, 5853, 5854, 5, 105, 0, 0, 5854, 5855, 5, 100, 0, 0, 5855, 5856, 5, 105, 0, 0, 5856, 5857, 5, 118, 0, 0, 5857, 5858, 1, 0, 0, 0, 5858, 5859, 6, 514, 114, 0, 5859, 1035, 1, 0, 0, 0, 5860, 5861, 5, 105, 0, 0, 5861, 5862, 5, 102, 0, 0, 5862, 5863, 1, 0, 0, 0, 5863, 5864, 6, 515, 115, 0, 5864, 1037, 1, 0, 0, 0, 5865, 5866, 5, 105, 0, 0, 5866, 5867, 5, 109, 0, 0, 5867, 5868, 5, 112, 0, 0, 5868, 5869, 5, 111, 0, 0, 5869, 5870, 5, 114, 0, 0, 5870, 5871, 5, 116, 0, 0, 5871, 5872, 1, 0, 0, 0, 5872, 5873, 6, 516, 116, 0, 5873, 1039, 1, 0, 0, 0, 5874, 5875, 5, 105, 0, 0, 5875, 5876, 5, 110, 0, 0, 5876, 5877, 1, 0, 0, 0, 5877, 5878, 6, 517, 117, 0, 5878, 1041, 1, 0, 0, 0, 5879, 5880, 5, 105, 0, 0, 5880, 5881, 5, 110, 0, 0, 5881, 5882, 5, 104, 0, 0, 5882, 5883, 5, 101, 0, 0, 5883, 5884, 5, 114, 0, 0, 5884, 5885, 5, 105, 0, 0, 5885, 5886, 5, 116, 0, 0, 5886, 5887, 1, 0, 0, 0, 5887, 5888, 6, 518, 118, 0, 5888, 1043, 1, 0, 0, 0, 5889, 5890, 5, 105, 0, 0, 5890, 5891, 5, 110, 0, 0, 5891, 5892, 5, 115, 0, 0, 5892, 5893, 5, 116, 0, 0, 5893, 5894, 5, 97, 0, 0, 5894, 5895, 5, 110, 0, 0, 5895, 5896, 5, 99, 0, 0, 5896, 5897, 5, 101, 0, 0, 5897, 5898, 1, 0, 0, 0, 5898, 5899, 6, 519, 119, 0, 5899, 1045, 1, 0, 0, 0, 5900, 5901, 5, 105, 0, 0, 5901, 5902, 5, 110, 0, 0, 5902, 5903, 5, 116, 0, 0, 5903, 5904, 5, 101, 0, 0, 5904, 5905, 5, 114, 0, 0, 5905, 5906, 5, 115, 0, 0, 5906, 5907, 5, 101, 0, 0, 5907, 5908, 5, 99, 0, 0, 5908, 5909, 5, 116, 0, 0, 5909, 5910, 1, 0, 0, 0, 5910, 5911, 6, 520, 120, 0, 5911, 1047, 1, 0, 0, 0, 5912, 5913, 5, 105, 0, 0, 5913, 5914, 5, 115, 0, 0, 5914, 5915, 1, 0, 0, 0, 5915, 5916, 6, 521, 121, 0, 5916, 1049, 1, 0, 0, 0, 5917, 5918, 5, 105, 0, 0, 5918, 5919, 5, 116, 0, 0, 5919, 5920, 5, 101, 0, 0, 5920, 5921, 5, 109, 0, 0, 5921, 5922, 1, 0, 0, 0, 5922, 5923, 6, 522, 122, 0, 5923, 1051, 1, 0, 0, 0, 5924, 5925, 5, 108, 0, 0, 5925, 5926, 5, 97, 0, 0, 5926, 5927, 5, 120, 0, 0, 5927, 5928, 1, 0, 0, 0, 5928, 5929, 6, 523, 123, 0, 5929, 1053, 1, 0, 0, 0, 5930, 5931, 5, 108, 0, 0, 5931, 5932, 5, 101, 0, 0, 5932, 5933, 1, 0, 0, 0, 5933, 5934, 6, 524, 124, 0, 5934, 1055, 1, 0, 0, 0, 5935, 5936, 5, 108, 0, 0, 5936, 5937, 5, 101, 0, 0, 5937, 5938, 5, 97, 0, 0, 5938, 5939, 5, 115, 0, 0, 5939, 5940, 5, 116, 0, 0, 5940, 5941, 1, 0, 0, 0, 5941, 5942, 6, 525, 125, 0, 5942, 1057, 1, 0, 0, 0, 5943, 5944, 5, 108, 0, 0, 5944, 5945, 5, 101, 0, 0, 5945, 5946, 5, 116, 0, 0, 5946, 5947, 1, 0, 0, 0, 5947, 5948, 6, 526, 126, 0, 5948, 1059, 1, 0, 0, 0, 5949, 5950, 5, 108, 0, 0, 5950, 5951, 5, 116, 0, 0, 5951, 5952, 1, 0, 0, 0, 5952, 5953, 6, 527, 127, 0, 5953, 1061, 1, 0, 0, 0, 5954, 5955, 5, 109, 0, 0, 5955, 5956, 5, 97, 0, 0, 5956, 5957, 5, 112, 0, 0, 5957, 5958, 1, 0, 0, 0, 5958, 5959, 6, 528, 128, 0, 5959, 1063, 1, 0, 0, 0, 5960, 5961, 5, 109, 0, 0, 5961, 5962, 5, 111, 0, 0, 5962, 5963, 5, 100, 0, 0, 5963, 5964, 1, 0, 0, 0, 5964, 5965, 6, 529, 129, 0, 5965, 1065, 1, 0, 0, 0, 5966, 5967, 5, 109, 0, 0, 5967, 5968, 5, 111, 0, 0, 5968, 5969, 5, 100, 0, 0, 5969, 5970, 5, 117, 0, 0, 5970, 5971, 5, 108, 0, 0, 5971, 5972, 5, 101, 0, 0, 5972, 5973, 1, 0, 0, 0, 5973, 5974, 6, 530, 130, 0, 5974, 1067, 1, 0, 0, 0, 5975, 5976, 5, 110, 0, 0, 5976, 5977, 5, 97, 0, 0, 5977, 5978, 5, 109, 0, 0, 5978, 5979, 5, 101, 0, 0, 5979, 5980, 5, 115, 0, 0, 5980, 5981, 5, 112, 0, 0, 5981, 5982, 5, 97, 0, 0, 5982, 5983, 5, 99, 0, 0, 5983, 5984, 5, 101, 0, 0, 5984, 5985, 1, 0, 0, 0, 5985, 5986, 6, 531, 131, 0, 5986, 1069, 1, 0, 0, 0, 5987, 5988, 5, 110, 0, 0, 5988, 5989, 5, 101, 0, 0, 5989, 5990, 1, 0, 0, 0, 5990, 5991, 6, 532, 132, 0, 5991, 1071, 1, 0, 0, 0, 5992, 5993, 5, 110, 0, 0, 5993, 5994, 5, 101, 0, 0, 5994, 5995, 5, 120, 0, 0, 5995, 5996, 5, 116, 0, 0, 5996, 5997, 1, 0, 0, 0, 5997, 5998, 6, 533, 133, 0, 5998, 1073, 1, 0, 0, 0, 5999, 6000, 5, 110, 0, 0, 6000, 6001, 5, 97, 0, 0, 6001, 6002, 5, 109, 0, 0, 6002, 6003, 5, 101, 0, 0, 6003, 6004, 5, 115, 0, 0, 6004, 6005, 5, 112, 0, 0, 6005, 6006, 5, 97, 0, 0, 6006, 6007, 5, 99, 0, 0, 6007, 6008, 5, 101, 0, 0, 6008, 6009, 5, 45, 0, 0, 6009, 6010, 5, 110, 0, 0, 6010, 6011, 5, 111, 0, 0, 6011, 6012, 5, 100, 0, 0, 6012, 6013, 5, 101, 0, 0, 6013, 6014, 1, 0, 0, 0, 6014, 6015, 6, 534, 134, 0, 6015, 1075, 1, 0, 0, 0, 6016, 6017, 5, 110, 0, 0, 6017, 6018, 5, 111, 0, 0, 6018, 6019, 5, 45, 0, 0, 6019, 6020, 5, 105, 0, 0, 6020, 6021, 5, 110, 0, 0, 6021, 6022, 5, 104, 0, 0, 6022, 6023, 5, 101, 0, 0, 6023, 6024, 5, 114, 0, 0, 6024, 6025, 5, 105, 0, 0, 6025, 6026, 5, 116, 0, 0, 6026, 6027, 1, 0, 0, 0, 6027, 6028, 6, 535, 135, 0, 6028, 1077, 1, 0, 0, 0, 6029, 6030, 5, 110, 0, 0, 6030, 6031, 5, 111, 0, 0, 6031, 6032, 5, 45, 0, 0, 6032, 6033, 5, 112, 0, 0, 6033, 6034, 5, 114, 0, 0, 6034, 6035, 5, 101, 0, 0, 6035, 6036, 5, 115, 0, 0, 6036, 6037, 5, 101, 0, 0, 6037, 6038, 5, 114, 0, 0, 6038, 6039, 5, 118, 0, 0, 6039, 6040, 5, 101, 0, 0, 6040, 6041, 1, 0, 0, 0, 6041, 6042, 6, 536, 136, 0, 6042, 1079, 1, 0, 0, 0, 6043, 6044, 5, 110, 0, 0, 6044, 6045, 5, 111, 0, 0, 6045, 6046, 5, 100, 0, 0, 6046, 6047, 5, 101, 0, 0, 6047, 6048, 1, 0, 0, 0, 6048, 6049, 6, 537, 137, 0, 6049, 1081, 1, 0, 0, 0, 6050, 6051, 5, 111, 0, 0, 6051, 6052, 5, 102, 0, 0, 6052, 6053, 1, 0, 0, 0, 6053, 6054, 6, 538, 138, 0, 6054, 1083, 1, 0, 0, 0, 6055, 6056, 5, 111, 0, 0, 6056, 6057, 5, 110, 0, 0, 6057, 6058, 5, 108, 0, 0, 6058, 6059, 5, 121, 0, 0, 6059, 6060, 1, 0, 0, 0, 6060, 6061, 6, 539, 139, 0, 6061, 1085, 1, 0, 0, 0, 6062, 6063, 5, 111, 0, 0, 6063, 6064, 5, 112, 0, 0, 6064, 6065, 5, 116, 0, 0, 6065, 6066, 5, 105, 0, 0, 6066, 6067, 5, 111, 0, 0, 6067, 6068, 5, 110, 0, 0, 6068, 6069, 1, 0, 0, 0, 6069, 6070, 6, 540, 140, 0, 6070, 1087, 1, 0, 0, 0, 6071, 6072, 5, 111, 0, 0, 6072, 6073, 5, 114, 0, 0, 6073, 6074, 1, 0, 0, 0, 6074, 6075, 6, 541, 141, 0, 6075, 1089, 1, 0, 0, 0, 6076, 6077, 5, 111, 0, 0, 6077, 6078, 5, 114, 0, 0, 6078, 6079, 5, 100, 0, 0, 6079, 6080, 5, 101, 0, 0, 6080, 6081, 5, 114, 0, 0, 6081, 6082, 1, 0, 0, 0, 6082, 6083, 6, 542, 142, 0, 6083, 1091, 1, 0, 0, 0, 6084, 6085, 5, 111, 0, 0, 6085, 6086, 5, 114, 0, 0, 6086, 6087, 5, 100, 0, 0, 6087, 6088, 5, 101, 0, 0, 6088, 6089, 5, 114, 0, 0, 6089, 6090, 5, 101, 0, 0, 6090, 6091, 5, 100, 0, 0, 6091, 6092, 1, 0, 0, 0, 6092, 6093, 6, 543, 143, 0, 6093, 1093, 1, 0, 0, 0, 6094, 6095, 5, 111, 0, 0, 6095, 6096, 5, 114, 0, 0, 6096, 6097, 5, 100, 0, 0, 6097, 6098, 5, 101, 0, 0, 6098, 6099, 5, 114, 0, 0, 6099, 6100, 5, 105, 0, 0, 6100, 6101, 5, 110, 0, 0, 6101, 6102, 5, 103, 0, 0, 6102, 6103, 1, 0, 0, 0, 6103, 6104, 6, 544, 144, 0, 6104, 1095, 1, 0, 0, 0, 6105, 6106, 5, 112, 0, 0, 6106, 6107, 5, 97, 0, 0, 6107, 6108, 5, 114, 0, 0, 6108, 6109, 5, 101, 0, 0, 6109, 6110, 5, 110, 0, 0, 6110, 6111, 5, 116, 0, 0, 6111, 6112, 1, 0, 0, 0, 6112, 6113, 6, 545, 145, 0, 6113, 1097, 1, 0, 0, 0, 6114, 6115, 5, 112, 0, 0, 6115, 6116, 5, 114, 0, 0, 6116, 6117, 5, 101, 0, 0, 6117, 6118, 5, 99, 0, 0, 6118, 6119, 5, 101, 0, 0, 6119, 6120, 5, 100, 0, 0, 6120, 6121, 5, 105, 0, 0, 6121, 6122, 5, 110, 0, 0, 6122, 6123, 5, 103, 0, 0, 6123, 6124, 1, 0, 0, 0, 6124, 6125, 6, 546, 146, 0, 6125, 1099, 1, 0, 0, 0, 6126, 6127, 5, 112, 0, 0, 6127, 6128, 5, 114, 0, 0, 6128, 6129, 5, 101, 0, 0, 6129, 6130, 5, 99, 0, 0, 6130, 6131, 5, 101, 0, 0, 6131, 6132, 5, 100, 0, 0, 6132, 6133, 5, 105, 0, 0, 6133, 6134, 5, 110, 0, 0, 6134, 6135, 5, 103, 0, 0, 6135, 6136, 5, 45, 0, 0, 6136, 6137, 5, 115, 0, 0, 6137, 6138, 5, 105, 0, 0, 6138, 6139, 5, 98, 0, 0, 6139, 6140, 5, 108, 0, 0, 6140, 6141, 5, 105, 0, 0, 6141, 6142, 5, 110, 0, 0, 6142, 6143, 5, 103, 0, 0, 6143, 6144, 1, 0, 0, 0, 6144, 6145, 6, 547, 147, 0, 6145, 1101, 1, 0, 0, 0, 6146, 6147, 5, 112, 0, 0, 6147, 6148, 5, 114, 0, 0, 6148, 6149, 5, 101, 0, 0, 6149, 6150, 5, 115, 0, 0, 6150, 6151, 5, 101, 0, 0, 6151, 6152, 5, 114, 0, 0, 6152, 6153, 5, 118, 0, 0, 6153, 6154, 5, 101, 0, 0, 6154, 6155, 1, 0, 0, 0, 6155, 6156, 6, 548, 148, 0, 6156, 1103, 1, 0, 0, 0, 6157, 6158, 5, 112, 0, 0, 6158, 6159, 5, 114, 0, 0, 6159, 6160, 5, 101, 0, 0, 6160, 6161, 5, 118, 0, 0, 6161, 6162, 5, 105, 0, 0, 6162, 6163, 5, 111, 0, 0, 6163, 6164, 5, 117, 0, 0, 6164, 6165, 5, 115, 0, 0, 6165, 6166, 1, 0, 0, 0, 6166, 6167, 6, 549, 149, 0, 6167, 1105, 1, 0, 0, 0, 6168, 6169, 5, 112, 0, 0, 6169, 6170, 5, 114, 0, 0, 6170, 6171, 5, 111, 0, 0, 6171, 6172, 5, 99, 0, 0, 6172, 6173, 5, 101, 0, 0, 6173, 6174, 5, 115, 0, 0, 6174, 6175, 5, 115, 0, 0, 6175, 6176, 5, 105, 0, 0, 6176, 6177, 5, 110, 0, 0, 6177, 6178, 5, 103, 0, 0, 6178, 6179, 5, 45, 0, 0, 6179, 6180, 5, 105, 0, 0, 6180, 6181, 5, 110, 0, 0, 6181, 6182, 5, 115, 0, 0, 6182, 6183, 5, 116, 0, 0, 6183, 6184, 5, 114, 0, 0, 6184, 6185, 5, 117, 0, 0, 6185, 6186, 5, 99, 0, 0, 6186, 6187, 5, 116, 0, 0, 6187, 6188, 5, 105, 0, 0, 6188, 6189, 5, 111, 0, 0, 6189, 6190, 5, 110, 0, 0, 6190, 6191, 1, 0, 0, 0, 6191, 6192, 6, 550, 150, 0, 6192, 1107, 1, 0, 0, 0, 6193, 6194, 5, 114, 0, 0, 6194, 6195, 5, 101, 0, 0, 6195, 6196, 5, 116, 0, 0, 6196, 6197, 5, 117, 0, 0, 6197, 6198, 5, 114, 0, 0, 6198, 6199, 5, 110, 0, 0, 6199, 6200, 1, 0, 0, 0, 6200, 6201, 6, 551, 151, 0, 6201, 1109, 1, 0, 0, 0, 6202, 6203, 5, 115, 0, 0, 6203, 6204, 5, 97, 0, 0, 6204, 6205, 5, 116, 0, 0, 6205, 6206, 5, 105, 0, 0, 6206, 6207, 5, 115, 0, 0, 6207, 6208, 5, 102, 0, 0, 6208, 6209, 5, 105, 0, 0, 6209, 6210, 5, 101, 0, 0, 6210, 6211, 5, 115, 0, 0, 6211, 6212, 1, 0, 0, 0, 6212, 6213, 6, 552, 152, 0, 6213, 1111, 1, 0, 0, 0, 6214, 6215, 5, 115, 0, 0, 6215, 6216, 5, 99, 0, 0, 6216, 6217, 5, 104, 0, 0, 6217, 6218, 5, 101, 0, 0, 6218, 6219, 5, 109, 0, 0, 6219, 6220, 5, 97, 0, 0, 6220, 6221, 1, 0, 0, 0, 6221, 6222, 6, 553, 153, 0, 6222, 1113, 1, 0, 0, 0, 6223, 6224, 5, 115, 0, 0, 6224, 6225, 5, 99, 0, 0, 6225, 6226, 5, 104, 0, 0, 6226, 6227, 5, 101, 0, 0, 6227, 6228, 5, 109, 0, 0, 6228, 6229, 5, 97, 0, 0, 6229, 6230, 5, 45, 0, 0, 6230, 6231, 5, 97, 0, 0, 6231, 6232, 5, 116, 0, 0, 6232, 6233, 5, 116, 0, 0, 6233, 6234, 5, 114, 0, 0, 6234, 6235, 5, 105, 0, 0, 6235, 6236, 5, 98, 0, 0, 6236, 6237, 5, 117, 0, 0, 6237, 6238, 5, 116, 0, 0, 6238, 6239, 5, 101, 0, 0, 6239, 6240, 1, 0, 0, 0, 6240, 6241, 6, 554, 154, 0, 6241, 1115, 1, 0, 0, 0, 6242, 6243, 5, 115, 0, 0, 6243, 6244, 5, 99, 0, 0, 6244, 6245, 5, 104, 0, 0, 6245, 6246, 5, 101, 0, 0, 6246, 6247, 5, 109, 0, 0, 6247, 6248, 5, 97, 0, 0, 6248, 6249, 5, 45, 0, 0, 6249, 6250, 5, 101, 0, 0, 6250, 6251, 5, 108, 0, 0, 6251, 6252, 5, 101, 0, 0, 6252, 6253, 5, 109, 0, 0, 6253, 6254, 5, 101, 0, 0, 6254, 6255, 5, 110, 0, 0, 6255, 6256, 5, 116, 0, 0, 6256, 6257, 1, 0, 0, 0, 6257, 6258, 6, 555, 155, 0, 6258, 1117, 1, 0, 0, 0, 6259, 6260, 5, 115, 0, 0, 6260, 6261, 5, 101, 0, 0, 6261, 6262, 5, 108, 0, 0, 6262, 6263, 5, 102, 0, 0, 6263, 6264, 1, 0, 0, 0, 6264, 6265, 6, 556, 156, 0, 6265, 1119, 1, 0, 0, 0, 6266, 6267, 5, 115, 0, 0, 6267, 6268, 5, 108, 0, 0, 6268, 6269, 5, 105, 0, 0, 6269, 6270, 5, 100, 0, 0, 6270, 6271, 5, 105, 0, 0, 6271, 6272, 5, 110, 0, 0, 6272, 6273, 5, 103, 0, 0, 6273, 6274, 1, 0, 0, 0, 6274, 6275, 6, 557, 157, 0, 6275, 1121, 1, 0, 0, 0, 6276, 6277, 5, 115, 0, 0, 6277, 6278, 5, 111, 0, 0, 6278, 6279, 5, 109, 0, 0, 6279, 6280, 5, 101, 0, 0, 6280, 6281, 1, 0, 0, 0, 6281, 6282, 6, 558, 158, 0, 6282, 1123, 1, 0, 0, 0, 6283, 6284, 5, 115, 0, 0, 6284, 6285, 5, 116, 0, 0, 6285, 6286, 5, 97, 0, 0, 6286, 6287, 5, 98, 0, 0, 6287, 6288, 5, 108, 0, 0, 6288, 6289, 5, 101, 0, 0, 6289, 6290, 1, 0, 0, 0, 6290, 6291, 6, 559, 159, 0, 6291, 1125, 1, 0, 0, 0, 6292, 6293, 5, 115, 0, 0, 6293, 6294, 5, 116, 0, 0, 6294, 6295, 5, 97, 0, 0, 6295, 6296, 5, 114, 0, 0, 6296, 6297, 5, 116, 0, 0, 6297, 6298, 1, 0, 0, 0, 6298, 6299, 6, 560, 160, 0, 6299, 1127, 1, 0, 0, 0, 6300, 6301, 5, 115, 0, 0, 6301, 6302, 5, 116, 0, 0, 6302, 6303, 5, 114, 0, 0, 6303, 6304, 5, 105, 0, 0, 6304, 6305, 5, 99, 0, 0, 6305, 6306, 5, 116, 0, 0, 6306, 6307, 1, 0, 0, 0, 6307, 6308, 6, 561, 161, 0, 6308, 1129, 1, 0, 0, 0, 6309, 6310, 5, 115, 0, 0, 6310, 6311, 5, 116, 0, 0, 6311, 6312, 5, 114, 0, 0, 6312, 6313, 5, 105, 0, 0, 6313, 6314, 5, 112, 0, 0, 6314, 6315, 1, 0, 0, 0, 6315, 6316, 6, 562, 162, 0, 6316, 1131, 1, 0, 0, 0, 6317, 6318, 5, 115, 0, 0, 6318, 6319, 5, 119, 0, 0, 6319, 6320, 5, 105, 0, 0, 6320, 6321, 5, 116, 0, 0, 6321, 6322, 5, 99, 0, 0, 6322, 6323, 5, 104, 0, 0, 6323, 6324, 1, 0, 0, 0, 6324, 6325, 6, 563, 163, 0, 6325, 1133, 1, 0, 0, 0, 6326, 6327, 5, 116, 0, 0, 6327, 6328, 5, 101, 0, 0, 6328, 6329, 5, 120, 0, 0, 6329, 6330, 5, 116, 0, 0, 6330, 6331, 1, 0, 0, 0, 6331, 6332, 6, 564, 164, 0, 6332, 1135, 1, 0, 0, 0, 6333, 6334, 5, 116, 0, 0, 6334, 6335, 5, 104, 0, 0, 6335, 6336, 5, 101, 0, 0, 6336, 6337, 5, 110, 0, 0, 6337, 6338, 1, 0, 0, 0, 6338, 6339, 6, 565, 165, 0, 6339, 1137, 1, 0, 0, 0, 6340, 6341, 5, 116, 0, 0, 6341, 6342, 5, 111, 0, 0, 6342, 6343, 1, 0, 0, 0, 6343, 6344, 6, 566, 166, 0, 6344, 1139, 1, 0, 0, 0, 6345, 6346, 5, 116, 0, 0, 6346, 6347, 5, 114, 0, 0, 6347, 6348, 5, 101, 0, 0, 6348, 6349, 5, 97, 0, 0, 6349, 6350, 5, 116, 0, 0, 6350, 6351, 1, 0, 0, 0, 6351, 6352, 6, 567, 167, 0, 6352, 1141, 1, 0, 0, 0, 6353, 6354, 5, 116, 0, 0, 6354, 6355, 5, 114, 0, 0, 6355, 6356, 5, 121, 0, 0, 6356, 6357, 1, 0, 0, 0, 6357, 6358, 6, 568, 168, 0, 6358, 1143, 1, 0, 0, 0, 6359, 6360, 5, 116, 0, 0, 6360, 6361, 5, 117, 0, 0, 6361, 6362, 5, 109, 0, 0, 6362, 6363, 5, 98, 0, 0, 6363, 6364, 5, 108, 0, 0, 6364, 6365, 5, 105, 0, 0, 6365, 6366, 5, 110, 0, 0, 6366, 6367, 5, 103, 0, 0, 6367, 6368, 1, 0, 0, 0, 6368, 6369, 6, 569, 169, 0, 6369, 1145, 1, 0, 0, 0, 6370, 6371, 5, 116, 0, 0, 6371, 6372, 5, 121, 0, 0, 6372, 6373, 5, 112, 0, 0, 6373, 6374, 5, 101, 0, 0, 6374, 6375, 1, 0, 0, 0, 6375, 6376, 6, 570, 170, 0, 6376, 1147, 1, 0, 0, 0, 6377, 6378, 5, 116, 0, 0, 6378, 6379, 5, 121, 0, 0, 6379, 6380, 5, 112, 0, 0, 6380, 6381, 5, 101, 0, 0, 6381, 6382, 5, 115, 0, 0, 6382, 6383, 5, 119, 0, 0, 6383, 6384, 5, 105, 0, 0, 6384, 6385, 5, 116, 0, 0, 6385, 6386, 5, 99, 0, 0, 6386, 6387, 5, 104, 0, 0, 6387, 6388, 1, 0, 0, 0, 6388, 6389, 6, 571, 171, 0, 6389, 1149, 1, 0, 0, 0, 6390, 6391, 5, 117, 0, 0, 6391, 6392, 5, 110, 0, 0, 6392, 6393, 5, 105, 0, 0, 6393, 6394, 5, 111, 0, 0, 6394, 6395, 5, 110, 0, 0, 6395, 6396, 1, 0, 0, 0, 6396, 6397, 6, 572, 172, 0, 6397, 1151, 1, 0, 0, 0, 6398, 6399, 5, 117, 0, 0, 6399, 6400, 5, 110, 0, 0, 6400, 6401, 5, 111, 0, 0, 6401, 6402, 5, 114, 0, 0, 6402, 6403, 5, 100, 0, 0, 6403, 6404, 5, 101, 0, 0, 6404, 6405, 5, 114, 0, 0, 6405, 6406, 5, 101, 0, 0, 6406, 6407, 5, 100, 0, 0, 6407, 6408, 1, 0, 0, 0, 6408, 6409, 6, 573, 173, 0, 6409, 1153, 1, 0, 0, 0, 6410, 6411, 5, 117, 0, 0, 6411, 6412, 5, 112, 0, 0, 6412, 6413, 5, 100, 0, 0, 6413, 6414, 5, 97, 0, 0, 6414, 6415, 5, 116, 0, 0, 6415, 6416, 5, 101, 0, 0, 6416, 6417, 1, 0, 0, 0, 6417, 6418, 6, 574, 174, 0, 6418, 1155, 1, 0, 0, 0, 6419, 6420, 5, 118, 0, 0, 6420, 6421, 5, 97, 0, 0, 6421, 6422, 5, 108, 0, 0, 6422, 6423, 5, 105, 0, 0, 6423, 6424, 5, 100, 0, 0, 6424, 6425, 5, 97, 0, 0, 6425, 6426, 5, 116, 0, 0, 6426, 6427, 5, 101, 0, 0, 6427, 6428, 1, 0, 0, 0, 6428, 6429, 6, 575, 175, 0, 6429, 1157, 1, 0, 0, 0, 6430, 6431, 5, 118, 0, 0, 6431, 6432, 5, 97, 0, 0, 6432, 6433, 5, 114, 0, 0, 6433, 6434, 5, 105, 0, 0, 6434, 6435, 5, 97, 0, 0, 6435, 6436, 5, 98, 0, 0, 6436, 6437, 5, 108, 0, 0, 6437, 6438, 5, 101, 0, 0, 6438, 6439, 1, 0, 0, 0, 6439, 6440, 6, 576, 176, 0, 6440, 1159, 1, 0, 0, 0, 6441, 6442, 5, 118, 0, 0, 6442, 6443, 5, 101, 0, 0, 6443, 6444, 5, 114, 0, 0, 6444, 6445, 5, 115, 0, 0, 6445, 6446, 5, 105, 0, 0, 6446, 6447, 5, 111, 0, 0, 6447, 6448, 5, 110, 0, 0, 6448, 6449, 1, 0, 0, 0, 6449, 6450, 6, 577, 177, 0, 6450, 1161, 1, 0, 0, 0, 6451, 6452, 5, 119, 0, 0, 6452, 6453, 5, 104, 0, 0, 6453, 6454, 5, 101, 0, 0, 6454, 6455, 5, 110, 0, 0, 6455, 6456, 1, 0, 0, 0, 6456, 6457, 6, 578, 178, 0, 6457, 1163, 1, 0, 0, 0, 6458, 6459, 5, 119, 0, 0, 6459, 6460, 5, 104, 0, 0, 6460, 6461, 5, 101, 0, 0, 6461, 6462, 5, 114, 0, 0, 6462, 6463, 5, 101, 0, 0, 6463, 6464, 1, 0, 0, 0, 6464, 6465, 6, 579, 179, 0, 6465, 1165, 1, 0, 0, 0, 6466, 6467, 5, 119, 0, 0, 6467, 6468, 5, 105, 0, 0, 6468, 6469, 5, 110, 0, 0, 6469, 6470, 5, 100, 0, 0, 6470, 6471, 5, 111, 0, 0, 6471, 6472, 5, 119, 0, 0, 6472, 6473, 1, 0, 0, 0, 6473, 6474, 6, 580, 180, 0, 6474, 1167, 1, 0, 0, 0, 6475, 6476, 5, 120, 0, 0, 6476, 6477, 5, 113, 0, 0, 6477, 6478, 5, 117, 0, 0, 6478, 6479, 5, 101, 0, 0, 6479, 6480, 5, 114, 0, 0, 6480, 6481, 5, 121, 0, 0, 6481, 6482, 1, 0, 0, 0, 6482, 6483, 6, 581, 181, 0, 6483, 1169, 1, 0, 0, 0, 6484, 6485, 5, 97, 0, 0, 6485, 6486, 5, 114, 0, 0, 6486, 6487, 5, 114, 0, 0, 6487, 6488, 5, 97, 0, 0, 6488, 6489, 5, 121, 0, 0, 6489, 6490, 5, 45, 0, 0, 6490, 6491, 5, 110, 0, 0, 6491, 6492, 5, 111, 0, 0, 6492, 6493, 5, 100, 0, 0, 6493, 6494, 5, 101, 0, 0, 6494, 6495, 1, 0, 0, 0, 6495, 6496, 6, 582, 182, 0, 6496, 1171, 1, 0, 0, 0, 6497, 6498, 5, 98, 0, 0, 6498, 6499, 5, 111, 0, 0, 6499, 6500, 5, 111, 0, 0, 6500, 6501, 5, 108, 0, 0, 6501, 6502, 5, 101, 0, 0, 6502, 6503, 5, 97, 0, 0, 6503, 6504, 5, 110, 0, 0, 6504, 6505, 5, 45, 0, 0, 6505, 6506, 5, 110, 0, 0, 6506, 6507, 5, 111, 0, 0, 6507, 6508, 5, 100, 0, 0, 6508, 6509, 5, 101, 0, 0, 6509, 6510, 1, 0, 0, 0, 6510, 6511, 6, 583, 183, 0, 6511, 1173, 1, 0, 0, 0, 6512, 6513, 5, 110, 0, 0, 6513, 6514, 5, 117, 0, 0, 6514, 6515, 5, 108, 0, 0, 6515, 6516, 5, 108, 0, 0, 6516, 6517, 5, 45, 0, 0, 6517, 6518, 5, 110, 0, 0, 6518, 6519, 5, 111, 0, 0, 6519, 6520, 5, 100, 0, 0, 6520, 6521, 5, 101, 0, 0, 6521, 6522, 1, 0, 0, 0, 6522, 6523, 6, 584, 184, 0, 6523, 1175, 1, 0, 0, 0, 6524, 6525, 5, 110, 0, 0, 6525, 6526, 5, 117, 0, 0, 6526, 6527, 5, 109, 0, 0, 6527, 6528, 5, 98, 0, 0, 6528, 6529, 5, 101, 0, 0, 6529, 6530, 5, 114, 0, 0, 6530, 6531, 5, 45, 0, 0, 6531, 6532, 5, 110, 0, 0, 6532, 6533, 5, 111, 0, 0, 6533, 6534, 5, 100, 0, 0, 6534, 6535, 5, 101, 0, 0, 6535, 6536, 1, 0, 0, 0, 6536, 6537, 6, 585, 185, 0, 6537, 1177, 1, 0, 0, 0, 6538, 6539, 5, 111, 0, 0, 6539, 6540, 5, 98, 0, 0, 6540, 6541, 5, 106, 0, 0, 6541, 6542, 5, 101, 0, 0, 6542, 6543, 5, 99, 0, 0, 6543, 6544, 5, 116, 0, 0, 6544, 6545, 5, 45, 0, 0, 6545, 6546, 5, 110, 0, 0, 6546, 6547, 5, 111, 0, 0, 6547, 6548, 5, 100, 0, 0, 6548, 6549, 5, 101, 0, 0, 6549, 6550, 1, 0, 0, 0, 6550, 6551, 6, 586, 186, 0, 6551, 1179, 1, 0, 0, 0, 6552, 6553, 5, 114, 0, 0, 6553, 6554, 5, 101, 0, 0, 6554, 6555, 5, 112, 0, 0, 6555, 6556, 5, 108, 0, 0, 6556, 6557, 5, 97, 0, 0, 6557, 6558, 5, 99, 0, 0, 6558, 6559, 5, 101, 0, 0, 6559, 6560, 1, 0, 0, 0, 6560, 6561, 6, 587, 187, 0, 6561, 1181, 1, 0, 0, 0, 6562, 6563, 5, 119, 0, 0, 6563, 6564, 5, 105, 0, 0, 6564, 6565, 5, 116, 0, 0, 6565, 6566, 5, 104, 0, 0, 6566, 6567, 1, 0, 0, 0, 6567, 6568, 6, 588, 188, 0, 6568, 1183, 1, 0, 0, 0, 6569, 6570, 5, 118, 0, 0, 6570, 6571, 5, 97, 0, 0, 6571, 6572, 5, 108, 0, 0, 6572, 6573, 5, 117, 0, 0, 6573, 6574, 5, 101, 0, 0, 6574, 6575, 1, 0, 0, 0, 6575, 6576, 6, 589, 189, 0, 6576, 1185, 1, 0, 0, 0, 6577, 6578, 5, 105, 0, 0, 6578, 6579, 5, 110, 0, 0, 6579, 6580, 5, 115, 0, 0, 6580, 6581, 5, 101, 0, 0, 6581, 6582, 5, 114, 0, 0, 6582, 6583, 5, 116, 0, 0, 6583, 6584, 1, 0, 0, 0, 6584, 6585, 6, 590, 190, 0, 6585, 1187, 1, 0, 0, 0, 6586, 6587, 5, 105, 0, 0, 6587, 6588, 5, 110, 0, 0, 6588, 6589, 5, 116, 0, 0, 6589, 6590, 5, 111, 0, 0, 6590, 6591, 1, 0, 0, 0, 6591, 6592, 6, 591, 191, 0, 6592, 1189, 1, 0, 0, 0, 6593, 6594, 5, 100, 0, 0, 6594, 6595, 5, 101, 0, 0, 6595, 6596, 5, 108, 0, 0, 6596, 6597, 5, 101, 0, 0, 6597, 6598, 5, 116, 0, 0, 6598, 6599, 5, 101, 0, 0, 6599, 6600, 1, 0, 0, 0, 6600, 6601, 6, 592, 192, 0, 6601, 1191, 1, 0, 0, 0, 6602, 6603, 5, 114, 0, 0, 6603, 6604, 5, 101, 0, 0, 6604, 6605, 5, 110, 0, 0, 6605, 6606, 5, 97, 0, 0, 6606, 6607, 5, 109, 0, 0, 6607, 6608, 5, 101, 0, 0, 6608, 6609, 1, 0, 0, 0, 6609, 6610, 6, 593, 193, 0, 6610, 1193, 1, 0, 0, 0, 6611, 6612, 5, 81, 0, 0, 6612, 6618, 5, 123, 0, 0, 6613, 6617, 3, 16, 5, 0, 6614, 6617, 3, 18, 6, 0, 6615, 6617, 8, 9, 0, 0, 6616, 6613, 1, 0, 0, 0, 6616, 6614, 1, 0, 0, 0, 6616, 6615, 1, 0, 0, 0, 6617, 6620, 1, 0, 0, 0, 6618, 6616, 1, 0, 0, 0, 6618, 6619, 1, 0, 0, 0, 6619, 6621, 1, 0, 0, 0, 6620, 6618, 1, 0, 0, 0, 6621, 6622, 5, 125, 0, 0, 6622, 6623, 3, 374, 184, 0, 6623, 6624, 1, 0, 0, 0, 6624, 6625, 6, 594, 194, 0, 6625, 1195, 1, 0, 0, 0, 6626, 6627, 3, 374, 184, 0, 6627, 6628, 5, 58, 0, 0, 6628, 6629, 3, 374, 184, 0, 6629, 6630, 1, 0, 0, 0, 6630, 6631, 6, 595, 195, 0, 6631, 1197, 1, 0, 0, 0, 6632, 6633, 3, 374, 184, 0, 6633, 6634, 5, 58, 0, 0, 6634, 6635, 5, 42, 0, 0, 6635, 6636, 1, 0, 0, 0, 6636, 6637, 6, 596, 196, 0, 6637, 1199, 1, 0, 0, 0, 6638, 6639, 5, 42, 0, 0, 6639, 6640, 5, 58, 0, 0, 6640, 6641, 3, 374, 184, 0, 6641, 6642, 1, 0, 0, 0, 6642, 6643, 6, 597, 197, 0, 6643, 1201, 1, 0, 0, 0, 6644, 6648, 3, 376, 185, 0, 6645, 6647, 3, 378, 186, 0, 6646, 6645, 1, 0, 0, 0, 6647, 6650, 1, 0, 0, 0, 6648, 6646, 1, 0, 0, 0, 6648, 6649, 1, 0, 0, 0, 6649, 6651, 1, 0, 0, 0, 6650, 6648, 1, 0, 0, 0, 6651, 6652, 6, 598, 198, 0, 6652, 1203, 1, 0, 0, 0, 6653, 6654, 5, 40, 0, 0, 6654, 6655, 5, 58, 0, 0, 6655, 6656, 5, 126, 0, 0, 6656, 6657, 1, 0, 0, 0, 6657, 6658, 6, 599, 199, 0, 6658, 1205, 1, 0, 0, 0, 6659, 6661, 5, 58, 0, 0, 6660, 6659, 1, 0, 0, 0, 6661, 6662, 1, 0, 0, 0, 6662, 6660, 1, 0, 0, 0, 6662, 6663, 1, 0, 0, 0, 6663, 6664, 1, 0, 0, 0, 6664, 6665, 5, 41, 0, 0, 6665, 6666, 1, 0, 0, 0, 6666, 6667, 6, 600, 200, 0, 6667, 1207, 1, 0, 0, 0, 6668, 6669, 5, 40, 0, 0, 6669, 6670, 5, 58, 0, 0, 6670, 6676, 5, 126, 0, 0, 6671, 6675, 3, 388, 191, 0, 6672, 6673, 5, 58, 0, 0, 6673, 6675, 8, 12, 0, 0, 6674, 6671, 1, 0, 0, 0, 6674, 6672, 1, 0, 0, 0, 6675, 6678, 1, 0, 0, 0, 6676, 6674, 1, 0, 0, 0, 6676, 6677, 1, 0, 0, 0, 6677, 6679, 1, 0, 0, 0, 6678, 6676, 1, 0, 0, 0, 6679, 6680, 5, 58, 0, 0, 6680, 6681, 5, 41, 0, 0, 6681, 6682, 1, 0, 0, 0, 6682, 6683, 6, 601, 201, 0, 6683, 1209, 1, 0, 0, 0, 6684, 6685, 5, 40, 0, 0, 6685, 6686, 5, 58, 0, 0, 6686, 6695, 8, 13, 0, 0, 6687, 6694, 3, 386, 190, 0, 6688, 6689, 5, 40, 0, 0, 6689, 6694, 8, 14, 0, 0, 6690, 6691, 5, 58, 0, 0, 6691, 6694, 8, 12, 0, 0, 6692, 6694, 8, 15, 0, 0, 6693, 6687, 1, 0, 0, 0, 6693, 6688, 1, 0, 0, 0, 6693, 6690, 1, 0, 0, 0, 6693, 6692, 1, 0, 0, 0, 6694, 6697, 1, 0, 0, 0, 6695, 6693, 1, 0, 0, 0, 6695, 6696, 1, 0, 0, 0, 6696, 6701, 1, 0, 0, 0, 6697, 6695, 1, 0, 0, 0, 6698, 6700, 5, 58, 0, 0, 6699, 6698, 1, 0, 0, 0, 6700, 6703, 1, 0, 0, 0, 6701, 6699, 1, 0, 0, 0, 6701, 6702, 1, 0, 0, 0, 6702, 6705, 1, 0, 0, 0, 6703, 6701, 1, 0, 0, 0, 6704, 6706, 5, 58, 0, 0, 6705, 6704, 1, 0, 0, 0, 6706, 6707, 1, 0, 0, 0, 6707, 6705, 1, 0, 0, 0, 6707, 6708, 1, 0, 0, 0, 6708, 6709, 1, 0, 0, 0, 6709, 6710, 5, 41, 0, 0, 6710, 6711, 1, 0, 0, 0, 6711, 6712, 6, 602, 2, 0, 6712, 6713, 6, 602, 202, 0, 6713, 1211, 1, 0, 0, 0, 6714, 6715, 7, 16, 0, 0, 6715, 6716, 1, 0, 0, 0, 6716, 6717, 6, 603, 203, 0, 6717, 1213, 1, 0, 0, 0, 6718, 6719, 3, 98, 46, 0, 6719, 6720, 3, 98, 46, 0, 6720, 6721, 3, 44, 19, 0, 6721, 6722, 1, 0, 0, 0, 6722, 6723, 6, 604, 3, 0, 6723, 6724, 6, 604, 204, 0, 6724, 1215, 1, 0, 0, 0, 6725, 6726, 3, 50, 22, 0, 6726, 6727, 3, 98, 46, 0, 6727, 6728, 1, 0, 0, 0, 6728, 6729, 6, 605, 4, 0, 6729, 6730, 6, 605, 205, 0, 6730, 1217, 1, 0, 0, 0, 6731, 6732, 8, 17, 0, 0, 6732, 6733, 1, 0, 0, 0, 6733, 6734, 6, 606, 17, 0, 6734, 1219, 1, 0, 0, 0, 116, 0, 1, 2, 3, 4, 5, 1229, 1232, 1241, 1244, 1246, 1250, 1376, 1381, 1399, 1409, 1419, 1422, 1440, 1442, 1459, 1462, 1475, 1478, 1496, 1507, 1512, 1519, 1522, 1530, 2641, 2643, 2665, 2669, 2673, 2682, 2692, 2694, 2709, 2711, 2717, 2723, 2814, 2826, 2836, 2839, 2892, 2904, 2914, 2917, 2936, 2939, 2950, 2953, 2955, 2959, 3087, 3107, 3119, 3129, 3132, 3160, 3162, 3181, 3184, 3199, 3202, 3222, 3235, 3240, 3247, 3250, 3260, 4711, 4713, 4743, 4757, 4769, 4771, 4788, 4790, 4796, 4802, 4841, 4844, 4855, 4858, 4860, 4864, 4992, 5012, 5024, 5034, 5037, 5065, 5067, 5086, 5089, 5104, 5107, 5127, 5140, 5145, 5152, 5155, 5165, 6616, 6618, 6648, 6662, 6674, 6676, 6693, 6695, 6701, 6707, 208, 5, 2, 0, 5, 3, 0, 0, 1, 0, 5, 1, 0, 4, 0, 0, 7, 50, 0, 7, 24, 0, 7, 25, 0, 5, 0, 0, 7, 1, 0, 7, 11, 0, 7, 3, 0, 7, 4, 0, 5, 4, 0, 7, 26, 0, 7, 9, 0, 7, 10, 0, 7, 196, 0, 7, 2, 0, 7, 12, 0, 5, 5, 0, 7, 5, 0, 7, 6, 0, 7, 7, 0, 7, 8, 0, 7, 13, 0, 7, 14, 0, 7, 15, 0, 7, 16, 0, 7, 17, 0, 7, 18, 0, 7, 19, 0, 7, 20, 0, 7, 21, 0, 7, 22, 0, 7, 23, 0, 1, 240, 0, 1, 242, 1, 7, 27, 0, 7, 28, 0, 7, 29, 0, 7, 30, 0, 7, 31, 0, 7, 32, 0, 7, 33, 0, 7, 34, 0, 7, 35, 0, 7, 36, 0, 7, 37, 0, 7, 38, 0, 7, 39, 0, 7, 40, 0, 7, 41, 0, 7, 42, 0, 7, 43, 0, 7, 44, 0, 7, 45, 0, 7, 46, 0, 7, 47, 0, 7, 48, 0, 7, 49, 0, 7, 51, 0, 7, 52, 0, 7, 53, 0, 7, 54, 0, 7, 55, 0, 7, 56, 0, 7, 57, 0, 7, 58, 0, 7, 59, 0, 7, 60, 0, 7, 61, 0, 7, 62, 0, 7, 63, 0, 7, 64, 0, 7, 65, 0, 7, 66, 0, 7, 67, 0, 7, 68, 0, 7, 69, 0, 7, 70, 0, 7, 71, 0, 7, 72, 0, 7, 73, 0, 7, 74, 0, 7, 75, 0, 7, 76, 0, 7, 77, 0, 7, 78, 0, 7, 79, 0, 7, 80, 0, 7, 81, 0, 7, 82, 0, 7, 83, 0, 7, 84, 0, 7, 85, 0, 7, 86, 0, 7, 87, 0, 7, 88, 0, 7, 89, 0, 7, 90, 0, 7, 91, 0, 7, 92, 0, 7, 93, 0, 7, 94, 0, 7, 95, 0, 7, 96, 0, 7, 97, 0, 7, 98, 0, 7, 99, 0, 7, 100, 0, 7, 101, 0, 7, 102, 0, 7, 103, 0, 7, 104, 0, 7, 105, 0, 7, 106, 0, 7, 107, 0, 7, 108, 0, 7, 109, 0, 7, 110, 0, 7, 111, 0, 7, 112, 0, 7, 113, 0, 7, 114, 0, 7, 115, 0, 7, 116, 0, 7, 117, 0, 7, 118, 0, 7, 119, 0, 7, 120, 0, 7, 121, 0, 7, 122, 0, 7, 123, 0, 7, 124, 0, 7, 125, 0, 7, 126, 0, 7, 127, 0, 7, 128, 0, 7, 129, 0, 7, 130, 0, 7, 131, 0, 7, 132, 0, 7, 133, 0, 7, 134, 0, 7, 135, 0, 7, 136, 0, 7, 137, 0, 7, 138, 0, 7, 139, 0, 7, 140, 0, 7, 141, 0, 7, 142, 0, 7, 143, 0, 7, 144, 0, 7, 145, 0, 7, 146, 0, 7, 147, 0, 7, 148, 0, 7, 149, 0, 7, 150, 0, 7, 151, 0, 7, 152, 0, 7, 153, 0, 7, 154, 0, 7, 155, 0, 7, 156, 0, 7, 157, 0, 7, 158, 0, 7, 159, 0, 7, 160, 0, 7, 161, 0, 7, 162, 0, 7, 163, 0, 7, 164, 0, 7, 165, 0, 7, 166, 0, 7, 167, 0, 7, 168, 0, 7, 169, 0, 7, 170, 0, 7, 171, 0, 7, 172, 0, 7, 173, 0, 7, 174, 0, 7, 175, 0, 7, 176, 0, 7, 177, 0, 7, 178, 0, 7, 179, 0, 7, 180, 0, 7, 181, 0, 7, 182, 0, 7, 183, 0, 7, 184, 0, 7, 185, 0, 7, 186, 0, 7, 187, 0, 7, 188, 0, 7, 189, 0, 7, 190, 0, 7, 191, 0, 7, 192, 0, 7, 193, 0, 7, 194, 0, 7, 198, 0, 1, 434, 2, 1, 436, 3]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/parser/XQueryParser.interp b/src/main/java/org/rumbledb/parser/XQueryParser.interp
new file mode 100644
index 0000000000..265dac8da9
--- /dev/null
+++ b/src/main/java/org/rumbledb/parser/XQueryParser.interp
@@ -0,0 +1,659 @@
+token literal names:
+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
+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
+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
+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
+null
+null
+null
+null
+null
+null
+null
+null
+
+token symbolic names:
+null
+EscapeQuot
+EscapeApos
+DOUBLE_LBRACE
+DOUBLE_RBRACE
+IntegerLiteral
+DecimalLiteral
+DoubleLiteral
+DFPropertyName
+PredefinedEntityRef
+CharRef
+Quot
+Apos
+COMMENT
+XMLDECL
+PI
+CDATA
+PRAGMA
+WS
+EQUAL
+NOT_EQUAL
+LPAREN
+RPAREN
+LBRACKET
+RBRACKET
+LBRACE
+RBRACE
+STAR
+PLUS
+MINUS
+COMMA
+DOT
+DDOT
+COLON
+COLON_EQ
+SEMICOLON
+SLASH
+DSLASH
+BACKSLASH
+VBAR
+LANGLE
+RANGLE
+QUESTION
+AT
+DOLLAR
+MOD
+BANG
+HASH
+CARAT
+ARROW
+GRAVE
+CONCATENATION
+TILDE
+KW_ALLOWING
+KW_ANCESTOR
+KW_ANCESTOR_OR_SELF
+KW_AND
+KW_ARRAY
+KW_AS
+KW_ASCENDING
+KW_AT
+KW_ATTRIBUTE
+KW_BASE_URI
+KW_BOUNDARY_SPACE
+KW_BINARY
+KW_BY
+KW_CASE
+KW_CAST
+KW_CASTABLE
+KW_CATCH
+KW_CHILD
+KW_COLLATION
+KW_COMMENT
+KW_CONSTRUCTION
+KW_CONTEXT
+KW_COPY_NS
+KW_COUNT
+KW_DECLARE
+KW_DEFAULT
+KW_DESCENDANT
+KW_DESCENDANT_OR_SELF
+KW_DESCENDING
+KW_DECIMAL_FORMAT
+KW_DIV
+KW_DOCUMENT
+KW_DOCUMENT_NODE
+KW_ELEMENT
+KW_ELSE
+KW_EMPTY
+KW_EMPTY_SEQUENCE
+KW_ENCODING
+KW_END
+KW_EQ
+KW_EVERY
+KW_EXCEPT
+KW_EXTERNAL
+KW_FOLLOWING
+KW_FOLLOWING_SIBLING
+KW_FOR
+KW_FUNCTION
+KW_GE
+KW_GREATEST
+KW_GROUP
+KW_GT
+KW_IDIV
+KW_IF
+KW_IMPORT
+KW_IN
+KW_INHERIT
+KW_INSTANCE
+KW_INTERSECT
+KW_IS
+KW_ITEM
+KW_LAX
+KW_LE
+KW_LEAST
+KW_LET
+KW_LT
+KW_MAP
+KW_MOD
+KW_MODULE
+KW_NAMESPACE
+KW_NE
+KW_NEXT
+KW_NAMESPACE_NODE
+KW_NO_INHERIT
+KW_NO_PRESERVE
+KW_NODE
+KW_OF
+KW_ONLY
+KW_OPTION
+KW_OR
+KW_ORDER
+KW_ORDERED
+KW_ORDERING
+KW_PARENT
+KW_PRECEDING
+KW_PRECEDING_SIBLING
+KW_PRESERVE
+KW_PREVIOUS
+KW_PI
+KW_RETURN
+KW_SATISFIES
+KW_SCHEMA
+KW_SCHEMA_ATTR
+KW_SCHEMA_ELEM
+KW_SELF
+KW_SLIDING
+KW_SOME
+KW_STABLE
+KW_START
+KW_STRICT
+KW_STRIP
+KW_SWITCH
+KW_TEXT
+KW_THEN
+KW_TO
+KW_TREAT
+KW_TRY
+KW_TUMBLING
+KW_TYPE
+KW_TYPESWITCH
+KW_UNION
+KW_UNORDERED
+KW_UPDATE
+KW_VALIDATE
+KW_VARIABLE
+KW_VERSION
+KW_WHEN
+KW_WHERE
+KW_WINDOW
+KW_XQUERY
+KW_ARRAY_NODE
+KW_BOOLEAN_NODE
+KW_NULL_NODE
+KW_NUMBER_NODE
+KW_OBJECT_NODE
+KW_REPLACE
+KW_WITH
+KW_VALUE
+KW_INSERT
+KW_INTO
+KW_DELETE
+KW_RENAME
+URIQualifiedName
+FullQName
+NCNameWithLocalWildcard
+NCNameWithPrefixWildcard
+NCName
+XQDOC_COMMENT_START
+XQDOC_COMMENT_END
+XQDocComment
+XQComment
+CHAR
+ENTER_STRING
+EXIT_INTERPOLATION
+ContentChar
+BASIC_CHAR
+ENTER_INTERPOLATION
+EXIT_STRING
+EscapeQuot_QuotString
+DOUBLE_LBRACE_QuotString
+DOUBLE_RBRACE_QuotString
+EscapeApos_AposString
+
+rule names:
+module
+xqDocComment
+versionDecl
+mainModule
+queryBody
+libraryModule
+moduleDecl
+prolog
+annotatedDecl
+defaultNamespaceDecl
+setter
+boundarySpaceDecl
+defaultCollationDecl
+baseURIDecl
+constructionDecl
+orderingModeDecl
+emptyOrderDecl
+copyNamespacesDecl
+preserveMode
+inheritMode
+decimalFormatDecl
+schemaImport
+schemaPrefix
+moduleImport
+namespaceDecl
+varDecl
+varValue
+varDefaultValue
+contextItemDecl
+functionDecl
+functionParams
+functionParam
+annotations
+annotation
+annotList
+annotationParam
+functionReturn
+optionDecl
+expr
+exprSingle
+flworExpr
+initialClause
+intermediateClause
+forClause
+forBinding
+allowingEmpty
+positionalVar
+letClause
+letBinding
+windowClause
+tumblingWindowClause
+slidingWindowClause
+windowStartCondition
+windowEndCondition
+windowVars
+countClause
+whereClause
+groupByClause
+groupingSpecList
+groupingSpec
+orderByClause
+orderSpec
+returnClause
+quantifiedExpr
+quantifiedVar
+switchExpr
+switchCaseClause
+switchCaseOperand
+typeswitchExpr
+caseClause
+sequenceUnionType
+ifExpr
+tryCatchExpr
+tryClause
+enclosedTryTargetExpression
+catchClause
+enclosedExpression
+catchErrorList
+existUpdateExpr
+existReplaceExpr
+existValueExpr
+existInsertExpr
+existDeleteExpr
+existRenameExpr
+orExpr
+andExpr
+comparisonExpr
+stringConcatExpr
+rangeExpr
+additiveExpr
+multiplicativeExpr
+unionExpr
+intersectExceptExpr
+instanceOfExpr
+treatExpr
+castableExpr
+castExpr
+arrowExpr
+complexArrow
+unaryExpr
+valueExpr
+generalComp
+valueComp
+nodeComp
+validateExpr
+validationMode
+extensionExpr
+simpleMapExpr
+pathExpr
+relativePathExpr
+stepExpr
+axisStep
+forwardStep
+forwardAxis
+abbrevForwardStep
+reverseStep
+reverseAxis
+abbrevReverseStep
+nodeTest
+nameTest
+wildcard
+postfixExpr
+argumentList
+predicateList
+predicate
+lookup
+keySpecifier
+arrowFunctionSpecifier
+primaryExpr
+literal
+numericLiteral
+varRef
+varName
+parenthesizedExpr
+contextItemExpr
+orderedExpr
+unorderedExpr
+functionCall
+argument
+nodeConstructor
+directConstructor
+dirElemConstructorOpenClose
+dirElemConstructorSingleTag
+dirAttributeList
+dirAttributeValueApos
+dirAttributeValueQuot
+dirAttributeValue
+dirAttributeContentQuot
+dirAttributeContentApos
+dirElemContent
+commonContent
+computedConstructor
+compMLJSONConstructor
+compMLJSONArrayConstructor
+compMLJSONObjectConstructor
+compMLJSONNumberConstructor
+compMLJSONBooleanConstructor
+compMLJSONNullConstructor
+compBinaryConstructor
+compDocConstructor
+compElemConstructor
+enclosedContentExpr
+compAttrConstructor
+compNamespaceConstructor
+prefix
+enclosedPrefixExpr
+enclosedURIExpr
+compTextConstructor
+compCommentConstructor
+compPIConstructor
+functionItemExpr
+namedFunctionRef
+inlineFunctionRef
+functionBody
+mapConstructor
+mapConstructorEntry
+arrayConstructor
+squareArrayConstructor
+curlyArrayConstructor
+stringConstructor
+stringConstructorContent
+charNoGrave
+charNoLBrace
+charNoRBrack
+stringConstructorChars
+stringConstructorInterpolation
+unaryLookup
+singleType
+typeDeclaration
+sequenceType
+itemType
+atomicOrUnionType
+kindTest
+anyKindTest
+binaryNodeTest
+documentTest
+textTest
+commentTest
+namespaceNodeTest
+piTest
+attributeTest
+attributeNameOrWildcard
+schemaAttributeTest
+elementTest
+elementNameOrWildcard
+schemaElementTest
+elementDeclaration
+attributeName
+elementName
+simpleTypeName
+typeName
+functionTest
+anyFunctionTest
+typedFunctionTest
+mapTest
+anyMapTest
+typedMapTest
+arrayTest
+anyArrayTest
+typedArrayTest
+parenthesizedItemTest
+attributeDeclaration
+mlNodeTest
+mlArrayNodeTest
+mlObjectNodeTest
+mlNumberNodeTest
+mlBooleanNodeTest
+mlNullNodeTest
+eqName
+qName
+ncName
+functionName
+keyword
+keywordNotOKForFunction
+keywordOKForFunction
+uriLiteral
+stringLiteralQuot
+stringLiteralApos
+stringLiteral
+stringContentQuot
+stringContentApos
+noQuotesNoBracesNoAmpNoLAng
+
+
+atn:
+[4, 1, 203, 2133, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 2, 194, 7, 194, 2, 195, 7, 195, 2, 196, 7, 196, 2, 197, 7, 197, 2, 198, 7, 198, 2, 199, 7, 199, 2, 200, 7, 200, 2, 201, 7, 201, 2, 202, 7, 202, 2, 203, 7, 203, 2, 204, 7, 204, 2, 205, 7, 205, 2, 206, 7, 206, 2, 207, 7, 207, 2, 208, 7, 208, 2, 209, 7, 209, 2, 210, 7, 210, 2, 211, 7, 211, 2, 212, 7, 212, 2, 213, 7, 213, 2, 214, 7, 214, 2, 215, 7, 215, 2, 216, 7, 216, 2, 217, 7, 217, 2, 218, 7, 218, 2, 219, 7, 219, 2, 220, 7, 220, 2, 221, 7, 221, 2, 222, 7, 222, 2, 223, 7, 223, 2, 224, 7, 224, 2, 225, 7, 225, 2, 226, 7, 226, 2, 227, 7, 227, 2, 228, 7, 228, 2, 229, 7, 229, 2, 230, 7, 230, 2, 231, 7, 231, 2, 232, 7, 232, 2, 233, 7, 233, 2, 234, 7, 234, 2, 235, 7, 235, 2, 236, 7, 236, 2, 237, 7, 237, 2, 238, 7, 238, 2, 239, 7, 239, 2, 240, 7, 240, 2, 241, 7, 241, 1, 0, 3, 0, 486, 8, 0, 1, 0, 3, 0, 489, 8, 0, 1, 0, 3, 0, 492, 8, 0, 1, 0, 1, 0, 3, 0, 496, 8, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 505, 8, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 529, 8, 7, 1, 7, 1, 7, 5, 7, 533, 8, 7, 10, 7, 12, 7, 536, 9, 7, 1, 7, 3, 7, 539, 8, 7, 1, 7, 1, 7, 1, 7, 5, 7, 544, 8, 7, 10, 7, 12, 7, 547, 9, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 553, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 569, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 613, 8, 20, 1, 20, 1, 20, 1, 20, 5, 20, 618, 8, 20, 10, 20, 12, 20, 621, 9, 20, 1, 21, 1, 21, 1, 21, 3, 21, 626, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 633, 8, 21, 10, 21, 12, 21, 636, 9, 21, 3, 21, 638, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 647, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 655, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 662, 8, 23, 10, 23, 12, 23, 665, 9, 23, 3, 23, 667, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 681, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 688, 8, 25, 3, 25, 690, 8, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 701, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 708, 8, 28, 3, 28, 710, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 718, 8, 29, 1, 29, 1, 29, 3, 29, 722, 8, 29, 1, 29, 1, 29, 3, 29, 726, 8, 29, 1, 30, 1, 30, 1, 30, 5, 30, 731, 8, 30, 10, 30, 12, 30, 734, 9, 30, 1, 31, 1, 31, 1, 31, 3, 31, 739, 8, 31, 1, 32, 5, 32, 742, 8, 32, 10, 32, 12, 32, 745, 9, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 753, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 758, 8, 34, 10, 34, 12, 34, 761, 9, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 789, 8, 39, 1, 40, 1, 40, 5, 40, 793, 8, 40, 10, 40, 12, 40, 796, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 803, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 810, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 816, 8, 43, 10, 43, 12, 43, 819, 9, 43, 1, 44, 1, 44, 1, 44, 3, 44, 824, 8, 44, 1, 44, 3, 44, 827, 8, 44, 1, 44, 3, 44, 830, 8, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 846, 8, 47, 10, 47, 12, 47, 849, 9, 47, 1, 48, 1, 48, 1, 48, 3, 48, 854, 8, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 3, 49, 862, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 869, 8, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 875, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 882, 8, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 3, 53, 895, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 904, 8, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 912, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 917, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 933, 8, 58, 10, 58, 12, 58, 936, 9, 58, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 3, 59, 945, 8, 59, 1, 59, 1, 59, 3, 59, 949, 8, 59, 1, 60, 3, 60, 952, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 959, 8, 60, 10, 60, 12, 60, 962, 9, 60, 1, 61, 1, 61, 1, 61, 3, 61, 967, 8, 61, 1, 61, 1, 61, 1, 61, 3, 61, 972, 8, 61, 3, 61, 974, 8, 61, 1, 61, 1, 61, 3, 61, 978, 8, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 3, 63, 985, 8, 63, 1, 63, 1, 63, 1, 63, 5, 63, 990, 8, 63, 10, 63, 12, 63, 993, 9, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 3, 64, 1001, 8, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 4, 65, 1011, 8, 65, 11, 65, 12, 65, 1012, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 4, 66, 1021, 8, 66, 11, 66, 12, 66, 1022, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 4, 68, 1035, 8, 68, 11, 68, 12, 68, 1036, 1, 68, 1, 68, 1, 68, 3, 68, 1042, 8, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1052, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1061, 8, 70, 10, 70, 12, 70, 1064, 9, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 4, 72, 1077, 8, 72, 11, 72, 12, 72, 1078, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1093, 8, 75, 1, 75, 1, 75, 1, 76, 1, 76, 3, 76, 1099, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 5, 77, 1106, 8, 77, 10, 77, 12, 77, 1109, 9, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 3, 78, 1117, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 5, 84, 1145, 8, 84, 10, 84, 12, 84, 1148, 9, 84, 1, 85, 1, 85, 1, 85, 5, 85, 1153, 8, 85, 10, 85, 12, 85, 1156, 9, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1162, 8, 86, 1, 86, 1, 86, 3, 86, 1166, 8, 86, 1, 87, 1, 87, 1, 87, 5, 87, 1171, 8, 87, 10, 87, 12, 87, 1174, 9, 87, 1, 88, 1, 88, 1, 88, 3, 88, 1179, 8, 88, 1, 89, 1, 89, 1, 89, 5, 89, 1184, 8, 89, 10, 89, 12, 89, 1187, 9, 89, 1, 90, 1, 90, 1, 90, 5, 90, 1192, 8, 90, 10, 90, 12, 90, 1195, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 1200, 8, 91, 10, 91, 12, 91, 1203, 9, 91, 1, 92, 1, 92, 1, 92, 5, 92, 1208, 8, 92, 10, 92, 12, 92, 1211, 9, 92, 1, 93, 1, 93, 1, 93, 1, 93, 3, 93, 1217, 8, 93, 1, 94, 1, 94, 1, 94, 1, 94, 3, 94, 1223, 8, 94, 1, 95, 1, 95, 1, 95, 1, 95, 3, 95, 1229, 8, 95, 1, 96, 1, 96, 1, 96, 1, 96, 3, 96, 1235, 8, 96, 1, 97, 1, 97, 1, 97, 5, 97, 1240, 8, 97, 10, 97, 12, 97, 1243, 9, 97, 1, 98, 1, 98, 1, 98, 1, 99, 5, 99, 1249, 8, 99, 10, 99, 12, 99, 1252, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 3, 100, 1259, 8, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 1269, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1278, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1284, 8, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 4, 106, 1291, 8, 106, 11, 106, 12, 106, 1292, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 5, 107, 1302, 8, 107, 10, 107, 12, 107, 1305, 9, 107, 1, 108, 1, 108, 3, 108, 1309, 8, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1314, 8, 108, 1, 109, 1, 109, 1, 109, 5, 109, 1319, 8, 109, 10, 109, 12, 109, 1322, 9, 109, 1, 110, 1, 110, 3, 110, 1326, 8, 110, 1, 111, 1, 111, 3, 111, 1330, 8, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 3, 112, 1338, 8, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 3, 114, 1345, 8, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 3, 115, 1353, 8, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 3, 118, 1363, 8, 118, 1, 119, 1, 119, 3, 119, 1367, 8, 119, 1, 120, 1, 120, 1, 120, 3, 120, 1372, 8, 120, 1, 121, 1, 121, 1, 121, 1, 121, 5, 121, 1378, 8, 121, 10, 121, 12, 121, 1381, 9, 121, 1, 122, 1, 122, 1, 122, 1, 122, 5, 122, 1387, 8, 122, 10, 122, 12, 122, 1390, 9, 122, 3, 122, 1392, 8, 122, 1, 122, 1, 122, 1, 123, 5, 123, 1397, 8, 123, 10, 123, 12, 123, 1400, 9, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 3, 126, 1413, 8, 126, 1, 127, 1, 127, 1, 127, 3, 127, 1418, 8, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 3, 128, 1433, 8, 128, 1, 129, 1, 129, 3, 129, 1437, 8, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 3, 133, 1448, 8, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 3, 138, 1465, 8, 138, 1, 139, 1, 139, 3, 139, 1469, 8, 139, 1, 140, 1, 140, 1, 140, 3, 140, 1474, 8, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1481, 8, 141, 10, 141, 12, 141, 1484, 9, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1501, 8, 143, 10, 143, 12, 143, 1504, 9, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1511, 8, 144, 10, 144, 12, 144, 1514, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1523, 8, 145, 10, 145, 12, 145, 1526, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 3, 146, 1532, 8, 146, 1, 147, 4, 147, 1535, 8, 147, 11, 147, 12, 147, 1536, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 3, 147, 1544, 8, 147, 1, 147, 3, 147, 1547, 8, 147, 1, 148, 4, 148, 1550, 8, 148, 11, 148, 12, 148, 1551, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 3, 148, 1559, 8, 148, 1, 148, 3, 148, 1562, 8, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 3, 149, 1570, 8, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1581, 8, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 3, 151, 1591, 8, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1599, 8, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1614, 8, 154, 10, 154, 12, 154, 1617, 9, 154, 3, 154, 1619, 8, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 3, 160, 1647, 8, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 3, 162, 1659, 8, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 3, 163, 1666, 8, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 3, 169, 1688, 8, 169, 1, 169, 1, 169, 1, 170, 1, 170, 3, 170, 1694, 8, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1704, 8, 172, 1, 172, 1, 172, 1, 172, 3, 172, 1709, 8, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 5, 174, 1720, 8, 174, 10, 174, 12, 174, 1723, 9, 174, 3, 174, 1725, 8, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 3, 176, 1735, 8, 176, 1, 177, 1, 177, 3, 177, 1739, 8, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 5, 180, 1754, 8, 180, 10, 180, 12, 180, 1757, 9, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 5, 184, 1775, 8, 184, 10, 184, 12, 184, 1778, 9, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 3, 187, 1789, 8, 187, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 3, 189, 1801, 8, 189, 3, 189, 1803, 8, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 3, 190, 1814, 8, 190, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 3, 192, 1830, 8, 192, 1, 193, 1, 193, 1, 193, 3, 193, 1835, 8, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 3, 195, 1847, 8, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 197, 1, 197, 1, 197, 1, 197, 1, 198, 1, 198, 1, 198, 1, 198, 1, 199, 1, 199, 1, 199, 1, 199, 3, 199, 1867, 8, 199, 1, 199, 1, 199, 1, 200, 1, 200, 1, 200, 1, 200, 1, 200, 3, 200, 1876, 8, 200, 3, 200, 1878, 8, 200, 1, 200, 1, 200, 1, 201, 1, 201, 3, 201, 1884, 8, 201, 1, 202, 1, 202, 1, 202, 1, 202, 1, 202, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 1, 203, 3, 203, 1897, 8, 203, 3, 203, 1899, 8, 203, 3, 203, 1901, 8, 203, 1, 203, 1, 203, 1, 204, 1, 204, 3, 204, 1907, 8, 204, 1, 205, 1, 205, 1, 205, 1, 205, 1, 205, 1, 206, 1, 206, 1, 207, 1, 207, 1, 208, 1, 208, 1, 209, 1, 209, 1, 210, 1, 210, 1, 211, 5, 211, 1925, 8, 211, 10, 211, 12, 211, 1928, 9, 211, 1, 211, 1, 211, 3, 211, 1932, 8, 211, 1, 212, 1, 212, 1, 212, 1, 212, 1, 212, 1, 213, 1, 213, 1, 213, 1, 213, 1, 213, 5, 213, 1944, 8, 213, 10, 213, 12, 213, 1947, 9, 213, 3, 213, 1949, 8, 213, 1, 213, 1, 213, 1, 213, 1, 213, 1, 214, 1, 214, 3, 214, 1957, 8, 214, 1, 215, 1, 215, 1, 215, 1, 215, 1, 215, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 216, 1, 217, 1, 217, 3, 217, 1973, 8, 217, 1, 218, 1, 218, 1, 218, 1, 218, 1, 218, 1, 219, 1, 219, 1, 219, 1, 219, 1, 219, 1, 220, 1, 220, 1, 220, 1, 220, 1, 221, 1, 221, 1, 222, 1, 222, 1, 222, 1, 222, 1, 222, 3, 222, 1996, 8, 222, 1, 223, 1, 223, 1, 223, 3, 223, 2001, 8, 223, 1, 223, 1, 223, 1, 224, 1, 224, 1, 224, 3, 224, 2008, 8, 224, 1, 224, 1, 224, 1, 225, 1, 225, 1, 225, 3, 225, 2015, 8, 225, 1, 225, 1, 225, 1, 226, 1, 226, 1, 226, 3, 226, 2022, 8, 226, 1, 226, 1, 226, 1, 227, 1, 227, 1, 227, 3, 227, 2029, 8, 227, 1, 227, 1, 227, 1, 228, 1, 228, 3, 228, 2035, 8, 228, 1, 229, 1, 229, 3, 229, 2039, 8, 229, 1, 230, 1, 230, 3, 230, 2043, 8, 230, 1, 231, 1, 231, 1, 231, 1, 231, 3, 231, 2049, 8, 231, 1, 232, 1, 232, 3, 232, 2053, 8, 232, 1, 233, 1, 233, 1, 234, 1, 234, 1, 235, 1, 235, 1, 236, 1, 236, 1, 236, 1, 236, 1, 236, 5, 236, 2066, 8, 236, 10, 236, 12, 236, 2069, 9, 236, 1, 236, 1, 236, 1, 237, 1, 237, 1, 237, 1, 237, 1, 237, 5, 237, 2078, 8, 237, 10, 237, 12, 237, 2081, 9, 237, 1, 237, 1, 237, 1, 238, 1, 238, 3, 238, 2087, 8, 238, 1, 239, 4, 239, 2090, 8, 239, 11, 239, 12, 239, 2091, 1, 239, 1, 239, 3, 239, 2096, 8, 239, 1, 239, 3, 239, 2099, 8, 239, 1, 239, 1, 239, 1, 239, 1, 239, 1, 239, 3, 239, 2106, 8, 239, 1, 240, 4, 240, 2109, 8, 240, 11, 240, 12, 240, 2110, 1, 240, 1, 240, 3, 240, 2115, 8, 240, 1, 240, 3, 240, 2118, 8, 240, 1, 240, 1, 240, 1, 240, 1, 240, 1, 240, 3, 240, 2125, 8, 240, 1, 241, 1, 241, 4, 241, 2129, 8, 241, 11, 241, 12, 241, 2130, 1, 241, 0, 0, 242, 0, 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, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 0, 27, 2, 0, 86, 86, 99, 99, 2, 0, 138, 138, 152, 152, 2, 0, 133, 133, 163, 163, 2, 0, 101, 101, 115, 115, 2, 0, 126, 126, 138, 138, 2, 0, 108, 108, 125, 125, 3, 0, 96, 96, 136, 136, 181, 181, 1, 0, 28, 29, 4, 0, 27, 27, 83, 83, 104, 104, 119, 119, 2, 0, 39, 39, 162, 162, 2, 0, 94, 94, 110, 110, 6, 0, 92, 92, 100, 100, 103, 103, 114, 114, 117, 117, 122, 122, 2, 0, 58, 58, 160, 160, 2, 0, 113, 113, 151, 151, 1, 0, 36, 37, 5, 0, 61, 61, 70, 70, 79, 80, 96, 97, 146, 146, 2, 0, 54, 55, 135, 137, 1, 0, 5, 7, 2, 0, 13, 13, 15, 15, 1, 0, 9, 10, 1, 0, 33, 34, 2, 0, 24, 25, 197, 197, 3, 0, 24, 24, 50, 50, 197, 197, 3, 0, 25, 25, 50, 50, 197, 197, 28, 0, 8, 8, 53, 53, 57, 57, 61, 61, 64, 64, 69, 69, 72, 72, 74, 74, 76, 76, 82, 82, 85, 86, 89, 89, 91, 91, 105, 105, 112, 112, 118, 118, 123, 124, 127, 127, 129, 129, 140, 140, 144, 145, 147, 147, 153, 154, 158, 161, 164, 164, 168, 168, 170, 170, 172, 183, 26, 0, 54, 56, 58, 60, 62, 63, 65, 68, 70, 71, 73, 73, 75, 75, 77, 81, 83, 84, 87, 88, 90, 90, 92, 104, 106, 111, 113, 117, 119, 122, 125, 126, 128, 128, 130, 138, 141, 143, 146, 146, 148, 152, 155, 157, 162, 163, 165, 167, 169, 169, 171, 171, 11, 0, 5, 7, 13, 13, 17, 17, 19, 24, 27, 39, 41, 50, 52, 52, 123, 123, 139, 139, 184, 189, 196, 196, 2212, 0, 485, 1, 0, 0, 0, 2, 497, 1, 0, 0, 0, 4, 499, 1, 0, 0, 0, 6, 508, 1, 0, 0, 0, 8, 511, 1, 0, 0, 0, 10, 513, 1, 0, 0, 0, 12, 516, 1, 0, 0, 0, 14, 534, 1, 0, 0, 0, 16, 552, 1, 0, 0, 0, 18, 554, 1, 0, 0, 0, 20, 568, 1, 0, 0, 0, 22, 570, 1, 0, 0, 0, 24, 574, 1, 0, 0, 0, 26, 579, 1, 0, 0, 0, 28, 583, 1, 0, 0, 0, 30, 587, 1, 0, 0, 0, 32, 591, 1, 0, 0, 0, 34, 597, 1, 0, 0, 0, 36, 603, 1, 0, 0, 0, 38, 605, 1, 0, 0, 0, 40, 607, 1, 0, 0, 0, 42, 622, 1, 0, 0, 0, 44, 646, 1, 0, 0, 0, 46, 648, 1, 0, 0, 0, 48, 668, 1, 0, 0, 0, 50, 674, 1, 0, 0, 0, 52, 691, 1, 0, 0, 0, 54, 693, 1, 0, 0, 0, 56, 695, 1, 0, 0, 0, 58, 711, 1, 0, 0, 0, 60, 727, 1, 0, 0, 0, 62, 735, 1, 0, 0, 0, 64, 743, 1, 0, 0, 0, 66, 746, 1, 0, 0, 0, 68, 754, 1, 0, 0, 0, 70, 762, 1, 0, 0, 0, 72, 764, 1, 0, 0, 0, 74, 767, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 790, 1, 0, 0, 0, 82, 802, 1, 0, 0, 0, 84, 809, 1, 0, 0, 0, 86, 811, 1, 0, 0, 0, 88, 820, 1, 0, 0, 0, 90, 834, 1, 0, 0, 0, 92, 837, 1, 0, 0, 0, 94, 841, 1, 0, 0, 0, 96, 850, 1, 0, 0, 0, 98, 858, 1, 0, 0, 0, 100, 863, 1, 0, 0, 0, 102, 876, 1, 0, 0, 0, 104, 888, 1, 0, 0, 0, 106, 894, 1, 0, 0, 0, 108, 903, 1, 0, 0, 0, 110, 918, 1, 0, 0, 0, 112, 922, 1, 0, 0, 0, 114, 925, 1, 0, 0, 0, 116, 929, 1, 0, 0, 0, 118, 937, 1, 0, 0, 0, 120, 951, 1, 0, 0, 0, 122, 963, 1, 0, 0, 0, 124, 979, 1, 0, 0, 0, 126, 984, 1, 0, 0, 0, 128, 997, 1, 0, 0, 0, 130, 1005, 1, 0, 0, 0, 132, 1020, 1, 0, 0, 0, 134, 1027, 1, 0, 0, 0, 136, 1029, 1, 0, 0, 0, 138, 1046, 1, 0, 0, 0, 140, 1057, 1, 0, 0, 0, 142, 1065, 1, 0, 0, 0, 144, 1074, 1, 0, 0, 0, 146, 1080, 1, 0, 0, 0, 148, 1083, 1, 0, 0, 0, 150, 1085, 1, 0, 0, 0, 152, 1096, 1, 0, 0, 0, 154, 1102, 1, 0, 0, 0, 156, 1110, 1, 0, 0, 0, 158, 1118, 1, 0, 0, 0, 160, 1123, 1, 0, 0, 0, 162, 1128, 1, 0, 0, 0, 164, 1133, 1, 0, 0, 0, 166, 1136, 1, 0, 0, 0, 168, 1141, 1, 0, 0, 0, 170, 1149, 1, 0, 0, 0, 172, 1157, 1, 0, 0, 0, 174, 1167, 1, 0, 0, 0, 176, 1175, 1, 0, 0, 0, 178, 1180, 1, 0, 0, 0, 180, 1188, 1, 0, 0, 0, 182, 1196, 1, 0, 0, 0, 184, 1204, 1, 0, 0, 0, 186, 1212, 1, 0, 0, 0, 188, 1218, 1, 0, 0, 0, 190, 1224, 1, 0, 0, 0, 192, 1230, 1, 0, 0, 0, 194, 1236, 1, 0, 0, 0, 196, 1244, 1, 0, 0, 0, 198, 1250, 1, 0, 0, 0, 200, 1258, 1, 0, 0, 0, 202, 1268, 1, 0, 0, 0, 204, 1270, 1, 0, 0, 0, 206, 1277, 1, 0, 0, 0, 208, 1279, 1, 0, 0, 0, 210, 1287, 1, 0, 0, 0, 212, 1290, 1, 0, 0, 0, 214, 1298, 1, 0, 0, 0, 216, 1313, 1, 0, 0, 0, 218, 1315, 1, 0, 0, 0, 220, 1325, 1, 0, 0, 0, 222, 1329, 1, 0, 0, 0, 224, 1337, 1, 0, 0, 0, 226, 1339, 1, 0, 0, 0, 228, 1344, 1, 0, 0, 0, 230, 1352, 1, 0, 0, 0, 232, 1354, 1, 0, 0, 0, 234, 1358, 1, 0, 0, 0, 236, 1362, 1, 0, 0, 0, 238, 1366, 1, 0, 0, 0, 240, 1371, 1, 0, 0, 0, 242, 1373, 1, 0, 0, 0, 244, 1382, 1, 0, 0, 0, 246, 1398, 1, 0, 0, 0, 248, 1401, 1, 0, 0, 0, 250, 1405, 1, 0, 0, 0, 252, 1412, 1, 0, 0, 0, 254, 1417, 1, 0, 0, 0, 256, 1432, 1, 0, 0, 0, 258, 1436, 1, 0, 0, 0, 260, 1438, 1, 0, 0, 0, 262, 1440, 1, 0, 0, 0, 264, 1443, 1, 0, 0, 0, 266, 1445, 1, 0, 0, 0, 268, 1451, 1, 0, 0, 0, 270, 1453, 1, 0, 0, 0, 272, 1456, 1, 0, 0, 0, 274, 1459, 1, 0, 0, 0, 276, 1464, 1, 0, 0, 0, 278, 1468, 1, 0, 0, 0, 280, 1473, 1, 0, 0, 0, 282, 1475, 1, 0, 0, 0, 284, 1490, 1, 0, 0, 0, 286, 1502, 1, 0, 0, 0, 288, 1505, 1, 0, 0, 0, 290, 1517, 1, 0, 0, 0, 292, 1531, 1, 0, 0, 0, 294, 1546, 1, 0, 0, 0, 296, 1561, 1, 0, 0, 0, 298, 1569, 1, 0, 0, 0, 300, 1580, 1, 0, 0, 0, 302, 1590, 1, 0, 0, 0, 304, 1598, 1, 0, 0, 0, 306, 1600, 1, 0, 0, 0, 308, 1603, 1, 0, 0, 0, 310, 1622, 1, 0, 0, 0, 312, 1625, 1, 0, 0, 0, 314, 1630, 1, 0, 0, 0, 316, 1634, 1, 0, 0, 0, 318, 1637, 1, 0, 0, 0, 320, 1640, 1, 0, 0, 0, 322, 1650, 1, 0, 0, 0, 324, 1652, 1, 0, 0, 0, 326, 1662, 1, 0, 0, 0, 328, 1669, 1, 0, 0, 0, 330, 1671, 1, 0, 0, 0, 332, 1673, 1, 0, 0, 0, 334, 1675, 1, 0, 0, 0, 336, 1678, 1, 0, 0, 0, 338, 1681, 1, 0, 0, 0, 340, 1693, 1, 0, 0, 0, 342, 1695, 1, 0, 0, 0, 344, 1699, 1, 0, 0, 0, 346, 1712, 1, 0, 0, 0, 348, 1714, 1, 0, 0, 0, 350, 1728, 1, 0, 0, 0, 352, 1734, 1, 0, 0, 0, 354, 1736, 1, 0, 0, 0, 356, 1742, 1, 0, 0, 0, 358, 1745, 1, 0, 0, 0, 360, 1749, 1, 0, 0, 0, 362, 1758, 1, 0, 0, 0, 364, 1760, 1, 0, 0, 0, 366, 1762, 1, 0, 0, 0, 368, 1776, 1, 0, 0, 0, 370, 1779, 1, 0, 0, 0, 372, 1783, 1, 0, 0, 0, 374, 1786, 1, 0, 0, 0, 376, 1790, 1, 0, 0, 0, 378, 1802, 1, 0, 0, 0, 380, 1813, 1, 0, 0, 0, 382, 1815, 1, 0, 0, 0, 384, 1829, 1, 0, 0, 0, 386, 1831, 1, 0, 0, 0, 388, 1838, 1, 0, 0, 0, 390, 1842, 1, 0, 0, 0, 392, 1850, 1, 0, 0, 0, 394, 1854, 1, 0, 0, 0, 396, 1858, 1, 0, 0, 0, 398, 1862, 1, 0, 0, 0, 400, 1870, 1, 0, 0, 0, 402, 1883, 1, 0, 0, 0, 404, 1885, 1, 0, 0, 0, 406, 1890, 1, 0, 0, 0, 408, 1906, 1, 0, 0, 0, 410, 1908, 1, 0, 0, 0, 412, 1913, 1, 0, 0, 0, 414, 1915, 1, 0, 0, 0, 416, 1917, 1, 0, 0, 0, 418, 1919, 1, 0, 0, 0, 420, 1921, 1, 0, 0, 0, 422, 1926, 1, 0, 0, 0, 424, 1933, 1, 0, 0, 0, 426, 1938, 1, 0, 0, 0, 428, 1956, 1, 0, 0, 0, 430, 1958, 1, 0, 0, 0, 432, 1963, 1, 0, 0, 0, 434, 1972, 1, 0, 0, 0, 436, 1974, 1, 0, 0, 0, 438, 1979, 1, 0, 0, 0, 440, 1984, 1, 0, 0, 0, 442, 1988, 1, 0, 0, 0, 444, 1995, 1, 0, 0, 0, 446, 1997, 1, 0, 0, 0, 448, 2004, 1, 0, 0, 0, 450, 2011, 1, 0, 0, 0, 452, 2018, 1, 0, 0, 0, 454, 2025, 1, 0, 0, 0, 456, 2034, 1, 0, 0, 0, 458, 2038, 1, 0, 0, 0, 460, 2042, 1, 0, 0, 0, 462, 2048, 1, 0, 0, 0, 464, 2052, 1, 0, 0, 0, 466, 2054, 1, 0, 0, 0, 468, 2056, 1, 0, 0, 0, 470, 2058, 1, 0, 0, 0, 472, 2060, 1, 0, 0, 0, 474, 2072, 1, 0, 0, 0, 476, 2086, 1, 0, 0, 0, 478, 2105, 1, 0, 0, 0, 480, 2124, 1, 0, 0, 0, 482, 2128, 1, 0, 0, 0, 484, 486, 3, 2, 1, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 489, 3, 4, 2, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 491, 1, 0, 0, 0, 490, 492, 3, 2, 1, 0, 491, 490, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 496, 3, 10, 5, 0, 494, 496, 3, 6, 3, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 1, 1, 0, 0, 0, 497, 498, 5, 191, 0, 0, 498, 3, 1, 0, 0, 0, 499, 500, 5, 171, 0, 0, 500, 501, 5, 167, 0, 0, 501, 504, 3, 476, 238, 0, 502, 503, 5, 90, 0, 0, 503, 505, 3, 476, 238, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 5, 35, 0, 0, 507, 5, 1, 0, 0, 0, 508, 509, 3, 14, 7, 0, 509, 510, 3, 8, 4, 0, 510, 7, 1, 0, 0, 0, 511, 512, 3, 76, 38, 0, 512, 9, 1, 0, 0, 0, 513, 514, 3, 12, 6, 0, 514, 515, 3, 14, 7, 0, 515, 11, 1, 0, 0, 0, 516, 517, 5, 120, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 3, 460, 230, 0, 519, 520, 5, 19, 0, 0, 520, 521, 3, 470, 235, 0, 521, 522, 5, 35, 0, 0, 522, 13, 1, 0, 0, 0, 523, 529, 3, 18, 9, 0, 524, 529, 3, 20, 10, 0, 525, 529, 3, 48, 24, 0, 526, 529, 3, 42, 21, 0, 527, 529, 3, 46, 23, 0, 528, 523, 1, 0, 0, 0, 528, 524, 1, 0, 0, 0, 528, 525, 1, 0, 0, 0, 528, 526, 1, 0, 0, 0, 528, 527, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 35, 0, 0, 531, 533, 1, 0, 0, 0, 532, 528, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 545, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 539, 3, 2, 1, 0, 538, 537, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 3, 16, 8, 0, 541, 542, 5, 35, 0, 0, 542, 544, 1, 0, 0, 0, 543, 538, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 15, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 553, 3, 50, 25, 0, 549, 553, 3, 58, 29, 0, 550, 553, 3, 56, 28, 0, 551, 553, 3, 74, 37, 0, 552, 548, 1, 0, 0, 0, 552, 549, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552, 551, 1, 0, 0, 0, 553, 17, 1, 0, 0, 0, 554, 555, 5, 77, 0, 0, 555, 556, 5, 78, 0, 0, 556, 557, 7, 0, 0, 0, 557, 558, 5, 121, 0, 0, 558, 559, 3, 476, 238, 0, 559, 19, 1, 0, 0, 0, 560, 569, 3, 22, 11, 0, 561, 569, 3, 24, 12, 0, 562, 569, 3, 26, 13, 0, 563, 569, 3, 28, 14, 0, 564, 569, 3, 30, 15, 0, 565, 569, 3, 32, 16, 0, 566, 569, 3, 34, 17, 0, 567, 569, 3, 40, 20, 0, 568, 560, 1, 0, 0, 0, 568, 561, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 563, 1, 0, 0, 0, 568, 564, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 567, 1, 0, 0, 0, 569, 21, 1, 0, 0, 0, 570, 571, 5, 77, 0, 0, 571, 572, 5, 63, 0, 0, 572, 573, 7, 1, 0, 0, 573, 23, 1, 0, 0, 0, 574, 575, 5, 77, 0, 0, 575, 576, 5, 78, 0, 0, 576, 577, 5, 71, 0, 0, 577, 578, 3, 470, 235, 0, 578, 25, 1, 0, 0, 0, 579, 580, 5, 77, 0, 0, 580, 581, 5, 62, 0, 0, 581, 582, 3, 470, 235, 0, 582, 27, 1, 0, 0, 0, 583, 584, 5, 77, 0, 0, 584, 585, 5, 73, 0, 0, 585, 586, 7, 1, 0, 0, 586, 29, 1, 0, 0, 0, 587, 588, 5, 77, 0, 0, 588, 589, 5, 134, 0, 0, 589, 590, 7, 2, 0, 0, 590, 31, 1, 0, 0, 0, 591, 592, 5, 77, 0, 0, 592, 593, 5, 78, 0, 0, 593, 594, 5, 132, 0, 0, 594, 595, 5, 88, 0, 0, 595, 596, 7, 3, 0, 0, 596, 33, 1, 0, 0, 0, 597, 598, 5, 77, 0, 0, 598, 599, 5, 75, 0, 0, 599, 600, 3, 36, 18, 0, 600, 601, 5, 30, 0, 0, 601, 602, 3, 38, 19, 0, 602, 35, 1, 0, 0, 0, 603, 604, 7, 4, 0, 0, 604, 37, 1, 0, 0, 0, 605, 606, 7, 5, 0, 0, 606, 39, 1, 0, 0, 0, 607, 612, 5, 77, 0, 0, 608, 609, 5, 82, 0, 0, 609, 613, 3, 456, 228, 0, 610, 611, 5, 78, 0, 0, 611, 613, 5, 82, 0, 0, 612, 608, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 619, 1, 0, 0, 0, 614, 615, 5, 8, 0, 0, 615, 616, 5, 19, 0, 0, 616, 618, 3, 476, 238, 0, 617, 614, 1, 0, 0, 0, 618, 621, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 41, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 622, 623, 5, 106, 0, 0, 623, 625, 5, 143, 0, 0, 624, 626, 3, 44, 22, 0, 625, 624, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 637, 3, 470, 235, 0, 628, 629, 5, 60, 0, 0, 629, 634, 3, 470, 235, 0, 630, 631, 5, 30, 0, 0, 631, 633, 3, 470, 235, 0, 632, 630, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 638, 1, 0, 0, 0, 636, 634, 1, 0, 0, 0, 637, 628, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 43, 1, 0, 0, 0, 639, 640, 5, 121, 0, 0, 640, 641, 3, 460, 230, 0, 641, 642, 5, 19, 0, 0, 642, 647, 1, 0, 0, 0, 643, 644, 5, 78, 0, 0, 644, 645, 5, 86, 0, 0, 645, 647, 5, 121, 0, 0, 646, 639, 1, 0, 0, 0, 646, 643, 1, 0, 0, 0, 647, 45, 1, 0, 0, 0, 648, 649, 5, 106, 0, 0, 649, 654, 5, 120, 0, 0, 650, 651, 5, 121, 0, 0, 651, 652, 3, 460, 230, 0, 652, 653, 5, 19, 0, 0, 653, 655, 1, 0, 0, 0, 654, 650, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 666, 3, 470, 235, 0, 657, 658, 5, 60, 0, 0, 658, 663, 3, 470, 235, 0, 659, 660, 5, 30, 0, 0, 660, 662, 3, 470, 235, 0, 661, 659, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 667, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 47, 1, 0, 0, 0, 668, 669, 5, 77, 0, 0, 669, 670, 5, 121, 0, 0, 670, 671, 3, 460, 230, 0, 671, 672, 5, 19, 0, 0, 672, 673, 3, 470, 235, 0, 673, 49, 1, 0, 0, 0, 674, 675, 5, 77, 0, 0, 675, 676, 3, 64, 32, 0, 676, 677, 5, 166, 0, 0, 677, 678, 5, 44, 0, 0, 678, 680, 3, 264, 132, 0, 679, 681, 3, 376, 188, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 689, 1, 0, 0, 0, 682, 683, 5, 34, 0, 0, 683, 690, 3, 52, 26, 0, 684, 687, 5, 95, 0, 0, 685, 686, 5, 34, 0, 0, 686, 688, 3, 54, 27, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 690, 1, 0, 0, 0, 689, 682, 1, 0, 0, 0, 689, 684, 1, 0, 0, 0, 690, 51, 1, 0, 0, 0, 691, 692, 3, 78, 39, 0, 692, 53, 1, 0, 0, 0, 693, 694, 3, 78, 39, 0, 694, 55, 1, 0, 0, 0, 695, 696, 5, 77, 0, 0, 696, 697, 5, 74, 0, 0, 697, 700, 5, 112, 0, 0, 698, 699, 5, 58, 0, 0, 699, 701, 3, 380, 190, 0, 700, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 709, 1, 0, 0, 0, 702, 703, 5, 34, 0, 0, 703, 710, 3, 78, 39, 0, 704, 707, 5, 95, 0, 0, 705, 706, 5, 34, 0, 0, 706, 708, 3, 78, 39, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 710, 1, 0, 0, 0, 709, 702, 1, 0, 0, 0, 709, 704, 1, 0, 0, 0, 710, 57, 1, 0, 0, 0, 711, 712, 5, 77, 0, 0, 712, 713, 3, 64, 32, 0, 713, 714, 5, 99, 0, 0, 714, 715, 3, 456, 228, 0, 715, 717, 5, 21, 0, 0, 716, 718, 3, 60, 30, 0, 717, 716, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 5, 22, 0, 0, 720, 722, 3, 72, 36, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 726, 3, 346, 173, 0, 724, 726, 5, 95, 0, 0, 725, 723, 1, 0, 0, 0, 725, 724, 1, 0, 0, 0, 726, 59, 1, 0, 0, 0, 727, 732, 3, 62, 31, 0, 728, 729, 5, 30, 0, 0, 729, 731, 3, 62, 31, 0, 730, 728, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 61, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 736, 5, 44, 0, 0, 736, 738, 3, 458, 229, 0, 737, 739, 3, 376, 188, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 63, 1, 0, 0, 0, 740, 742, 3, 66, 33, 0, 741, 740, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 65, 1, 0, 0, 0, 745, 743, 1, 0, 0, 0, 746, 747, 5, 45, 0, 0, 747, 752, 3, 458, 229, 0, 748, 749, 5, 21, 0, 0, 749, 750, 3, 68, 34, 0, 750, 751, 5, 22, 0, 0, 751, 753, 1, 0, 0, 0, 752, 748, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 67, 1, 0, 0, 0, 754, 759, 3, 70, 35, 0, 755, 756, 5, 30, 0, 0, 756, 758, 3, 70, 35, 0, 757, 755, 1, 0, 0, 0, 758, 761, 1, 0, 0, 0, 759, 757, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 69, 1, 0, 0, 0, 761, 759, 1, 0, 0, 0, 762, 763, 3, 258, 129, 0, 763, 71, 1, 0, 0, 0, 764, 765, 5, 58, 0, 0, 765, 766, 3, 378, 189, 0, 766, 73, 1, 0, 0, 0, 767, 768, 5, 77, 0, 0, 768, 769, 5, 130, 0, 0, 769, 770, 3, 458, 229, 0, 770, 771, 3, 476, 238, 0, 771, 75, 1, 0, 0, 0, 772, 777, 3, 78, 39, 0, 773, 774, 5, 30, 0, 0, 774, 776, 3, 78, 39, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 77, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 789, 3, 80, 40, 0, 781, 789, 3, 126, 63, 0, 782, 789, 3, 130, 65, 0, 783, 789, 3, 136, 68, 0, 784, 789, 3, 156, 78, 0, 785, 789, 3, 142, 71, 0, 786, 789, 3, 144, 72, 0, 787, 789, 3, 168, 84, 0, 788, 780, 1, 0, 0, 0, 788, 781, 1, 0, 0, 0, 788, 782, 1, 0, 0, 0, 788, 783, 1, 0, 0, 0, 788, 784, 1, 0, 0, 0, 788, 785, 1, 0, 0, 0, 788, 786, 1, 0, 0, 0, 788, 787, 1, 0, 0, 0, 789, 79, 1, 0, 0, 0, 790, 794, 3, 82, 41, 0, 791, 793, 3, 84, 42, 0, 792, 791, 1, 0, 0, 0, 793, 796, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 797, 1, 0, 0, 0, 796, 794, 1, 0, 0, 0, 797, 798, 3, 124, 62, 0, 798, 81, 1, 0, 0, 0, 799, 803, 3, 86, 43, 0, 800, 803, 3, 94, 47, 0, 801, 803, 3, 98, 49, 0, 802, 799, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 801, 1, 0, 0, 0, 803, 83, 1, 0, 0, 0, 804, 810, 3, 82, 41, 0, 805, 810, 3, 112, 56, 0, 806, 810, 3, 114, 57, 0, 807, 810, 3, 120, 60, 0, 808, 810, 3, 110, 55, 0, 809, 804, 1, 0, 0, 0, 809, 805, 1, 0, 0, 0, 809, 806, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 808, 1, 0, 0, 0, 810, 85, 1, 0, 0, 0, 811, 812, 5, 98, 0, 0, 812, 817, 3, 88, 44, 0, 813, 814, 5, 30, 0, 0, 814, 816, 3, 88, 44, 0, 815, 813, 1, 0, 0, 0, 816, 819, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 87, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 823, 3, 264, 132, 0, 822, 824, 3, 376, 188, 0, 823, 822, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 826, 1, 0, 0, 0, 825, 827, 3, 90, 45, 0, 826, 825, 1, 0, 0, 0, 826, 827, 1, 0, 0, 0, 827, 829, 1, 0, 0, 0, 828, 830, 3, 92, 46, 0, 829, 828, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 5, 107, 0, 0, 832, 833, 3, 78, 39, 0, 833, 89, 1, 0, 0, 0, 834, 835, 5, 53, 0, 0, 835, 836, 5, 88, 0, 0, 836, 91, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 839, 5, 44, 0, 0, 839, 840, 3, 264, 132, 0, 840, 93, 1, 0, 0, 0, 841, 842, 5, 116, 0, 0, 842, 847, 3, 96, 48, 0, 843, 844, 5, 30, 0, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 845, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 95, 1, 0, 0, 0, 849, 847, 1, 0, 0, 0, 850, 851, 5, 44, 0, 0, 851, 853, 3, 264, 132, 0, 852, 854, 3, 376, 188, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 856, 5, 34, 0, 0, 856, 857, 3, 78, 39, 0, 857, 97, 1, 0, 0, 0, 858, 861, 5, 98, 0, 0, 859, 862, 3, 100, 50, 0, 860, 862, 3, 102, 51, 0, 861, 859, 1, 0, 0, 0, 861, 860, 1, 0, 0, 0, 862, 99, 1, 0, 0, 0, 863, 864, 5, 159, 0, 0, 864, 865, 5, 170, 0, 0, 865, 866, 5, 44, 0, 0, 866, 868, 3, 458, 229, 0, 867, 869, 3, 376, 188, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 5, 107, 0, 0, 871, 872, 3, 78, 39, 0, 872, 874, 3, 104, 52, 0, 873, 875, 3, 106, 53, 0, 874, 873, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 101, 1, 0, 0, 0, 876, 877, 5, 147, 0, 0, 877, 878, 5, 170, 0, 0, 878, 879, 5, 44, 0, 0, 879, 881, 3, 458, 229, 0, 880, 882, 3, 376, 188, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 107, 0, 0, 884, 885, 3, 78, 39, 0, 885, 886, 3, 104, 52, 0, 886, 887, 3, 106, 53, 0, 887, 103, 1, 0, 0, 0, 888, 889, 5, 150, 0, 0, 889, 890, 3, 108, 54, 0, 890, 891, 5, 168, 0, 0, 891, 892, 3, 78, 39, 0, 892, 105, 1, 0, 0, 0, 893, 895, 5, 129, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 5, 91, 0, 0, 897, 898, 3, 108, 54, 0, 898, 899, 5, 168, 0, 0, 899, 900, 3, 78, 39, 0, 900, 107, 1, 0, 0, 0, 901, 902, 5, 44, 0, 0, 902, 904, 3, 456, 228, 0, 903, 901, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 906, 1, 0, 0, 0, 905, 907, 3, 92, 46, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 911, 1, 0, 0, 0, 908, 909, 5, 139, 0, 0, 909, 910, 5, 44, 0, 0, 910, 912, 3, 456, 228, 0, 911, 908, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 916, 1, 0, 0, 0, 913, 914, 5, 123, 0, 0, 914, 915, 5, 44, 0, 0, 915, 917, 3, 456, 228, 0, 916, 913, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 109, 1, 0, 0, 0, 918, 919, 5, 76, 0, 0, 919, 920, 5, 44, 0, 0, 920, 921, 3, 264, 132, 0, 921, 111, 1, 0, 0, 0, 922, 923, 5, 169, 0, 0, 923, 924, 3, 78, 39, 0, 924, 113, 1, 0, 0, 0, 925, 926, 5, 102, 0, 0, 926, 927, 5, 65, 0, 0, 927, 928, 3, 116, 58, 0, 928, 115, 1, 0, 0, 0, 929, 934, 3, 118, 59, 0, 930, 931, 5, 30, 0, 0, 931, 933, 3, 118, 59, 0, 932, 930, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 117, 1, 0, 0, 0, 936, 934, 1, 0, 0, 0, 937, 938, 5, 44, 0, 0, 938, 944, 3, 264, 132, 0, 939, 941, 3, 376, 188, 0, 940, 939, 1, 0, 0, 0, 940, 941, 1, 0, 0, 0, 941, 942, 1, 0, 0, 0, 942, 943, 5, 34, 0, 0, 943, 945, 3, 78, 39, 0, 944, 940, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 947, 5, 71, 0, 0, 947, 949, 3, 470, 235, 0, 948, 946, 1, 0, 0, 0, 948, 949, 1, 0, 0, 0, 949, 119, 1, 0, 0, 0, 950, 952, 5, 149, 0, 0, 951, 950, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 5, 132, 0, 0, 954, 955, 5, 65, 0, 0, 955, 960, 3, 122, 61, 0, 956, 957, 5, 30, 0, 0, 957, 959, 3, 122, 61, 0, 958, 956, 1, 0, 0, 0, 959, 962, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 121, 1, 0, 0, 0, 962, 960, 1, 0, 0, 0, 963, 966, 3, 78, 39, 0, 964, 967, 5, 59, 0, 0, 965, 967, 5, 81, 0, 0, 966, 964, 1, 0, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 973, 1, 0, 0, 0, 968, 971, 5, 88, 0, 0, 969, 972, 5, 101, 0, 0, 970, 972, 5, 115, 0, 0, 971, 969, 1, 0, 0, 0, 971, 970, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 977, 1, 0, 0, 0, 975, 976, 5, 71, 0, 0, 976, 978, 3, 470, 235, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 123, 1, 0, 0, 0, 979, 980, 5, 141, 0, 0, 980, 981, 3, 78, 39, 0, 981, 125, 1, 0, 0, 0, 982, 985, 5, 148, 0, 0, 983, 985, 5, 93, 0, 0, 984, 982, 1, 0, 0, 0, 984, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 991, 3, 128, 64, 0, 987, 988, 5, 30, 0, 0, 988, 990, 3, 128, 64, 0, 989, 987, 1, 0, 0, 0, 990, 993, 1, 0, 0, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 991, 1, 0, 0, 0, 994, 995, 5, 142, 0, 0, 995, 996, 3, 78, 39, 0, 996, 127, 1, 0, 0, 0, 997, 998, 5, 44, 0, 0, 998, 1000, 3, 264, 132, 0, 999, 1001, 3, 376, 188, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 5, 107, 0, 0, 1003, 1004, 3, 78, 39, 0, 1004, 129, 1, 0, 0, 0, 1005, 1006, 5, 153, 0, 0, 1006, 1007, 5, 21, 0, 0, 1007, 1008, 3, 76, 38, 0, 1008, 1010, 5, 22, 0, 0, 1009, 1011, 3, 132, 66, 0, 1010, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1010, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 5, 78, 0, 0, 1015, 1016, 5, 141, 0, 0, 1016, 1017, 3, 78, 39, 0, 1017, 131, 1, 0, 0, 0, 1018, 1019, 5, 66, 0, 0, 1019, 1021, 3, 134, 67, 0, 1020, 1018, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 141, 0, 0, 1025, 1026, 3, 78, 39, 0, 1026, 133, 1, 0, 0, 0, 1027, 1028, 3, 78, 39, 0, 1028, 135, 1, 0, 0, 0, 1029, 1030, 5, 161, 0, 0, 1030, 1031, 5, 21, 0, 0, 1031, 1032, 3, 76, 38, 0, 1032, 1034, 5, 22, 0, 0, 1033, 1035, 3, 138, 69, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1041, 5, 78, 0, 0, 1039, 1040, 5, 44, 0, 0, 1040, 1042, 3, 264, 132, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 5, 141, 0, 0, 1044, 1045, 3, 78, 39, 0, 1045, 137, 1, 0, 0, 0, 1046, 1051, 5, 66, 0, 0, 1047, 1048, 5, 44, 0, 0, 1048, 1049, 3, 264, 132, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 3, 140, 70, 0, 1054, 1055, 5, 141, 0, 0, 1055, 1056, 3, 78, 39, 0, 1056, 139, 1, 0, 0, 0, 1057, 1062, 3, 378, 189, 0, 1058, 1059, 5, 39, 0, 0, 1059, 1061, 3, 378, 189, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 141, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1066, 5, 105, 0, 0, 1066, 1067, 5, 21, 0, 0, 1067, 1068, 3, 76, 38, 0, 1068, 1069, 5, 22, 0, 0, 1069, 1070, 5, 155, 0, 0, 1070, 1071, 3, 78, 39, 0, 1071, 1072, 5, 87, 0, 0, 1072, 1073, 3, 78, 39, 0, 1073, 143, 1, 0, 0, 0, 1074, 1076, 3, 146, 73, 0, 1075, 1077, 3, 150, 75, 0, 1076, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 145, 1, 0, 0, 0, 1080, 1081, 5, 158, 0, 0, 1081, 1082, 3, 148, 74, 0, 1082, 147, 1, 0, 0, 0, 1083, 1084, 3, 152, 76, 0, 1084, 149, 1, 0, 0, 0, 1085, 1092, 5, 69, 0, 0, 1086, 1093, 3, 154, 77, 0, 1087, 1088, 5, 21, 0, 0, 1088, 1089, 5, 44, 0, 0, 1089, 1090, 3, 264, 132, 0, 1090, 1091, 5, 22, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1087, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 3, 152, 76, 0, 1095, 151, 1, 0, 0, 0, 1096, 1098, 5, 25, 0, 0, 1097, 1099, 3, 76, 38, 0, 1098, 1097, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 5, 26, 0, 0, 1101, 153, 1, 0, 0, 0, 1102, 1107, 3, 238, 119, 0, 1103, 1104, 5, 39, 0, 0, 1104, 1106, 3, 238, 119, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1109, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 155, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1116, 5, 164, 0, 0, 1111, 1117, 3, 158, 79, 0, 1112, 1117, 3, 160, 80, 0, 1113, 1117, 3, 162, 81, 0, 1114, 1117, 3, 164, 82, 0, 1115, 1117, 3, 166, 83, 0, 1116, 1111, 1, 0, 0, 0, 1116, 1112, 1, 0, 0, 0, 1116, 1113, 1, 0, 0, 0, 1116, 1114, 1, 0, 0, 0, 1116, 1115, 1, 0, 0, 0, 1117, 157, 1, 0, 0, 0, 1118, 1119, 5, 177, 0, 0, 1119, 1120, 3, 76, 38, 0, 1120, 1121, 5, 178, 0, 0, 1121, 1122, 3, 78, 39, 0, 1122, 159, 1, 0, 0, 0, 1123, 1124, 5, 179, 0, 0, 1124, 1125, 3, 76, 38, 0, 1125, 1126, 5, 178, 0, 0, 1126, 1127, 3, 78, 39, 0, 1127, 161, 1, 0, 0, 0, 1128, 1129, 5, 180, 0, 0, 1129, 1130, 3, 78, 39, 0, 1130, 1131, 7, 6, 0, 0, 1131, 1132, 3, 78, 39, 0, 1132, 163, 1, 0, 0, 0, 1133, 1134, 5, 182, 0, 0, 1134, 1135, 3, 78, 39, 0, 1135, 165, 1, 0, 0, 0, 1136, 1137, 5, 183, 0, 0, 1137, 1138, 3, 78, 39, 0, 1138, 1139, 5, 58, 0, 0, 1139, 1140, 3, 78, 39, 0, 1140, 167, 1, 0, 0, 0, 1141, 1146, 3, 170, 85, 0, 1142, 1143, 5, 131, 0, 0, 1143, 1145, 3, 170, 85, 0, 1144, 1142, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 169, 1, 0, 0, 0, 1148, 1146, 1, 0, 0, 0, 1149, 1154, 3, 172, 86, 0, 1150, 1151, 5, 56, 0, 0, 1151, 1153, 3, 172, 86, 0, 1152, 1150, 1, 0, 0, 0, 1153, 1156, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 171, 1, 0, 0, 0, 1156, 1154, 1, 0, 0, 0, 1157, 1165, 3, 174, 87, 0, 1158, 1162, 3, 204, 102, 0, 1159, 1162, 3, 202, 101, 0, 1160, 1162, 3, 206, 103, 0, 1161, 1158, 1, 0, 0, 0, 1161, 1159, 1, 0, 0, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 3, 174, 87, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1161, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 173, 1, 0, 0, 0, 1167, 1172, 3, 176, 88, 0, 1168, 1169, 5, 51, 0, 0, 1169, 1171, 3, 176, 88, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 175, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1178, 3, 178, 89, 0, 1176, 1177, 5, 156, 0, 0, 1177, 1179, 3, 178, 89, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 177, 1, 0, 0, 0, 1180, 1185, 3, 180, 90, 0, 1181, 1182, 7, 7, 0, 0, 1182, 1184, 3, 180, 90, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 179, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1193, 3, 182, 91, 0, 1189, 1190, 7, 8, 0, 0, 1190, 1192, 3, 182, 91, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1195, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 181, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1196, 1201, 3, 184, 92, 0, 1197, 1198, 7, 9, 0, 0, 1198, 1200, 3, 184, 92, 0, 1199, 1197, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 183, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1209, 3, 186, 93, 0, 1205, 1206, 7, 10, 0, 0, 1206, 1208, 3, 186, 93, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 185, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1216, 3, 188, 94, 0, 1213, 1214, 5, 109, 0, 0, 1214, 1215, 5, 128, 0, 0, 1215, 1217, 3, 378, 189, 0, 1216, 1213, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 187, 1, 0, 0, 0, 1218, 1222, 3, 190, 95, 0, 1219, 1220, 5, 157, 0, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1223, 3, 378, 189, 0, 1222, 1219, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 189, 1, 0, 0, 0, 1224, 1228, 3, 192, 96, 0, 1225, 1226, 5, 68, 0, 0, 1226, 1227, 5, 58, 0, 0, 1227, 1229, 3, 374, 187, 0, 1228, 1225, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 191, 1, 0, 0, 0, 1230, 1234, 3, 194, 97, 0, 1231, 1232, 5, 67, 0, 0, 1232, 1233, 5, 58, 0, 0, 1233, 1235, 3, 374, 187, 0, 1234, 1231, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 193, 1, 0, 0, 0, 1236, 1241, 3, 198, 99, 0, 1237, 1238, 5, 49, 0, 0, 1238, 1240, 3, 196, 98, 0, 1239, 1237, 1, 0, 0, 0, 1240, 1243, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 195, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1244, 1245, 3, 254, 127, 0, 1245, 1246, 3, 244, 122, 0, 1246, 197, 1, 0, 0, 0, 1247, 1249, 7, 7, 0, 0, 1248, 1247, 1, 0, 0, 0, 1249, 1252, 1, 0, 0, 0, 1250, 1248, 1, 0, 0, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1253, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1253, 1254, 3, 200, 100, 0, 1254, 199, 1, 0, 0, 0, 1255, 1259, 3, 208, 104, 0, 1256, 1259, 3, 212, 106, 0, 1257, 1259, 3, 214, 107, 0, 1258, 1255, 1, 0, 0, 0, 1258, 1256, 1, 0, 0, 0, 1258, 1257, 1, 0, 0, 0, 1259, 201, 1, 0, 0, 0, 1260, 1269, 5, 19, 0, 0, 1261, 1269, 5, 20, 0, 0, 1262, 1269, 5, 40, 0, 0, 1263, 1264, 5, 40, 0, 0, 1264, 1269, 5, 19, 0, 0, 1265, 1269, 5, 41, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 1269, 5, 19, 0, 0, 1268, 1260, 1, 0, 0, 0, 1268, 1261, 1, 0, 0, 0, 1268, 1262, 1, 0, 0, 0, 1268, 1263, 1, 0, 0, 0, 1268, 1265, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1269, 203, 1, 0, 0, 0, 1270, 1271, 7, 11, 0, 0, 1271, 205, 1, 0, 0, 0, 1272, 1278, 5, 111, 0, 0, 1273, 1274, 5, 40, 0, 0, 1274, 1278, 5, 40, 0, 0, 1275, 1276, 5, 41, 0, 0, 1276, 1278, 5, 41, 0, 0, 1277, 1272, 1, 0, 0, 0, 1277, 1273, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1278, 207, 1, 0, 0, 0, 1279, 1283, 5, 165, 0, 0, 1280, 1284, 3, 210, 105, 0, 1281, 1282, 7, 12, 0, 0, 1282, 1284, 3, 420, 210, 0, 1283, 1280, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 3, 152, 76, 0, 1286, 209, 1, 0, 0, 0, 1287, 1288, 7, 13, 0, 0, 1288, 211, 1, 0, 0, 0, 1289, 1291, 5, 17, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 25, 0, 0, 1295, 1296, 3, 76, 38, 0, 1296, 1297, 5, 26, 0, 0, 1297, 213, 1, 0, 0, 0, 1298, 1303, 3, 216, 108, 0, 1299, 1300, 5, 46, 0, 0, 1300, 1302, 3, 216, 108, 0, 1301, 1299, 1, 0, 0, 0, 1302, 1305, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 215, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1306, 1308, 5, 36, 0, 0, 1307, 1309, 3, 218, 109, 0, 1308, 1307, 1, 0, 0, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1314, 1, 0, 0, 0, 1310, 1311, 5, 37, 0, 0, 1311, 1314, 3, 218, 109, 0, 1312, 1314, 3, 218, 109, 0, 1313, 1306, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 217, 1, 0, 0, 0, 1315, 1320, 3, 220, 110, 0, 1316, 1317, 7, 14, 0, 0, 1317, 1319, 3, 220, 110, 0, 1318, 1316, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 219, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1326, 3, 242, 121, 0, 1324, 1326, 3, 222, 111, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1324, 1, 0, 0, 0, 1326, 221, 1, 0, 0, 0, 1327, 1330, 3, 230, 115, 0, 1328, 1330, 3, 224, 112, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 3, 246, 123, 0, 1332, 223, 1, 0, 0, 0, 1333, 1334, 3, 226, 113, 0, 1334, 1335, 3, 236, 118, 0, 1335, 1338, 1, 0, 0, 0, 1336, 1338, 3, 228, 114, 0, 1337, 1333, 1, 0, 0, 0, 1337, 1336, 1, 0, 0, 0, 1338, 225, 1, 0, 0, 0, 1339, 1340, 7, 15, 0, 0, 1340, 1341, 5, 33, 0, 0, 1341, 1342, 5, 33, 0, 0, 1342, 227, 1, 0, 0, 0, 1343, 1345, 5, 43, 0, 0, 1344, 1343, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 3, 236, 118, 0, 1347, 229, 1, 0, 0, 0, 1348, 1349, 3, 232, 116, 0, 1349, 1350, 3, 236, 118, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1353, 3, 234, 117, 0, 1352, 1348, 1, 0, 0, 0, 1352, 1351, 1, 0, 0, 0, 1353, 231, 1, 0, 0, 0, 1354, 1355, 7, 16, 0, 0, 1355, 1356, 5, 33, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 233, 1, 0, 0, 0, 1358, 1359, 5, 32, 0, 0, 1359, 235, 1, 0, 0, 0, 1360, 1363, 3, 238, 119, 0, 1361, 1363, 3, 384, 192, 0, 1362, 1360, 1, 0, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 237, 1, 0, 0, 0, 1364, 1367, 3, 456, 228, 0, 1365, 1367, 3, 240, 120, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 239, 1, 0, 0, 0, 1368, 1372, 5, 27, 0, 0, 1369, 1372, 5, 186, 0, 0, 1370, 1372, 5, 187, 0, 0, 1371, 1368, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 241, 1, 0, 0, 0, 1373, 1379, 3, 256, 128, 0, 1374, 1378, 3, 248, 124, 0, 1375, 1378, 3, 244, 122, 0, 1376, 1378, 3, 250, 125, 0, 1377, 1374, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1377, 1376, 1, 0, 0, 0, 1378, 1381, 1, 0, 0, 0, 1379, 1377, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 243, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1382, 1391, 5, 21, 0, 0, 1383, 1388, 3, 276, 138, 0, 1384, 1385, 5, 30, 0, 0, 1385, 1387, 3, 276, 138, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1392, 1, 0, 0, 0, 1390, 1388, 1, 0, 0, 0, 1391, 1383, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 5, 22, 0, 0, 1394, 245, 1, 0, 0, 0, 1395, 1397, 3, 248, 124, 0, 1396, 1395, 1, 0, 0, 0, 1397, 1400, 1, 0, 0, 0, 1398, 1396, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 247, 1, 0, 0, 0, 1400, 1398, 1, 0, 0, 0, 1401, 1402, 5, 23, 0, 0, 1402, 1403, 3, 76, 38, 0, 1403, 1404, 5, 24, 0, 0, 1404, 249, 1, 0, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1407, 3, 252, 126, 0, 1407, 251, 1, 0, 0, 0, 1408, 1413, 3, 460, 230, 0, 1409, 1413, 5, 5, 0, 0, 1410, 1413, 3, 266, 133, 0, 1411, 1413, 5, 27, 0, 0, 1412, 1408, 1, 0, 0, 0, 1412, 1409, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 253, 1, 0, 0, 0, 1414, 1418, 3, 456, 228, 0, 1415, 1418, 3, 262, 131, 0, 1416, 1418, 3, 266, 133, 0, 1417, 1414, 1, 0, 0, 0, 1417, 1415, 1, 0, 0, 0, 1417, 1416, 1, 0, 0, 0, 1418, 255, 1, 0, 0, 0, 1419, 1433, 3, 258, 129, 0, 1420, 1433, 3, 262, 131, 0, 1421, 1433, 3, 266, 133, 0, 1422, 1433, 3, 268, 134, 0, 1423, 1433, 3, 274, 137, 0, 1424, 1433, 3, 270, 135, 0, 1425, 1433, 3, 272, 136, 0, 1426, 1433, 3, 278, 139, 0, 1427, 1433, 3, 340, 170, 0, 1428, 1433, 3, 348, 174, 0, 1429, 1433, 3, 352, 176, 0, 1430, 1433, 3, 358, 179, 0, 1431, 1433, 3, 372, 186, 0, 1432, 1419, 1, 0, 0, 0, 1432, 1420, 1, 0, 0, 0, 1432, 1421, 1, 0, 0, 0, 1432, 1422, 1, 0, 0, 0, 1432, 1423, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1425, 1, 0, 0, 0, 1432, 1426, 1, 0, 0, 0, 1432, 1427, 1, 0, 0, 0, 1432, 1428, 1, 0, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 257, 1, 0, 0, 0, 1434, 1437, 3, 260, 130, 0, 1435, 1437, 3, 476, 238, 0, 1436, 1434, 1, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 259, 1, 0, 0, 0, 1438, 1439, 7, 17, 0, 0, 1439, 261, 1, 0, 0, 0, 1440, 1441, 5, 44, 0, 0, 1441, 1442, 3, 456, 228, 0, 1442, 263, 1, 0, 0, 0, 1443, 1444, 3, 456, 228, 0, 1444, 265, 1, 0, 0, 0, 1445, 1447, 5, 21, 0, 0, 1446, 1448, 3, 76, 38, 0, 1447, 1446, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 5, 22, 0, 0, 1450, 267, 1, 0, 0, 0, 1451, 1452, 5, 31, 0, 0, 1452, 269, 1, 0, 0, 0, 1453, 1454, 5, 133, 0, 0, 1454, 1455, 3, 152, 76, 0, 1455, 271, 1, 0, 0, 0, 1456, 1457, 5, 163, 0, 0, 1457, 1458, 3, 152, 76, 0, 1458, 273, 1, 0, 0, 0, 1459, 1460, 3, 456, 228, 0, 1460, 1461, 3, 244, 122, 0, 1461, 275, 1, 0, 0, 0, 1462, 1465, 3, 78, 39, 0, 1463, 1465, 5, 42, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 277, 1, 0, 0, 0, 1466, 1469, 3, 280, 140, 0, 1467, 1469, 3, 302, 151, 0, 1468, 1466, 1, 0, 0, 0, 1468, 1467, 1, 0, 0, 0, 1469, 279, 1, 0, 0, 0, 1470, 1474, 3, 282, 141, 0, 1471, 1474, 3, 284, 142, 0, 1472, 1474, 7, 18, 0, 0, 1473, 1470, 1, 0, 0, 0, 1473, 1471, 1, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 281, 1, 0, 0, 0, 1475, 1476, 5, 40, 0, 0, 1476, 1477, 3, 458, 229, 0, 1477, 1478, 3, 286, 143, 0, 1478, 1482, 5, 41, 0, 0, 1479, 1481, 3, 298, 149, 0, 1480, 1479, 1, 0, 0, 0, 1481, 1484, 1, 0, 0, 0, 1482, 1480, 1, 0, 0, 0, 1482, 1483, 1, 0, 0, 0, 1483, 1485, 1, 0, 0, 0, 1484, 1482, 1, 0, 0, 0, 1485, 1486, 5, 40, 0, 0, 1486, 1487, 5, 36, 0, 0, 1487, 1488, 3, 458, 229, 0, 1488, 1489, 5, 41, 0, 0, 1489, 283, 1, 0, 0, 0, 1490, 1491, 5, 40, 0, 0, 1491, 1492, 3, 458, 229, 0, 1492, 1493, 3, 286, 143, 0, 1493, 1494, 5, 36, 0, 0, 1494, 1495, 5, 41, 0, 0, 1495, 285, 1, 0, 0, 0, 1496, 1497, 3, 458, 229, 0, 1497, 1498, 5, 19, 0, 0, 1498, 1499, 3, 292, 146, 0, 1499, 1501, 1, 0, 0, 0, 1500, 1496, 1, 0, 0, 0, 1501, 1504, 1, 0, 0, 0, 1502, 1500, 1, 0, 0, 0, 1502, 1503, 1, 0, 0, 0, 1503, 287, 1, 0, 0, 0, 1504, 1502, 1, 0, 0, 0, 1505, 1512, 5, 11, 0, 0, 1506, 1511, 5, 9, 0, 0, 1507, 1511, 5, 10, 0, 0, 1508, 1511, 5, 1, 0, 0, 1509, 1511, 3, 294, 147, 0, 1510, 1506, 1, 0, 0, 0, 1510, 1507, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1510, 1509, 1, 0, 0, 0, 1511, 1514, 1, 0, 0, 0, 1512, 1510, 1, 0, 0, 0, 1512, 1513, 1, 0, 0, 0, 1513, 1515, 1, 0, 0, 0, 1514, 1512, 1, 0, 0, 0, 1515, 1516, 5, 11, 0, 0, 1516, 289, 1, 0, 0, 0, 1517, 1524, 5, 12, 0, 0, 1518, 1523, 5, 9, 0, 0, 1519, 1523, 5, 10, 0, 0, 1520, 1523, 5, 2, 0, 0, 1521, 1523, 3, 296, 148, 0, 1522, 1518, 1, 0, 0, 0, 1522, 1519, 1, 0, 0, 0, 1522, 1520, 1, 0, 0, 0, 1522, 1521, 1, 0, 0, 0, 1523, 1526, 1, 0, 0, 0, 1524, 1522, 1, 0, 0, 0, 1524, 1525, 1, 0, 0, 0, 1525, 1527, 1, 0, 0, 0, 1526, 1524, 1, 0, 0, 0, 1527, 1528, 5, 12, 0, 0, 1528, 291, 1, 0, 0, 0, 1529, 1532, 3, 288, 144, 0, 1530, 1532, 3, 290, 145, 0, 1531, 1529, 1, 0, 0, 0, 1531, 1530, 1, 0, 0, 0, 1532, 293, 1, 0, 0, 0, 1533, 1535, 5, 196, 0, 0, 1534, 1533, 1, 0, 0, 0, 1535, 1536, 1, 0, 0, 0, 1536, 1534, 1, 0, 0, 0, 1536, 1537, 1, 0, 0, 0, 1537, 1547, 1, 0, 0, 0, 1538, 1547, 5, 3, 0, 0, 1539, 1547, 5, 4, 0, 0, 1540, 1547, 3, 288, 144, 0, 1541, 1543, 5, 25, 0, 0, 1542, 1544, 3, 76, 38, 0, 1543, 1542, 1, 0, 0, 0, 1543, 1544, 1, 0, 0, 0, 1544, 1545, 1, 0, 0, 0, 1545, 1547, 5, 26, 0, 0, 1546, 1534, 1, 0, 0, 0, 1546, 1538, 1, 0, 0, 0, 1546, 1539, 1, 0, 0, 0, 1546, 1540, 1, 0, 0, 0, 1546, 1541, 1, 0, 0, 0, 1547, 295, 1, 0, 0, 0, 1548, 1550, 5, 196, 0, 0, 1549, 1548, 1, 0, 0, 0, 1550, 1551, 1, 0, 0, 0, 1551, 1549, 1, 0, 0, 0, 1551, 1552, 1, 0, 0, 0, 1552, 1562, 1, 0, 0, 0, 1553, 1562, 5, 3, 0, 0, 1554, 1562, 5, 4, 0, 0, 1555, 1562, 3, 290, 145, 0, 1556, 1558, 5, 25, 0, 0, 1557, 1559, 3, 76, 38, 0, 1558, 1557, 1, 0, 0, 0, 1558, 1559, 1, 0, 0, 0, 1559, 1560, 1, 0, 0, 0, 1560, 1562, 5, 26, 0, 0, 1561, 1549, 1, 0, 0, 0, 1561, 1553, 1, 0, 0, 0, 1561, 1554, 1, 0, 0, 0, 1561, 1555, 1, 0, 0, 0, 1561, 1556, 1, 0, 0, 0, 1562, 297, 1, 0, 0, 0, 1563, 1570, 3, 280, 140, 0, 1564, 1570, 3, 300, 150, 0, 1565, 1570, 5, 16, 0, 0, 1566, 1570, 5, 11, 0, 0, 1567, 1570, 5, 12, 0, 0, 1568, 1570, 3, 482, 241, 0, 1569, 1563, 1, 0, 0, 0, 1569, 1564, 1, 0, 0, 0, 1569, 1565, 1, 0, 0, 0, 1569, 1566, 1, 0, 0, 0, 1569, 1567, 1, 0, 0, 0, 1569, 1568, 1, 0, 0, 0, 1570, 299, 1, 0, 0, 0, 1571, 1581, 7, 19, 0, 0, 1572, 1573, 5, 25, 0, 0, 1573, 1581, 5, 25, 0, 0, 1574, 1575, 5, 26, 0, 0, 1575, 1581, 5, 26, 0, 0, 1576, 1577, 5, 25, 0, 0, 1577, 1578, 3, 76, 38, 0, 1578, 1579, 5, 26, 0, 0, 1579, 1581, 1, 0, 0, 0, 1580, 1571, 1, 0, 0, 0, 1580, 1572, 1, 0, 0, 0, 1580, 1574, 1, 0, 0, 0, 1580, 1576, 1, 0, 0, 0, 1581, 301, 1, 0, 0, 0, 1582, 1591, 3, 318, 159, 0, 1583, 1591, 3, 320, 160, 0, 1584, 1591, 3, 324, 162, 0, 1585, 1591, 3, 326, 163, 0, 1586, 1591, 3, 334, 167, 0, 1587, 1591, 3, 336, 168, 0, 1588, 1591, 3, 338, 169, 0, 1589, 1591, 3, 304, 152, 0, 1590, 1582, 1, 0, 0, 0, 1590, 1583, 1, 0, 0, 0, 1590, 1584, 1, 0, 0, 0, 1590, 1585, 1, 0, 0, 0, 1590, 1586, 1, 0, 0, 0, 1590, 1587, 1, 0, 0, 0, 1590, 1588, 1, 0, 0, 0, 1590, 1589, 1, 0, 0, 0, 1591, 303, 1, 0, 0, 0, 1592, 1599, 3, 306, 153, 0, 1593, 1599, 3, 308, 154, 0, 1594, 1599, 3, 310, 155, 0, 1595, 1599, 3, 312, 156, 0, 1596, 1599, 3, 314, 157, 0, 1597, 1599, 3, 316, 158, 0, 1598, 1592, 1, 0, 0, 0, 1598, 1593, 1, 0, 0, 0, 1598, 1594, 1, 0, 0, 0, 1598, 1595, 1, 0, 0, 0, 1598, 1596, 1, 0, 0, 0, 1598, 1597, 1, 0, 0, 0, 1599, 305, 1, 0, 0, 0, 1600, 1601, 5, 172, 0, 0, 1601, 1602, 3, 322, 161, 0, 1602, 307, 1, 0, 0, 0, 1603, 1604, 5, 176, 0, 0, 1604, 1618, 5, 25, 0, 0, 1605, 1606, 3, 78, 39, 0, 1606, 1607, 5, 33, 0, 0, 1607, 1615, 3, 78, 39, 0, 1608, 1609, 5, 30, 0, 0, 1609, 1610, 3, 78, 39, 0, 1610, 1611, 5, 33, 0, 0, 1611, 1612, 3, 78, 39, 0, 1612, 1614, 1, 0, 0, 0, 1613, 1608, 1, 0, 0, 0, 1614, 1617, 1, 0, 0, 0, 1615, 1613, 1, 0, 0, 0, 1615, 1616, 1, 0, 0, 0, 1616, 1619, 1, 0, 0, 0, 1617, 1615, 1, 0, 0, 0, 1618, 1605, 1, 0, 0, 0, 1618, 1619, 1, 0, 0, 0, 1619, 1620, 1, 0, 0, 0, 1620, 1621, 5, 26, 0, 0, 1621, 309, 1, 0, 0, 0, 1622, 1623, 5, 175, 0, 0, 1623, 1624, 3, 322, 161, 0, 1624, 311, 1, 0, 0, 0, 1625, 1626, 5, 173, 0, 0, 1626, 1627, 5, 25, 0, 0, 1627, 1628, 3, 78, 39, 0, 1628, 1629, 5, 26, 0, 0, 1629, 313, 1, 0, 0, 0, 1630, 1631, 5, 174, 0, 0, 1631, 1632, 5, 25, 0, 0, 1632, 1633, 5, 26, 0, 0, 1633, 315, 1, 0, 0, 0, 1634, 1635, 5, 64, 0, 0, 1635, 1636, 3, 322, 161, 0, 1636, 317, 1, 0, 0, 0, 1637, 1638, 5, 84, 0, 0, 1638, 1639, 3, 152, 76, 0, 1639, 319, 1, 0, 0, 0, 1640, 1646, 5, 86, 0, 0, 1641, 1647, 3, 456, 228, 0, 1642, 1643, 5, 25, 0, 0, 1643, 1644, 3, 76, 38, 0, 1644, 1645, 5, 26, 0, 0, 1645, 1647, 1, 0, 0, 0, 1646, 1641, 1, 0, 0, 0, 1646, 1642, 1, 0, 0, 0, 1647, 1648, 1, 0, 0, 0, 1648, 1649, 3, 322, 161, 0, 1649, 321, 1, 0, 0, 0, 1650, 1651, 3, 152, 76, 0, 1651, 323, 1, 0, 0, 0, 1652, 1658, 5, 61, 0, 0, 1653, 1659, 3, 456, 228, 0, 1654, 1655, 5, 25, 0, 0, 1655, 1656, 3, 76, 38, 0, 1656, 1657, 5, 26, 0, 0, 1657, 1659, 1, 0, 0, 0, 1658, 1653, 1, 0, 0, 0, 1658, 1654, 1, 0, 0, 0, 1659, 1660, 1, 0, 0, 0, 1660, 1661, 3, 152, 76, 0, 1661, 325, 1, 0, 0, 0, 1662, 1665, 5, 121, 0, 0, 1663, 1666, 3, 328, 164, 0, 1664, 1666, 3, 330, 165, 0, 1665, 1663, 1, 0, 0, 0, 1665, 1664, 1, 0, 0, 0, 1666, 1667, 1, 0, 0, 0, 1667, 1668, 3, 332, 166, 0, 1668, 327, 1, 0, 0, 0, 1669, 1670, 3, 460, 230, 0, 1670, 329, 1, 0, 0, 0, 1671, 1672, 3, 152, 76, 0, 1672, 331, 1, 0, 0, 0, 1673, 1674, 3, 152, 76, 0, 1674, 333, 1, 0, 0, 0, 1675, 1676, 5, 154, 0, 0, 1676, 1677, 3, 152, 76, 0, 1677, 335, 1, 0, 0, 0, 1678, 1679, 5, 72, 0, 0, 1679, 1680, 3, 152, 76, 0, 1680, 337, 1, 0, 0, 0, 1681, 1687, 5, 140, 0, 0, 1682, 1688, 3, 460, 230, 0, 1683, 1684, 5, 25, 0, 0, 1684, 1685, 3, 76, 38, 0, 1685, 1686, 5, 26, 0, 0, 1686, 1688, 1, 0, 0, 0, 1687, 1682, 1, 0, 0, 0, 1687, 1683, 1, 0, 0, 0, 1688, 1689, 1, 0, 0, 0, 1689, 1690, 3, 152, 76, 0, 1690, 339, 1, 0, 0, 0, 1691, 1694, 3, 342, 171, 0, 1692, 1694, 3, 344, 172, 0, 1693, 1691, 1, 0, 0, 0, 1693, 1692, 1, 0, 0, 0, 1694, 341, 1, 0, 0, 0, 1695, 1696, 3, 456, 228, 0, 1696, 1697, 5, 47, 0, 0, 1697, 1698, 5, 5, 0, 0, 1698, 343, 1, 0, 0, 0, 1699, 1700, 3, 64, 32, 0, 1700, 1701, 5, 99, 0, 0, 1701, 1703, 5, 21, 0, 0, 1702, 1704, 3, 60, 30, 0, 1703, 1702, 1, 0, 0, 0, 1703, 1704, 1, 0, 0, 0, 1704, 1705, 1, 0, 0, 0, 1705, 1708, 5, 22, 0, 0, 1706, 1707, 5, 58, 0, 0, 1707, 1709, 3, 378, 189, 0, 1708, 1706, 1, 0, 0, 0, 1708, 1709, 1, 0, 0, 0, 1709, 1710, 1, 0, 0, 0, 1710, 1711, 3, 346, 173, 0, 1711, 345, 1, 0, 0, 0, 1712, 1713, 3, 152, 76, 0, 1713, 347, 1, 0, 0, 0, 1714, 1715, 5, 118, 0, 0, 1715, 1724, 5, 25, 0, 0, 1716, 1721, 3, 350, 175, 0, 1717, 1718, 5, 30, 0, 0, 1718, 1720, 3, 350, 175, 0, 1719, 1717, 1, 0, 0, 0, 1720, 1723, 1, 0, 0, 0, 1721, 1719, 1, 0, 0, 0, 1721, 1722, 1, 0, 0, 0, 1722, 1725, 1, 0, 0, 0, 1723, 1721, 1, 0, 0, 0, 1724, 1716, 1, 0, 0, 0, 1724, 1725, 1, 0, 0, 0, 1725, 1726, 1, 0, 0, 0, 1726, 1727, 5, 26, 0, 0, 1727, 349, 1, 0, 0, 0, 1728, 1729, 3, 78, 39, 0, 1729, 1730, 7, 20, 0, 0, 1730, 1731, 3, 78, 39, 0, 1731, 351, 1, 0, 0, 0, 1732, 1735, 3, 354, 177, 0, 1733, 1735, 3, 356, 178, 0, 1734, 1732, 1, 0, 0, 0, 1734, 1733, 1, 0, 0, 0, 1735, 353, 1, 0, 0, 0, 1736, 1738, 5, 23, 0, 0, 1737, 1739, 3, 76, 38, 0, 1738, 1737, 1, 0, 0, 0, 1738, 1739, 1, 0, 0, 0, 1739, 1740, 1, 0, 0, 0, 1740, 1741, 5, 24, 0, 0, 1741, 355, 1, 0, 0, 0, 1742, 1743, 5, 57, 0, 0, 1743, 1744, 3, 152, 76, 0, 1744, 357, 1, 0, 0, 0, 1745, 1746, 5, 194, 0, 0, 1746, 1747, 3, 360, 180, 0, 1747, 1748, 5, 199, 0, 0, 1748, 359, 1, 0, 0, 0, 1749, 1755, 3, 368, 184, 0, 1750, 1751, 3, 370, 185, 0, 1751, 1752, 3, 368, 184, 0, 1752, 1754, 1, 0, 0, 0, 1753, 1750, 1, 0, 0, 0, 1754, 1757, 1, 0, 0, 0, 1755, 1753, 1, 0, 0, 0, 1755, 1756, 1, 0, 0, 0, 1756, 361, 1, 0, 0, 0, 1757, 1755, 1, 0, 0, 0, 1758, 1759, 7, 21, 0, 0, 1759, 363, 1, 0, 0, 0, 1760, 1761, 7, 22, 0, 0, 1761, 365, 1, 0, 0, 0, 1762, 1763, 7, 23, 0, 0, 1763, 367, 1, 0, 0, 0, 1764, 1775, 5, 197, 0, 0, 1765, 1766, 3, 362, 181, 0, 1766, 1767, 3, 364, 182, 0, 1767, 1775, 1, 0, 0, 0, 1768, 1769, 3, 366, 183, 0, 1769, 1770, 3, 362, 181, 0, 1770, 1771, 3, 362, 181, 0, 1771, 1775, 1, 0, 0, 0, 1772, 1775, 3, 362, 181, 0, 1773, 1775, 5, 25, 0, 0, 1774, 1764, 1, 0, 0, 0, 1774, 1765, 1, 0, 0, 0, 1774, 1768, 1, 0, 0, 0, 1774, 1772, 1, 0, 0, 0, 1774, 1773, 1, 0, 0, 0, 1775, 1778, 1, 0, 0, 0, 1776, 1774, 1, 0, 0, 0, 1776, 1777, 1, 0, 0, 0, 1777, 369, 1, 0, 0, 0, 1778, 1776, 1, 0, 0, 0, 1779, 1780, 5, 198, 0, 0, 1780, 1781, 3, 76, 38, 0, 1781, 1782, 5, 195, 0, 0, 1782, 371, 1, 0, 0, 0, 1783, 1784, 5, 42, 0, 0, 1784, 1785, 3, 252, 126, 0, 1785, 373, 1, 0, 0, 0, 1786, 1788, 3, 418, 209, 0, 1787, 1789, 5, 42, 0, 0, 1788, 1787, 1, 0, 0, 0, 1788, 1789, 1, 0, 0, 0, 1789, 375, 1, 0, 0, 0, 1790, 1791, 5, 58, 0, 0, 1791, 1792, 3, 378, 189, 0, 1792, 377, 1, 0, 0, 0, 1793, 1794, 5, 89, 0, 0, 1794, 1795, 5, 21, 0, 0, 1795, 1803, 5, 22, 0, 0, 1796, 1800, 3, 380, 190, 0, 1797, 1801, 5, 42, 0, 0, 1798, 1801, 5, 27, 0, 0, 1799, 1801, 5, 28, 0, 0, 1800, 1797, 1, 0, 0, 0, 1800, 1798, 1, 0, 0, 0, 1800, 1799, 1, 0, 0, 0, 1800, 1801, 1, 0, 0, 0, 1801, 1803, 1, 0, 0, 0, 1802, 1793, 1, 0, 0, 0, 1802, 1796, 1, 0, 0, 0, 1803, 379, 1, 0, 0, 0, 1804, 1814, 3, 384, 192, 0, 1805, 1806, 5, 112, 0, 0, 1806, 1807, 5, 21, 0, 0, 1807, 1814, 5, 22, 0, 0, 1808, 1814, 3, 422, 211, 0, 1809, 1814, 3, 428, 214, 0, 1810, 1814, 3, 434, 217, 0, 1811, 1814, 3, 382, 191, 0, 1812, 1814, 3, 440, 220, 0, 1813, 1804, 1, 0, 0, 0, 1813, 1805, 1, 0, 0, 0, 1813, 1808, 1, 0, 0, 0, 1813, 1809, 1, 0, 0, 0, 1813, 1810, 1, 0, 0, 0, 1813, 1811, 1, 0, 0, 0, 1813, 1812, 1, 0, 0, 0, 1814, 381, 1, 0, 0, 0, 1815, 1816, 3, 456, 228, 0, 1816, 383, 1, 0, 0, 0, 1817, 1830, 3, 390, 195, 0, 1818, 1830, 3, 406, 203, 0, 1819, 1830, 3, 400, 200, 0, 1820, 1830, 3, 410, 205, 0, 1821, 1830, 3, 404, 202, 0, 1822, 1830, 3, 398, 199, 0, 1823, 1830, 3, 394, 197, 0, 1824, 1830, 3, 392, 196, 0, 1825, 1830, 3, 396, 198, 0, 1826, 1830, 3, 444, 222, 0, 1827, 1830, 3, 388, 194, 0, 1828, 1830, 3, 386, 193, 0, 1829, 1817, 1, 0, 0, 0, 1829, 1818, 1, 0, 0, 0, 1829, 1819, 1, 0, 0, 0, 1829, 1820, 1, 0, 0, 0, 1829, 1821, 1, 0, 0, 0, 1829, 1822, 1, 0, 0, 0, 1829, 1823, 1, 0, 0, 0, 1829, 1824, 1, 0, 0, 0, 1829, 1825, 1, 0, 0, 0, 1829, 1826, 1, 0, 0, 0, 1829, 1827, 1, 0, 0, 0, 1829, 1828, 1, 0, 0, 0, 1830, 385, 1, 0, 0, 0, 1831, 1832, 5, 127, 0, 0, 1832, 1834, 5, 21, 0, 0, 1833, 1835, 5, 27, 0, 0, 1834, 1833, 1, 0, 0, 0, 1834, 1835, 1, 0, 0, 0, 1835, 1836, 1, 0, 0, 0, 1836, 1837, 5, 22, 0, 0, 1837, 387, 1, 0, 0, 0, 1838, 1839, 5, 64, 0, 0, 1839, 1840, 5, 21, 0, 0, 1840, 1841, 5, 22, 0, 0, 1841, 389, 1, 0, 0, 0, 1842, 1843, 5, 85, 0, 0, 1843, 1846, 5, 21, 0, 0, 1844, 1847, 3, 406, 203, 0, 1845, 1847, 3, 410, 205, 0, 1846, 1844, 1, 0, 0, 0, 1846, 1845, 1, 0, 0, 0, 1846, 1847, 1, 0, 0, 0, 1847, 1848, 1, 0, 0, 0, 1848, 1849, 5, 22, 0, 0, 1849, 391, 1, 0, 0, 0, 1850, 1851, 5, 154, 0, 0, 1851, 1852, 5, 21, 0, 0, 1852, 1853, 5, 22, 0, 0, 1853, 393, 1, 0, 0, 0, 1854, 1855, 5, 72, 0, 0, 1855, 1856, 5, 21, 0, 0, 1856, 1857, 5, 22, 0, 0, 1857, 395, 1, 0, 0, 0, 1858, 1859, 5, 124, 0, 0, 1859, 1860, 5, 21, 0, 0, 1860, 1861, 5, 22, 0, 0, 1861, 397, 1, 0, 0, 0, 1862, 1863, 5, 140, 0, 0, 1863, 1866, 5, 21, 0, 0, 1864, 1867, 3, 460, 230, 0, 1865, 1867, 3, 476, 238, 0, 1866, 1864, 1, 0, 0, 0, 1866, 1865, 1, 0, 0, 0, 1866, 1867, 1, 0, 0, 0, 1867, 1868, 1, 0, 0, 0, 1868, 1869, 5, 22, 0, 0, 1869, 399, 1, 0, 0, 0, 1870, 1871, 5, 61, 0, 0, 1871, 1877, 5, 21, 0, 0, 1872, 1875, 3, 402, 201, 0, 1873, 1874, 5, 30, 0, 0, 1874, 1876, 3, 420, 210, 0, 1875, 1873, 1, 0, 0, 0, 1875, 1876, 1, 0, 0, 0, 1876, 1878, 1, 0, 0, 0, 1877, 1872, 1, 0, 0, 0, 1877, 1878, 1, 0, 0, 0, 1878, 1879, 1, 0, 0, 0, 1879, 1880, 5, 22, 0, 0, 1880, 401, 1, 0, 0, 0, 1881, 1884, 3, 414, 207, 0, 1882, 1884, 5, 27, 0, 0, 1883, 1881, 1, 0, 0, 0, 1883, 1882, 1, 0, 0, 0, 1884, 403, 1, 0, 0, 0, 1885, 1886, 5, 144, 0, 0, 1886, 1887, 5, 21, 0, 0, 1887, 1888, 3, 442, 221, 0, 1888, 1889, 5, 22, 0, 0, 1889, 405, 1, 0, 0, 0, 1890, 1891, 5, 86, 0, 0, 1891, 1900, 5, 21, 0, 0, 1892, 1898, 3, 408, 204, 0, 1893, 1894, 5, 30, 0, 0, 1894, 1896, 3, 420, 210, 0, 1895, 1897, 5, 42, 0, 0, 1896, 1895, 1, 0, 0, 0, 1896, 1897, 1, 0, 0, 0, 1897, 1899, 1, 0, 0, 0, 1898, 1893, 1, 0, 0, 0, 1898, 1899, 1, 0, 0, 0, 1899, 1901, 1, 0, 0, 0, 1900, 1892, 1, 0, 0, 0, 1900, 1901, 1, 0, 0, 0, 1901, 1902, 1, 0, 0, 0, 1902, 1903, 5, 22, 0, 0, 1903, 407, 1, 0, 0, 0, 1904, 1907, 3, 416, 208, 0, 1905, 1907, 5, 27, 0, 0, 1906, 1904, 1, 0, 0, 0, 1906, 1905, 1, 0, 0, 0, 1907, 409, 1, 0, 0, 0, 1908, 1909, 5, 145, 0, 0, 1909, 1910, 5, 21, 0, 0, 1910, 1911, 3, 412, 206, 0, 1911, 1912, 5, 22, 0, 0, 1912, 411, 1, 0, 0, 0, 1913, 1914, 3, 416, 208, 0, 1914, 413, 1, 0, 0, 0, 1915, 1916, 3, 456, 228, 0, 1916, 415, 1, 0, 0, 0, 1917, 1918, 3, 456, 228, 0, 1918, 417, 1, 0, 0, 0, 1919, 1920, 3, 420, 210, 0, 1920, 419, 1, 0, 0, 0, 1921, 1922, 3, 456, 228, 0, 1922, 421, 1, 0, 0, 0, 1923, 1925, 3, 66, 33, 0, 1924, 1923, 1, 0, 0, 0, 1925, 1928, 1, 0, 0, 0, 1926, 1924, 1, 0, 0, 0, 1926, 1927, 1, 0, 0, 0, 1927, 1931, 1, 0, 0, 0, 1928, 1926, 1, 0, 0, 0, 1929, 1932, 3, 424, 212, 0, 1930, 1932, 3, 426, 213, 0, 1931, 1929, 1, 0, 0, 0, 1931, 1930, 1, 0, 0, 0, 1932, 423, 1, 0, 0, 0, 1933, 1934, 5, 99, 0, 0, 1934, 1935, 5, 21, 0, 0, 1935, 1936, 5, 27, 0, 0, 1936, 1937, 5, 22, 0, 0, 1937, 425, 1, 0, 0, 0, 1938, 1939, 5, 99, 0, 0, 1939, 1948, 5, 21, 0, 0, 1940, 1945, 3, 378, 189, 0, 1941, 1942, 5, 30, 0, 0, 1942, 1944, 3, 378, 189, 0, 1943, 1941, 1, 0, 0, 0, 1944, 1947, 1, 0, 0, 0, 1945, 1943, 1, 0, 0, 0, 1945, 1946, 1, 0, 0, 0, 1946, 1949, 1, 0, 0, 0, 1947, 1945, 1, 0, 0, 0, 1948, 1940, 1, 0, 0, 0, 1948, 1949, 1, 0, 0, 0, 1949, 1950, 1, 0, 0, 0, 1950, 1951, 5, 22, 0, 0, 1951, 1952, 5, 58, 0, 0, 1952, 1953, 3, 378, 189, 0, 1953, 427, 1, 0, 0, 0, 1954, 1957, 3, 430, 215, 0, 1955, 1957, 3, 432, 216, 0, 1956, 1954, 1, 0, 0, 0, 1956, 1955, 1, 0, 0, 0, 1957, 429, 1, 0, 0, 0, 1958, 1959, 5, 118, 0, 0, 1959, 1960, 5, 21, 0, 0, 1960, 1961, 5, 27, 0, 0, 1961, 1962, 5, 22, 0, 0, 1962, 431, 1, 0, 0, 0, 1963, 1964, 5, 118, 0, 0, 1964, 1965, 5, 21, 0, 0, 1965, 1966, 3, 456, 228, 0, 1966, 1967, 5, 30, 0, 0, 1967, 1968, 3, 378, 189, 0, 1968, 1969, 5, 22, 0, 0, 1969, 433, 1, 0, 0, 0, 1970, 1973, 3, 436, 218, 0, 1971, 1973, 3, 438, 219, 0, 1972, 1970, 1, 0, 0, 0, 1972, 1971, 1, 0, 0, 0, 1973, 435, 1, 0, 0, 0, 1974, 1975, 5, 57, 0, 0, 1975, 1976, 5, 21, 0, 0, 1976, 1977, 5, 27, 0, 0, 1977, 1978, 5, 22, 0, 0, 1978, 437, 1, 0, 0, 0, 1979, 1980, 5, 57, 0, 0, 1980, 1981, 5, 21, 0, 0, 1981, 1982, 3, 378, 189, 0, 1982, 1983, 5, 22, 0, 0, 1983, 439, 1, 0, 0, 0, 1984, 1985, 5, 21, 0, 0, 1985, 1986, 3, 380, 190, 0, 1986, 1987, 5, 22, 0, 0, 1987, 441, 1, 0, 0, 0, 1988, 1989, 3, 414, 207, 0, 1989, 443, 1, 0, 0, 0, 1990, 1996, 3, 446, 223, 0, 1991, 1996, 3, 448, 224, 0, 1992, 1996, 3, 450, 225, 0, 1993, 1996, 3, 452, 226, 0, 1994, 1996, 3, 454, 227, 0, 1995, 1990, 1, 0, 0, 0, 1995, 1991, 1, 0, 0, 0, 1995, 1992, 1, 0, 0, 0, 1995, 1993, 1, 0, 0, 0, 1995, 1994, 1, 0, 0, 0, 1996, 445, 1, 0, 0, 0, 1997, 1998, 5, 172, 0, 0, 1998, 2000, 5, 21, 0, 0, 1999, 2001, 3, 476, 238, 0, 2000, 1999, 1, 0, 0, 0, 2000, 2001, 1, 0, 0, 0, 2001, 2002, 1, 0, 0, 0, 2002, 2003, 5, 22, 0, 0, 2003, 447, 1, 0, 0, 0, 2004, 2005, 5, 176, 0, 0, 2005, 2007, 5, 21, 0, 0, 2006, 2008, 3, 476, 238, 0, 2007, 2006, 1, 0, 0, 0, 2007, 2008, 1, 0, 0, 0, 2008, 2009, 1, 0, 0, 0, 2009, 2010, 5, 22, 0, 0, 2010, 449, 1, 0, 0, 0, 2011, 2012, 5, 175, 0, 0, 2012, 2014, 5, 21, 0, 0, 2013, 2015, 3, 476, 238, 0, 2014, 2013, 1, 0, 0, 0, 2014, 2015, 1, 0, 0, 0, 2015, 2016, 1, 0, 0, 0, 2016, 2017, 5, 22, 0, 0, 2017, 451, 1, 0, 0, 0, 2018, 2019, 5, 173, 0, 0, 2019, 2021, 5, 21, 0, 0, 2020, 2022, 3, 476, 238, 0, 2021, 2020, 1, 0, 0, 0, 2021, 2022, 1, 0, 0, 0, 2022, 2023, 1, 0, 0, 0, 2023, 2024, 5, 22, 0, 0, 2024, 453, 1, 0, 0, 0, 2025, 2026, 5, 174, 0, 0, 2026, 2028, 5, 21, 0, 0, 2027, 2029, 3, 476, 238, 0, 2028, 2027, 1, 0, 0, 0, 2028, 2029, 1, 0, 0, 0, 2029, 2030, 1, 0, 0, 0, 2030, 2031, 5, 22, 0, 0, 2031, 455, 1, 0, 0, 0, 2032, 2035, 3, 458, 229, 0, 2033, 2035, 5, 184, 0, 0, 2034, 2032, 1, 0, 0, 0, 2034, 2033, 1, 0, 0, 0, 2035, 457, 1, 0, 0, 0, 2036, 2039, 5, 185, 0, 0, 2037, 2039, 3, 460, 230, 0, 2038, 2036, 1, 0, 0, 0, 2038, 2037, 1, 0, 0, 0, 2039, 459, 1, 0, 0, 0, 2040, 2043, 5, 188, 0, 0, 2041, 2043, 3, 464, 232, 0, 2042, 2040, 1, 0, 0, 0, 2042, 2041, 1, 0, 0, 0, 2043, 461, 1, 0, 0, 0, 2044, 2049, 5, 185, 0, 0, 2045, 2049, 5, 188, 0, 0, 2046, 2049, 5, 184, 0, 0, 2047, 2049, 3, 468, 234, 0, 2048, 2044, 1, 0, 0, 0, 2048, 2045, 1, 0, 0, 0, 2048, 2046, 1, 0, 0, 0, 2048, 2047, 1, 0, 0, 0, 2049, 463, 1, 0, 0, 0, 2050, 2053, 3, 468, 234, 0, 2051, 2053, 3, 466, 233, 0, 2052, 2050, 1, 0, 0, 0, 2052, 2051, 1, 0, 0, 0, 2053, 465, 1, 0, 0, 0, 2054, 2055, 7, 24, 0, 0, 2055, 467, 1, 0, 0, 0, 2056, 2057, 7, 25, 0, 0, 2057, 469, 1, 0, 0, 0, 2058, 2059, 3, 476, 238, 0, 2059, 471, 1, 0, 0, 0, 2060, 2067, 5, 11, 0, 0, 2061, 2066, 5, 9, 0, 0, 2062, 2066, 5, 10, 0, 0, 2063, 2066, 5, 1, 0, 0, 2064, 2066, 3, 478, 239, 0, 2065, 2061, 1, 0, 0, 0, 2065, 2062, 1, 0, 0, 0, 2065, 2063, 1, 0, 0, 0, 2065, 2064, 1, 0, 0, 0, 2066, 2069, 1, 0, 0, 0, 2067, 2065, 1, 0, 0, 0, 2067, 2068, 1, 0, 0, 0, 2068, 2070, 1, 0, 0, 0, 2069, 2067, 1, 0, 0, 0, 2070, 2071, 5, 11, 0, 0, 2071, 473, 1, 0, 0, 0, 2072, 2079, 5, 12, 0, 0, 2073, 2078, 5, 9, 0, 0, 2074, 2078, 5, 10, 0, 0, 2075, 2078, 5, 2, 0, 0, 2076, 2078, 3, 480, 240, 0, 2077, 2073, 1, 0, 0, 0, 2077, 2074, 1, 0, 0, 0, 2077, 2075, 1, 0, 0, 0, 2077, 2076, 1, 0, 0, 0, 2078, 2081, 1, 0, 0, 0, 2079, 2077, 1, 0, 0, 0, 2079, 2080, 1, 0, 0, 0, 2080, 2082, 1, 0, 0, 0, 2081, 2079, 1, 0, 0, 0, 2082, 2083, 5, 12, 0, 0, 2083, 475, 1, 0, 0, 0, 2084, 2087, 3, 472, 236, 0, 2085, 2087, 3, 474, 237, 0, 2086, 2084, 1, 0, 0, 0, 2086, 2085, 1, 0, 0, 0, 2087, 477, 1, 0, 0, 0, 2088, 2090, 5, 196, 0, 0, 2089, 2088, 1, 0, 0, 0, 2090, 2091, 1, 0, 0, 0, 2091, 2089, 1, 0, 0, 0, 2091, 2092, 1, 0, 0, 0, 2092, 2106, 1, 0, 0, 0, 2093, 2095, 5, 25, 0, 0, 2094, 2096, 3, 76, 38, 0, 2095, 2094, 1, 0, 0, 0, 2095, 2096, 1, 0, 0, 0, 2096, 2098, 1, 0, 0, 0, 2097, 2099, 5, 26, 0, 0, 2098, 2097, 1, 0, 0, 0, 2098, 2099, 1, 0, 0, 0, 2099, 2106, 1, 0, 0, 0, 2100, 2106, 5, 26, 0, 0, 2101, 2106, 5, 3, 0, 0, 2102, 2106, 5, 4, 0, 0, 2103, 2106, 3, 482, 241, 0, 2104, 2106, 3, 474, 237, 0, 2105, 2089, 1, 0, 0, 0, 2105, 2093, 1, 0, 0, 0, 2105, 2100, 1, 0, 0, 0, 2105, 2101, 1, 0, 0, 0, 2105, 2102, 1, 0, 0, 0, 2105, 2103, 1, 0, 0, 0, 2105, 2104, 1, 0, 0, 0, 2106, 479, 1, 0, 0, 0, 2107, 2109, 5, 196, 0, 0, 2108, 2107, 1, 0, 0, 0, 2109, 2110, 1, 0, 0, 0, 2110, 2108, 1, 0, 0, 0, 2110, 2111, 1, 0, 0, 0, 2111, 2125, 1, 0, 0, 0, 2112, 2114, 5, 25, 0, 0, 2113, 2115, 3, 76, 38, 0, 2114, 2113, 1, 0, 0, 0, 2114, 2115, 1, 0, 0, 0, 2115, 2117, 1, 0, 0, 0, 2116, 2118, 5, 26, 0, 0, 2117, 2116, 1, 0, 0, 0, 2117, 2118, 1, 0, 0, 0, 2118, 2125, 1, 0, 0, 0, 2119, 2125, 5, 26, 0, 0, 2120, 2125, 5, 3, 0, 0, 2121, 2125, 5, 4, 0, 0, 2122, 2125, 3, 482, 241, 0, 2123, 2125, 3, 472, 236, 0, 2124, 2108, 1, 0, 0, 0, 2124, 2112, 1, 0, 0, 0, 2124, 2119, 1, 0, 0, 0, 2124, 2120, 1, 0, 0, 0, 2124, 2121, 1, 0, 0, 0, 2124, 2122, 1, 0, 0, 0, 2124, 2123, 1, 0, 0, 0, 2125, 481, 1, 0, 0, 0, 2126, 2129, 3, 464, 232, 0, 2127, 2129, 7, 26, 0, 0, 2128, 2126, 1, 0, 0, 0, 2128, 2127, 1, 0, 0, 0, 2129, 2130, 1, 0, 0, 0, 2130, 2128, 1, 0, 0, 0, 2130, 2131, 1, 0, 0, 0, 2131, 483, 1, 0, 0, 0, 204, 485, 488, 491, 495, 504, 528, 534, 538, 545, 552, 568, 612, 619, 625, 634, 637, 646, 654, 663, 666, 680, 687, 689, 700, 707, 709, 717, 721, 725, 732, 738, 743, 752, 759, 777, 788, 794, 802, 809, 817, 823, 826, 829, 847, 853, 861, 868, 874, 881, 894, 903, 906, 911, 916, 934, 940, 944, 948, 951, 960, 966, 971, 973, 977, 984, 991, 1000, 1012, 1022, 1036, 1041, 1051, 1062, 1078, 1092, 1098, 1107, 1116, 1146, 1154, 1161, 1165, 1172, 1178, 1185, 1193, 1201, 1209, 1216, 1222, 1228, 1234, 1241, 1250, 1258, 1268, 1277, 1283, 1292, 1303, 1308, 1313, 1320, 1325, 1329, 1337, 1344, 1352, 1362, 1366, 1371, 1377, 1379, 1388, 1391, 1398, 1412, 1417, 1432, 1436, 1447, 1464, 1468, 1473, 1482, 1502, 1510, 1512, 1522, 1524, 1531, 1536, 1543, 1546, 1551, 1558, 1561, 1569, 1580, 1590, 1598, 1615, 1618, 1646, 1658, 1665, 1687, 1693, 1703, 1708, 1721, 1724, 1734, 1738, 1755, 1774, 1776, 1788, 1800, 1802, 1813, 1829, 1834, 1846, 1866, 1875, 1877, 1883, 1896, 1898, 1900, 1906, 1926, 1931, 1945, 1948, 1956, 1972, 1995, 2000, 2007, 2014, 2021, 2028, 2034, 2038, 2042, 2048, 2052, 2065, 2067, 2077, 2079, 2086, 2091, 2095, 2098, 2105, 2110, 2114, 2117, 2124, 2128, 2130]
\ No newline at end of file
diff --git a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
index db14e76fee..d58a597d98 100644
--- a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java
@@ -155,8 +155,8 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
}
PendingUpdateList pul = new PendingUpdateList();
- for (RuntimeIterator child : children) {
- pul = PendingUpdateList.mergeUpdates(pul, child.getPendingUpdateList(context), this.getMetadata());
+ for (RuntimeIterator child : this.children) {
+ pul.mergeUpdates(child.getPendingUpdateList(context), this.getMetadata());
}
return pul;
}
diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
index 131742fe57..f6dfc708ac 100644
--- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java
@@ -159,8 +159,7 @@ public JavaRDD
- getRDD(DynamicContext context) {
public static JavaRDD
- dataFrameToRDDOfItems(JSoundDataFrame df, ExceptionMetadata metadata) {
JavaRDD
rowRDD = df.javaRDD();
- JavaRDD- result = rowRDD.map(new RowToItemMapper(metadata, df.getItemType()));
- return result;
+ return rowRDD.map(new RowToItemMapper(metadata, df.getItemType()));
}
public void materialize(DynamicContext context, List
- result) {
diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
index 15ed99c538..b225b1bd35 100644
--- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
+++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java
@@ -391,7 +391,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
}
PendingUpdateList result = new PendingUpdateList();
- if (!isRDDOrDataFrame()) {
+ if (!this.expression.isRDDOrDataFrame()) {
this.child.open(context);
this.tupleContext = new DynamicContext(context); // assign current context
@@ -401,12 +401,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.tupleContext.getVariableValues().setBindingsFromTuple(tuple, getMetadata()); // assign new
// variables
// from new tuple
-
- result = PendingUpdateList.mergeUpdates(
- result,
- this.expression.getPendingUpdateList(this.tupleContext),
- this.getMetadata()
- );
+ result.mergeUpdates(this.expression.getPendingUpdateList(this.tupleContext), this.getMetadata());
}
this.child.close();
@@ -432,7 +427,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
// from new tuple
PendingUpdateList intermediateResult = this.expression.getPendingUpdateList(dynamicContext);
- result = PendingUpdateList.mergeUpdates(result, intermediateResult, this.getMetadata());
+ result.mergeUpdates(intermediateResult, this.getMetadata());
}
}
return result;
diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
index 5e253d0d01..501d17953b 100644
--- a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java
@@ -37,6 +37,7 @@
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.typing.AtMostOneItemTypePromotionIterator;
import org.rumbledb.runtime.typing.TypePromotionIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import org.rumbledb.types.FunctionSignature;
import org.rumbledb.types.SequenceType;
import org.rumbledb.types.SequenceType.Arity;
@@ -78,6 +79,7 @@ public FunctionItemCallIterator(
this.functionItem = functionItem;
this.functionArguments = functionArguments;
this.functionBodyIterator = null;
+ this.isUpdating = functionItem.getSignature().isUpdating();
this.validateNumberOfArguments();
this.wrapArgumentIteratorsWithTypeCheckingIterators();
@@ -232,7 +234,8 @@ private RuntimeIterator generatePartiallyAppliedFunction(DynamicContext context)
partialApplicationParamNames,
new FunctionSignature(
partialApplicationParamTypes,
- this.functionItem.getSignature().getReturnType()
+ this.functionItem.getSignature().getReturnType(),
+ this.functionItem.getSignature().isUpdating()
),
this.functionItem.getModuleDynamicContext(),
this.functionItem.getBodyIterator(),
@@ -346,4 +349,16 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
this.functionBodyIterator = this.functionItem.getBodyIterator();
return this.functionBodyIterator.getDataFrame(this.dynamicContextForCalls);
}
+
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ if (!isUpdating()) {
+ return new PendingUpdateList();
+ }
+ this.populateDynamicContextWithArguments(context);
+ DynamicContext contextForUpdates = new DynamicContext(this.dynamicContextForCalls);
+ contextForUpdates.setCurrentMutabilityLevel(context.getCurrentMutabilityLevel());
+ this.functionBodyIterator = this.functionItem.getBodyIterator();
+ return this.functionBodyIterator.getPendingUpdateList(contextForUpdates);
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
index b4854d4fad..83ad520810 100644
--- a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java
@@ -44,13 +44,15 @@ public FunctionRuntimeIterator(
Map paramNameToSequenceTypes,
SequenceType returnType,
RuntimeIterator bodyIterator,
- RuntimeStaticContext staticContext
+ RuntimeStaticContext staticContext,
+ boolean isUpdating
) {
super(null, staticContext);
this.functionName = functionName;
this.paramNameToSequenceTypes = paramNameToSequenceTypes;
this.returnType = returnType;
this.bodyIterator = bodyIterator;
+ this.isUpdating = isUpdating;
}
@Override
@@ -61,7 +63,8 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
this.paramNameToSequenceTypes,
this.returnType,
dynamicContext.getModuleContext(),
- bodyIteratorCopy
+ bodyIteratorCopy,
+ this.isUpdating
);
function.populateClosureFromDynamicContext(dynamicContext, getMetadata());
return function;
diff --git a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
index 6bf65e3b88..326e01ae76 100644
--- a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java
@@ -31,6 +31,7 @@
import org.rumbledb.items.structured.JSoundDataFrame;
import org.rumbledb.runtime.HybridRuntimeIterator;
import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.update.PendingUpdateList;
import java.util.List;
import java.util.Map;
@@ -55,13 +56,15 @@ public class StaticUserDefinedFunctionCallIterator extends HybridRuntimeIterator
public StaticUserDefinedFunctionCallIterator(
FunctionIdentifier functionIdentifier,
List functionArguments,
- RuntimeStaticContext staticContext
+ RuntimeStaticContext staticContext,
+ boolean isUpdating
) {
super(null, staticContext);
this.functionIdentifier = functionIdentifier;
this.functionArguments = functionArguments;
this.userDefinedFunctionCallIterator = null;
this.nextExitStatementResult = 0;
+ this.isUpdating = isUpdating;
}
protected boolean implementsDataFrames() {
@@ -199,4 +202,19 @@ public Map getVariableDependencies() {
}
return result;
}
+
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ if (!isUpdating()) {
+ return new PendingUpdateList();
+ }
+ this.userDefinedFunctionCallIterator = context.getNamedFunctions()
+ .getUserDefinedFunctionCallIterator(
+ this.functionIdentifier,
+ this.getHighestExecutionMode(),
+ getMetadata(),
+ this.functionArguments
+ );
+ return this.userDefinedFunctionCallIterator.getPendingUpdateList(context);
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java
new file mode 100644
index 0000000000..50247351ca
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/CreateDeltaLakeTableFunctionIterator.java
@@ -0,0 +1,89 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.RowFactory;
+import org.apache.spark.sql.types.DataTypes;
+import org.apache.spark.sql.types.StructType;
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.BooleanItem;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+import org.apache.spark.sql.Row;
+import sparksoniq.spark.SparkSessionManager;
+
+import java.io.File;
+import java.net.URI;
+import java.util.List;
+
+import static org.apache.spark.sql.functions.lit;
+import static org.apache.spark.sql.functions.monotonically_increasing_id;
+
+public class CreateDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator {
+
+ public CreateDeltaLakeTableFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException(
+ "File " + uri + " already exists. Cannot create new delta lake table at this location.",
+ getMetadata()
+ );
+ }
+ try {
+ File directory = new File(uri.getPath());
+ if (!directory.exists()) {
+ boolean mkdirs = directory.mkdirs();
+ if (!mkdirs) {
+ throw new RuntimeException("Failed to create directory " + directory);
+ }
+ }
+ Dataset
dataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .emptyDataFrame();
+ dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit(""));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString()));
+
+ StructType schema = new StructType()
+ .add(SparkSessionManager.mutabilityLevelColumnName, DataTypes.IntegerType, false)
+ .add(SparkSessionManager.rowIdColumnName, DataTypes.IntegerType, false)
+ .add(SparkSessionManager.pathInColumnName, DataTypes.StringType, false)
+ .add(SparkSessionManager.tableLocationColumnName, DataTypes.StringType, false);
+
+ Row newRow = RowFactory.create(
+ 0,
+ 0,
+ "",
+ uri.toString()
+ );
+
+ Dataset newRowDataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .createDataFrame(List.of(newRow), schema);
+
+ Dataset combinedDataFrame = dataFrame.union(newRowDataFrame);
+
+ combinedDataFrame.write().format("delta").mode("error").save(uri.toString());
+ return new BooleanItem(true);
+ } catch (RuntimeException e) {
+ e.printStackTrace();
+ return new BooleanItem(false);
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java
new file mode 100644
index 0000000000..c62424558e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeleteDeltaLakeTableFunctionIterator.java
@@ -0,0 +1,53 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.apache.commons.io.FileUtils;
+import org.rumbledb.api.Item;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.BooleanItem;
+import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import org.rumbledb.runtime.functions.input.FileSystemUtil;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+
+public class DeleteDeltaLakeTableFunctionIterator extends AtMostOneItemLocalRuntimeIterator {
+
+ public DeleteDeltaLakeTableFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public Item materializeFirstItemOrNull(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata());
+ }
+
+ // URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory(
+ // this.currentAnnotation.getDeltaTablePath(),
+ // DeltaLakeConfigurationCatalogue.defaultDeltaLakeConfiguration,
+ // ExceptionMetadata.EMPTY_METADATA
+ // );
+
+ try {
+ File oldTable = new File(uri.getPath());
+ FileUtils.deleteDirectory(oldTable);
+ return new BooleanItem(true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ return new BooleanItem(false);
+ }
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java
new file mode 100644
index 0000000000..b06283ebcb
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/delta_lake/DeltaLakeConfigurationCatalogue.java
@@ -0,0 +1,32 @@
+package org.rumbledb.runtime.functions.delta_lake;
+
+import org.rumbledb.config.RumbleRuntimeConfiguration;
+
+public class DeltaLakeConfigurationCatalogue {
+ static final RumbleRuntimeConfiguration defaultDeltaLakeConfiguration = new RumbleRuntimeConfiguration(
+ new String[] {
+ "--print-iterator-tree",
+ "yes",
+ "--output-format",
+ "delta",
+ "--show-error-info",
+ "yes",
+ "--apply-updates",
+ "yes",
+ }
+ );
+
+ static final RumbleRuntimeConfiguration createDeltaLakeConfiguration = new RumbleRuntimeConfiguration(
+ new String[] {
+ "--print-iterator-tree",
+ "yes",
+ "--output-format",
+ "delta",
+ "--show-error-info",
+ "yes",
+ "--apply-updates",
+ "yes",
+ }
+ );
+
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java
new file mode 100644
index 0000000000..6934f3b13e
--- /dev/null
+++ b/src/main/java/org/rumbledb/runtime/functions/input/DeltaFileFunctionIterator.java
@@ -0,0 +1,65 @@
+package org.rumbledb.runtime.functions.input;
+
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
+import org.rumbledb.context.DynamicContext;
+import org.rumbledb.context.RuntimeStaticContext;
+import org.rumbledb.exceptions.CannotRetrieveResourceException;
+import org.rumbledb.items.structured.JSoundDataFrame;
+import org.rumbledb.runtime.DataFrameRuntimeIterator;
+import org.rumbledb.runtime.RuntimeIterator;
+import sparksoniq.spark.SparkSessionManager;
+
+import java.net.URI;
+import java.util.List;
+
+import static org.apache.spark.sql.functions.lit;
+import static org.apache.spark.sql.functions.monotonically_increasing_id;
+
+public class DeltaFileFunctionIterator extends DataFrameRuntimeIterator {
+
+ private static final long serialVersionUID = 1L;
+
+ public DeltaFileFunctionIterator(
+ List arguments,
+ RuntimeStaticContext staticContext
+ ) {
+ super(arguments, staticContext);
+ }
+
+ @Override
+ public JSoundDataFrame getDataFrame(DynamicContext context) {
+ RuntimeIterator urlIterator = this.children.get(0);
+ urlIterator.open(context);
+ String url = urlIterator.next().getStringValue();
+ urlIterator.close();
+ URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata());
+ if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) {
+ throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata());
+ }
+ // DeltaTable deltaTable = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(),
+ // uri.toString());
+ SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString())
+ .withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id())
+ .write()
+ .format("delta")
+ .mode("overwrite")
+ .option("overwriteSchema", true)
+ .save(uri.toString());
+ Dataset dataFrame = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .read()
+ .format("delta")
+ .load(uri.toString());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.mutabilityLevelColumnName, lit(0));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.rowIdColumnName, monotonically_increasing_id());
+ dataFrame = dataFrame.withColumn(SparkSessionManager.pathInColumnName, lit(""));
+ dataFrame = dataFrame.withColumn(SparkSessionManager.tableLocationColumnName, lit(uri.toString()));
+ // TODO: Make unique DeltaTable code
+ return new JSoundDataFrame(dataFrame);
+ }
+}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
index ae28047e8a..6e159fe805 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java
@@ -73,7 +73,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
}
}
- Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
this.hasNext = false;
return result;
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
index edf66d1b5e..4f5bf5b141 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java
@@ -113,7 +113,7 @@ private void getDescendantPairs(List- items) {
List
- valueList = Collections.singletonList(value);
Item result = ItemFactory.getInstance()
- .createObjectItem(keyList, valueList, getMetadata());
+ .createObjectItem(keyList, valueList, getMetadata(), true);
this.nextResults.add(result);
getDescendantPairs(valueList);
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
index ee05ad56cb..2315c72ac0 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java
@@ -88,7 +88,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
}
}
- Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ Item result = ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
return result;
}
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
index e64f62c6ad..922dd969be 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectMapClosure.java
@@ -45,10 +45,10 @@ public Item call(Item arg0) throws Exception {
for (String key : arg0.getKeys()) {
Item value = arg0.getItemByKey(key);
Item arrayValue = ItemFactory.getInstance()
- .createArrayItem(new ArrayList
- (Collections.singletonList(value)));
+ .createArrayItem(new ArrayList
- (Collections.singletonList(value)), false);
keyValuePairs.put(key, new ArrayList
- (Collections.singletonList(arrayValue)));
}
- return ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ return ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
}
};
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
index 48f44c314e..aa3cd8de4e 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectReduceClosure.java
@@ -71,6 +71,6 @@ else if (!v2.isObject())
}
}
- return ItemFactory.getInstance().createObjectItem(keyValuePairs);
+ return ItemFactory.getInstance().createObjectItem(keyValuePairs, true);
}
};
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
index 840c4f029a..4787501129 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java
@@ -69,6 +69,18 @@ public void openLocal() {
private void setResultsFromDF() {
JSoundDataFrame childDF = this.iterator.getDataFrame(this.currentDynamicContextForLocalExecution);
for (String key : childDF.getKeys()) {
+ if (key.equals(SparkSessionManager.mutabilityLevelColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.rowIdColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.tableLocationColumnName)) {
+ continue;
+ }
+ if (key.equals(SparkSessionManager.pathInColumnName)) {
+ continue;
+ }
if (
!key.equals(SparkSessionManager.emptyObjectJSONiqItemColumnName)
&& !key.equals(SparkSessionManager.atomicJSONiqItemColumnName)
diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
index 72a385ec29..f17a173d03 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java
@@ -112,7 +112,7 @@ private Item getProjection(Item objItem, List
- keys) {
}
}
return ItemFactory.getInstance()
- .createObjectItem(finalKeylist, finalValueList, getMetadata());
+ .createObjectItem(finalKeylist, finalValueList, getMetadata(), true);
}
@Override
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 6b5dd20f0e..0a1f967c24 100644
--- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java
@@ -120,7 +120,7 @@ private Item removeKeys(Item objItem, List removalKeys) {
}
}
return ItemFactory.getInstance()
- .createObjectItem(finalKeylist, finalValueList, getMetadata());
+ .createObjectItem(finalKeylist, finalValueList, getMetadata(), true);
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
index cbda4f4ad7..9ae3102bb6 100644
--- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java
@@ -470,6 +470,18 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
if (df.isEmptySequence()) {
return null;
}
+ ItemType maxType;
+ if (
+ df.getItemType().isObjectItemType()
+ && df.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ maxType = df.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ } else {
+ maxType = df.getItemType();
+ }
String input = FlworDataFrameUtils.createTempView(df.getDataFrame());
JSoundDataFrame maxDF = df.evaluateSQL(
String.format(
@@ -478,7 +490,7 @@ public Item materializeFirstItemOrNull(DynamicContext context) {
SparkSessionManager.atomicJSONiqItemColumnName,
input
),
- df.getItemType()
+ maxType
);
return itemTypePromotion(maxDF.getExactlyOneItem());
}
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
index 5aec4653a3..de6adcd1d7 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java
@@ -23,6 +23,8 @@
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.ArrayType;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.StructType;
@@ -40,6 +42,7 @@
import org.rumbledb.runtime.flwor.NativeClauseContext;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.SequenceType;
+import org.rumbledb.types.ItemTypeFactory;
import sparksoniq.spark.SparkSessionManager;
@@ -237,6 +240,11 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context);
initLookupPosition(context);
String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame());
+ boolean isObject = childDataFrame.getItemType().isObjectItemType();
+ boolean hasAtomicJSONiqItem = isObject
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .containsKey(SparkSessionManager.atomicJSONiqItemColumnName);
if (childDataFrame.getItemType().isArrayItemType()) {
ItemType elementType = childDataFrame.getItemType().getArrayContentFacet();
if (elementType.isObjectItemType()) {
@@ -266,6 +274,66 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
),
elementType
);
+ } else if (
+ hasAtomicJSONiqItem
+ &&
+ childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .isArrayItemType()
+ && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ ItemType elementType = childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .getArrayContentFacet();
+ String sql;
+ JSoundDataFrame res;
+ if (elementType.isObjectItemType()) {
+ sql = String.format(
+ "SELECT `%s`.*, `%s`, `%s`, `%s`, `%s` FROM (SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s)",
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup - 1,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ this.lookup - 1,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup
+ );
+ res = childDataFrame.evaluateSQL(sql, elementType);
+ } else {
+ sql = String.format(
+ "SELECT `%s`[%s] as `%s`, `%s`, `%s`, CONCAT(`%s`, '[%s]') AS `%s`, `%s` FROM %s WHERE size(`%s`) >= %s",
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup - 1,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ this.lookup - 1,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ this.lookup
+ );
+ Dataset
df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ res = new JSoundDataFrame(df, deltaItemType);
+ }
+ return res;
}
if (getConfiguration().doStaticAnalysis()) {
throw new UnexpectedStaticTypeException(
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
index ba12801d73..f88af52e11 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java
@@ -23,6 +23,8 @@
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.ArrayType;
import org.rumbledb.api.Item;
import org.rumbledb.context.DynamicContext;
@@ -39,6 +41,7 @@
import org.rumbledb.runtime.flwor.NativeClauseContext;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.SequenceType;
+import org.rumbledb.types.ItemTypeFactory;
import sparksoniq.spark.SparkSessionManager;
@@ -182,6 +185,11 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC
public JSoundDataFrame getDataFrame(DynamicContext context) {
JSoundDataFrame childDataFrame = this.children.get(0).getDataFrame(context);
String array = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame());
+ boolean isObject = childDataFrame.getItemType().isObjectItemType();
+ boolean hasAtomicJSONiqItem = isObject
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .containsKey(SparkSessionManager.atomicJSONiqItemColumnName);
if (childDataFrame.getItemType().isArrayItemType()) {
ItemType elementType = childDataFrame.getItemType().getArrayContentFacet();
if (elementType.isObjectItemType()) {
@@ -205,6 +213,59 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
),
elementType
);
+ } else if (
+ hasAtomicJSONiqItem
+ && childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .isArrayItemType()
+ && childDataFrame.getItemType().getObjectContentFacet().containsKey("tableLocation")
+ ) {
+ ItemType elementType = childDataFrame.getItemType()
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType()
+ .getArrayContentFacet();
+ String sql;
+ JSoundDataFrame res;
+ // TODO: SORT OUT INDEXING DURING UNBOXING
+ if (elementType.isObjectItemType()) {
+ sql = String.format(
+ "SELECT col.*, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)",
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array
+ );
+ res = childDataFrame.evaluateSQL(sql, elementType);
+ } else {
+ sql = String.format(
+ "SELECT col, `%s`, `%s`, CONCAT(CONCAT(CONCAT(`%s`, '['), pos), ']') AS `%s`, `%s` FROM (SELECT posexplode(`%s`), `%s`, `%s`, `%s`, `%s` FROM %s)",
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ array
+ );
+ Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ res = new JSoundDataFrame(df, deltaItemType);
+ }
+ return res;
}
if (getConfiguration().doStaticAnalysis()) {
throw new UnexpectedStaticTypeException(
diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
index 1237e01e03..b66278c627 100644
--- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
+++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java
@@ -20,9 +20,16 @@
package org.rumbledb.runtime.navigation;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Map;
+
import org.apache.log4j.LogManager;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.apache.spark.sql.types.DataType;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;
@@ -31,7 +38,12 @@
import org.rumbledb.context.Name;
import org.rumbledb.context.RuntimeStaticContext;
import org.rumbledb.errorcodes.ErrorCode;
-import org.rumbledb.exceptions.*;
+import org.rumbledb.exceptions.InvalidSelectorException;
+import org.rumbledb.exceptions.IteratorFlowException;
+import org.rumbledb.exceptions.MoreThanOneItemException;
+import org.rumbledb.exceptions.NoItemException;
+import org.rumbledb.exceptions.UnexpectedStaticTypeException;
+import org.rumbledb.exceptions.UnexpectedTypeException;
import org.rumbledb.expressions.flowr.FLWOR_CLAUSES;
import org.rumbledb.items.ItemFactory;
import org.rumbledb.items.structured.JSoundDataFrame;
@@ -44,17 +56,13 @@
import org.rumbledb.types.BuiltinTypesCatalogue;
import org.rumbledb.types.FieldDescriptor;
import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
import org.rumbledb.types.SequenceType;
import org.rumbledb.types.SequenceType.Arity;
import org.rumbledb.types.TypeMappings;
import sparksoniq.spark.SparkSessionManager;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.Map;
-
public class ObjectLookupIterator extends HybridRuntimeIterator {
private static final long serialVersionUID = 1L;
@@ -351,21 +359,61 @@ public JSoundDataFrame getDataFrame(DynamicContext context) {
type = fieldDescriptor.getType();
}
if (type.isObjectItemType()) {
+ // TODO: Find another way to check if delta dataframe -- e.g. flag and mutability level
+ // TODO: implement keyword vars to stop ust using strs
+ String sql;
+ if (childDataFrame.getKeys().contains("tableLocation")) {
+ sql = String.format(
+ "SELECT `%s`.*, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s",
+ key,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ key,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ object
+ );
+
+ } else {
+ sql = String.format("SELECT `%s`.* FROM %s", key, object);
+ }
JSoundDataFrame result = childDataFrame.evaluateSQL(
- String.format("SELECT `%s`.* FROM %s", key, object),
+ sql,
type
);
return result;
} else {
- JSoundDataFrame result = childDataFrame.evaluateSQL(
- String.format(
+ String sql;
+ JSoundDataFrame result;
+ if (childDataFrame.getKeys().contains("tableLocation")) {
+ sql = String.format(
+ "SELECT `%s` AS `%s`, `%s`, `%s`, CONCAT(`%s`, '.%s') AS `%s`, `%s` FROM %s",
+ key,
+ SparkSessionManager.atomicJSONiqItemColumnName,
+ SparkSessionManager.rowIdColumnName,
+ SparkSessionManager.mutabilityLevelColumnName,
+ SparkSessionManager.pathInColumnName,
+ key,
+ SparkSessionManager.pathInColumnName,
+ SparkSessionManager.tableLocationColumnName,
+ object
+ );
+ Dataset df = childDataFrame.getDataFrame().sparkSession().sql(sql);
+ ItemType deltaItemType = ItemTypeFactory.createItemType(df.schema());
+ result = new JSoundDataFrame(df, deltaItemType);
+ } else {
+ sql = String.format(
"SELECT `%s` AS `%s` FROM %s",
key,
SparkSessionManager.atomicJSONiqItemColumnName,
object
- ),
- type
- );
+ );
+ result = childDataFrame.evaluateSQL(
+ sql,
+ type
+ );
+ }
return result;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
index 36b2d8b91d..d4e39c8d99 100644
--- a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java
@@ -51,7 +51,7 @@ public Item materializeFirstItemOrNull(
if (!this.children.isEmpty()) {
result.addAll(this.children.get(0).materialize(dynamicContext));
}
- Item item = ItemFactory.getInstance().createArrayItem(result);
+ Item item = ItemFactory.getInstance().createArrayItem(result, true);
return item;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
index 4c871ea861..cfa46df538 100644
--- a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java
@@ -77,7 +77,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
}
this.hasNext = false;
return ItemFactory.getInstance()
- .createObjectItem(keys, values, getMetadata());
+ .createObjectItem(keys, values, getMetadata(), true);
} else {
@@ -90,7 +90,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
valueIterator.close();
// SIMILAR TO ZORBA, if value is more than one item, wrap it in an array
if (currentResults.size() > 1) {
- values.add(ItemFactory.getInstance().createArrayItem(currentResults));
+ values.add(ItemFactory.getInstance().createArrayItem(currentResults, true));
} else if (currentResults.size() == 1) {
values.add(currentResults.get(0));
} else {
@@ -121,7 +121,7 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) {
}
this.hasNext = false;
return ItemFactory.getInstance()
- .createObjectItem(keys, values, getMetadata());
+ .createObjectItem(keys, values, getMetadata(), true);
}
}
}
diff --git a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
index 256a318fdd..91970ed72d 100644
--- a/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
+++ b/src/main/java/org/rumbledb/runtime/scripting/ProgramIterator.java
@@ -105,6 +105,16 @@ protected Item nextLocal() {
return null;
}
+ @Override
+ public boolean isSequential() {
+ return this.statementsAndExprIterator.isSequential();
+ }
+
+ @Override
+ public boolean isUpdating() {
+ return this.statementsAndExprIterator.isUpdating();
+ }
+
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
if (!encounteredExitStatement) {
diff --git a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
index 8f7cc5beb4..bf035392dd 100644
--- a/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
+++ b/src/main/java/org/rumbledb/runtime/scripting/block/StatementsWithExprIterator.java
@@ -156,6 +156,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
return exprIterator.getDataFrame(dynamicContext);
}
+ @Override
+ public boolean isUpdating() {
+ return this.children.get(this.children.size() - 1).isUpdating();
+ }
+
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
RuntimeIterator exprIterator = this.children.get(this.children.size() - 1);
diff --git a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
index b63ebe5004..39f972fe1e 100644
--- a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
+++ b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java
@@ -23,6 +23,7 @@
import org.rumbledb.runtime.HybridRuntimeIterator;
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.functions.sequences.general.TreatAsClosure;
+import org.rumbledb.runtime.update.PendingUpdateList;
import org.rumbledb.types.ItemType;
import org.rumbledb.types.ItemTypeFactory;
import org.rumbledb.types.SequenceType;
@@ -51,12 +52,14 @@ public class TreatIterator extends HybridRuntimeIterator {
public TreatIterator(
RuntimeIterator iterator,
SequenceType sequenceType,
+ boolean isUpdating,
ErrorCode errorCode,
RuntimeStaticContext staticContext
) {
super(Collections.singletonList(iterator), staticContext);
this.iterator = iterator;
this.sequenceType = sequenceType;
+ this.isUpdating = isUpdating;
this.errorCode = errorCode;
if (!this.sequenceType.isEmptySequence()) {
this.itemType = this.sequenceType.getItemType();
@@ -73,6 +76,15 @@ public TreatIterator(
}
}
+ public TreatIterator(
+ RuntimeIterator iterator,
+ SequenceType sequenceType,
+ ErrorCode errorCode,
+ RuntimeStaticContext staticContext
+ ) {
+ this(iterator, sequenceType, false, errorCode, staticContext);
+ }
+
@Override
public boolean hasNextLocal() {
return this.hasNext;
@@ -226,6 +238,11 @@ public JSoundDataFrame getDataFrame(DynamicContext dynamicContext) {
throw errorToThrow("" + dataItemType);
}
+ @Override
+ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
+ return iterator.getPendingUpdateList(context);
+ }
+
/**
* Converts a homogeneous RDD of atomic values to a DataFrame
*
diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
index c8666e38c6..2bcb717650 100644
--- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
+++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java
@@ -389,7 +389,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met
}
Integer minLength = itemType.getMinLengthFacet();
Integer maxLength = itemType.getMaxLengthFacet();
- Item arrayItem = ItemFactory.getInstance().createArrayItem(members);
+ Item arrayItem = ItemFactory.getInstance().createArrayItem(members, true);
if (itemType.getName() == null) {
itemType = itemType.getBaseType();
}
@@ -453,7 +453,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met
}
}
Item objectItem = ItemFactory.getInstance()
- .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA);
+ .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true);
if (itemType.getName() == null) {
itemType = itemType.getBaseType();
}
diff --git a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
index 6e56434714..346e72d68c 100644
--- a/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
+++ b/src/main/java/org/rumbledb/runtime/update/PendingUpdateList.java
@@ -17,9 +17,27 @@ public class PendingUpdateList {
private Map- > delReplaceArrayMap;
private Map
- > renameObjMap;
private Comparator
- targetComparator;
+ private Comparator
- arraySelectorComparator;
public PendingUpdateList() {
+ // TODO: diff comparator for delta
this.targetComparator = (item1, item2) -> {
+ boolean itemIsDelta1 = item1.getTableLocation() != null && !item1.getTableLocation().equals("null");
+ boolean itemIsDelta2 = item2.getTableLocation() != null && !item2.getTableLocation().equals("null");
+ if (itemIsDelta1 && itemIsDelta2) {
+ int tableComp = item1.getTableLocation().compareTo(item2.getTableLocation());
+ if (tableComp != 0) {
+ return tableComp;
+ }
+ int rowComp = Long.compare(item1.getTopLevelID(), item2.getTopLevelID());
+ if (rowComp != 0) {
+ return rowComp;
+ }
+ return item1.getPathIn().compareTo(item2.getPathIn());
+ } else if (itemIsDelta1 || itemIsDelta2) {
+ // TODO: what to compare when one is delta and one is not? Never occurs?
+ return 0;
+ }
int hashCompare = Integer.compare(item1.hashCode(), item2.hashCode());
if (item1.hashCode() != item2.hashCode()) {
return hashCompare;
@@ -29,6 +47,7 @@ public PendingUpdateList() {
}
return Integer.compare(System.identityHashCode(item1), System.identityHashCode(item2));
};
+ this.arraySelectorComparator = Comparator.comparingInt(Item::getIntValue).reversed();
this.insertObjMap = new TreeMap<>(this.targetComparator);
this.insertArrayMap = new TreeMap<>(this.targetComparator);
this.delReplaceObjMap = new TreeMap<>(this.targetComparator);
@@ -44,39 +63,39 @@ public PendingUpdateList(UpdatePrimitive updatePrimitive) {
public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) {
Item target = updatePrimitive.getTarget();
if (updatePrimitive.isDeleteObject()) {
- Map
- locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
for (Item locator : updatePrimitive.getContentList()) {
locSrcMap.put(locator, null);
}
- delReplaceObjMap.put(target, locSrcMap);
+ this.delReplaceObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isReplaceObject()) {
- Map
- locSrcMap = delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- delReplaceObjMap.put(target, locSrcMap);
+ this.delReplaceObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isInsertObject()) {
- insertObjMap.put(target, updatePrimitive.getContent());
+ this.insertObjMap.put(target, updatePrimitive.getContent());
} else if (updatePrimitive.isRenameObject()) {
- Map
- locSrcMap = renameObjMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.renameObjMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- renameObjMap.put(target, locSrcMap);
+ this.renameObjMap.put(target, locSrcMap);
} else if (updatePrimitive.isDeleteArray()) {
- Map
- locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), null);
- delReplaceArrayMap.put(target, locSrcMap);
+ this.delReplaceArrayMap.put(target, locSrcMap);
} else if (updatePrimitive.isReplaceArray()) {
- Map
- locSrcMap = delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- locSrcMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContent());
- delReplaceArrayMap.put(target, locSrcMap);
+ this.delReplaceArrayMap.put(target, locSrcMap);
} else if (updatePrimitive.isInsertArray()) {
- Map
- > locSrcMap = insertArrayMap.getOrDefault(target, new HashMap<>());
+ Map
- > locSrcMap = this.insertArrayMap.getOrDefault(target, new HashMap<>());
locSrcMap.put(updatePrimitive.getSelector(), updatePrimitive.getContentList());
- insertArrayMap.put(target, locSrcMap);
+ this.insertArrayMap.put(target, locSrcMap);
} else {
throw new OurBadException("Invalid UpdatePrimitive created");
}
@@ -85,7 +104,9 @@ public void addUpdatePrimitive(UpdatePrimitive updatePrimitive) {
public void applyUpdates(ExceptionMetadata metadata) {
UpdatePrimitiveFactory upFactory = UpdatePrimitiveFactory.getInstance();
- Map
- > targetArrayPULs = new HashMap<>();
+ // new TreeMap<>(this.targetComparator) sometimes causes null on apply?
+ Map
- >> targetArrayPULs = new HashMap<>();
+ Map
- > tempSelPULsMap;
List tempArrayPULs;
List objectPUL = new ArrayList<>();
@@ -96,9 +117,9 @@ public void applyUpdates(ExceptionMetadata metadata) {
////// OBJECTS
// DELETES & REPLACES
- for (Item target : delReplaceObjMap.keySet()) {
+ for (Item target : this.delReplaceObjMap.keySet()) {
List
- toDel = new ArrayList<>();
- tempSelSrcMap = delReplaceObjMap.get(target);
+ tempSelSrcMap = this.delReplaceObjMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
tempSrc = tempSelSrcMap.get(locator);
if (tempSrc == null) {
@@ -107,19 +128,21 @@ public void applyUpdates(ExceptionMetadata metadata) {
objectPUL.add(upFactory.createReplaceInObjectPrimitive(target, locator, tempSrc, metadata));
}
}
- objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata));
+ if (!toDel.isEmpty()) {
+ objectPUL.add(upFactory.createDeleteFromObjectPrimitive(target, toDel, metadata));
+ }
}
// INSERTS
- for (Item target : insertObjMap.keySet()) {
- objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, insertObjMap.get(target)));
+ for (Item target : this.insertObjMap.keySet()) {
+ objectPUL.add(upFactory.createInsertIntoObjectPrimitive(target, this.insertObjMap.get(target), metadata));
}
// RENAMES
- for (Item target : renameObjMap.keySet()) {
- tempSelSrcMap = renameObjMap.get(target);
+ for (Item target : this.renameObjMap.keySet()) {
+ tempSelSrcMap = this.renameObjMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
objectPUL.add(
upFactory.createRenameInObjectPrimitive(target, locator, tempSelSrcMap.get(locator), metadata)
@@ -131,9 +154,9 @@ public void applyUpdates(ExceptionMetadata metadata) {
// DELETES & REPLACES
- for (Item target : delReplaceArrayMap.keySet()) {
- tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>());
- tempSelSrcMap = delReplaceArrayMap.get(target);
+ for (Item target : this.delReplaceArrayMap.keySet()) {
+ tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator));
+ tempSelSrcMap = this.delReplaceArrayMap.get(target);
for (Item locator : tempSelSrcMap.keySet()) {
UpdatePrimitive up;
tempSrc = tempSelSrcMap.get(locator);
@@ -142,38 +165,31 @@ public void applyUpdates(ExceptionMetadata metadata) {
} else {
up = upFactory.createReplaceInArrayPrimitive(target, locator, tempSrc, metadata);
}
- int index = Collections.binarySearch(
- tempArrayPULs,
- up,
- Comparator.comparing(UpdatePrimitive::getIntSelector)
- );
- if (index < 0) {
- index = -index - 1;
- }
- tempArrayPULs.add(index, up);
+ tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>());
+ tempArrayPULs.add(up);
+ tempSelPULsMap.put(locator, tempArrayPULs);
}
- targetArrayPULs.put(target, tempArrayPULs);
+ targetArrayPULs.put(target, tempSelPULsMap);
}
// INSERTS
- for (Item target : insertArrayMap.keySet()) {
+ for (Item target : this.insertArrayMap.keySet()) {
UpdatePrimitive up;
- tempArrayPULs = targetArrayPULs.getOrDefault(target, new ArrayList<>());
- tempSelSrcListMap = insertArrayMap.get(target);
+ tempSelPULsMap = targetArrayPULs.getOrDefault(target, new TreeMap<>(this.arraySelectorComparator));
+ tempSelSrcListMap = this.insertArrayMap.get(target);
for (Item locator : tempSelSrcListMap.keySet()) {
- up = upFactory.createInsertIntoArrayPrimitive(target, locator, tempSelSrcListMap.get(locator));
- int index = Collections.binarySearch(
- tempArrayPULs,
- up,
- Comparator.comparing(UpdatePrimitive::getIntSelector)
+ up = upFactory.createInsertIntoArrayPrimitive(
+ target,
+ locator,
+ tempSelSrcListMap.get(locator),
+ metadata
);
- if (index < 0) {
- index = -index - 1;
- }
- tempArrayPULs.add(index, up);
+ tempArrayPULs = tempSelPULsMap.getOrDefault(locator, new ArrayList<>());
+ tempArrayPULs.add(up);
+ tempSelPULsMap.put(locator, tempArrayPULs);
}
- targetArrayPULs.put(target, tempArrayPULs);
+ targetArrayPULs.put(target, tempSelPULsMap);
}
////// APPLY OBJECTS
@@ -183,151 +199,123 @@ public void applyUpdates(ExceptionMetadata metadata) {
}
////// APPLY ARRAYS
-
for (Item target : targetArrayPULs.keySet()) {
- tempArrayPULs = targetArrayPULs.get(target);
- for (int i = tempArrayPULs.size() - 1; i >= 0; i--) {
- tempArrayPULs.get(i).apply();
+ tempSelPULsMap = targetArrayPULs.get(target);
+ for (Item selector : tempSelPULsMap.keySet()) {
+ tempArrayPULs = tempSelPULsMap.get(selector);
+ for (UpdatePrimitive up : tempArrayPULs) {
+ up.apply();
+ }
}
}
}
- public static PendingUpdateList mergeUpdates(
- PendingUpdateList pul1,
- PendingUpdateList pul2,
+ public void mergeUpdates(
+ PendingUpdateList otherPul,
ExceptionMetadata metadata
) {
- PendingUpdateList res = new PendingUpdateList();
Map
- tempSelSrcMap;
Map
- > tempSelSrcListMap;
Map
- tempSelSrcResMap;
Map
- > tempSelSrcResListMap;
Item tempSrc;
+ Item tempSrcRes;
List
- tempSrcList;
////// OBJECTS
// DELETES & REPLACES
-
- for (Item target : pul1.delReplaceObjMap.keySet()) {
- tempSelSrcMap = pul1.delReplaceObjMap.get(target);
- tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.delReplaceObjMap.keySet()) {
+ tempSelSrcMap = otherPul.delReplaceObjMap.get(target);
+ tempSelSrcResMap = this.delReplaceObjMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.delReplaceObjMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.delReplaceObjMap.keySet()) {
- tempSelSrcMap = pul2.delReplaceObjMap.get(target);
- tempSelSrcResMap = res.delReplaceObjMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- if (tempSelSrcResMap.containsKey(selector)) {
- tempSrc = tempSelSrcResMap.get(selector);
- if (tempSrc != null) {
+ tempSrc = tempSelSrcMap.get(selector);
+ tempSrcRes = tempSelSrcResMap.get(selector);
+ boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector);
+ if (tempSrc == null) {
+ boolean hasRename = this.renameObjMap.containsKey(target)
+ && this.renameObjMap.get(target).containsKey(selector);
+ if (hasRename) {
+ this.renameObjMap.get(target).remove(selector);
+ }
+ } else {
+ if (srcResMapHasSel && tempSrcRes != null) {
throw new TooManyReplacesOnSameTargetSelectorException(
target.getDynamicType().getName().toString(),
selector.getStringValue(),
metadata
);
+ } else if (srcResMapHasSel) {
+ continue;
}
- continue;
}
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
+ tempSelSrcResMap.put(selector, tempSrc);
}
- res.delReplaceObjMap.put(target, tempSelSrcResMap);
+ this.delReplaceObjMap.put(target, tempSelSrcResMap);
}
// INSERTS
-
- res.insertObjMap.putAll(pul1.insertObjMap);
-
- for (Item target : pul2.insertObjMap.keySet()) {
- tempSrc = pul2.insertObjMap.get(target);
- if (res.insertObjMap.containsKey(target)) {
- tempSrc = InsertIntoObjectPrimitive.mergeSources(res.insertObjMap.get(target), tempSrc, metadata);
+ for (Item target : otherPul.insertObjMap.keySet()) {
+ tempSrc = otherPul.insertObjMap.get(target);
+ if (this.insertObjMap.containsKey(target)) {
+ tempSrc = InsertIntoObjectPrimitive.mergeSources(this.insertObjMap.get(target), tempSrc, metadata);
}
- res.insertObjMap.put(target, tempSrc);
+ this.insertObjMap.put(target, tempSrc);
}
// RENAME
-
- for (Item target : pul1.renameObjMap.keySet()) {
- tempSelSrcMap = pul1.renameObjMap.get(target);
- tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.renameObjMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.renameObjMap.keySet()) {
- tempSelSrcMap = pul2.renameObjMap.get(target);
- tempSelSrcResMap = res.renameObjMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.renameObjMap.keySet()) {
+ tempSelSrcMap = otherPul.renameObjMap.get(target);
+ tempSelSrcResMap = this.renameObjMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
if (tempSelSrcResMap.containsKey(selector)) {
throw new TooManyRenamesOnSameTargetSelectorException(selector.getStringValue(), metadata);
}
+ boolean isDelete = this.delReplaceObjMap.containsKey(target)
+ && this.delReplaceObjMap.get(target).containsKey(selector)
+ && this.delReplaceObjMap.get(target).get(selector) == null;
+ if (isDelete) {
+ continue;
+ }
tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
}
- res.renameObjMap.put(target, tempSelSrcResMap);
+ this.renameObjMap.put(target, tempSelSrcResMap);
}
////// ARRAYS
// DELETES & REPLACES
-
- for (Item target : pul1.delReplaceArrayMap.keySet()) {
- tempSelSrcMap = pul1.delReplaceArrayMap.get(target);
- tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.delReplaceArrayMap.keySet()) {
+ tempSelSrcMap = otherPul.delReplaceArrayMap.get(target);
+ tempSelSrcResMap = this.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcMap.keySet()) {
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
- }
- res.delReplaceArrayMap.put(target, tempSelSrcResMap);
- }
-
- for (Item target : pul2.delReplaceArrayMap.keySet()) {
- tempSelSrcMap = pul2.delReplaceArrayMap.get(target);
- tempSelSrcResMap = res.delReplaceArrayMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcMap.keySet()) {
- if (tempSelSrcResMap.containsKey(selector)) {
- tempSrc = tempSelSrcResMap.get(selector);
- if (tempSrc != null) {
+ tempSrc = tempSelSrcMap.get(selector);
+ tempSrcRes = tempSelSrcResMap.get(selector);
+ boolean srcResMapHasSel = tempSelSrcResMap.containsKey(selector);
+ if (tempSrc != null && srcResMapHasSel) {
+ if (tempSrcRes == null) {
+ continue;
+ } else {
throw new TooManyReplacesOnSameTargetSelectorException(
target.getDynamicType().getName().toString(),
Integer.toString(selector.getIntValue()),
metadata
);
}
- continue;
}
- tempSelSrcResMap.put(selector, tempSelSrcMap.get(selector));
+ tempSelSrcResMap.put(selector, tempSrc);
}
- res.delReplaceArrayMap.put(target, tempSelSrcResMap);
+ this.delReplaceArrayMap.put(target, tempSelSrcResMap);
}
// INSERTS
-
- for (Item target : pul1.insertArrayMap.keySet()) {
- tempSelSrcListMap = pul1.insertArrayMap.get(target);
- tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>());
-
- for (Item selector : tempSelSrcListMap.keySet()) {
- tempSelSrcResListMap.put(selector, tempSelSrcListMap.get(selector));
- }
- res.insertArrayMap.put(target, tempSelSrcResListMap);
- }
-
- for (Item target : pul2.insertArrayMap.keySet()) {
- tempSelSrcListMap = pul2.insertArrayMap.get(target);
- tempSelSrcResListMap = res.insertArrayMap.getOrDefault(target, new HashMap<>());
+ for (Item target : otherPul.insertArrayMap.keySet()) {
+ tempSelSrcListMap = otherPul.insertArrayMap.get(target);
+ tempSelSrcResListMap = this.insertArrayMap.getOrDefault(target, new HashMap<>());
for (Item selector : tempSelSrcListMap.keySet()) {
tempSrcList = tempSelSrcResListMap.getOrDefault(selector, new ArrayList<>());
@@ -336,10 +324,8 @@ public static PendingUpdateList mergeUpdates(
InsertIntoArrayPrimitive.mergeSources(tempSrcList, tempSelSrcListMap.get(selector))
);
}
- res.insertArrayMap.put(target, tempSelSrcResListMap);
+ this.insertArrayMap.put(target, tempSelSrcResListMap);
}
-
- return res;
}
}
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
index 054fe6f2b0..5bf329c486 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/AppendExpressionIterator.java
@@ -1,5 +1,6 @@
package org.rumbledb.runtime.update.expression;
+import org.apache.commons.lang3.SerializationUtils;
import org.apache.spark.api.java.JavaRDD;
import org.rumbledb.api.Item;
import org.rumbledb.context.DynamicContext;
@@ -72,7 +73,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
try {
target = this.arrayIterator.materializeExactlyOneItem(context);
- content = this.toAppendIterator.materializeExactlyOneItem(context);
+ content = SerializationUtils.clone(this.toAppendIterator.materializeExactlyOneItem(context));
} catch (NoItemException | MoreThanOneItemException e) {
throw new RuntimeException(e);
}
@@ -81,13 +82,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
UpdatePrimitive up;
if (target.isArray()) {
Item locator = ItemFactory.getInstance().createIntItem(target.getSize() + 1);
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoArrayPrimitive(target, locator, Collections.singletonList(content));
+ up = factory.createInsertIntoArrayPrimitive(
+ target,
+ locator,
+ Collections.singletonList(content),
+ this.getMetadata()
+ );
} else {
throw new InvalidUpdateTargetException(
"Append expression target must be a single array",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
index c9a4dc6aae..e05c026095 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/DeleteExpressionIterator.java
@@ -83,6 +83,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
@@ -97,6 +100,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
index 297156cdd6..f36e3b8ebf 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/InsertExpressionIterator.java
@@ -42,7 +42,7 @@ public InsertExpressionIterator(
}
public boolean hasPositionIterator() {
- return positionIterator != null;
+ return this.positionIterator != null;
}
@Override
@@ -84,7 +84,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
try {
main = this.mainIterator.materializeExactlyOneItem(context);
- content = (Item) SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context));
+ content = SerializationUtils.clone(this.toInsertIterator.materializeExactlyOneItem(context));
if (this.hasPositionIterator()) {
locator = this.positionIterator.materializeExactlyOneItem(context);
}
@@ -103,13 +103,16 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoObjectPrimitive(main, content);
+ up = factory.createInsertIntoObjectPrimitive(main, content, this.getMetadata());
} else if (main.isArray()) {
if (locator == null) {
throw new CannotCastUpdateSelectorException("Insert expression selector is null", this.getMetadata());
@@ -120,13 +123,21 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (main.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (main.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
this.getMetadata()
);
}
- up = factory.createInsertIntoArrayPrimitive(main, locator, Collections.singletonList(content));
+ up = factory.createInsertIntoArrayPrimitive(
+ main,
+ locator,
+ Collections.singletonList(content),
+ this.getMetadata()
+ );
} else {
throw new InvalidUpdateTargetException(
"Insert expression target must be a single array or object",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
index 57fbf49e50..9f0142399f 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/RenameExpressionIterator.java
@@ -90,6 +90,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
index 25ce38dea5..e32445f544 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/ReplaceExpressionIterator.java
@@ -74,7 +74,6 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
Item target;
Item locator;
Item content;
-
try {
target = this.mainIterator.materializeExactlyOneItem(context);
locator = this.locatorIterator.materializeExactlyOneItem(context);
@@ -94,7 +93,7 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
for (Item item : tempContent) {
copyContent.add((Item) SerializationUtils.clone(item));
}
- content = ItemFactory.getInstance().createArrayItem(copyContent);
+ content = ItemFactory.getInstance().createArrayItem(copyContent, true);
}
UpdatePrimitiveFactory factory = UpdatePrimitiveFactory.getInstance();
@@ -106,6 +105,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
@@ -120,6 +122,9 @@ public PendingUpdateList getPendingUpdateList(DynamicContext context) {
this.getMetadata()
);
}
+ if (target.getMutabilityLevel() == -1) {
+ throw new ModifiesImmutableValueException("Attempt to modify immutable target", this.getMetadata());
+ }
if (target.getMutabilityLevel() != context.getCurrentMutabilityLevel()) {
throw new TransformModifiesNonCopiedValueException(
"Attempt to modify currently immutable target",
diff --git a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
index fb1a24a0f4..85ae6484c8 100644
--- a/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
+++ b/src/main/java/org/rumbledb/runtime/update/expression/TransformExpressionIterator.java
@@ -46,20 +46,20 @@ public TransformExpressionIterator(
protected JavaRDD
- getRDDAux(DynamicContext context) {
PendingUpdateList pul = getPendingUpdateList(context);
pul.applyUpdates(this.getMetadata());
- return returnIterator.getRDD(context);
+ return this.returnIterator.getRDD(context);
}
@Override
protected void openLocal() {
PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution);
pul.applyUpdates(this.getMetadata());
- returnIterator.open(this.currentDynamicContextForLocalExecution);
+ this.returnIterator.open(this.currentDynamicContextForLocalExecution);
}
@Override
protected void closeLocal() {
- returnIterator.close();
- for (Name copyVar : copyDeclMap.keySet()) {
+ this.returnIterator.close();
+ for (Name copyVar : this.copyDeclMap.keySet()) {
this.currentDynamicContextForLocalExecution.getVariableValues().removeVariable(copyVar);
}
}
@@ -68,35 +68,39 @@ protected void closeLocal() {
protected void resetLocal() {
PendingUpdateList pul = getPendingUpdateList(this.currentDynamicContextForLocalExecution);
pul.applyUpdates(this.getMetadata());
- returnIterator.reset(this.currentDynamicContextForLocalExecution);
+ this.returnIterator.reset(this.currentDynamicContextForLocalExecution);
}
@Override
protected boolean hasNextLocal() {
- return returnIterator.hasNext();
+ return this.returnIterator.hasNext();
}
@Override
protected Item nextLocal() {
- return returnIterator.next();
+ return this.returnIterator.next();
}
@Override
public PendingUpdateList getPendingUpdateList(DynamicContext context) {
bindCopyDeclarations(context);
- context.setCurrentMutabilityLevel(this.mutabilityLevel);
- return modifyIterator.getPendingUpdateList(context);
+ DynamicContext newCtx = new DynamicContext(context);
+ newCtx.setCurrentMutabilityLevel(this.mutabilityLevel);
+ return this.modifyIterator.getPendingUpdateList(newCtx);
}
private void bindCopyDeclarations(DynamicContext context) {
- for (Name copyVar : copyDeclMap.keySet()) {
- RuntimeIterator copyIterator = copyDeclMap.get(copyVar);
+ for (Name copyVar : this.copyDeclMap.keySet()) {
+ RuntimeIterator copyIterator = this.copyDeclMap.get(copyVar);
List
- toCopy = copyIterator.materialize(context);
List
- copy = new ArrayList<>();
Item temp;
for (Item item : toCopy) {
- temp = (Item) SerializationUtils.clone(item);
+ temp = SerializationUtils.clone(item);
temp.setMutabilityLevel(this.mutabilityLevel);
+ // TODO: Currently avoids copied delta items being updated via applyDelta but perhaps should be checked
+ // with mutability level
+ temp.setTableLocation(null);
copy.add(temp);
}
context.getVariableValues().addVariableValue(copyVar, copy);
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
index 8cf51f57bb..e204578079 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromArrayPrimitive.java
@@ -1,8 +1,14 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
public class DeleteFromArrayPrimitive implements UpdatePrimitive {
@@ -23,9 +29,53 @@ public DeleteFromArrayPrimitive(Item targetArray, Item positionInt, ExceptionMet
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
this.target.removeItemAt(this.selector.getIntValue() - 1);
}
+ @Override
+ public void applyDelta() {
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+ String setClause = "SET " + pathIn + " = ";
+ this.applyItem();
+ setClause = setClause + this.target.getSparkSQLValue(arrayType);
+
+ String query = "UPDATE delta.`" + location + "` " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -33,17 +83,17 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
index a55b5b9a3e..5bd8918c24 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/DeleteFromObjectPrimitive.java
@@ -3,11 +3,13 @@
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import sparksoniq.spark.SparkSessionManager;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
import java.util.stream.Collectors;
+import static org.apache.spark.sql.functions.*;
+
public class DeleteFromObjectPrimitive implements UpdatePrimitive {
private Item target;
@@ -30,6 +32,15 @@ public DeleteFromObjectPrimitive(Item targetObject, List- namesToRemove, Ex
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
for (
String str : this.content.stream().map(Item::getStringValue).collect(Collectors.toList())
) {
@@ -37,6 +48,28 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ List setFieldsToNulls = this.content.stream()
+ .map(i -> pathIn + i.getStringValue() + " = NULL")
+ .collect(Collectors.toList());
+ String concatSetNulls = String.join(", ", setFieldsToNulls);
+
+ String query = "UPDATE delta.`" + location + "` SET " + concatSetNulls + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return false;
@@ -44,12 +77,12 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public List
- getContentList() {
- return content;
+ return this.content;
}
@Override
@@ -57,10 +90,4 @@ public boolean isDeleteObject() {
return true;
}
- public static List
- mergeSources(List
- first, List
- second) {
- List
- merged = new ArrayList<>(first);
- merged.addAll(second);
- merged = merged.stream().distinct().collect(Collectors.toList());
- return merged;
- }
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
index a6f2d9b4e8..2dc0c8e3c5 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoArrayPrimitive.java
@@ -1,6 +1,13 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
+import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
import java.util.ArrayList;
import java.util.List;
@@ -11,12 +18,17 @@ public class InsertIntoArrayPrimitive implements UpdatePrimitive {
private Item selector;
private List
- content;
- public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List
- sourceSequence) {
- if (!targetArray.isArray() || !positionInt.isNumeric()) {
- // TODO ERROR
- }
- if (positionInt.getIntValue() < 0 || positionInt.getIntValue() >= targetArray.getSize()) {
- // TODO throw error or do nothing?
+ public InsertIntoArrayPrimitive(
+ Item targetArray,
+ Item positionInt,
+ List
- sourceSequence,
+ ExceptionMetadata metadata
+ ) {
+ if (positionInt.getIntValue() <= 0 || positionInt.getIntValue() > targetArray.getSize() + 1) {
+ throw new CannotResolveUpdateSelectorException(
+ "Cannot insert item at index out of range of target array",
+ metadata
+ );
}
this.target = targetArray;
@@ -27,9 +39,60 @@ public InsertIntoArrayPrimitive(Item targetArray, Item positionInt, List
- s
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
this.target.putItemsAt(this.content, this.selector.getIntValue() - 1);
}
+ @Override
+ public void applyDelta() {
+ // TODO: Properly discern ItemType to SQLType
+ // TODO: Sort out types for value item
+ // ASSUMES ArrayType ONLY CONTAINS 1 TYPE AND INSERTION OF A DIFF TYPE IS INVALID
+ // TODO: perhaps check for homogenous typing of array w/o relying on SQL error
+
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+ // DeltaTable dt = DeltaTable.forPath(SparkSessionManager.getInstance().getOrCreateSession(), location);
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String setClause = pathIn + " = ";
+ this.applyItem();
+ setClause = setClause + this.target.getSparkSQLValue(arrayType);
+
+ String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -37,22 +100,22 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
public List- getContentList() {
- return content;
+ return this.content;
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
index 7a2a659b0b..e4093e3f06 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/InsertIntoObjectPrimitive.java
@@ -1,11 +1,15 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.AnalysisException;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.*;
import org.rumbledb.items.ItemFactory;
+import sparksoniq.spark.SparkSessionManager;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
+
public class InsertIntoObjectPrimitive implements UpdatePrimitive {
@@ -13,9 +17,14 @@ public class InsertIntoObjectPrimitive implements UpdatePrimitive {
private Item content;
- public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) {
- if (!targetObject.isObject() || !contentObject.isObject()) {
- // TODO: ERROR
+ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject, ExceptionMetadata metadata) {
+ for (String key : contentObject.getKeys()) {
+ if (targetObject.getItemByKey(key) != null) {
+ throw new DuplicateKeyOnUpdateApplyException(
+ "cannot insert a key already present in an object",
+ metadata
+ );
+ }
}
this.target = targetObject;
this.content = contentObject;
@@ -23,6 +32,15 @@ public InsertIntoObjectPrimitive(Item targetObject, Item contentObject) {
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
try {
for (String key : this.content.getKeys()) {
this.target.putItemByKey(key, this.content.getItemByKey(key));
@@ -32,6 +50,55 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Properly discern ItemType to SQLType
+ // TODO: Sort out types for value item
+
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+
+ List columnsClauseList = new ArrayList<>();
+ List setClauseList = new ArrayList<>();
+ List keys = this.content.getKeys();
+ List
- values = this.content.getValues();
+ for (int i = 0; i < keys.size(); i++) {
+ columnsClauseList.add(pathIn + keys.get(i) + " " + values.get(i).getSparkSQLType());
+ setClauseList.add(pathIn + keys.get(i) + " = " + values.get(i).getSparkSQLValue());
+ }
+
+ String setClauses = String.join(", ", setClauseList);
+
+ List insertColumnQueries = columnsClauseList.stream()
+ .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");")
+ .collect(Collectors.toList());
+
+ String setFieldQuery = "UPDATE delta.`" + location + "` SET " + setClauses + " WHERE rowID == " + rowID;
+
+ SparkSessionManager manager = SparkSessionManager.getInstance();
+
+ // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS
+ for (String insertColumnQuery : insertColumnQueries) {
+ try {
+ manager.getOrCreateSession().sql(insertColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
+ manager.getOrCreateSession().sql(setFieldQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ // TODO: Add new column for changed array and do the null trick -- do not forget the nullable etc
+ }
+ }
+
@Override
public boolean hasSelector() {
return false;
@@ -39,7 +106,7 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
@@ -49,7 +116,7 @@ public Item getSelector() {
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
@@ -57,6 +124,44 @@ public boolean isInsertObject() {
return true;
}
+ @Override
+ public boolean updatesSchemaDelta() {
+ return true;
+ }
+
+ @Override
+ public void arrayIndexingUpdateSchemaDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+
+ String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element");
+
+ List columnsClauseList = new ArrayList<>();
+ List keys = this.content.getKeys();
+ List
- values = this.content.getValues();
+ for (int i = 0; i < keys.size(); i++) {
+ columnsClauseList.add(pathInSchema + keys.get(i) + " " + values.get(i).getSparkSQLType());
+ }
+
+ List insertColumnQueries = columnsClauseList.stream()
+ .map(c -> "ALTER TABLE delta.`" + location + "` ADD COLUMNS (" + c + ");")
+ .collect(Collectors.toList());
+
+ SparkSessionManager manager = SparkSessionManager.getInstance();
+
+ // SKIP CREATING NEW COL FOR COL THAT ALREADY EXISTS
+ for (String insertColumnQuery : insertColumnQueries) {
+ try {
+ manager.getOrCreateSession().sql(insertColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
+ }
+
public static Item mergeSources(Item first, Item second, ExceptionMetadata metadata) {
Item res;
@@ -67,7 +172,7 @@ public static Item mergeSources(Item first, Item second, ExceptionMetadata metad
values.addAll(second.getValues());
try {
- res = ItemFactory.getInstance().createObjectItem(keys, values, metadata);
+ res = ItemFactory.getInstance().createObjectItem(keys, values, metadata, false);
} catch (DuplicateObjectKeyException e) {
throw new DuplicateObjectInsertSourceException(e.getMessage(), metadata);
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
index 01c0d4037b..538c36cae3 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/RenameInObjectPrimitive.java
@@ -1,8 +1,16 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.AnalysisException;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
+import static org.apache.spark.sql.functions.col;
public class RenameInObjectPrimitive implements UpdatePrimitive {
@@ -32,6 +40,15 @@ public RenameInObjectPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
String name = this.selector.getStringValue();
if (this.target.getKeys().contains(name)) {
Item item = this.target.getItemByKey(name);
@@ -41,6 +58,61 @@ public void apply() {
// TODO: implement replace and rename methods for Array & Object to avoid deletion and append
}
+ @Override
+ public void applyDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String oldName = this.selector.getStringValue();
+
+ String fullOldPath = pathIn + oldName;
+ String fullNewPath = pathIn + this.content.getStringValue();
+
+ String setOldFieldClause = fullOldPath + " = NULL";
+ String setNewFieldClause = fullNewPath + " = " + this.target.getItemByKey(oldName).getSparkSQLValue();
+ String type = SparkSessionManager.getInstance()
+ .getOrCreateSession()
+ .sql("DESC (SELECT " + fullOldPath + " FROM delta.`" + location + "`)")
+ .filter(col("col_name").equalTo(oldName))
+ .select("data_type")
+ .collectAsList()
+ .get(0)
+ .getString(0);
+
+ String insertNewColumnQuery = "ALTER TABLE delta.`"
+ + location
+ + "` ADD COLUMNS ("
+ + fullNewPath
+ + " "
+ + type
+ + ");";
+ String setFieldsQuery = "UPDATE delta.`"
+ + location
+ + "` SET "
+ + setOldFieldClause
+ + ", "
+ + setNewFieldClause
+ + " WHERE rowID == "
+ + rowID;
+
+ // SKIP INSERTING NEW COL IF COL ALREADY EXISTS
+ try {
+ SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ SparkSessionManager.getInstance().getOrCreateSession().sql(setFieldsQuery);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -48,21 +120,71 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
public boolean isRenameObject() {
return true;
}
+
+ @Override
+ public boolean updatesSchemaDelta() {
+ return true;
+ }
+
+ @Override
+ public void arrayIndexingUpdateSchemaDelta() {
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+
+ String selectColQuery = "SELECT "
+ + pathIn
+ + this.selector.getStringValue()
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset
colDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectColQuery);
+
+ ItemType colType = ItemTypeFactory.createItemType(colDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String pathInSchema = pathIn.replaceAll("\\[\\d+]", ".element");
+ String fullNewPath = pathInSchema + this.content.getStringValue();
+
+ String insertNewColumnQuery = "ALTER TABLE delta.`"
+ + location
+ + "` ADD COLUMNS ("
+ + fullNewPath
+ + " "
+ + colType.getSparkSQLType()
+ + ");";
+
+ // SKIP INSERTING NEW COL IF COL ALREADY EXISTS
+ try {
+ SparkSessionManager.getInstance().getOrCreateSession().sql(insertNewColumnQuery);
+ } catch (Exception e) {
+ if (!(e instanceof AnalysisException)) {
+ throw e;
+ }
+ }
+ }
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
index 9be2c98200..04d027b242 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInArrayPrimitive.java
@@ -1,8 +1,14 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+
public class ReplaceInArrayPrimitive implements UpdatePrimitive {
@@ -30,6 +36,15 @@ public ReplaceInArrayPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
int index = this.selector.getIntValue() - 1;
if (index >= 0 || index < this.target.getSize()) {
this.target.removeItemAt(index);
@@ -41,6 +56,47 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Sort out diff types of content Item
+ // TODO: Find out name of array column
+ // ASSUME pathIn CONTAINS ARRAYFIELD NAME
+ // PERHAPS CASE OF REPLACING ARRAY WITH 1 ITEM SHOULD CREATE NEW ARRAYCOL WITH CORRECTED TYPE IF TYPE CHANGES
+
+ String pathIn = this.target.getPathIn().substring(this.target.getPathIn().indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+ String selectArrayQuery = "SELECT "
+ + pathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ String setField = pathIn + " = ";
+ this.applyItem();
+ setField = setField + this.target.getSparkSQLValue(arrayType);
+
+ String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -48,22 +104,22 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public int getIntSelector() {
- return selector.getIntValue();
+ return this.selector.getIntValue();
}
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
index a4d9e0daf1..e8ddd3ab58 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/ReplaceInObjectPrimitive.java
@@ -3,6 +3,10 @@
import org.rumbledb.api.Item;
import org.rumbledb.exceptions.CannotResolveUpdateSelectorException;
import org.rumbledb.exceptions.ExceptionMetadata;
+import sparksoniq.spark.SparkSessionManager;
+
+
+import static org.apache.spark.sql.functions.*;
public class ReplaceInObjectPrimitive implements UpdatePrimitive {
@@ -19,7 +23,7 @@ public ReplaceInObjectPrimitive(
if (targetObject.getItemByKey(targetName.getStringValue()) == null) {
throw new CannotResolveUpdateSelectorException(
- "Cannot delete key that does not exist in target object",
+ "Cannot replace key that does not exist in target object",
metadata
);
}
@@ -31,6 +35,15 @@ public ReplaceInObjectPrimitive(
@Override
public void apply() {
+ if (this.target.getTableLocation() == null || this.target.getTableLocation().equals("null")) {
+ this.applyItem();
+ } else {
+ this.applyDelta();
+ }
+ }
+
+ @Override
+ public void applyItem() {
String name = this.getSelector().getStringValue();
if (this.getTarget().getKeys().contains(name)) {
this.getTarget().removeItemByKey(name);
@@ -38,6 +51,29 @@ public void apply() {
}
}
+ @Override
+ public void applyDelta() {
+ // TODO: Sort out diff types of content Item
+ // PERHAPS CHANGE OF TYPE SHOULD CREATE NEW COLUMN?
+
+ String tempPathIn = this.target.getPathIn() + ".";
+ String pathIn = tempPathIn.substring(tempPathIn.indexOf(".") + 1);
+ String location = this.target.getTableLocation();
+ long rowID = this.target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ if (startOfArrayIndexing == -1) {
+
+ String setField = pathIn + this.selector.getStringValue() + " = " + this.content.getSparkSQLValue();
+
+ String query = "UPDATE delta.`" + location + "` SET " + setField + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ } else {
+ this.arrayIndexingApplyDelta();
+ }
+ }
+
@Override
public boolean hasSelector() {
return true;
@@ -45,17 +81,17 @@ public boolean hasSelector() {
@Override
public Item getTarget() {
- return target;
+ return this.target;
}
@Override
public Item getSelector() {
- return selector;
+ return this.selector;
}
@Override
public Item getContent() {
- return content;
+ return this.content;
}
@Override
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
index 7827587d36..af73ecea42 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitive.java
@@ -1,13 +1,26 @@
package org.rumbledb.runtime.update.primitives;
+import org.apache.spark.api.java.JavaRDD;
+import org.apache.spark.sql.Dataset;
+import org.apache.spark.sql.Row;
import org.rumbledb.api.Item;
+import org.rumbledb.exceptions.ExceptionMetadata;
+import org.rumbledb.items.parsing.RowToItemMapper;
+import org.rumbledb.types.ItemType;
+import org.rumbledb.types.ItemTypeFactory;
+import sparksoniq.spark.SparkSessionManager;
+import java.util.Arrays;
import java.util.List;
public interface UpdatePrimitive {
void apply();
+ void applyItem();
+
+ void applyDelta();
+
boolean hasSelector();
Item getTarget();
@@ -56,5 +69,82 @@ default boolean isRenameObject() {
return false;
}
+ default boolean updatesSchemaDelta() {
+ return false;
+ }
+
+ default void arrayIndexingUpdateSchemaDelta() {
+ throw new UnsupportedOperationException("Operation not defined");
+ }
+
+ default void arrayIndexingApplyDelta() {
+ Item target = this.getTarget();
+
+ String pathIn = target.getPathIn().substring(target.getPathIn().indexOf(".") + 1);
+ String location = target.getTableLocation();
+ long rowID = target.getTopLevelID();
+ int startOfArrayIndexing = pathIn.indexOf("[");
+
+ String preIndexingPathIn = pathIn.substring(0, startOfArrayIndexing);
+ String postIndexingPathIn = pathIn.substring(startOfArrayIndexing);
+ List fields = Arrays.asList(postIndexingPathIn.split("\\."));
+
+ // TODO: Perhaps an if here to update schema if required but need to sort out new name of array column --
+ if (this.updatesSchemaDelta()) {
+ this.arrayIndexingUpdateSchemaDelta();
+ }
+
+ String selectArrayQuery = "SELECT "
+ + preIndexingPathIn
+ + " AS `"
+ + SparkSessionManager.atomicJSONiqItemColumnName
+ + "` FROM delta.`"
+ + location
+ + "` WHERE rowID == "
+ + rowID;
+
+ Dataset arrayDF = SparkSessionManager.getInstance().getOrCreateSession().sql(selectArrayQuery);
+
+ ItemType arrayType = ItemTypeFactory.createItemType(arrayDF.schema())
+ .getObjectContentFacet()
+ .get(SparkSessionManager.atomicJSONiqItemColumnName)
+ .getType();
+
+ JavaRDD rowRDD = arrayDF.javaRDD();
+ JavaRDD- itemRDD = rowRDD.map(new RowToItemMapper(ExceptionMetadata.EMPTY_METADATA, arrayType));
+ List
- collectedItems = itemRDD.take(2);
+ Item originalArray = collectedItems.get(0);
+ // TODO: errors if 0 items or more than one item
+
+ Item innerItem = originalArray;
+ for (int i = 0; i < fields.size() - 1; i++) {
+ String field = fields.get(i);
+ if (innerItem.isObject()) {
+ innerItem = innerItem.getItemByKey(field);
+ } else if (innerItem.isArray()) {
+ int index = Integer.parseInt(field.substring(field.indexOf("[") + 1, field.indexOf("]")));
+ innerItem = innerItem.getItemAt(index);
+ }
+ }
+
+ String finalSelector = fields.get(fields.size() - 1);
+ this.applyItem();
+ if (innerItem.isObject()) {
+ innerItem.removeItemByKey(finalSelector);
+ innerItem.putItemByKey(finalSelector, this.getTarget());
+ } else if (innerItem.isArray()) {
+ int finalIndex = Integer.parseInt(
+ finalSelector.substring(finalSelector.indexOf("[") + 1, finalSelector.indexOf("]"))
+ );
+ innerItem.removeItemAt(finalIndex);
+ innerItem.putItemAt(this.getTarget(), finalIndex);
+ }
+
+ String setClause = preIndexingPathIn + " = " + originalArray.getSparkSQLValue(arrayType);
+ String query = "UPDATE delta.`" + location + "` SET " + setClause + " WHERE rowID == " + rowID;
+
+ SparkSessionManager.getInstance().getOrCreateSession().sql(query);
+ }
+
}
diff --git a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
index 2dc938b1c2..c351803af8 100644
--- a/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
+++ b/src/main/java/org/rumbledb/runtime/update/primitives/UpdatePrimitiveFactory.java
@@ -32,12 +32,21 @@ public UpdatePrimitive createDeleteFromObjectPrimitive(
return new DeleteFromObjectPrimitive(targetObject, selectorStrs, metadata);
}
- public UpdatePrimitive createInsertIntoArrayPrimitive(Item targetArray, Item selectorInt, List
- contents) {
- return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents);
+ public UpdatePrimitive createInsertIntoArrayPrimitive(
+ Item targetArray,
+ Item selectorInt,
+ List
- contents,
+ ExceptionMetadata metadata
+ ) {
+ return new InsertIntoArrayPrimitive(targetArray, selectorInt, contents, metadata);
}
- public UpdatePrimitive createInsertIntoObjectPrimitive(Item targetObject, Item contentsObject) {
- return new InsertIntoObjectPrimitive(targetObject, contentsObject);
+ public UpdatePrimitive createInsertIntoObjectPrimitive(
+ Item targetObject,
+ Item contentsObject,
+ ExceptionMetadata metadata
+ ) {
+ return new InsertIntoObjectPrimitive(targetObject, contentsObject, metadata);
}
public UpdatePrimitive createReplaceInArrayPrimitive(
diff --git a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
index 5899742ed1..8581c4311a 100644
--- a/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
+++ b/src/main/java/org/rumbledb/server/RumbleHttpHandler.java
@@ -155,7 +155,7 @@ private static Item assembleResponse(RumbleRuntimeConfiguration configuration, L
);
} else {
if (results != null) {
- Item values = ItemFactory.getInstance().createArrayItem(results);
+ Item values = ItemFactory.getInstance().createArrayItem(results, false);
output.putItemByKey("values", values);
}
}
diff --git a/src/main/java/org/rumbledb/types/ArrayItemType.java b/src/main/java/org/rumbledb/types/ArrayItemType.java
index ddf40af11e..34d0ab69ee 100644
--- a/src/main/java/org/rumbledb/types/ArrayItemType.java
+++ b/src/main/java/org/rumbledb/types/ArrayItemType.java
@@ -266,4 +266,12 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati
return this.content.isCompatibleWithDataFrames(configuration);
}
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("ARRAY<");
+ sb.append(this.getArrayContentFacet().getSparkSQLType());
+ sb.append(">");
+ return sb.toString();
+ }
}
diff --git a/src/main/java/org/rumbledb/types/AtomicItemType.java b/src/main/java/org/rumbledb/types/AtomicItemType.java
index 02b3b48e82..a4c3fb22e6 100644
--- a/src/main/java/org/rumbledb/types/AtomicItemType.java
+++ b/src/main/java/org/rumbledb/types/AtomicItemType.java
@@ -547,4 +547,24 @@ public boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurati
}
return true;
}
+
+ @Override
+ public String getSparkSQLType() {
+ if (this.getPrimitiveType().equals(stringItem)) {
+ return "STRING";
+ }
+ if (this.getPrimitiveType().equals(booleanItem)) {
+ return "BOOLEAN";
+ }
+ if (this.getPrimitiveType().equals(doubleItem)) {
+ return "DOUBLE";
+ }
+ if (this.getPrimitiveType().equals(floatItem)) {
+ return "FLOAT";
+ }
+ if (this.getPrimitiveType().equals(decimalItem)) {
+ return "DECIMAL";
+ }
+ throw new UnsupportedOperationException("getSparkSQLType is unsupported for " + this.getPrimitiveType());
+ }
}
diff --git a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
index 1f7ba3822a..a6e6b27258 100644
--- a/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
+++ b/src/main/java/org/rumbledb/types/DerivedAtomicItemType.java
@@ -613,4 +613,21 @@ public void processBaseType() {
ExceptionMetadata.EMPTY_METADATA
);
}
+
+ @Override
+ public String getSparkSQLType() {
+ if (this.equals(BuiltinTypesCatalogue.integerItem)) {
+ return "INT";
+ }
+ if (this.equals(BuiltinTypesCatalogue.intItem)) {
+ return "INT";
+ }
+ if (this.equals(BuiltinTypesCatalogue.longItem)) {
+ return "LONG";
+ }
+ if (this.equals(BuiltinTypesCatalogue.shortItem)) {
+ return "SHORT";
+ }
+ return this.primitiveType.getSparkSQLType();
+ }
}
diff --git a/src/main/java/org/rumbledb/types/FunctionSignature.java b/src/main/java/org/rumbledb/types/FunctionSignature.java
index be9defb075..8e5369e121 100644
--- a/src/main/java/org/rumbledb/types/FunctionSignature.java
+++ b/src/main/java/org/rumbledb/types/FunctionSignature.java
@@ -26,14 +26,24 @@
public class FunctionSignature implements Serializable {
private List parameterTypes;
private SequenceType returnType;
+ private boolean isUpdating;
private static final long serialVersionUID = 1L;
public FunctionSignature(
List parameterTypes,
- SequenceType returnType
+ SequenceType returnType,
+ boolean isUpdating
) {
this.parameterTypes = parameterTypes;
this.returnType = returnType;
+ this.isUpdating = isUpdating;
+ }
+
+ public FunctionSignature(
+ List parameterTypes,
+ SequenceType returnType
+ ) {
+ this(parameterTypes, returnType, false);
}
@@ -45,6 +55,10 @@ public SequenceType getReturnType() {
return this.returnType;
}
+ public boolean isUpdating() {
+ return this.isUpdating;
+ }
+
@Override
public boolean equals(Object instance) {
return instance instanceof FunctionSignature
diff --git a/src/main/java/org/rumbledb/types/ItemType.java b/src/main/java/org/rumbledb/types/ItemType.java
index 101c5978a6..c51604f2e8 100644
--- a/src/main/java/org/rumbledb/types/ItemType.java
+++ b/src/main/java/org/rumbledb/types/ItemType.java
@@ -451,6 +451,15 @@ default boolean isCompatibleWithDataFrames(RumbleRuntimeConfiguration configurat
return false;
}
+ /**
+ * Returns the SparkSQL type of the item type for use in a query.
+ *
+ * @return String representing the SparkSQL type of the item type.
+ */
+ default String getSparkSQLType() {
+ throw new UnsupportedOperationException("Operation not defined for type " + this.getName());
+ }
+
String toString();
default boolean isResolved() {
diff --git a/src/main/java/org/rumbledb/types/ObjectItemType.java b/src/main/java/org/rumbledb/types/ObjectItemType.java
index 7c189dcbb4..5bb2b3f66d 100644
--- a/src/main/java/org/rumbledb/types/ObjectItemType.java
+++ b/src/main/java/org/rumbledb/types/ObjectItemType.java
@@ -372,4 +372,28 @@ public void checkSubtypeConsistency() {
);
}
}
+
+
+ @Override
+ public String getSparkSQLType() {
+ StringBuilder sb = new StringBuilder();
+ Map content = this.getObjectContentFacet();
+ String[] keys = content.keySet().toArray(new String[0]);
+
+ sb.append("STRUCT<");
+ for (int i = 0; i < keys.length; i++) {
+ String key = keys[i];
+ FieldDescriptor field = content.get(key);
+
+ sb.append(key);
+ sb.append(":");
+ sb.append(field.getType().getSparkSQLType());
+ if (i < keys.length - 1) {
+ sb.append(", ");
+ }
+ }
+ sb.append(">");
+
+ return sb.toString();
+ }
}
diff --git a/src/main/java/sparksoniq/spark/SparkSessionManager.java b/src/main/java/sparksoniq/spark/SparkSessionManager.java
index 17923d698a..cca6a293f0 100644
--- a/src/main/java/sparksoniq/spark/SparkSessionManager.java
+++ b/src/main/java/sparksoniq/spark/SparkSessionManager.java
@@ -83,12 +83,16 @@ public class SparkSessionManager {
private SparkSession session;
private JavaSparkContext javaSparkContext;
- public static String atomicJSONiqItemColumnName = "0d08af5d-10bb-4a73-af84-c6aac917a830";
- public static String emptyObjectJSONiqItemColumnName = "a84bc646-05af-4383-8853-2e9f31a710f2";
- public static String temporaryColumnName = "0f7b4040-b404-4239-99dd-9b4cf2900594";
- public static String countColumnName = "5af0c0c8-e84c-482a-82ce-1887565cf448";
- public static String rightHandSideHashColumnName = "db273b7d-d927-4c0d-b9c1-665af71faa2b ";
- public static String leftHandSideHashColumnName = "171bdb70-7400-48ed-a105-d132f4e38a2d";
+ public static String atomicJSONiqItemColumnName = "atomic0d08af5d-10bb-4a73-af84-c6aac917a830";
+ public static String emptyObjectJSONiqItemColumnName = "emptyobja84bc646-05af-4383-8853-2e9f31a710f2";
+ public static String temporaryColumnName = "tmp0f7b4040-b404-4239-99dd-9b4cf2900594";
+ public static String countColumnName = "count5af0c0c8-e84c-482a-82ce-1887565cf448";
+ public static String rightHandSideHashColumnName = "rhsdb273b7d-d927-4c0d-b9c1-665af71faa2b ";
+ public static String leftHandSideHashColumnName = "lhs171bdb70-7400-48ed-a105-d132f4e38a2d";
+ public static String mutabilityLevelColumnName = "mutabilityLevel";
+ public static String rowIdColumnName = "rowID";
+ public static String pathInColumnName = "pathIn";
+ public static String tableLocationColumnName = "tableLocation";
private SparkSessionManager() {
}
@@ -126,6 +130,11 @@ private void setDefaultConfiguration() {
this.configuration.setAppName(APP_NAME);
}
this.configuration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product
+ this.configuration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension");
+ this.configuration.set(
+ "spark.sql.catalog.spark_catalog",
+ "org.apache.spark.sql.delta.catalog.DeltaCatalog"
+ );
if (!this.configuration.contains("spark.master")) {
this.configuration.set("spark.master", "local[*]");
}
diff --git a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
index 90933724fe..6048587b3a 100644
--- a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
+++ b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java
@@ -101,7 +101,8 @@ public Item call(Tuple2