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 a) { List values = new ArrayList<>(); values.add(ItemFactory.getInstance().createDoubleItem((double) a._1())); values.add(ItemFactory.getInstance().createDoubleItem((double) a._2())); - return ItemFactory.getInstance().createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA); + return ItemFactory.getInstance() + .createObjectItem(keys, values, ExceptionMetadata.EMPTY_METADATA, true); } } ); diff --git a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java index ae3938539d..de967113f9 100644 --- a/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java +++ b/src/main/java/sparksoniq/spark/ml/RumbleMLUtils.java @@ -245,7 +245,7 @@ public static Item removeParameter(Item paramMapItem, String key, ExceptionMetad int indexToRemove = keys.indexOf(key); keys.remove(indexToRemove); values.remove(indexToRemove); - return ItemFactory.getInstance().createObjectItem(keys, values, metadata); + return ItemFactory.getInstance().createObjectItem(keys, values, metadata, true); } public static JSoundDataFrame createDataFrameContainingVectorizedColumn( diff --git a/src/test/java/iq/DeltaUpdateRuntimeTests.java b/src/test/java/iq/DeltaUpdateRuntimeTests.java new file mode 100644 index 0000000000..7341472bd4 --- /dev/null +++ b/src/test/java/iq/DeltaUpdateRuntimeTests.java @@ -0,0 +1,347 @@ +/* + * 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 iq; + +import iq.base.AnnotationsTestsBase; +import org.apache.commons.io.FileUtils; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import utils.annotations.AnnotationParseException; +import utils.annotations.AnnotationProcessor; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.Item; +import org.rumbledb.api.SequenceOfItems; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; +import utils.FileManager; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.net.URI; +import java.util.*; + +@RunWith(Parameterized.class) +public class DeltaUpdateRuntimeTests extends AnnotationsTestsBase { + + public static final File runtimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-delta-updates" + ); + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + } + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static final RumbleRuntimeConfiguration deleteDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + } + ); + + protected static Map> _testFilesMap; + + protected final File testFile; + + + public DeltaUpdateRuntimeTests(File testFile) { + this.testFile = testFile; + } + + public static void readFileList(File dir) throws IOException, AnnotationParseException { + Map> updateDimToFileMap = new TreeMap<>(); + Map innerMap; + for (File file : FileManager.loadJiqFiles(dir)) { + FileReader reader = new FileReader(file.getPath()); + String dims = AnnotationProcessor.getUpdateDimensionAnnotation(reader); + String[] dimsArr = dims.substring(1, dims.length() - 1).split(","); + int dim1 = Integer.parseInt(dimsArr[0]); + int dim2 = Integer.parseInt(dimsArr[1]); + innerMap = updateDimToFileMap.getOrDefault(dim1, new TreeMap<>()); + innerMap.put(dim2, file); + updateDimToFileMap.put(dim1, innerMap); + } + DeltaUpdateRuntimeTests._testFilesMap = updateDimToFileMap; + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() throws IOException, AnnotationParseException { + List result = new ArrayList<>(); + DeltaUpdateRuntimeTests.readFileList(DeltaUpdateRuntimeTests.runtimeTestsDirectory); + Map innerMap; + File curr; + for (int i : DeltaUpdateRuntimeTests._testFilesMap.keySet()) { + innerMap = DeltaUpdateRuntimeTests._testFilesMap.get(i); + for (int j : innerMap.keySet()) { + curr = innerMap.get(j); + result.add(new Object[] { curr }); + } + } + return result; + } + + @BeforeClass + public static void setupSparkSession() { + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + sparkConfiguration.setMaster("local[*]"); + sparkConfiguration.set("spark.submit.deployMode", "client"); + sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); + sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); + sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store + + // prevents spark from failing to start on MacOS when disconnected from the internet + sparkConfiguration.set("spark.driver.host", "127.0.0.1"); + + + // sparkConfiguration.set("spark.driver.memory", "2g"); + // sparkConfiguration.set("spark.executor.memory", "2g"); + // sparkConfiguration.set("spark.speculation", "true"); + // sparkConfiguration.set("spark.speculation.quantile", "0.5"); + SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); + SparkSessionManager.COLLECT_ITEM_LIMIT = defaultConfiguration.getResultSizeCap(); + System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + try { + this.currentAnnotation = AnnotationProcessor.readAnnotation( + new FileReader(this.testFile.getAbsolutePath()) + ); + } catch (AnnotationParseException e) { + e.printStackTrace(); + Assert.fail(); + } + boolean didDelete = checkTableDeletion(); + boolean didCreate = checkTableCreation(this.testFile.getAbsolutePath()); + if (!(didCreate || didDelete)) { + testAnnotations(this.testFile.getAbsolutePath(), getConfiguration()); + } + } + + private boolean checkTableCreation(String path) throws IOException, InterruptedException { + if (!this.currentAnnotation.shouldCreateTable()) { + return false; + } + + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + DeltaUpdateRuntimeTests.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + DeltaUpdateRuntimeTests.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(DeltaUpdateRuntimeTests.createDeltaConfiguration); + executor.runQuery(); + return true; + } + + private boolean checkTableDeletion() { + if (!this.currentAnnotation.shouldDeleteTable()) { + return false; + } + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + this.currentAnnotation.getDeltaTablePath(), + DeltaUpdateRuntimeTests.deleteDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + return true; + + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput; + if (!sequence.availableAsRDD()) { + actualOutput = runIterators(sequence); + } else { + actualOutput = getRDDResults(sequence); + } + Assert.assertTrue( + "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } + + protected String runIterators(SequenceOfItems sequence) { + String actualOutput = getIteratorOutput(sequence); + applyPossibleUpdates(sequence); + return actualOutput; + } + + protected String getIteratorOutput(SequenceOfItems sequence) { + sequence.open(); + Item result = null; + if (sequence.hasNext()) { + result = sequence.next(); + } + if (result == null) { + return ""; + } + String singleOutput = result.serialize(); + if (!sequence.hasNext()) { + return singleOutput; + } else { + int itemCount = 1; + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(result.serialize()); + sb.append(", "); + while ( + sequence.hasNext() + && + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) + || + getConfiguration().getResultSizeCap() == 0) + ) { + sb.append(sequence.next().serialize()); + sb.append(", "); + itemCount++; + } + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { + System.err.println( + "Warning! The output sequence contains a large number of items but its materialization was capped at " + + SparkSessionManager.COLLECT_ITEM_LIMIT + + " items. This value can be configured with the --result-size parameter at startup" + ); + } + // remove last comma + String output = sb.toString(); + output = output.substring(0, output.length() - 2); + output += ")"; + return output; + } + } + + private String getRDDResults(SequenceOfItems sequence) { + JavaRDD rdd = sequence.getAsRDD(); + applyPossibleUpdates(sequence); + JavaRDD output = rdd.map(o -> o.serialize()); + List collectedOutput = new ArrayList(); + SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); + + + if (collectedOutput.isEmpty()) { + return ""; + } + + if (collectedOutput.size() == 1) { + return collectedOutput.get(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (String item : collectedOutput) { + sb.append(item); + sb.append(", "); + } + + String result = sb.toString(); + result = result.substring(0, result.length() - 2); + result += ")"; + return result; + } + + private void applyPossibleUpdates(SequenceOfItems sequence) { + if (getConfiguration().applyUpdates() && sequence.availableAsPUL()) { + sequence.applyPUL(); + } + } + +} diff --git a/src/test/java/iq/JavaAPITest.java b/src/test/java/iq/JavaAPITest.java index 4eda7162ff..9cb946774c 100644 --- a/src/test/java/iq/JavaAPITest.java +++ b/src/test/java/iq/JavaAPITest.java @@ -34,6 +34,8 @@ import java.util.List; +import static org.apache.spark.sql.functions.*; + public class JavaAPITest { public JavaAPITest() { @@ -48,6 +50,9 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.host", "127.0.0.1"); sparkConfiguration.set("spark.driver.bindAddress", "127.0.0.1"); + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); + sparkConfiguration.set("spark.databricks.delta.schema.autoMerge.enabled", "true"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); } diff --git a/src/test/java/iq/RuntimeTests.java b/src/test/java/iq/RuntimeTests.java index 4b52934fc1..7dbbffed82 100644 --- a/src/test/java/iq/RuntimeTests.java +++ b/src/test/java/iq/RuntimeTests.java @@ -30,14 +30,15 @@ import org.junit.runners.Parameterized; import org.rumbledb.api.Item; import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.Name; +import org.rumbledb.items.ItemFactory; import scala.util.Properties; import sparksoniq.spark.SparkSessionManager; import utils.FileManager; import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; @RunWith(Parameterized.class) public class RuntimeTests extends AnnotationsTestsBase { @@ -58,6 +59,33 @@ public RuntimeTests(File testFile) { this.testFile = testFile; } + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--apply-updates", + "yes" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); + } + public static void readFileList(File dir) { FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTests._testFiles.add(file)); } @@ -80,6 +108,11 @@ public static void setupSparkSession() { sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + sparkConfiguration.set("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension"); // enables delta + // store + sparkConfiguration.set("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog"); // enables + // delta + // store // prevents spark from failing to start on MacOS when disconnected from the internet sparkConfiguration.set("spark.driver.host", "127.0.0.1"); diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index 04459353dd..8a9c5222eb 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -48,7 +48,9 @@ public RumbleRuntimeConfiguration getConfiguration() { "--variable:externalUnparsedString", "unparsed string", "--function-inlining", - "no" } + "no", + "--apply-updates", + "yes" } ).setExternalVariableValue( Name.createVariableInNoNamespace("externalStringItem"), Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) diff --git a/src/test/java/iq/UpdatesForRumbleBenchmark.java b/src/test/java/iq/UpdatesForRumbleBenchmark.java new file mode 100644 index 0000000000..da2a41317f --- /dev/null +++ b/src/test/java/iq/UpdatesForRumbleBenchmark.java @@ -0,0 +1,708 @@ +package iq; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.LogManager; +import org.apache.spark.SparkConf; +import org.junit.Assert; +import org.rumbledb.api.Item; +import org.rumbledb.api.Rumble; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.cli.JsoniqQueryExecutor; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.runtime.functions.input.FileSystemUtil; +import scala.util.Properties; +import sparksoniq.spark.SparkSessionManager; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URI; +import java.util.*; +import java.util.function.Consumer; + +public class UpdatesForRumbleBenchmark { + + private static final String APP_NAME = "Rumble application"; + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + + public List benchmarkFiles; + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes", + "--print-iterator-tree", + "yes", + "--apply-updates", + "yes", + "--show-error-info", + "yes", + "--materialization-cap", + "900000" + } + ); + + protected static final RumbleRuntimeConfiguration createDeltaConfiguration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--output-format", + "delta", + "--show-error-info", + "yes", + "--apply-updates", + "yes", + "--materialization-cap", + "900000" + } + ); + + public UpdatesForRumbleBenchmark() { + this.benchmarkFiles = new ArrayList<>(); + List powersOf2 = new ArrayList<>(); + powersOf2.add(2); + powersOf2.add(4); + powersOf2.add(8); + powersOf2.add(16); + powersOf2.add(32); + powersOf2.add(64); + powersOf2.add(128); + + ////// GH_Q1 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_" + power + + // ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // String queryFirstHalf = "UPDATE delta.`"; + // String queryLastHalf = "` SET public = (NOT public)"; + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // queryFirstHalf + + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power + queryLastHalf, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q1/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q1/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q2 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q2/q2_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String updateSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (repo.nickname STRING, + // repo.popularity_rating INT)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET repo.nickname = 'cool_nickname', + // repo.popularity_rating = -1;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(updateSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power +".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q2/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// GH_Q3 + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/GH_Q3/q3_" + power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/RUMBLE_" + power + ".txt", + // false + // )); + // } + // + // //SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "null", + // (tables) -> { + // String insertSchemaQuery = "ALTER TABLE delta.`" + tables.get(0) + "` ADD COLUMNS (ids ARRAY>)"; + // String setQuery = "UPDATE delta.`" + tables.get(0) +"` SET ids = array(named_struct('repo_id', repo.id, + // 'actor_id', actor.id, 'id', id)), repo.id = NULL, actor.id = NULL, id = NULL;"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(insertSchemaQuery); + // SparkSessionManager.getInstance().getOrCreateSession().sql(setQuery); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/bigghTables/bigghTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/createTables/create_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/GH_Q3/SPARK_" + power + ".txt", + // true + // )); + // } + + ////// NEW ORDER TRANSACTION + // RUMBLE + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_" + + power + + ".jq", + "null", + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/RUMBLE_NEW_ORDER_INC_" + + power + + ".txt", + false + ) + ); + } + + // SPARK + for (Integer power : powersOf2) { + benchmarkFiles.add( + new FileTuple( + null, + (tables) -> { + String query = "UPDATE delta.`" + tables.get(0) + "` SET NO_O_ID = (NO_O_ID + 1);"; + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + }, + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/newOrderTable" + + power + ), + Collections.singletonList( + "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_" + + power + + ".jq" + ), + "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_NEW_ORDER_INC_" + + power + + ".txt", + true + ) + ); + } + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // String query = "WITH updates AS ( SELECT S_I_ID, OL_QUANTITY FROM delta.`" + tables.get(0) +"` JOIN delta.`" + // + tables.get(1) + "` ON S_I_ID = OL_I_ID AND S_W_ID = OL_SUPPLY_W_ID )" + + // " MERGE INTO delta.`" + tables.get(0) + "` USING updates" + + // " ON delta.`" + tables.get(0) + "`.S_I_ID = updates.S_I_ID " + + // "WHEN MATCHED THEN UPDATE SET S_QUANTITY = CASE WHEN S_QUANTITY - OL_QUANTITY >= 10 THEN S_QUANTITY - + // OL_QUANTITY ELSE S_QUANTITY - OL_QUANTITY + 91," + + // " S_YTD = S_YTD + OL_QUANTITY, S_ORDER_CNT = S_ORDER_CNT + 1"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/stockTable32", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable"), + // Arrays.asList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_stock_table_32.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/new_order_trans/create_order_line_table.jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/NEW_ORDER_TRANS/SPARK_STOCK_OL_UP.txt", + // true + // )); + + ////// PAYMENT TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/payment" + + // power + ".jq", + // "null", + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/RUMBLE_CUSTOMER_IF_" + power + ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int h_amt = 343; + // String query = "UPDATE delta.`" + tables.get(0) +"` SET C_BALANCE = (C_BALANCE + " + h_amt + "), C_DATA = + // if(C_CREDIT == 'BC', concat(C_DATA, C_ID, C_D_ID, C_W_ID, " + h_amt + "), C_DATA);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + // + power), + // Collections.singletonList("/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_" + // + power + ".jq"), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/PAYMENT_TRANS/SPARK_CUSTOMER_IF_" + power + ".txt", + // true + // )); + // } + + ////// DELIVERY TRANSACTION + // RUMBLE + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/delivery" + + // power + ".jq", + // "null", + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/RUMBLE_CUSTOMER_JOIN_" + power + + // ".txt", + // false + // )); + // } + // + // // SPARK + // for (Integer power : powersOf2) { + // benchmarkFiles.add(new FileTuple( + // null, + // (tables) -> { + // int no_o_id = 4; + // int w_id = 1; + // String query = "WITH ol_total_per_dist AS ( " + + // "SELECT D_ID, SUM(OL_AMOUNT) AS OL_TOTAL FROM delta.`" + tables.get(1) + "` JOIN delta.`" + tables.get(2) + + // "` ON D_ID = OL_D_ID" + + // " WHERE OL_W_ID = " + w_id + " AND OL_O_ID = " + no_o_id + + // " GROUP BY D_ID" + + // ")" + + // " MERGE INTO delta.`" + tables.get(0) +"` USING ol_total_per_dist" + + // " ON delta.`" + tables.get(0) +"`.C_D_ID = ol_total_per_dist.D_ID" + + // " WHEN MATCHED THEN UPDATE SET C_BALANCE = (C_BALANCE + ol_total_per_dist.OL_TOTAL);"; + // SparkSessionManager.getInstance().getOrCreateSession().sql(query); + // }, + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/customerTable" + power, + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/districtTable", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta_benchmark_data/orderLineTable" + // ), + // Arrays.asList( + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_" + // + power + ".jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq", + // "/home/davidl/Documents/Thesis/rumble/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq" + // ), + // "/home/davidl/Documents/Thesis/rumble/BenchmarkResults/DELIVERY_TRANS/SPARK_CUSTOMER_JOIN_" + power + ".txt", + // true + // )); + // } + + } + + public static void setupSparkSession() { + + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + if (sparkConfiguration.get("spark.app.name", "").equals(" benchmarkDeltaTest(Rumble rumble, URI uri) throws IOException { + SequenceOfItems sequence = rumble.runQuery(uri); + List res = new ArrayList<>(); + sequence.populateList(res); + return res; + } + + public void benchmarkDelta( + String queryPath, + List tablePaths, + List createTablePaths, + String outputPath + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + List res; + + this.appendToFile(outputPath, "RUMBLE"); + this.appendToFile(outputPath, queryPath); + + URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( + queryPath, + configuration, + ExceptionMetadata.EMPTY_METADATA + ); + Rumble rumble = new Rumble(configuration); + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + res = this.benchmarkDeltaTest(rumble, uri); + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + res = this.benchmarkDeltaTest(rumble, uri); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + this.appendToFile(outputPath, queryPath); + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + + public void benchmarkSparkSQLTest(String query) { + SparkSessionManager.getInstance().getOrCreateSession().sql(query); + } + + public void benchmarkSpark( + String query, + List tablePaths, + List createTablePaths, + String outputPath, + Optional>> possSqlFunc + ) + throws IOException { + long total = 0; + long[] diffs = new long[10]; + long start; + long end; + long diff; + + this.appendToFile(outputPath, "SPARK"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + + Consumer> func = null; + if (possSqlFunc.isPresent()) { + func = possSqlFunc.get(); + } + + // WARMUP + for (int i = 0; i < 3; i++) { + this.createTables(tablePaths, createTablePaths); + if (func != null) { + func.accept(tablePaths); + } else { + this.benchmarkSparkSQLTest(query); + } + this.deleteTables(tablePaths); + } + this.appendToFile(outputPath, "WARMUP DONE"); + + // TIMING + if (func != null) { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + func.accept(tablePaths); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } else { + for (int i = 0; i < 10; i++) { + this.createTables(tablePaths, createTablePaths); + start = System.nanoTime(); + this.benchmarkSparkSQLTest(query); + end = System.nanoTime(); + this.deleteTables(tablePaths); + diff = (end - start) / 1000000; + diffs[i] = diff; + total += diff; + this.appendToFile(outputPath, "ITERATION" + i); + this.appendToFile(outputPath, String.valueOf(diff)); + } + } + + this.appendToFile(outputPath, "##########################################"); + this.appendToFile(outputPath, "DONE"); + for (String tablePath : tablePaths) { + this.appendToFile(outputPath, tablePath); + } + this.appendToFile(outputPath, "MS"); + this.appendToFile(outputPath, "TOTAL: " + total); + this.appendToFile(outputPath, "DIFFS: " + Arrays.toString(diffs)); + this.appendToFile(outputPath, "AVG: " + (total / 10)); + this.appendToFile(outputPath, "SD: " + sd(diffs)); + this.appendToFile(outputPath, "##########################################"); + } + + public void appendToFile(String path, String str) { + try ( + FileWriter writer = new FileWriter(path, true); + BufferedWriter bufferedWriter = new BufferedWriter(writer) + ) { + bufferedWriter.write(str); + bufferedWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void createTable(String path, String query) throws IOException { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + URI queryURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + query, + DeltaUpdateRuntimeTests.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + UpdatesForRumbleBenchmark.createDeltaConfiguration.setOutputPath(tableURI.getPath()); + UpdatesForRumbleBenchmark.createDeltaConfiguration.setQueryPath(queryURI.getPath()); + JsoniqQueryExecutor executor = new JsoniqQueryExecutor(UpdatesForRumbleBenchmark.createDeltaConfiguration); + executor.runQuery(); + } + + public void createTables(List paths, List queries) throws IOException { + for (int i = 0; i < paths.size(); i++) { + this.createTable(paths.get(i), queries.get(i)); + } + } + + public void deleteTable(String path) { + URI tableURI = FileSystemUtil.resolveURIAgainstWorkingDirectory( + path, + UpdatesForRumbleBenchmark.createDeltaConfiguration, + ExceptionMetadata.EMPTY_METADATA + ); + + try { + File oldTable = new File(tableURI.getPath()); + FileUtils.deleteDirectory(oldTable); + System.err.println("Deleted file: " + oldTable.getAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + } + + public void deleteTables(List paths) { + for (String path : paths) { + this.deleteTable(path); + } + } + + public static double sd(long[] arr) { + double sd = 0.0; + + long sum = Arrays.stream(arr).sum(); + long N = arr.length; + double mean = (double) sum / N; + + for (long x : arr) { + sd += Math.pow(x - mean, 2); + } + + return Math.sqrt(sd / N); + } + + + public static void main(String[] args) throws IOException { + + UpdatesForRumbleBenchmark benchmark = new UpdatesForRumbleBenchmark(); + setupSparkSession(); + + for (FileTuple ft : benchmark.benchmarkFiles) { + if (ft.isSQL()) { + benchmark.benchmarkSpark( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath(), + Optional.ofNullable(ft.getSqlQueryFunc()) + ); + } else { + benchmark.benchmarkDelta( + ft.getQueryMaterial(), + ft.getTablePaths(), + ft.getCreateTablePaths(), + ft.getOutputPath() + ); + } + } + + System.out.println("##########################################"); + System.out.println("DONE"); + System.out.println("##########################################"); + + } + + class FileTuple { + + private String queryPath; + private String sqlQuery; + private Consumer> sqlQueryFunc; + private List tablePaths; + private List createTablePaths; + private String outputPath; + private boolean isSQL; + + public FileTuple( + String queryPath, + String sqlQuery, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = sqlQuery; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public FileTuple( + String queryPath, + Consumer> sqlQueryFunc, + List tablePaths, + List createTablePaths, + String outputPath, + boolean isSQL + ) { + this.queryPath = queryPath; + this.sqlQuery = null; + this.sqlQueryFunc = sqlQueryFunc; + this.tablePaths = tablePaths; + this.createTablePaths = createTablePaths; + this.outputPath = outputPath; + this.isSQL = isSQL; + } + + public String getQueryMaterial() { + return this.isSQL() ? this.sqlQuery : this.queryPath; + } + + public Consumer> getSqlQueryFunc() { + return this.sqlQueryFunc; + } + + public List getTablePaths() { + return tablePaths; + } + + public List getCreateTablePaths() { + return createTablePaths; + } + + public String getOutputPath() { + return outputPath; + } + + public boolean isSQL() { + return isSQL; + } + } +} diff --git a/src/test/java/utils/annotations/AnnotationProcessor.java b/src/test/java/utils/annotations/AnnotationProcessor.java index bc90d83995..c34a4f9d86 100644 --- a/src/test/java/utils/annotations/AnnotationProcessor.java +++ b/src/test/java/utils/annotations/AnnotationProcessor.java @@ -33,6 +33,10 @@ public class AnnotationProcessor { public static final String OUTPUT_KEY = "Output"; + public static final String UPDATE_DIM_KEY = "UpdateDim"; + public static final String UPDATE_TABLE_KEY = "UpdateTable"; + public static final String CREATE_TABLE = "CreateTable"; + public static final String DELETE_TABLE = "DeleteTable"; public static final String ERROR_MESSAGE = "ErrorCode"; public static final String ERROR_METADATA = "ErrorMetadata"; public static final String SHOULD_PARSE = "ShouldParse"; @@ -68,6 +72,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A Optional shouldCompile = Optional.empty(); Optional shouldRun = Optional.empty(); + Optional deleteTable = Optional.of(false); + Optional createTable = Optional.of(false); + + Optional updateDim1 = Optional.empty(); + Optional updateDim2 = Optional.empty(); + Map parameters = new HashMap<>(); for (String token : annotationTokens) { if (token.equals(SHOULD_PARSE)) { @@ -84,6 +94,10 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A shouldRun = Optional.of(true); } else if (token.equals(SHOULD_CRASH)) { shouldRun = Optional.of(false); + } else if (token.equals(DELETE_TABLE)) { + deleteTable = Optional.of(true); + } else if (token.equals(CREATE_TABLE)) { + createTable = Optional.of(true); } else if (token.contains("=")) { String[] tokenParts = token.split("=", 2); @@ -93,6 +107,12 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (value.startsWith("\"")) { value = value.substring(1, value.length() - 1); } + if (key.equals(UPDATE_DIM_KEY)) { + String[] dimsArr = value.substring(1, value.length() - 1).split(","); + updateDim1 = Optional.of(Integer.parseInt(dimsArr[0])); + updateDim2 = Optional.of(Integer.parseInt(dimsArr[1])); + } + value = value.replaceAll("([^\\\\])\\\\n", "$1\n").replaceAll("\\\\\\\\n", "\\\\n"); parameters.put(key, value); } @@ -107,7 +127,18 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A if (shouldRun.isPresent()) { if (shouldRun.get()) - return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + if (updateDim1.isPresent() && updateDim2.isPresent()) { + return new UpdatingRunnableTestAnnotation( + parameters.get(OUTPUT_KEY), + parameters.get(UPDATE_TABLE_KEY), + updateDim1.get(), + updateDim2.get(), + deleteTable.get(), + createTable.get() + ); + } else { + return new RunnableTestAnnotation(parameters.get(OUTPUT_KEY)); + } else return new UnrunnableTestAnnotation( parameters.get(ERROR_MESSAGE), @@ -134,10 +165,38 @@ public static TestAnnotation readAnnotation(Reader reader) throws IOException, A ); } + public static String getUpdateDimensionAnnotation(Reader reader) throws IOException, AnnotationParseException { + String annotationText = readAnnotationText(reader); + if (annotationText.isEmpty()) { + throw new AnnotationParseException(annotationText, "Found empty annotation."); + } + String[] annotationTokens = annotationText.split("\\s*;\\s*"); + for (String token : annotationTokens) { + if (token.contains(UPDATE_DIM_KEY)) { + + String[] tokenParts = token.split("=", 2); + String value = tokenParts[1].trim(); + if (!value.matches("\\[\\d+,\\d+]")) { + throw new AnnotationParseException( + annotationText, + "UpdateDim key does not match regex: \"\\[\\d+,\\d+]\"" + ); + } + return value; + } + } + throw new AnnotationParseException(annotationText, "No UpdateDim key found."); + } + public static abstract class TestAnnotation { protected String expectedOutput = ""; protected String errorCode = ""; protected String errorMetadata = ""; + protected String deltaTablePath = ""; + protected int updatingDim1 = -1; + protected int updatingDim2 = -1; + protected boolean shouldDeleteTable = false; + protected boolean shouldCreateTable = false; public TestAnnotation() { } @@ -154,6 +213,26 @@ public String getErrorMetadata() { return this.errorMetadata; } + public String getDeltaTablePath() { + return this.deltaTablePath; + } + + public int getUpdatingDim1() { + return this.updatingDim1; + } + + public int getUpdatingDim2() { + return this.updatingDim2; + } + + public boolean shouldDeleteTable() { + return this.shouldDeleteTable; + } + + public boolean shouldCreateTable() { + return this.shouldCreateTable; + } + public abstract boolean shouldParse(); public abstract boolean shouldCompile(); @@ -189,6 +268,39 @@ public boolean shouldRun() { } } + public static class UpdatingRunnableTestAnnotation extends RunnableTestAnnotation { + public UpdatingRunnableTestAnnotation( + String expectedOut, + String deltaTablePath, + int dim1, + int dim2, + boolean shouldDeleteTable, + boolean shouldCreateTable + ) { + super(expectedOut); + this.deltaTablePath = deltaTablePath; + this.updatingDim1 = dim1; + this.updatingDim2 = dim2; + this.shouldDeleteTable = shouldDeleteTable; + this.shouldCreateTable = shouldCreateTable; + } + + @Override + public boolean shouldParse() { + return true; + } + + @Override + public boolean shouldCompile() { + return true; + } + + @Override + public boolean shouldRun() { + return true; + } + } + public static class UnrunnableTestAnnotation extends TestAnnotation { public UnrunnableTestAnnotation(String errorCode, String errorMetadata) { diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq new file mode 100644 index 0000000000..2e15a1595d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_1024.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable1024") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq new file mode 100644 index 0000000000..5829e78979 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq new file mode 100644 index 0000000000..5802ca9cd0 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq new file mode 100644 index 0000000000..f82079b88c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq new file mode 100644 index 0000000000..59f777293f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_256.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable256") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq new file mode 100644 index 0000000000..649616afa3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq new file mode 100644 index 0000000000..841d911858 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq new file mode 100644 index 0000000000..40f34d7ca9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_512.jq @@ -0,0 +1,4 @@ +let $data := delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable512") +return + for $d in $data + return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq new file mode 100644 index 0000000000..c9b7f957be --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq new file mode 100644 index 0000000000..0f9bc71d6c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q1/queries/q1_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return replace value of $d.public with (not $d.public) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq new file mode 100644 index 0000000000..06a22738f3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq new file mode 100644 index 0000000000..23c6e67d3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq new file mode 100644 index 0000000000..1547b12913 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return insert "nickname" : "cool_nickname", "popularity_rating" : -1 into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq new file mode 100644 index 0000000000..2093d7a1ce --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq new file mode 100644 index 0000000000..410b3b377c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq new file mode 100644 index 0000000000..3711d4999a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq new file mode 100644 index 0000000000..5021eacd49 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q2/q2_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return insert { "nickname" : "cool_nickname", "popularity_rating" : -1 } into $d.repo \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq new file mode 100644 index 0000000000..84e471bd83 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_128.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable128") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq new file mode 100644 index 0000000000..6589171005 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_16.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable16") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq new file mode 100644 index 0000000000..2dc942b7e6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_2.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable2") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq new file mode 100644 index 0000000000..891bcfd8eb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_32.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable32") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq new file mode 100644 index 0000000000..d384fb3915 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_4.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable4") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq new file mode 100644 index 0000000000..41f1ddcd93 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_64.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable64") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq new file mode 100644 index 0000000000..79ae554e44 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/GH_Q3/q3_8.jq @@ -0,0 +1,7 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/bigghTables/bigghTable8") +return ( + insert "ids" : [ { "repo_id" : $d.repo.id, "actor_id" : $d.actor.id, "id" : $d.id } ] into $d, + delete $d.repo.id, + delete $d.actor.id, + delete $d.id +) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq new file mode 100644 index 0000000000..097b0c995f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_1024.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 1024 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq new file mode 100644 index 0000000000..fae644a404 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq new file mode 100644 index 0000000000..d64f128d57 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq new file mode 100644 index 0000000000..7bd206f010 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq new file mode 100644 index 0000000000..efad60cf3e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_256.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 256 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq new file mode 100644 index 0000000000..6731689230 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq new file mode 100644 index 0000000000..cde52b0290 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq new file mode 100644 index 0000000000..fb815bb7c9 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_512.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 512 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq new file mode 100644 index 0000000000..bc0ddb4ac3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq new file mode 100644 index 0000000000..405cf2a591 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/createTables/create_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/biggh.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq new file mode 100644 index 0000000000..5490e977e4 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/create_order_line_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/order_line.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq new file mode 100644 index 0000000000..921c7b140a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery128.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable128")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq new file mode 100644 index 0000000000..fc05618036 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery16.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable16")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq new file mode 100644 index 0000000000..46f73aeecd --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery2.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable2")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq new file mode 100644 index 0000000000..aeb4e3ef2a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery32.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable32")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq new file mode 100644 index 0000000000..0956fc927f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery4.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable4")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq new file mode 100644 index 0000000000..bea5c6cce8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery64.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable64")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq new file mode 100644 index 0000000000..306def01bb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/delivery_trans/delivery8.jq @@ -0,0 +1,13 @@ +let $no_o_id := 4 +let $w_id := 1 +let $d_id_to_ol_total := ( + for $d in delta-file("../../../queries/delta_benchmark_data/districtTable"), + $ol in delta-file("../../../queries/delta_benchmark_data/orderLineTable")[ $$.OL_D_ID eq $d.D_ID ] + where $ol.OL_W_ID eq $w_id and $ol.OL_O_ID eq $no_o_id + group by $d_id := $d.D_ID + return { "d_id" : $d_id, "ol_total" : sum($ol.OL_AMOUNT) } +) +for $d in $d_id_to_ol_total, + $c in delta-file("../../../queries/delta_benchmark_data/customerTable8")[ $$.C_D_ID eq $d.d_id ] +where $c.C_W_ID eq $w_id +return replace value of $c.C_BALANCE with ($c.C_BALANCE + $d.ol_total) diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq new file mode 100644 index 0000000000..5d96bb135c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_district_table.jq @@ -0,0 +1,2 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/district.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq new file mode 100644 index 0000000000..e71e9f916a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq new file mode 100644 index 0000000000..fd520ab0d6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq new file mode 100644 index 0000000000..05802c9ce6 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq new file mode 100644 index 0000000000..a870e414e3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq new file mode 100644 index 0000000000..4363d9b5a2 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq new file mode 100644 index 0000000000..c41f9c6706 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq new file mode 100644 index 0000000000..35dc83ca68 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/create_new_order_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/new_order.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq new file mode 100644 index 0000000000..1241944250 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_district.jq @@ -0,0 +1,3 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/districtTable") +where $d.D_ID eq 3 and $d.D_W_ID eq 1 +return replace value of $d.D_NEXT_O_ID with ($d.D_NEXT_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq new file mode 100644 index 0000000000..84aed67ddb --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_128.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable128") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq new file mode 100644 index 0000000000..9a3adbec20 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_16.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable16") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq new file mode 100644 index 0000000000..33b2fed59a --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_2.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable2") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq new file mode 100644 index 0000000000..e9b0551fe8 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_32.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable32") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq new file mode 100644 index 0000000000..124012776e --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_4.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable4") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq new file mode 100644 index 0000000000..f6de66971c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_64.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable64") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq new file mode 100644 index 0000000000..d31d121d48 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/new_order_trans/update_new_order_8.jq @@ -0,0 +1,2 @@ +for $d in delta-file("../../../queries/delta_benchmark_data/newOrderTable8") +return replace value of $d.NO_O_ID with ($d.NO_O_ID + 1) \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq new file mode 100644 index 0000000000..7797c1b486 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_128.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 128 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq new file mode 100644 index 0000000000..183462f129 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_16.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 16 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq new file mode 100644 index 0000000000..6adeb995c7 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_2.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 2 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq new file mode 100644 index 0000000000..f1a9ec0efa --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_32.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 32 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq new file mode 100644 index 0000000000..b66eb4d43c --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_4.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 4 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq new file mode 100644 index 0000000000..c970ea676f --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_64.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 64 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq new file mode 100644 index 0000000000..ebd23bdbe3 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/create_customer_table_8.jq @@ -0,0 +1,4 @@ +for $data in parquet-file("../../../queries/delta_benchmark_data/customer.parquet") +count $c +where $c le 8 +return $data \ No newline at end of file diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq new file mode 100644 index 0000000000..b62f191196 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment128.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable128") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq new file mode 100644 index 0000000000..dae4bbcc23 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment16.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable16") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq new file mode 100644 index 0000000000..06e5224f22 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment2.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable2") +return + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + if ($c.C_CREDIT eq "BC") + then + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + else + () + ) diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq new file mode 100644 index 0000000000..10c3a7fe66 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment32.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable32") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq new file mode 100644 index 0000000000..5840c4d7fe --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment4.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable4") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq new file mode 100644 index 0000000000..5a65d5f25d --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment64.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable64") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq new file mode 100644 index 0000000000..ce47364f95 --- /dev/null +++ b/src/test/resources/queries/delta-benchmark/payment_trans/payment8.jq @@ -0,0 +1,11 @@ +let $h_amt := 343 +for $c in delta-file("../../../queries/delta_benchmark_data/customerTable8") +return + if ($c.C_CREDIT eq "BC") + then + ( + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt, + replace value of $c.C_DATA with $c.C_DATA || $c.C_ID || $c.C_D_ID || $c.C_W_ID || $h_amt + ) + else + replace value of $c.C_BALANCE with $c.C_BALANCE + $h_amt diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..7ff1d10a07 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..21b493d056 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f9d97bc47e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..6ceaf6d6d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..021c5fc602 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..01f7ba6892 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..a053d2b7d8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..f8dfb82774 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc new file mode 100644 index 0000000000..48010533b1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/.part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..7b4b820771 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00000-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..f70a259448 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00001-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..30b9fc645a Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00002-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..b58d9de8fe Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00003-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..88e70a2eb4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00004-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..5e7dd6a7e8 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00005-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..0ccc0e3f1e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00006-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..3012443cac Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00007-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet new file mode 100644 index 0000000000..a9826c146b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/biggh.parquet/part-00008-678d3511-56f7-462d-8180-8683f10e34fe-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc new file mode 100644 index 0000000000..8f5ec23f1b Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/.part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/customer.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet new file mode 100644 index 0000000000..5a53151735 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/customer.parquet/part-00000-ea4ff45d-affd-402c-9ced-3b4ef3404f23-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc new file mode 100644 index 0000000000..03f5b4a9bf Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/.part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/district.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet new file mode 100644 index 0000000000..1f5e7cf1b9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/district.parquet/part-00000-35a358fa-6c00-4d92-a09c-315004baa60e-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc new file mode 100644 index 0000000000..2096c24645 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/.part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/history.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet new file mode 100644 index 0000000000..18c1626200 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/history.parquet/part-00000-bf62b2e6-b0b5-4d01-bfcd-03736360058f-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc new file mode 100644 index 0000000000..ae1171c149 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/.part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/item.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet new file mode 100644 index 0000000000..c671faefd6 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/item.parquet/part-00000-15b0ce88-8dc8-40af-b55c-4bffb20bc134-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc new file mode 100644 index 0000000000..1dfee0c6a9 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/.part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet new file mode 100644 index 0000000000..87a78c631e Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/new_order.parquet/part-00000-10a3bc1c-fca4-44eb-ac6d-50fdf205e2d2-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..aaceec6e1c Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/.part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet new file mode 100644 index 0000000000..46882244d5 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order.parquet/part-00000-83db82f3-3167-4079-aadd-4e20c5a538e0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc new file mode 100644 index 0000000000..faa3168a06 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/.part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet new file mode 100644 index 0000000000..7ae0da0023 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/order_line.parquet/part-00000-b1e7b03a-5649-4296-844c-39173d4b2b9b-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..b3afa45e61 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/.part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/stock.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet new file mode 100644 index 0000000000..3b8fcfbbc1 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/stock.parquet/part-00000-6d6e560a-e0ee-4c36-bc35-7f43d3b5a76a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc new file mode 100644 index 0000000000..349d348d83 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/.part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet new file mode 100644 index 0000000000..6f4761a7f4 Binary files /dev/null and b/src/test/resources/queries/delta_benchmark_data/warehouse.parquet/part-00000-706b32e3-99e0-4bf6-b141-cb31e77beb45-c000.snappy.parquet differ diff --git a/src/test/resources/queries/multirow.parquet/._SUCCESS.crc b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc new file mode 100644 index 0000000000..3d4106ee49 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/.part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/multirow.parquet/_SUCCESS b/src/test/resources/queries/multirow.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet new file mode 100644 index 0000000000..ea1eb4d227 Binary files /dev/null and b/src/test/resources/queries/multirow.parquet/part-00000-6e9fd8c2-2394-403c-bb91-2a96f0d7c7b0-c000.snappy.parquet differ diff --git a/src/test/resources/queries/nested_parquet/._SUCCESS.crc b/src/test/resources/queries/nested_parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc new file mode 100644 index 0000000000..9534b589d9 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/.part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/nested_parquet/_SUCCESS b/src/test/resources/queries/nested_parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet new file mode 100644 index 0000000000..58b2ec9422 Binary files /dev/null and b/src/test/resources/queries/nested_parquet/part-00000-685f3e37-ad7a-4a8e-b7e3-e1f936f5677c-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc new file mode 100644 index 0000000000..4937e844ba Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc new file mode 100644 index 0000000000..d3fe12f6bd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc new file mode 100644 index 0000000000..c62e953f4b Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/.part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc new file mode 100644 index 0000000000..2501e41449 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000000.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc new file mode 100644 index 0000000000..e8e4d1e22e Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000001.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc new file mode 100644 index 0000000000..25d19030f1 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000002.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc new file mode 100644 index 0000000000..516142b2fd Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/_delta_log/.00000000000000000003.json.crc differ diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json new file mode 100644 index 0000000000..f9ea9edf6b --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000000.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813691596,"operation":"WRITE","operationParameters":{"mode":"ErrorIfExists","partitionBy":"[]"},"isolationLevel":"Serializable","isBlindAppend":true,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6700"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"16dbf65a-b299-458f-83d9-e03565c90b09"}} +{"protocol":{"minReaderVersion":1,"minWriterVersion":2}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","partitionValues":{},"size":6700,"modificationTime":1689813691396,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\"},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json new file mode 100644 index 0000000000..fe993a51aa --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000001.json @@ -0,0 +1,4 @@ +{"commitInfo":{"timestamp":1689813791145,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":0,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6952"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"fbc16a9a-8ebb-48b4-b481-23a17dab9b1e"}} +{"metaData":{"id":"2f77d9ee-52ac-42d0-9880-56879974d5fd","format":{"provider":"parquet","options":{}},"schemaString":"{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"bool_array\",\"type\":{\"type\":\"array\",\"elementType\":\"boolean\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float_array\",\"type\":{\"type\":\"array\",\"elementType\":\"double\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64_array\",\"type\":{\"type\":\"array\",\"elementType\":\"long\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"object_array\",\"type\":{\"type\":\"array\",\"elementType\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"float\",\"type\":\"double\",\"nullable\":true,\"metadata\":{}},{\"name\":\"int64\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"object\",\"type\":{\"type\":\"struct\",\"fields\":[{\"name\":\"bool\",\"type\":\"boolean\",\"nullable\":true,\"metadata\":{}},{\"name\":\"null\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}}]},\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"string\",\"type\":\"string\",\"nullable\":true,\"metadata\":{}},{\"name\":\"string_array\",\"type\":{\"type\":\"array\",\"elementType\":\"string\",\"containsNull\":true},\"nullable\":true,\"metadata\":{}},{\"name\":\"rowID\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]}","partitionColumns":[],"configuration":{},"createdTime":1689813688368}} +{"add":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","partitionValues":{},"size":6952,"modificationTime":1689813790779,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":0,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet","deletionTimestamp":1689813791143,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6700}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json new file mode 100644 index 0000000000..d68b854a7d --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000002.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813799061,"operation":"UPDATE","operationParameters":{"predicate":"(rowID#1974L = 0)"},"readVersion":1,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numRemovedFiles":"1","numRemovedBytes":"6952","numCopiedRows":"0","numAddedChangeFiles":"0","executionTimeMs":"4326","scanTimeMs":"3529","numAddedFiles":"1","numUpdatedRows":"1","numAddedBytes":"6937","rewriteTimeMs":"791"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"89f89e3a-6ffb-4955-9d1d-50274b0a0b65"}} +{"remove":{"path":"part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet","deletionTimestamp":1689813799056,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6952}} +{"add":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813799023,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} diff --git a/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json new file mode 100644 index 0000000000..ab4f031b8e --- /dev/null +++ b/src/test/resources/queries/sample_json_delta/_delta_log/00000000000000000003.json @@ -0,0 +1,3 @@ +{"commitInfo":{"timestamp":1689813802612,"operation":"WRITE","operationParameters":{"mode":"Overwrite","partitionBy":"[]"},"readVersion":2,"isolationLevel":"Serializable","isBlindAppend":false,"operationMetrics":{"numFiles":"1","numOutputRows":"1","numOutputBytes":"6937"},"engineInfo":"Apache-Spark/3.3.2 Delta-Lake/2.3.0","txnId":"f4fe7ea7-81c9-4545-b379-f31282894f71"}} +{"add":{"path":"part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet","partitionValues":{},"size":6937,"modificationTime":1689813802246,"dataChange":true,"stats":"{\"numRecords\":1,\"minValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"maxValues\":{\"float\":4.2,\"int64\":42,\"object\":{\"float\":4.2,\"int64\":42,\"object\":{},\"string\":\"hello\"},\"string\":\"hello\",\"rowID\":0},\"nullCount\":{\"bool\":1,\"bool_array\":0,\"float\":0,\"float_array\":0,\"int64\":0,\"int64_array\":0,\"null\":1,\"object\":{\"bool\":0,\"float\":0,\"int64\":0,\"null\":1,\"object\":{\"bool\":0,\"null\":1},\"string\":0},\"object_array\":0,\"string\":0,\"string_array\":0,\"rowID\":0}}"}} +{"remove":{"path":"part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet","deletionTimestamp":1689813802610,"dataChange":true,"extendedFileMetadata":true,"partitionValues":{},"size":6937}} diff --git a/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-546f72de-6a53-4515-b18c-fe4a6d98f486-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet new file mode 100644 index 0000000000..62667e229a Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-e9dbc4cf-dcbe-4b69-b768-e0db8f756147-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet new file mode 100644 index 0000000000..0601ad41e4 Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-f3962698-a6e6-4fd7-af4e-f4163b491341-c000.snappy.parquet differ diff --git a/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet new file mode 100644 index 0000000000..5b182bc3cb Binary files /dev/null and b/src/test/resources/queries/sample_json_delta/part-00000-fdceb212-beac-4058-888b-d087a285192a-c000.snappy.parquet differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc new file mode 100644 index 0000000000..3b7b044936 Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/._SUCCESS.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc new file mode 100644 index 0000000000..819ca5424d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/.part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet.crc differ diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS b/src/test/resources/queries/xQuery_update_R_data/R.parquet/_SUCCESS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet new file mode 100644 index 0000000000..72699f151d Binary files /dev/null and b/src/test/resources/queries/xQuery_update_R_data/R.parquet/part-00000-877e45e2-0680-405f-9fc3-29c9b447eb43-c000.snappy.parquet differ diff --git a/src/test/resources/test_files/composability/FunctionDecl1.jq b/src/test/resources/test_files/composability/FunctionDecl1.jq index 7af7070021..5f4d7585df 100644 --- a/src/test/resources/test_files/composability/FunctionDecl1.jq +++ b/src/test/resources/test_files/composability/FunctionDecl1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { variable $x := 3; while ($x eq 3) { if ($x eq 3) then { diff --git a/src/test/resources/test_files/composability/FunctionDecl2.jq b/src/test/resources/test_files/composability/FunctionDecl2.jq index 4e28983171..73998d16e6 100644 --- a/src/test/resources/test_files/composability/FunctionDecl2.jq +++ b/src/test/resources/test_files/composability/FunctionDecl2.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { exit returning 1; }; diff --git a/src/test/resources/test_files/composability/FunctionDecl3.jq b/src/test/resources/test_files/composability/FunctionDecl3.jq index a7595b9837..211b34a7e8 100644 --- a/src/test/resources/test_files/composability/FunctionDecl3.jq +++ b/src/test/resources/test_files/composability/FunctionDecl3.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { +declare %nonsequential function foo() { copy $je := {"a" : 1} modify delete json $je.b return $je diff --git a/src/test/resources/test_files/composability/FunctionDeclErr1.jq b/src/test/resources/test_files/composability/FunctionDeclErr1.jq index b19b7b8323..7fc8e7a1ac 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr1.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr1.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="XQAN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -declare %an:sequential %an:nonsequential function foo() { 1 }; +declare %sequential %nonsequential function foo() { 1 }; (: it is a static error to have both sequential and nonsequential annotations :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr2.jq b/src/test/resources/test_files/composability/FunctionDeclErr2.jq index 2c5dedfe95..ac2d1d5a11 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr2.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr2.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:4:COLUMN:0:" :) -declare %an:sequential function barseq() { 0 }; +declare %sequential function barseq() { 0 }; declare function bar() { barseq() }; -declare %an:nonsequential function foo() {bar()}; +declare %nonsequential function foo() {bar()}; (: declared nonsequential with sequential body is not valid :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/FunctionDeclErr3.jq b/src/test/resources/test_files/composability/FunctionDeclErr3.jq index e7414b521e..1a35893026 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr3.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr3.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar() }; diff --git a/src/test/resources/test_files/composability/FunctionDeclErr4.jq b/src/test/resources/test_files/composability/FunctionDeclErr4.jq index fb850f17ea..922f053a2e 100644 --- a/src/test/resources/test_files/composability/FunctionDeclErr4.jq +++ b/src/test/resources/test_files/composability/FunctionDeclErr4.jq @@ -1,6 +1,6 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0006"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function bar() { 1 }; -declare %an:nonsequential function foo() { +declare %sequential function bar() { 1 }; +declare %nonsequential function foo() { bar(); }; diff --git a/src/test/resources/test_files/composability/VariableDecl1.jq b/src/test/resources/test_files/composability/VariableDecl1.jq index cf89be90b1..e2f2416676 100644 --- a/src/test/resources/test_files/composability/VariableDecl1.jq +++ b/src/test/resources/test_files/composability/VariableDecl1.jq @@ -1,3 +1,3 @@ (:JIQS: ShouldCompile:) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; declare variable $var := foo(); diff --git a/src/test/resources/test_files/composability/VariableDeclErr1.jq b/src/test/resources/test_files/composability/VariableDeclErr1.jq index d1bdc8cd7f..57224cad6b 100644 --- a/src/test/resources/test_files/composability/VariableDeclErr1.jq +++ b/src/test/resources/test_files/composability/VariableDeclErr1.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCCP0001"; ErrorMetadata="LINE:3:COLUMN:0:" :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; declare variable $var := foo(); (: variable declaration not allowed with non-updating and non-sequential expressions :) \ No newline at end of file diff --git a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq index d15310222e..3e80507965 100644 --- a/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq +++ b/src/test/resources/test_files/composability/VariableDeclarationStatementErr2.jq @@ -1,4 +1,4 @@ (:JIQS: ShouldNotCompile; ErrorCode="SCIN0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) -%an:nonassignable variable $je; +%nonassignable variable $je; (: at least one expr is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq index e94cb569f5..67a82ced36 100644 --- a/src/test/resources/test_files/parser/VariableDeclarationStatement.jq +++ b/src/test/resources/test_files/parser/VariableDeclarationStatement.jq @@ -1,2 +1,2 @@ (:JIQS: ShouldParse :) -%an:nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file +%nonassignable variable $uid := doc("users.xml").users.user_tuple[$$ eq "Roger Smith"].userid; \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq new file mode 100644 index 0000000000..80eb0295c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq new file mode 100644 index 0000000000..fcbea7a15f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[4,3]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/check-delta-transform/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq new file mode 100644 index 0000000000..a3abf80a3b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDelta.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[4,1]; Output="{ "bool" : true, "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string_array" : [ "hello" ], "string" : "null" }" :) +copy $je := delta-file("./tempDeltaTable") +modify replace value of json $je.string with "null" +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq new file mode 100644 index 0000000000..9a6d699d59 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/check-delta-transform/TransformWithDeltaErr.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; UpdateDim=[4,2]; ErrorCode="XUDY0014"; ErrorMetadata="LINE:5:COLUMN:11:" :) +let $data := delta-file("./tempDeltaTable") +return ( + copy $je := {"a" : 1} + modify delete json $data.string + return $je +) +(: Attempt to modify mutable delta file value inside transform without copy :) diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq new file mode 100644 index 0000000000..fe541dcd82 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayDelete.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,7]; Output="[ "SUCCESS" ]" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.new_array[[1]]; +delta-file("./tempDeltaTable").new_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq new file mode 100644 index 0000000000..e74f7460fd --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayInsert.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,5]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return insert json "SUCCESS" into $data.new_array at position 1; +delta-file("./tempDeltaTable").new_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq new file mode 100644 index 0000000000..12858250db --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaArrayReplace.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_array[[1]] with "DOUBLE SUCCESS"; +delta-file("./tempDeltaTable").new_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq new file mode 100644 index 0000000000..177b46c424 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectDelete.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,4]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.success; +delta-file("./tempDeltaTable").success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq new file mode 100644 index 0000000000..19bd6bade4 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectInsert.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,1]; Output="(SUCCESS, [ "SUCCESS" ])" :) +let $data := delta-file("./tempDeltaTable") +return (insert json "new_ins" : "SUCCESS" into $data, insert json "new_array" : ["SUCCESS"] into $data); +(delta-file("./tempDeltaTable").new_ins, delta-file("./tempDeltaTable").new_array) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq new file mode 100644 index 0000000000..5614b20b56 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectRename.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,3]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.new_ins as "success"; +delta-file("./tempDeltaTable").success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq new file mode 100644 index 0000000000..212df1297d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionDeltaObjectReplace.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; UpdateDim=[5,2]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_ins with "DOUBLE SUCCESS"; +delta-file("./tempDeltaTable").new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq new file mode 100644 index 0000000000..2003ce8a59 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsCreateDeltaLakeTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[5,0]; Output="true" :) +let $ret := create-delta-lake-table("./tempDeltaTable") +return $ret \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq new file mode 100644 index 0000000000..55473e11da --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/delta-lake-functions/FunctionsDeleteDeltaLakeTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[5,8]; Output="true" :) +let $ret := delete-delta-lake-table("./tempDeltaTable") +return $ret \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..e33e4fe550 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/multirow.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..005432527a --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/multirow-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq new file mode 100644 index 0000000000..8a9f00780f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaArrayDelete.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldRun; UpdateDim=[2,5]; Output="" :) +for $arr in delta-file("./tempDeltaTable").foobar +count $c1 +return + for $val in $arr[] + count $c2 + where $c1 eq $c2 + return delete json $arr[[$c2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq new file mode 100644 index 0000000000..b9e95c4802 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,2]; Output="(-1, -1)" :) +for $data in delta-file("./tempDeltaTable") +return $data.foo \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq new file mode 100644 index 0000000000..2de79a4a98 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,4]; Output="({ "is_1" : true, "is_not_1" : null }, { "is_1" : null, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq new file mode 100644 index 0000000000..d19724c780 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,6]; Output="([ "test2" ], [ "test4" ])" :) +for $data in delta-file("./tempDeltaTable") +return $data.foobar \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq new file mode 100644 index 0000000000..57bb8e5e50 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,8]; Output="({ "is_1" : true, "is_not_1" : false }, { "is_1" : false, "is_not_1" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1" : $data.is_1, "is_not_1" : $data.is_not_1} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq new file mode 100644 index 0000000000..7a102cdda2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,10]; Output="({ "is_1_2" : true, "is_not_1_2" : null }, { "is_1_2" : null, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq new file mode 100644 index 0000000000..58f8cefb04 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,12]; Output="({ "is_1_2" : true, "is_not_1_2" : false }, { "is_1_2" : false, "is_not_1_2" : true })" :) +for $data in delta-file("./tempDeltaTable") +return {"is_1_2" : $data.is_1_2, "is_not_1_2" : $data.is_not_1_2} \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq new file mode 100644 index 0000000000..da94780307 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,14]; Output="({ "key1" : "value1" }, { "key1" : "value1" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq new file mode 100644 index 0000000000..e0b1e0bd90 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaCheck8.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,16]; Output="({ "key1" : "value1", "key2" : "value2" }, { "key1" : "value1", "key2" : "value2" })" :) +for $data in delta-file("./tempDeltaTable") +return $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq new file mode 100644 index 0000000000..dec3ec9841 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,13]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json { "nest" : { "key1" : "value1" } } into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq new file mode 100644 index 0000000000..06f1ec6f69 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaNestedObjectInsert2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,15]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return insert json "key2" : "value2" into $data.nest \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq new file mode 100644 index 0000000000..9840b1fb22 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,3]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1" : true} into $data + else + insert json {"is_not_1" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq new file mode 100644 index 0000000000..2bf0c4899d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert2.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,9]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_1_2" : true} into $data + else + insert json {"is_not_1_2" : true} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq new file mode 100644 index 0000000000..b02277092c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectInsert3.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[2,11]; Output="" :) +for $data in delta-file("./tempDeltaTable") +count $c +return + if ($c eq 1) + then + insert json {"is_not_1_2" : false} into $data + else + insert json {"is_1_2" : false} into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq new file mode 100644 index 0000000000..f05fb5b2a6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[2,1]; Output="" :) +for $data in delta-file("./tempDeltaTable") +return replace value of json $data.foo with -1 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq new file mode 100644 index 0000000000..f17973da44 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/multirow-updates/MultirowDeltaUpsert.jq @@ -0,0 +1,14 @@ +(:JIQS: ShouldRun; UpdateDim=[2,7]; Output="" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +for $data in delta-file("./tempDeltaTable") +count $c +return ( + local:upsert($data, "is_1", $c eq 1), + local:upsert($data, "is_not_1", $c ne 1) +) diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..a0cb994520 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/nested_parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..a9ed501929 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/nested-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq new file mode 100644 index 0000000000..4334f51dde --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq new file mode 100644 index 0000000000..948015557e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json {"string" : "NEW SUCCESS" } into $data.object.object.object_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq new file mode 100644 index 0000000000..0d1d9c9eda --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[2]] with { "string" : "NEW DOUBLE SUCCESS" } \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq new file mode 100644 index 0000000000..3cd20c96f3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,2]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq new file mode 100644 index 0000000000..25ea91ad00 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,4]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq new file mode 100644 index 0000000000..b3fd3479fc --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq new file mode 100644 index 0000000000..cb27982197 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,8]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq new file mode 100644 index 0000000000..49eee99bf5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,10]; Output="{ "string" : "NEW SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq new file mode 100644 index 0000000000..5a23d90e0d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,12]; Output="{ "string" : "NEW DOUBLE SUCCESS" }" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq new file mode 100644 index 0000000000..3af8cc118b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,14]; Output="[ { "string" : "hello" } ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.object.object.object_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq new file mode 100644 index 0000000000..ad085737b3 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.object.object.object_array[[1]].success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq new file mode 100644 index 0000000000..1225fd497e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data.object.object.object_array[[1]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq new file mode 100644 index 0000000000..3f832e9c20 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.object.object.object_array[[1]].new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq new file mode 100644 index 0000000000..762c7b1d0c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/nested-updates/NestedDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[1,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.object.object.object_array[[1]].new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq new file mode 100644 index 0000000000..aaf6ee4972 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := parquet-file("../../../queries/sample-json.snappy.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq new file mode 100644 index 0000000000..52f4b677bb --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,15]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/simple-updates/tempDeltaTable"; Output="" :) +let $data := "" +return "" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq new file mode 100644 index 0000000000..8cda6c5961 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,13]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq new file mode 100644 index 0000000000..e6190a18d8 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,9]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "SUCCESS" into $data.string_array at position 2 \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq new file mode 100644 index 0000000000..dc3eab8bf4 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaArrayReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,11]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.string_array[[2]] with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq new file mode 100644 index 0000000000..38a5429ba7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,2]; Output="null" :) +let $data := delta-file("./tempDeltaTable") +return $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq new file mode 100644 index 0000000000..9a8b6e73fa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,4]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq new file mode 100644 index 0000000000..a9d5a32a21 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck3.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,6]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.new_ins \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq new file mode 100644 index 0000000000..70ad65ad1b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck4.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,8]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.success \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq new file mode 100644 index 0000000000..065f117e7d --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck5.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,10]; Output="SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq new file mode 100644 index 0000000000..44f6d47e97 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck6.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,12]; Output="DOUBLE SUCCESS" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array[[2]] \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq new file mode 100644 index 0000000000..883594e1da --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaCheck7.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,14]; Output="[ "hello" ]" :) +let $data := delta-file("./tempDeltaTable") +return $data.string_array \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq new file mode 100644 index 0000000000..2272f9b7ed --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectDelete.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,1]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return delete json $data.bool \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq new file mode 100644 index 0000000000..072bd22d5f --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectInsert.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,3]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return insert json "new_ins" : "SUCCESS" into $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq new file mode 100644 index 0000000000..0c3e0e50e2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectRename.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,7]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return rename json $data.new_ins as "success" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq new file mode 100644 index 0000000000..e3e29f83d6 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/simple-updates/SimpleDeltaObjectReplace.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[0,5]; Output="" :) +let $data := delta-file("./tempDeltaTable") +return replace value of json $data.new_ins with "DOUBLE SUCCESS" \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq new file mode 100644 index 0000000000..9fc124a3d2 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/CreateDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,0]; CreateTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := parquet-file("../../../queries/xQuery_update_R_data/R.parquet") +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq new file mode 100644 index 0000000000..bbe196ccd5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/DeleteDeltaTable.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,20]; DeleteTable; UpdateTable="./src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/R"; Output="" :) +let $data := "" +return $data \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq new file mode 100644 index 0000000000..f4a0b62e42 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,1]; Output="" :) +let $users := delta-file("./R").users +return append json {"userID" : "U07", "name" : "Annabel Lee"} into $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq new file mode 100644 index 0000000000..c42bf70c15 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ1Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,2]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq new file mode 100644 index 0000000000..8e3914ee2e --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,3]; Output="" :) +let $bids := delta-file("./R").bids +return append json {"userID" : "U07", "itemNO" : 1001, "bid" : 60, "bid_date" : "1999-02-01"} into $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq new file mode 100644 index 0000000000..f48dbc19f5 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ2Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,4]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq new file mode 100644 index 0000000000..3af1edb570 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; UpdateDim=[3,5]; Output="" :) +let $R := delta-file("./R") +let $users := $R.users[] +let $bids := $R.bids[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1002].bid) +return append json {"userID" : $uid, "itemNO" : 1002, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq new file mode 100644 index 0000000000..0276f2c2aa --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ3Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,6]; Output="({ "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" })" :) +let $bids := delta-file("./R").bids[] +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq new file mode 100644 index 0000000000..956b2c7502 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4.jq @@ -0,0 +1,9 @@ +(:JIQS: ShouldRun; UpdateDim=[3,7]; Output="" :) +for $user in delta-file("./R").users[] +where $user.name eq "Annabel Lee" +return + if ($user.rating) + then + replace value of json $user.rating with "B" + else + insert json "rating" : "B" into $user \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq new file mode 100644 index 0000000000..efc46afd7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ4Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,8]; Output="[ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Dee Linquent", "rating" : "D", "userID" : "U03" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ]" :) +let $users := delta-file("./R").users +return $users \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq new file mode 100644 index 0000000000..8299917db7 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5.jq @@ -0,0 +1,12 @@ +(:JIQS: ShouldRun; UpdateDim=[3,9]; Output="" :) +let $R := delta-file("./R") +let $bids := $R.bids[] +let $users := $R.users[] +let $uid := $users[$$.name eq "Annabel Lee"].userID +let $top_bid := max($bids[$$.itemNO eq 1007].bid) +return + if ($top_bid * 1.1 le 200) + then + append json {"userID" : $uid, "itemNO" : 1007, "bid" : $top_bid * 1.1, "bid_date" : "1999-02-01"} into $R.bids + else + () \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq new file mode 100644 index 0000000000..34afea2d7c --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ5Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,10]; Output="[ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 800, "bid_date" : "1999-02-17", "itemNO" : 1002, "userID" : "U03" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 175, "bid_date" : "1999-01-25", "itemNO" : 1007, "userID" : "U03" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ]" :) +let $bids := delta-file("./R").bids +return $bids \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq new file mode 100644 index 0000000000..b39a77026b --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6.jq @@ -0,0 +1,21 @@ +(:JIQS: ShouldRun; UpdateDim=[3,11]; Output="" :) +let $R := delta-file("./R") +let $usersSeq := $R.users[] +let $remove_uid := $usersSeq[$$.name eq "Dee Linquent"].userID +return + ( + for $item in $R.items[] + count $c + where $item.offered_by = $remove_uid + return delete json $R.items[[$c]] + , + for $bid in $R.bids[] + count $c + where $bid.userID = $remove_uid + return delete json $R.bids[[$c]] + , + for $user in $R.users[] + count $c + where $user.name eq "Dee Linquent" + return delete json $R.users[[$c]] + ) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq new file mode 100644 index 0000000000..177704a837 --- /dev/null +++ b/src/test/resources/test_files/runtime-delta-updates/xQuery-update-R/RQ6Check.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; UpdateDim=[3,12]; Output="{ "bids" : [ { "bid" : 35, "bid_date" : "1999-01-07", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 40, "bid_date" : "1999-01-08", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 45, "bid_date" : "1999-01-11", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 50, "bid_date" : "1999-01-13", "itemNO" : 1001, "userID" : "U04" }, { "bid" : 55, "bid_date" : "1999-01-15", "itemNO" : 1001, "userID" : "U02" }, { "bid" : 400, "bid_date" : "1999-02-14", "itemNO" : 1002, "userID" : "U01" }, { "bid" : 600, "bid_date" : "1999-02-16", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 1000, "bid_date" : "1999-02-25", "itemNO" : 1002, "userID" : "U04" }, { "bid" : 1200, "bid_date" : "1999-03-02", "itemNO" : 1002, "userID" : "U02" }, { "bid" : 15, "bid_date" : "1999-01-22", "itemNO" : 1003, "userID" : "U04" }, { "bid" : 20, "bid_date" : "1999-02-03", "itemNO" : 1003, "userID" : "U05" }, { "bid" : 40, "bid_date" : "1999-03-05", "itemNO" : 1004, "userID" : "U01" }, { "bid" : 200, "bid_date" : "1999-02-08", "itemNO" : 1007, "userID" : "U05" }, { "bid" : 225, "bid_date" : "1999-02-12", "itemNO" : 1007, "userID" : "U04" }, { "bid" : 60, "bid_date" : "1999-02-01", "itemNO" : 1001, "userID" : "U07" }, { "bid" : 1320, "bid_date" : "1999-02-01", "itemNO" : 1002, "userID" : "U07" } ], "items" : [ { "description" : "Red Bicycle", "end_date" : "1999-01-20", "itemNO" : "1001", "offered_by" : "U01", "reserve_price" : 40, "start_date" : "1999-01-05" }, { "description" : "Motorcycle", "end_date" : "1999-03-15", "itemNO" : "1002", "offered_by" : "U02", "reserve_price" : 500, "start_date" : "1999-02-11" }, { "description" : "Old Bicycle", "end_date" : "1999-02-20", "itemNO" : "1003", "offered_by" : "U02", "reserve_price" : 25, "start_date" : "1999-01-10" }, { "description" : "Tricycle", "end_date" : "1999-03-08", "itemNO" : "1004", "offered_by" : "U01", "reserve_price" : 15, "start_date" : "1999-02-25" }, { "description" : "Racing Bicycle", "end_date" : "1999-02-20", "itemNO" : "1007", "offered_by" : "U04", "reserve_price" : 200, "start_date" : "1999-01-20" }, { "description" : "Broken Bicycle", "end_date" : "1999-03-06", "itemNO" : "1008", "offered_by" : "U01", "reserve_price" : 25, "start_date" : "1999-02-05" } ], "users" : [ { "name" : "Tom Jones", "rating" : "B", "userID" : "U01" }, { "name" : "Mary Doe", "rating" : "A", "userID" : "U02" }, { "name" : "Roger Smith", "rating" : "C", "userID" : "U04" }, { "name" : "Jack Sprat", "rating" : "B", "userID" : "U05" }, { "name" : "Rip Van Winkle", "rating" : "B", "userID" : "U06" }, { "name" : "Annabel Lee", "rating" : "B", "userID" : "U07" } ] }" :) +let $R := delta-file("./R") +return $R \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq new file mode 100644 index 0000000000..2d0ba36f97 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/Delta.jq @@ -0,0 +1,3 @@ +(:JIQS: ShouldRun; Output="{ "bool_array" : [ true ], "float" : 4.2, "float_array" : [ 4.2 ], "int64" : 42, "int64_array" : [ 42 ], "object" : { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" }, "object_array" : [ { "bool" : true, "float" : 4.2, "int64" : 42, "object" : { "bool" : true }, "string" : "hello" } ], "string" : "hello", "string_array" : [ "hello" ] }" :) +delta-file("../../../queries/sample_json_delta") + diff --git a/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq new file mode 100644 index 0000000000..96782c23c5 --- /dev/null +++ b/src/test/resources/test_files/runtime-spark/FileInputs/DeltaFile-Error-NotFound1.jq @@ -0,0 +1,2 @@ +(:JIQS: ShouldCrash; ErrorCode="FODC0002"; ErrorMetadata="LINE:2;COLUMN:0;" :) +delta-file("./does-not-exist") diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq index 96ea32b888..016846e132 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/RecursiveFunctionWithLocalArgument.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="0":) -declare %an:assignable variable $x := 3; +declare %assignable variable $x := 3; declare function local:recursive_decrement_x($to_change) { if ($x gt 0) then { $x := $x - 1; diff --git a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq index 5f8edf653d..0ec946fda6 100644 --- a/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq +++ b/src/test/resources/test_files/runtime/ScriptingComplex/UpdateGlobalVariableWithUsernames.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldRun; Output="({ "name" : "test@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test1@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "aaa@aaa.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "a@a.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" }, { "name" : "test9999@test.com", "failed" : false, "email_verified" : true, "access-attempt" : "2016-11-28T16:00:47.203Z" })" :) -declare %an:assignable variable $res as item* := (); +declare %assignable variable $res as item* := (); declare function local:validate-and-return($username as xs:string) { variable $user-doc := json-doc("../../../queries/user-names.json"); variable $log := {}; diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq new file mode 100644 index 0000000000..b5bd41bff6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesArray6.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="[ 1, 2, 4 ]" :) +copy $je := [1 to 4] +modify (replace value of json $je[[3]] with 6, delete json $je[[3]]) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq new file mode 100644 index 0000000000..e77eb37e3a --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/MultipleUpdatesObject5.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="{ "b" : 2, "c" : 3, "d" : 4 }" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, replace value of json $je.a with 5) +return $je \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq new file mode 100644 index 0000000000..c16a2967af --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleDeleteErr7.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:38:" :) +copy $je := {"a" : 1} +modify (insert json "b" : 4 into $je, delete json $je.b) +return $je + +(: selector string does not exist in target object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq new file mode 100644 index 0000000000..6585bc5cfe --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr10.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0016"; ErrorMetadata="LINE:3:COLUMN:7:" :) +copy $je := [1 to 4] +modify insert json 5 into $je at position 6 +return $je + +(: selector expr does not evaluate to int within range of the target array :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq new file mode 100644 index 0000000000..ace107d8de --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleInsertErr11.jq @@ -0,0 +1,6 @@ +(:JIQS: ShouldCrash; ErrorCode="JNUP0006"; ErrorMetadata="LINE:3:COLUMN:27:" :) +copy $je := {"a": 1, "b": 2, "c": 3, "d": 4} +modify (delete json $je.a, insert json "a" : 10 into $je) +return $je + +(: selector key already exists in object in snapshot :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq new file mode 100644 index 0000000000..f382ed3c90 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr10.jq @@ -0,0 +1,20 @@ +(:JIQS: ShouldCrash; ErrorCode="XUDY0014"; ErrorMetadata="LINE:10:COLUMN:27:" :) +copy $je := [1 to 4] +modify () +return ( + let $x := ( + copy $ej := [5 to 8] + modify ( + let $x := ( + copy $ee := [5 to 8] + modify delete json $je[[1]] + return $ee + ) + return delete json $ej[[2]] + ) + return $ej + ) + return $je +) + +(: target of modify is not same level copy var :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq index 488b27d517..46fae609c8 100644 --- a/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq +++ b/src/test/resources/test_files/runtime/Updating/SimpleTransformErr6.jq @@ -5,4 +5,4 @@ let $y := copy $je := [1 to 4] return $je return $x -(: target of modify is not same level copy var :) +(: target of modify is not mutable :) diff --git a/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq new file mode 100644 index 0000000000..1105d41ac6 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/SimpleUpdateErr1.jq @@ -0,0 +1,5 @@ +(:JIQS: ShouldRun; Output="" :) +let $data := {"bool" : true, "int": 10} +return delete json $data.bool + +(: attempt to modify immutable variable :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq new file mode 100644 index 0000000000..c8959ac0ac --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction1.jq @@ -0,0 +1,11 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2, "c" : 3 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + if($o.$key) + then + replace value of json $o.$key with $val + else + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq new file mode 100644 index 0000000000..4bd8628fa2 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunction2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldRun; Output="{ "a" : 1, "b" : 2 }" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq new file mode 100644 index 0000000000..0ffb4c760e --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr1.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:6:COLUMN:20:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert(insert json "c" : 3 into $je, "c", 3) +return $je +(: argument of function call is not simple :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq new file mode 100644 index 0000000000..54e06fd8c0 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr2.jq @@ -0,0 +1,7 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0001"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare function local:upsert($o as object, $key as string, $val as item) { + insert json $key : $val into $o +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq new file mode 100644 index 0000000000..cb44b83486 --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr3.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0028"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) as item* { + () +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: declared updating function has return type :) \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq new file mode 100644 index 0000000000..3a0a8f7a5b --- /dev/null +++ b/src/test/resources/test_files/runtime/Updating/UpdatingFunctionErr4.jq @@ -0,0 +1,8 @@ +(:JIQS: ShouldCrash; ErrorCode="XUST0002"; ErrorMetadata="LINE:2:COLUMN:0:" :) +declare updating function local:upsert($o as object, $key as string, $val as item) { + $val +}; +copy $je := {"a" : 1, "b" : 2} +modify local:upsert($je, "c", 3) +return $je +(: updating function has simple body :) \ No newline at end of file diff --git a/src/test/resources/test_files/sequential/BlockStatementSequential.jq b/src/test/resources/test_files/sequential/BlockStatementSequential.jq index d8bee5457c..c7c92f713a 100644 --- a/src/test/resources/test_files/sequential/BlockStatementSequential.jq +++ b/src/test/resources/test_files/sequential/BlockStatementSequential.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:sequential function foo() { 1 }; +declare %sequential function foo() { 1 }; { variable $x := 3; diff --git a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq index 8ff7481c3b..74aa093cdb 100644 --- a/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq +++ b/src/test/resources/test_files/sequential/non-sequential/NonSequential7.jq @@ -1,5 +1,5 @@ (:JIQS: ShouldCompile :) -declare %an:nonsequential function foo() { 1 }; +declare %nonsequential function foo() { 1 }; { variable $x := 3;