From ab5852c63779036e83a862067efc9b94afdfa122 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 14:25:16 +0200 Subject: [PATCH 01/93] First version --- .../function/fulltext/MatchFunction.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java new file mode 100644 index 0000000000000..10deaaf765aa5 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.expression.function.fulltext; + +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.querydsl.query.MatchQuery; +import org.elasticsearch.xpack.esql.core.querydsl.query.Query; +import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; +import org.elasticsearch.xpack.esql.core.tree.NodeInfo; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.expression.function.Example; +import org.elasticsearch.xpack.esql.expression.function.FunctionInfo; +import org.elasticsearch.xpack.esql.expression.function.Param; + +import java.io.IOException; +import java.util.List; + +/** + * Full text function that performs a {@link QueryStringQuery} . + */ +public class MatchFunction extends FullTextFunction { + + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( + Expression.class, + "Matchstr", + MatchFunction::new + ); + + private final Expression field; + + @FunctionInfo( + returnType = "boolean", + preview = true, + description = "Performs a match query on the specified fields. Returns true if the provided query matches the row.", + examples = { @Example(file = "match-function", tag = "match-with-field") } + ) + public MatchFunction( + Source source, + @Param( + name = "field", + type = { "keyword", "text" }, + description = "Field or field pattern that the query will target." + ) Expression field, + @Param( + name = "query", + type = { "keyword", "text" }, + description = "Query string in Lucene query string format." + ) Expression matchQuery + ) { + super(source, matchQuery); + this.field = field; + } + + private MatchFunction(StreamInput in) throws IOException { + super(in); + field = in.readNamedWriteable(Expression.class); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeNamedWriteable(field); + } + + @Override + public String functionName() { + return "MATCHSTR"; + } + + @Override + public Query asQuery() { + Object queryAsObject = query().fold(); + if (queryAsObject instanceof BytesRef == false) { + throw new IllegalArgumentException("Query in MATCHSTR function needs to be resolved to a string"); + } + Object fieldAsObject = field.fold(); + if (fieldAsObject instanceof BytesRef == false) { + throw new IllegalArgumentException("Field in NATCHSTR function needs to be resolved to a string"); + } + + return new MatchQuery(source(), ((BytesRef) fieldAsObject).utf8ToString(), ((BytesRef) queryAsObject).utf8ToString()); + } + + @Override + public Expression replaceChildren(List newChildren) { + return new MatchFunction(source(), newChildren.get(0), newChildren.get(1)); + } + + @Override + protected NodeInfo info() { + return NodeInfo.create(this, MatchFunction::new, field, query()); + } + + @Override + public String getWriteableName() { + return ENTRY.name; + } +} From 35573a3f4ddad27600a4bf91eed6bbb6c68514bd Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 14:25:53 +0200 Subject: [PATCH 02/93] Wire up for capabilities and function registry --- .../elasticsearch/xpack/esql/action/EsqlCapabilities.java | 5 +++++ .../xpack/esql/expression/function/EsqlFunctionRegistry.java | 4 +++- .../esql/expression/function/fulltext/FullTextFunction.java | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java index 88cbcbd608926..5e2eed50e489d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java @@ -316,6 +316,11 @@ public enum Cap { */ QSTR_FUNCTION(true), + /** + * MATCH function + */ + MATCH_FUNCTION(true), + /** * Don't optimize CASE IS NOT NULL function by not requiring the fields to be not null as well. * https://github.com/elastic/elasticsearch/issues/112704 diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java index f96742b5a4d91..ba5aa8d63659e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java @@ -32,6 +32,7 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.Top; import org.elasticsearch.xpack.esql.expression.function.aggregate.Values; import org.elasticsearch.xpack.esql.expression.function.aggregate.WeightedAvg; +import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; import org.elasticsearch.xpack.esql.expression.function.grouping.Bucket; import org.elasticsearch.xpack.esql.expression.function.grouping.Categorize; @@ -390,7 +391,8 @@ private static FunctionDefinition[][] snapshotFunctions() { def(Categorize.class, Categorize::new, "categorize"), def(Rate.class, Rate::withUnresolvedTimestamp, "rate"), // Full text functions - def(QueryStringFunction.class, QueryStringFunction::new, "qstr") } }; + def(QueryStringFunction.class, QueryStringFunction::new, "qstr"), + def(MatchFunction.class, MatchFunction::new, "matchstr")} }; } public EsqlFunctionRegistry snapshotRegistry() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 54730eec4f317..21fa35c64508f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -38,6 +38,9 @@ public static List getNamedWriteables() { if (EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()) { entries.add(QueryStringFunction.ENTRY); } + if (EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()) { + entries.add(MatchFunction.ENTRY); + } return entries; } From b2fc88743642bafe5f8524967d71de7e189c62da Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 14:26:12 +0200 Subject: [PATCH 03/93] Minor text message change --- .../esql/expression/function/fulltext/QueryStringFunction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index fa331acd08655..748af1cd34e4f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -66,7 +66,7 @@ public Query asQuery() { if (queryAsObject instanceof BytesRef queryAsBytesRef) { return new QueryStringQuery(source(), queryAsBytesRef.utf8ToString(), Map.of(), null); } else { - throw new IllegalArgumentException("Query in QSTR needs to be resolved to a string"); + throw new IllegalArgumentException("Query in QSTR function needs to be resolved to a string"); } } From fdbd22610ba93e2f21c4394d340adbfa6f6c0b69 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 18:24:37 +0200 Subject: [PATCH 04/93] Changed hierarchy to allow for more expressions besides query --- .../esql/core/expression/TypeResolutions.java | 18 +++++----- .../function/fulltext/FullTextFunction.java | 33 ++++++++----------- .../function/fulltext/MatchFunction.java | 27 ++++++++++++--- .../fulltext/QueryStringFunction.java | 12 +++++-- 4 files changed, 54 insertions(+), 36 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index ab05a71b0e1c6..ed3285673cdbc 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -133,15 +133,9 @@ public static TypeResolution isFoldable(Expression e, String operationName, Para return TypeResolution.TYPE_RESOLVED; } - public static TypeResolution isNotNullAndFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { - TypeResolution resolution = isFoldable(e, operationName, paramOrd); - - if (resolution.unresolved()) { - return resolution; - } - - if (e.dataType() == DataType.NULL || e.fold() == null) { - resolution = new TypeResolution( + public static TypeResolution isNotNull(Expression e, String operationName, ParamOrdinal paramOrd) { + if (e.dataType() == DataType.NULL) { + return new TypeResolution( format( null, "{}argument of [{}] cannot be null, received [{}]", @@ -152,7 +146,11 @@ public static TypeResolution isNotNullAndFoldable(Expression e, String operation ); } - return resolution; + return TypeResolution.TYPE_RESOLVED; + } + + public static TypeResolution isNotNullAndFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { + return isNotNull(e, operationName, paramOrd).and(isFoldable(e, operationName, paramOrd)); } public static TypeResolution isNotFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 21fa35c64508f..4be2fd5c79316 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -8,21 +8,18 @@ package org.elasticsearch.xpack.esql.expression.function.fulltext; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; -import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; import org.elasticsearch.xpack.esql.core.expression.function.Function; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; -import org.elasticsearch.xpack.esql.core.util.PlanStreamInput; -import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; -import static java.util.Collections.singletonList; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNullAndFoldable; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; @@ -46,38 +43,36 @@ public static List getNamedWriteables() { private final Expression query; - protected FullTextFunction(Source source, Expression query) { - super(source, singletonList(query)); + protected FullTextFunction(Source source, Expression query, Expression... additionalChildren) { + super(source, Stream.concat(Stream.of(query), Stream.of(additionalChildren)).toList()); this.query = query; } - protected FullTextFunction(StreamInput in) throws IOException { - this(Source.readFrom((StreamInput & PlanStreamInput) in), in.readNamedWriteable(Expression.class)); - } - @Override public DataType dataType() { return DataType.BOOLEAN; } @Override - protected TypeResolution resolveType() { + protected final TypeResolution resolveType() { if (childrenResolved() == false) { return new TypeResolution("Unresolved children"); } - return isString(query(), sourceText(), DEFAULT).and(isNotNullAndFoldable(query(), functionName(), DEFAULT)); + return doResolveType(); } - public Expression query() { - return query; + protected TypeResolution doResolveType() { + return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), functionName(), queryParamOrdinal())); } - @Override - public void writeTo(StreamOutput out) throws IOException { - source().writeTo(out); - out.writeNamedWriteable(query); + public Expression query() { + return query; } public abstract Query asQuery(); + + protected TypeResolutions.ParamOrdinal queryParamOrdinal() { + return DEFAULT; + } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 10deaaf765aa5..d3787b0fd0c64 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -12,6 +12,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; import org.elasticsearch.xpack.esql.core.querydsl.query.MatchQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; @@ -20,10 +21,16 @@ import org.elasticsearch.xpack.esql.expression.function.Example; import org.elasticsearch.xpack.esql.expression.function.FunctionInfo; import org.elasticsearch.xpack.esql.expression.function.Param; +import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput; import java.io.IOException; import java.util.List; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; + /** * Full text function that performs a {@link QueryStringQuery} . */ @@ -56,19 +63,19 @@ public MatchFunction( description = "Query string in Lucene query string format." ) Expression matchQuery ) { - super(source, matchQuery); + super(source, matchQuery, field); this.field = field; } private MatchFunction(StreamInput in) throws IOException { - super(in); - field = in.readNamedWriteable(Expression.class); + this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); } @Override public void writeTo(StreamOutput out) throws IOException { - super.writeTo(out); + source().writeTo(out); out.writeNamedWriteable(field); + out.writeNamedWriteable(query()); } @Override @@ -90,9 +97,15 @@ public Query asQuery() { return new MatchQuery(source(), ((BytesRef) fieldAsObject).utf8ToString(), ((BytesRef) queryAsObject).utf8ToString()); } + @Override + protected TypeResolution doResolveType() { + return isNotNull(field, functionName(), FIRST).and(isString(field, functionName(), FIRST)).and(super.doResolveType()); + } + @Override public Expression replaceChildren(List newChildren) { - return new MatchFunction(source(), newChildren.get(0), newChildren.get(1)); + // Query is the first child, field is the second child + return new MatchFunction(source(), newChildren.get(1), newChildren.getFirst()); } @Override @@ -104,4 +117,8 @@ protected NodeInfo info() { public String getWriteableName() { return ENTRY.name; } + + protected TypeResolutions.ParamOrdinal queryParamOrdinal() { + return SECOND; + } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 748af1cd34e4f..0a81448b68e0e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -10,6 +10,7 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; @@ -18,6 +19,7 @@ import org.elasticsearch.xpack.esql.expression.function.Example; import org.elasticsearch.xpack.esql.expression.function.FunctionInfo; import org.elasticsearch.xpack.esql.expression.function.Param; +import org.elasticsearch.xpack.esql.io.stream.PlanStreamInput; import java.io.IOException; import java.util.List; @@ -52,7 +54,13 @@ public QueryStringFunction( } private QueryStringFunction(StreamInput in) throws IOException { - super(in); + this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(query()); } @Override @@ -72,7 +80,7 @@ public Query asQuery() { @Override public Expression replaceChildren(List newChildren) { - return new QueryStringFunction(source(), newChildren.get(0)); + return new QueryStringFunction(source(), newChildren.getFirst()); } @Override From e4c1fbe1328a5e1e86db21e3699630e8ce0d5ebc Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 18:25:33 +0200 Subject: [PATCH 05/93] Change name to matchstr in registry --- .../xpack/esql/expression/function/EsqlFunctionRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java index ba5aa8d63659e..2a5ea495ddcd8 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java @@ -392,7 +392,7 @@ private static FunctionDefinition[][] snapshotFunctions() { def(Rate.class, Rate::withUnresolvedTimestamp, "rate"), // Full text functions def(QueryStringFunction.class, QueryStringFunction::new, "qstr"), - def(MatchFunction.class, MatchFunction::new, "matchstr")} }; + def(MatchFunction.class, MatchFunction::new, "matchstr") } }; } public EsqlFunctionRegistry snapshotRegistry() { From 9c934121d786f8d359e4902949f8d124729919fd Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 18:25:57 +0200 Subject: [PATCH 06/93] Added VerifierTests for matchstr --- .../xpack/esql/analysis/VerifierTests.java | 129 +++++++++++++----- 1 file changed, 94 insertions(+), 35 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 0b83b76992546..a358e8b5f5be2 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -26,6 +26,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; @@ -1107,75 +1108,117 @@ private void assertMatchCommand(String lineAndColumn, String command, String que assertThat(error(query, defaultAnalyzer, exception), containsString(expectedErrorMessage)); } - public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { + public void testQueryStringFunctionNotAllowedAfterCommands() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - // Source commands - assertEquals("1:13: [QSTR] function cannot be used after SHOW", error("show info | where qstr(\"8.16.0\")")); + assertEquals("1:13: [QSTR] function cannot be used after SHOW", error("show info | where qstr(\"Anna\")")); assertEquals("1:17: [QSTR] function cannot be used after ROW", error("row a= \"Anna\" | where qstr(\"Anna\")")); + checkFullTextFunctionNotAllowedAfterCommands("QSTR", "qstr(\"Anna\")"); + } + + public void testMatchFunctionNotAllowedAfterCommands() throws Exception { + assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals("1:13: [MATCHSTR] function cannot be used after SHOW", error("show info | where matchstr(version, \"8.*\")")); + checkFullTextFunctionNotAllowedAfterCommands("MATCHSTR", "matchstr(first_name, \"Anna\")"); + } + + private void checkFullTextFunctionNotAllowedAfterCommands(String functionName, String functionInvocation) throws Exception { + + // Source commands + String function = functionName.toLowerCase(Locale.ROOT); // Processing commands assertEquals( - "1:43: [QSTR] function cannot be used after DISSECT", - error("from test | dissect first_name \"%{foo}\" | where qstr(\"Connection\")") + "1:43: [" + functionName + "] function cannot be used after DISSECT", + error("from test | dissect first_name \"%{foo}\" | where " + functionInvocation) ); - assertEquals("1:27: [QSTR] function cannot be used after DROP", error("from test | drop emp_no | where qstr(\"Anna\")")); assertEquals( - "1:71: [QSTR] function cannot be used after ENRICH", - error("from test | enrich languages on languages with lang = language_name | where qstr(\"Anna\")") + "1:27: [" + functionName + "] function cannot be used after DROP", + error("from test | drop emp_no | where " + functionInvocation) ); - assertEquals("1:26: [QSTR] function cannot be used after EVAL", error("from test | eval z = 2 | where qstr(\"Anna\")")); assertEquals( - "1:44: [QSTR] function cannot be used after GROK", - error("from test | grok last_name \"%{WORD:foo}\" | where qstr(\"Anna\")") + "1:71: [" + functionName + "] function cannot be used after ENRICH", + error("from test | enrich languages on languages with lang = language_name | where " + functionInvocation) ); - assertEquals("1:27: [QSTR] function cannot be used after KEEP", error("from test | keep emp_no | where qstr(\"Anna\")")); - assertEquals("1:24: [QSTR] function cannot be used after LIMIT", error("from test | limit 10 | where qstr(\"Anna\")")); assertEquals( - "1:35: [QSTR] function cannot be used after MV_EXPAND", - error("from test | mv_expand last_name | where qstr(\"Anna\")") + "1:26: [" + functionName + "] function cannot be used after EVAL", + error("from test | eval z = 2 | where " + functionInvocation) ); assertEquals( - "1:45: [QSTR] function cannot be used after RENAME", - error("from test | rename last_name as full_name | where qstr(\"Anna\")") + "1:44: [" + functionName + "] function cannot be used after GROK", + error("from test | grok last_name \"%{WORD:foo}\" | where " + functionInvocation) ); assertEquals( - "1:52: [QSTR] function cannot be used after STATS", - error("from test | STATS c = COUNT(emp_no) BY languages | where qstr(\"Anna\")") + "1:31: [" + functionName + "] function cannot be used after KEEP", + error("from test | keep first_name | where " + functionInvocation) + ); + assertEquals( + "1:24: [" + functionName + "] function cannot be used after LIMIT", + error("from test | limit 10 | where " + functionInvocation) + ); + assertEquals( + "1:35: [" + functionName + "] function cannot be used after MV_EXPAND", + error("from test | mv_expand last_name | where " + functionInvocation) + ); + assertEquals( + "1:45: [" + functionName + "] function cannot be used after RENAME", + error("from test | rename last_name as full_name | where " + functionInvocation) + ); + assertEquals( + "1:53: [" + functionName + "] function cannot be used after STATS", + error("from test | STATS c = COUNT(emp_no) BY first_name | where " + functionInvocation) ); // Some combination of processing commands assertEquals( - "1:38: [QSTR] function cannot be used after LIMIT", - error("from test | keep emp_no | limit 10 | where qstr(\"Anna\")") + "1:42: [" + functionName + "] function cannot be used after LIMIT", + error("from test | keep first_name | limit 10 | where " + functionInvocation) ); assertEquals( - "1:46: [QSTR] function cannot be used after MV_EXPAND", - error("from test | limit 10 | mv_expand last_name | where qstr(\"Anna\")") + "1:46: [" + functionName + "] function cannot be used after MV_EXPAND", + error("from test | limit 10 | mv_expand last_name | where " + functionInvocation) ); assertEquals( - "1:52: [QSTR] function cannot be used after KEEP", - error("from test | mv_expand last_name | keep last_name | where qstr(\"Anna\")") + "1:53: [" + functionName + "] function cannot be used after KEEP", + error("from test | mv_expand last_name | keep first_name | where " + functionInvocation) ); assertEquals( - "1:77: [QSTR] function cannot be used after RENAME", - error("from test | STATS c = COUNT(emp_no) BY languages | rename c as total_emps | where qstr(\"Anna\")") + "1:78: [" + functionName + "] function cannot be used after RENAME", + error("from test | STATS c = COUNT(emp_no) BY first_name | rename c as total_emps | where " + functionInvocation) ); assertEquals( - "1:54: [QSTR] function cannot be used after KEEP", - error("from test | rename last_name as name | keep emp_no | where qstr(\"Anna\")") + "1:58: [" + functionName + "] function cannot be used after KEEP", + error("from test | rename last_name as name | keep first_name | where " + functionInvocation) ); } - public void testQueryStringFunctionsOnlyAllowedInWhere() throws Exception { + public void testQueryStringFunctionOnlyAllowedInWhere() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - assertEquals("1:22: [QSTR] function is only supported in WHERE commands", error("from test | eval y = qstr(\"Anna\")")); - assertEquals("1:18: [QSTR] function is only supported in WHERE commands", error("from test | sort qstr(\"Connection\") asc")); - assertEquals("1:5: [QSTR] function is only supported in WHERE commands", error("row qstr(\"Connection\")")); + assertEquals("1:9: [QSTR] function is only supported in WHERE commands", error("row a = qstr(\"Anna\")")); + checkFullTextFunctionsOnlyAllowedInWhere("QSTR", "qstr(\"Anna\")"); + } + + public void testMatchFunctionOnlyAllowedInWhere() throws Exception { + assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + checkFullTextFunctionsOnlyAllowedInWhere("MATCHSTR", "matchstr(first_name, \"Anna\")"); + } + + private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, String functionInvocation) throws Exception { + String function = functionName.toLowerCase(Locale.ROOT); + assertEquals( + "1:22: [" + functionName + "] function is only supported in WHERE commands", + error("from test | eval y = " + functionInvocation) + ); + assertEquals( + "1:18: [" + functionName + "] function is only supported in WHERE commands", + error("from test | sort " + functionInvocation + " asc") + ); assertEquals( - "1:23: [QSTR] function is only supported in WHERE commands", - error("from test | STATS c = qstr(\"foo\") BY languages") + "1:23: [" + functionName + "] function is only supported in WHERE commands", + error("from test | STATS c = " + functionInvocation + " BY first_name") ); } @@ -1187,6 +1230,22 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } + public void testMatchFunctionArgNotNullOrConstant() throws Exception { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + // assertEquals("1:19: first argument of [MATCHSTR] cannot be null, received [null]", error("from test | where matchstr(null, + // \"Anna\")")); + assertEquals( + "1:19: second argument of [MATCHSTR] cannot be null, received [null]", + error("from test | where matchstr(first_name, null)") + ); + assertEquals( + "1:19: second argument of [MATCHSTR] must be a constant, received [first_name]", + error("from test | where matchstr(first_name, first_name)") + ); + // Other value types are tested in QueryStringFunctionTests + } + public void testCoalesceWithMixedNumericTypes() { assertEquals( "1:22: second argument of [coalesce(languages, height)] must be [integer], found value [height] type [double]", From f48d6488d36bf61c756e69f5b49bdf5e90ce5006 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 20 Sep 2024 18:31:38 +0200 Subject: [PATCH 07/93] Fix TypeResolution method --- .../esql/core/expression/TypeResolutions.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index ed3285673cdbc..ef2e13be56f85 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -150,22 +150,25 @@ public static TypeResolution isNotNull(Expression e, String operationName, Param } public static TypeResolution isNotNullAndFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { - return isNotNull(e, operationName, paramOrd).and(isFoldable(e, operationName, paramOrd)); - } + TypeResolution resolution = isFoldable(e, operationName, paramOrd); - public static TypeResolution isNotFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { - if (e.foldable()) { - return new TypeResolution( + if (resolution.unresolved()) { + return resolution; + } + + if (e.dataType() == DataType.NULL || e.fold() == null) { + resolution = new TypeResolution( format( null, - "{}argument of [{}] must be a table column, found constant [{}]", + "{}argument of [{}] cannot be null, received [{}]", paramOrd == null || paramOrd == DEFAULT ? "" : paramOrd.name().toLowerCase(Locale.ROOT) + " ", operationName, Expressions.name(e) ) ); } - return TypeResolution.TYPE_RESOLVED; + + return resolution; } public static TypeResolution isType( From 58e1eeee651071c8688807687536191bb0c8f890 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 10:21:24 +0200 Subject: [PATCH 08/93] Accept only a field as a first argument --- .../function/fulltext/MatchFunction.java | 8 ++++---- .../xpack/esql/analysis/VerifierTests.java | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index d3787b0fd0c64..bba1b958ce223 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -12,6 +12,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.FieldAttribute; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; import org.elasticsearch.xpack.esql.core.querydsl.query.MatchQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; @@ -89,12 +90,11 @@ public Query asQuery() { if (queryAsObject instanceof BytesRef == false) { throw new IllegalArgumentException("Query in MATCHSTR function needs to be resolved to a string"); } - Object fieldAsObject = field.fold(); - if (fieldAsObject instanceof BytesRef == false) { - throw new IllegalArgumentException("Field in NATCHSTR function needs to be resolved to a string"); + if (field instanceof FieldAttribute == false) { + throw new IllegalArgumentException("Field in MATCHSTR function needs to be a field"); } - return new MatchQuery(source(), ((BytesRef) fieldAsObject).utf8ToString(), ((BytesRef) queryAsObject).utf8ToString()); + return new MatchQuery(source(), ((FieldAttribute) field).name(), ((BytesRef) queryAsObject).utf8ToString()); } @Override diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index a358e8b5f5be2..4b2965a3f1b4d 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1233,8 +1233,10 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { public void testMatchFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - // assertEquals("1:19: first argument of [MATCHSTR] cannot be null, received [null]", error("from test | where matchstr(null, - // \"Anna\")")); + assertEquals( + "1:19: first argument of [MATCHSTR] cannot be null, received [null]", + error("from test | where matchstr(null, \"Anna\")") + ); assertEquals( "1:19: second argument of [MATCHSTR] cannot be null, received [null]", error("from test | where matchstr(first_name, null)") @@ -1246,6 +1248,15 @@ public void testMatchFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } + public void testMatchFunctionNoField() throws Exception { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals( + "1:19: second argument of [MATCHSTR] cannot be null, received [null]", + error("from test | where matchstr(\"first_name\", null)") + ); + } + public void testCoalesceWithMixedNumericTypes() { assertEquals( "1:22: second argument of [coalesce(languages, height)] must be [integer], found value [height] type [double]", From 242d99312750f28e3c0a531d0e498157679f479c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 10:21:32 +0200 Subject: [PATCH 09/93] Add CSV tests --- .../main/resources/match-function.csv-spec | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec new file mode 100644 index 0000000000000..ae3bbdde72cb5 --- /dev/null +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -0,0 +1,118 @@ +############################################### +# Tests for Match function +# + +matchWithField +required_capability: match_function + +// tag::match-with-field[] +from books +| where matchstr(author, "Faulkner") +| keep book_no, author +| sort book_no +| limit 5; +// end::match-with-field[] + +// tag::match-with-field-result[] +book_no:keyword | author:text +2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] +2713 | William Faulkner +2847 | Colleen Faulkner +2883 | William Faulkner +3293 | Danny Faulkner +; +// end::match-with-field-result[] + +matchWithMultipleFunctions +required_capability: match_function + +from books +| where matchstr(title, "Return") AND matchstr(author, "Tolkien") +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +2714 | Return of the King Being the Third Part of The Lord of the Rings +7350 | Return of the Shadow +; + +matchWithQueryExpressions +required_capability: match_function + +from books +| where matchstr(title, CONCAT("Return ", " King")) +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +2714 | Return of the King Being the Third Part of The Lord of the Rings +7350 | Return of the Shadow +; + +matchWithDisjunction +required_capability: match_function + +from books +| where matchstr(title, "Return") or year > 2020 +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +2714 | Return of the King Being the Third Part of The Lord of the Rings +6818 | Hadji Murad +7350 | Return of the Shadow +; + +matchWithConjunction +required_capability: match_function + +from books +| where matchstr(title, "Rings") and ratings > 4.6 +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +4023 |A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings +7140 |The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) +; + +matchWithFunctionPushedToLucene +required_capability: match_function + +from hosts +| where matchstr(host, "beta") and cidr_match(ip1, "127.0.0.2/32", "127.0.0.3/32") +| keep card, host, ip0, ip1; +ignoreOrder:true + +card:keyword |host:keyword |ip0:ip |ip1:ip +eth1 |beta |127.0.0.1 |127.0.0.2 +; + +matchWithFunctionNotPushedToLucene +required_capability: match_function + +from books +| where matchstr(title, "rings") and length(description) > 600 +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +2675 | The Lord of the Rings - Boxed Set +2714 | Return of the King Being the Third Part of The Lord of the Rings +; + +matchWithMultipleWhereClauses +required_capability: match_function + +from books +| where matchstr(title, "rings") +| where matchstr(title, "lord") +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +2675 | The Lord of the Rings - Boxed Set +2714 | Return of the King Being the Third Part of The Lord of the Rings +4023 | A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings +7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) +; From 11b59f06e5ee2802e3312cc2e010608d787087c9 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:28:37 +0200 Subject: [PATCH 10/93] Modified type errors to include source and not function name --- .../function/fulltext/FullTextFunction.java | 2 +- .../expression/function/fulltext/MatchFunction.java | 2 +- .../xpack/esql/analysis/VerifierTests.java | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 4be2fd5c79316..76eb8f0ebeaba 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -63,7 +63,7 @@ protected final TypeResolution resolveType() { } protected TypeResolution doResolveType() { - return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), functionName(), queryParamOrdinal())); + return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal())); } public Expression query() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index bba1b958ce223..df093855888d3 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -99,7 +99,7 @@ public Query asQuery() { @Override protected TypeResolution doResolveType() { - return isNotNull(field, functionName(), FIRST).and(isString(field, functionName(), FIRST)).and(super.doResolveType()); + return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.doResolveType()); } @Override diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 4b2965a3f1b4d..b8daf541a6431 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1225,8 +1225,8 @@ private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, Strin public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - assertEquals("1:19: argument of [QSTR] must be a constant, received [first_name]", error("from test | where qstr(first_name)")); - assertEquals("1:19: argument of [QSTR] cannot be null, received [null]", error("from test | where qstr(null)")); + assertEquals("1:19: argument of [qstr(first_name)] must be a constant, received [first_name]", error("from test | where qstr(first_name)")); + assertEquals("1:19: argument of [qstr(null)] cannot be null, received [null]", error("from test | where qstr(null)")); // Other value types are tested in QueryStringFunctionTests } @@ -1234,15 +1234,15 @@ public void testMatchFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:19: first argument of [MATCHSTR] cannot be null, received [null]", + "1:19: first argument of [matchstr(null, \"Anna\")] cannot be null, received [null]", error("from test | where matchstr(null, \"Anna\")") ); assertEquals( - "1:19: second argument of [MATCHSTR] cannot be null, received [null]", + "1:19: second argument of [matchstr(first_name, null)] cannot be null, received [null]", error("from test | where matchstr(first_name, null)") ); assertEquals( - "1:19: second argument of [MATCHSTR] must be a constant, received [first_name]", + "1:19: second argument of [matchstr(first_name, first_name)] must be a constant, received [first_name]", error("from test | where matchstr(first_name, first_name)") ); // Other value types are tested in QueryStringFunctionTests @@ -1252,7 +1252,7 @@ public void testMatchFunctionNoField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:19: second argument of [MATCHSTR] cannot be null, received [null]", + "1:19: second argument of [matchstr(\"first_name\", null)] cannot be null, received [null]", error("from test | where matchstr(\"first_name\", null)") ); } From 0acd6044b8ff268c61dd1e44b370481d5381cc82 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:29:57 +0200 Subject: [PATCH 11/93] Don't do CSV tests for match function --- .../src/test/java/org/elasticsearch/xpack/esql/CsvTests.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java index 3e8d1e4e71562..f5b03d536fa81 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java @@ -255,6 +255,10 @@ public final void test() throws Throwable { "can't use QSTR function in csv tests", testCase.requiredCapabilities.contains(EsqlCapabilities.Cap.QSTR_FUNCTION.capabilityName()) ); + assumeFalse( + "can't use MATCHSTR function in csv tests", + testCase.requiredCapabilities.contains(EsqlCapabilities.Cap.MATCH_FUNCTION.capabilityName()) + ); if (Build.current().isSnapshot()) { assertThat( From 7957382873d73476e3ae77f5b252b91d86c78cff Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:30:24 +0200 Subject: [PATCH 12/93] Add MatchFunctionTests --- .../function/fulltext/MatchFunctionTests.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java new file mode 100644 index 0000000000000..b899a541fa9bd --- /dev/null +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.expression.function.fulltext; + +import com.carrotsearch.randomizedtesting.annotations.Name; +import com.carrotsearch.randomizedtesting.annotations.ParametersFactory; + +import org.apache.lucene.util.BytesRef; +import org.elasticsearch.xpack.core.security.authc.support.mapper.expressiondsl.FieldExpression; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.tree.Source; +import org.elasticsearch.xpack.esql.core.type.DataType; +import org.elasticsearch.xpack.esql.expression.function.AbstractFunctionTestCase; +import org.elasticsearch.xpack.esql.expression.function.FunctionName; +import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier; +import org.hamcrest.Matcher; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +import static org.hamcrest.Matchers.equalTo; + +@FunctionName("matchstr") +public class MatchFunctionTests extends AbstractFunctionTestCase { + + public MatchFunctionTests(@Name("TestCase") Supplier testCaseSupplier) { + this.testCase = testCaseSupplier.get(); + } + + @ParametersFactory + public static Iterable parameters() { + final Set validTypes = Set.of(DataType.KEYWORD, DataType.TEXT); + final List> validPerPosition = List.of(validTypes, validTypes); + List suppliers = new LinkedList<>(); + // Don't test null, as it is not allowed but the expected message is not a type error - so we check it separately in VerifierTests + + for (DataType fieldType : validStringDataTypes()) { + for (DataType queryType : validStringDataTypes()) { + suppliers.add( + new TestCaseSupplier( + "<" + fieldType + ", " + queryType + ">", + List.of(fieldType, queryType), + () -> testCase(fieldType, randomIdentifier(), queryType, randomAlphaOfLengthBetween(1, 10), equalTo(true)) + ) + ); + } + } + List errorsSuppliers = errorsForCasesWithoutExamples(suppliers, (v, p) -> "string"); + // Don't test null, as it is not allowed but the expected message is not a type error - so we check it separately in VerifierTests + return parameterSuppliersFromTypedData(errorsSuppliers.stream().filter(s -> s.types().contains(DataType.NULL) == false).toList()); + } + + private static List validStringDataTypes() { + return Arrays.stream(DataType.values()).filter(DataType::isString).toList(); + } + + public final void testFold() { + Expression expression = buildLiteralExpression(testCase); + if (testCase.getExpectedTypeError() != null) { + assertTrue("expected unresolved", expression.typeResolved().unresolved()); + assertThat(expression.typeResolved().message(), equalTo(testCase.getExpectedTypeError())); + } + } + + private static TestCaseSupplier.TestCase testCase( + DataType fieldType, + String field, + DataType queryType, + String query, + Matcher matcher + ) { + return new TestCaseSupplier.TestCase( + List.of( + new TestCaseSupplier.TypedData( + new FieldExpression(field, List.of(new FieldExpression.FieldValue(field))), + fieldType, + "field" + ), + new TestCaseSupplier.TypedData(new BytesRef(query), queryType, "query") + ), + "EndsWithEvaluator[str=Attribute[channel=0], suffix=Attribute[channel=1]]", + DataType.BOOLEAN, + matcher + ); + } + + @Override + protected Expression build(Source source, List args) { + return new MatchFunction(source, args.get(0), args.get(1)); + } +} From 3b28cc9b553fac3636e7d3dc99508bff2d68af57 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:31:12 +0200 Subject: [PATCH 13/93] Add generated docs --- .../functions/description/matchstr.asciidoc | 5 ++ .../esql/functions/examples/matchstr.asciidoc | 13 +++ .../functions/kibana/definition/matchstr.json | 84 +++++++++++++++++++ .../esql/functions/kibana/docs/matchstr.md | 14 ++++ .../esql/functions/layout/matchstr.asciidoc | 17 ++++ .../functions/parameters/matchstr.asciidoc | 9 ++ .../esql/functions/signature/matchstr.svg | 1 + .../esql/functions/types/matchstr.asciidoc | 12 +++ 8 files changed, 155 insertions(+) create mode 100644 docs/reference/esql/functions/description/matchstr.asciidoc create mode 100644 docs/reference/esql/functions/examples/matchstr.asciidoc create mode 100644 docs/reference/esql/functions/kibana/definition/matchstr.json create mode 100644 docs/reference/esql/functions/kibana/docs/matchstr.md create mode 100644 docs/reference/esql/functions/layout/matchstr.asciidoc create mode 100644 docs/reference/esql/functions/parameters/matchstr.asciidoc create mode 100644 docs/reference/esql/functions/signature/matchstr.svg create mode 100644 docs/reference/esql/functions/types/matchstr.asciidoc diff --git a/docs/reference/esql/functions/description/matchstr.asciidoc b/docs/reference/esql/functions/description/matchstr.asciidoc new file mode 100644 index 0000000000000..b90a63230a689 --- /dev/null +++ b/docs/reference/esql/functions/description/matchstr.asciidoc @@ -0,0 +1,5 @@ +// This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. + +*Description* + +Performs a match query on the specified fields. Returns true if the provided query matches the row. diff --git a/docs/reference/esql/functions/examples/matchstr.asciidoc b/docs/reference/esql/functions/examples/matchstr.asciidoc new file mode 100644 index 0000000000000..3f31d68ea9abb --- /dev/null +++ b/docs/reference/esql/functions/examples/matchstr.asciidoc @@ -0,0 +1,13 @@ +// This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. + +*Example* + +[source.merge.styled,esql] +---- +include::{esql-specs}/match-function.csv-spec[tag=match-with-field] +---- +[%header.monospaced.styled,format=dsv,separator=|] +|=== +include::{esql-specs}/match-function.csv-spec[tag=match-with-field-result] +|=== + diff --git a/docs/reference/esql/functions/kibana/definition/matchstr.json b/docs/reference/esql/functions/kibana/definition/matchstr.json new file mode 100644 index 0000000000000..1b46239dff7b8 --- /dev/null +++ b/docs/reference/esql/functions/kibana/definition/matchstr.json @@ -0,0 +1,84 @@ +{ + "comment" : "This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.", + "type" : "eval", + "name" : "matchstr", + "description" : "Performs a match query on the specified fields. Returns true if the provided query matches the row.", + "signatures" : [ + { + "params" : [ + { + "name" : "field", + "type" : "keyword", + "optional" : false, + "description" : "Field or field pattern that the query will target." + }, + { + "name" : "query", + "type" : "keyword", + "optional" : false, + "description" : "Query string in Lucene query string format." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, + { + "params" : [ + { + "name" : "field", + "type" : "keyword", + "optional" : false, + "description" : "Field or field pattern that the query will target." + }, + { + "name" : "query", + "type" : "text", + "optional" : false, + "description" : "Query string in Lucene query string format." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, + { + "params" : [ + { + "name" : "field", + "type" : "text", + "optional" : false, + "description" : "Field or field pattern that the query will target." + }, + { + "name" : "query", + "type" : "keyword", + "optional" : false, + "description" : "Query string in Lucene query string format." + } + ], + "variadic" : false, + "returnType" : "boolean" + }, + { + "params" : [ + { + "name" : "field", + "type" : "text", + "optional" : false, + "description" : "Field or field pattern that the query will target." + }, + { + "name" : "query", + "type" : "text", + "optional" : false, + "description" : "Query string in Lucene query string format." + } + ], + "variadic" : false, + "returnType" : "boolean" + } + ], + "examples" : [ + "from books \n| where matchstr(author, \"Faulkner\")\n| keep book_no, author \n| sort book_no \n| limit 5;" + ], + "preview" : true +} diff --git a/docs/reference/esql/functions/kibana/docs/matchstr.md b/docs/reference/esql/functions/kibana/docs/matchstr.md new file mode 100644 index 0000000000000..bfa7d8e204f58 --- /dev/null +++ b/docs/reference/esql/functions/kibana/docs/matchstr.md @@ -0,0 +1,14 @@ + + +### MATCHSTR +Performs a match query on the specified fields. Returns true if the provided query matches the row. + +``` +from books +| where matchstr(author, "Faulkner") +| keep book_no, author +| sort book_no +| limit 5; +``` diff --git a/docs/reference/esql/functions/layout/matchstr.asciidoc b/docs/reference/esql/functions/layout/matchstr.asciidoc new file mode 100644 index 0000000000000..5ba5ccee260d2 --- /dev/null +++ b/docs/reference/esql/functions/layout/matchstr.asciidoc @@ -0,0 +1,17 @@ +// This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. + +[discrete] +[[esql-matchstr]] +=== `MATCHSTR` + +preview::["Do not use on production environments. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features."] + +*Syntax* + +[.text-center] +image::esql/functions/signature/matchstr.svg[Embedded,opts=inline] + +include::../parameters/matchstr.asciidoc[] +include::../description/matchstr.asciidoc[] +include::../types/matchstr.asciidoc[] +include::../examples/matchstr.asciidoc[] diff --git a/docs/reference/esql/functions/parameters/matchstr.asciidoc b/docs/reference/esql/functions/parameters/matchstr.asciidoc new file mode 100644 index 0000000000000..ef6e2d58822dc --- /dev/null +++ b/docs/reference/esql/functions/parameters/matchstr.asciidoc @@ -0,0 +1,9 @@ +// This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. + +*Parameters* + +`field`:: +Field or field pattern that the query will target. + +`query`:: +Query string in Lucene query string format. diff --git a/docs/reference/esql/functions/signature/matchstr.svg b/docs/reference/esql/functions/signature/matchstr.svg new file mode 100644 index 0000000000000..dc6e8297c5970 --- /dev/null +++ b/docs/reference/esql/functions/signature/matchstr.svg @@ -0,0 +1 @@ +MATCHSTR(field,query) diff --git a/docs/reference/esql/functions/types/matchstr.asciidoc b/docs/reference/esql/functions/types/matchstr.asciidoc new file mode 100644 index 0000000000000..7523b29c62b1d --- /dev/null +++ b/docs/reference/esql/functions/types/matchstr.asciidoc @@ -0,0 +1,12 @@ +// This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. + +*Supported types* + +[%header.monospaced.styled,format=dsv,separator=|] +|=== +field | query | result +keyword | keyword | boolean +keyword | text | boolean +text | keyword | boolean +text | text | boolean +|=== From c9449c7aad00deac5cf86ed8e223912c9c0f1ef2 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:38:04 +0200 Subject: [PATCH 14/93] Make PR easier to read --- .../esql/core/expression/TypeResolutions.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index ef2e13be56f85..b817ec17c7bda 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -133,9 +133,15 @@ public static TypeResolution isFoldable(Expression e, String operationName, Para return TypeResolution.TYPE_RESOLVED; } - public static TypeResolution isNotNull(Expression e, String operationName, ParamOrdinal paramOrd) { - if (e.dataType() == DataType.NULL) { - return new TypeResolution( + public static TypeResolution isNotNullAndFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { + TypeResolution resolution = isFoldable(e, operationName, paramOrd); + + if (resolution.unresolved()) { + return resolution; + } + + if (e.dataType() == DataType.NULL || e.fold() == null) { + resolution = new TypeResolution( format( null, "{}argument of [{}] cannot be null, received [{}]", @@ -146,18 +152,12 @@ public static TypeResolution isNotNull(Expression e, String operationName, Param ); } - return TypeResolution.TYPE_RESOLVED; + return resolution; } - public static TypeResolution isNotNullAndFoldable(Expression e, String operationName, ParamOrdinal paramOrd) { - TypeResolution resolution = isFoldable(e, operationName, paramOrd); - - if (resolution.unresolved()) { - return resolution; - } - - if (e.dataType() == DataType.NULL || e.fold() == null) { - resolution = new TypeResolution( + public static TypeResolution isNotNull(Expression e, String operationName, ParamOrdinal paramOrd) { + if (e.dataType() == DataType.NULL) { + return new TypeResolution( format( null, "{}argument of [{}] cannot be null, received [{}]", @@ -168,7 +168,7 @@ public static TypeResolution isNotNullAndFoldable(Expression e, String operation ); } - return resolution; + return TypeResolution.TYPE_RESOLVED; } public static TypeResolution isType( From 1fa0c601248a43cbe8c614f395954f1363352a9d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 16:52:58 +0200 Subject: [PATCH 15/93] Minor refactorings for better javadoc and subclass structure for FullTextFunctions --- .../function/fulltext/FullTextFunction.java | 25 ++++++++++++++++--- .../function/fulltext/MatchFunction.java | 4 +-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 76eb8f0ebeaba..40beeb8dc463d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -43,8 +43,8 @@ public static List getNamedWriteables() { private final Expression query; - protected FullTextFunction(Source source, Expression query, Expression... additionalChildren) { - super(source, Stream.concat(Stream.of(query), Stream.of(additionalChildren)).toList()); + protected FullTextFunction(Source source, Expression query, Expression... nonQueryChildren) { + super(source, Stream.concat(Stream.of(query), Stream.of(nonQueryChildren)).toList()); this.query = query; } @@ -59,19 +59,36 @@ protected final TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - return doResolveType(); + return resolveNonQueryParamTypes().and(resolveQueryType()); } - protected TypeResolution doResolveType() { + private TypeResolution resolveQueryType() { return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal())); } + /** + * Subclasses can override this method for custom type resolution + * @return type resolution for non-query parameter types + */ + protected TypeResolution resolveNonQueryParamTypes() { + return TypeResolution.TYPE_RESOLVED; + } + public Expression query() { return query; } + /** + * Returns the resulting Query for the function parameters so it can be pushed down to Lucene + * @return + */ public abstract Query asQuery(); + /** + * Returns the param ordinal for the query parameter so it can be used in error messages + * + * @return Query ordinal for the + */ protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return DEFAULT; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index df093855888d3..4f33211cd15e7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -98,8 +98,8 @@ public Query asQuery() { } @Override - protected TypeResolution doResolveType() { - return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.doResolveType()); + protected TypeResolution resolveNonQueryParamTypes() { + return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes()); } @Override From f88bf3039f05f234a79bd64ec738feb47e8fdcaf Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 23 Sep 2024 17:03:44 +0200 Subject: [PATCH 16/93] Spotless --- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index b8daf541a6431..b1473546ce808 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1225,7 +1225,10 @@ private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, Strin public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - assertEquals("1:19: argument of [qstr(first_name)] must be a constant, received [first_name]", error("from test | where qstr(first_name)")); + assertEquals( + "1:19: argument of [qstr(first_name)] must be a constant, received [first_name]", + error("from test | where qstr(first_name)") + ); assertEquals("1:19: argument of [qstr(null)] cannot be null, received [null]", error("from test | where qstr(null)")); // Other value types are tested in QueryStringFunctionTests } From 880b4e672b36bba2b8181f67faff0642677c6d2f Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 14:18:17 +0200 Subject: [PATCH 17/93] Check function defined in tests --- .../expression/function/fulltext/MatchFunctionTests.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index b899a541fa9bd..d177cdd1ed967 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -19,6 +19,7 @@ import org.elasticsearch.xpack.esql.expression.function.FunctionName; import org.elasticsearch.xpack.esql.expression.function.TestCaseSupplier; import org.hamcrest.Matcher; +import org.junit.BeforeClass; import java.util.Arrays; import java.util.LinkedList; @@ -26,11 +27,17 @@ import java.util.Set; import java.util.function.Supplier; +import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.MATCH_FUNCTION; import static org.hamcrest.Matchers.equalTo; @FunctionName("matchstr") public class MatchFunctionTests extends AbstractFunctionTestCase { + @BeforeClass + public static void checkFunctionEnabled() { + assumeTrue("MATCH function should be enabled ", MATCH_FUNCTION.isEnabled()); + } + public MatchFunctionTests(@Name("TestCase") Supplier testCaseSupplier) { this.testCase = testCaseSupplier.get(); } From e23eef3f1e409e6974b0f345ec2ddafff9ec01ab Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 14:26:37 +0200 Subject: [PATCH 18/93] Rename match operator to matchstr --- .../main/resources/match-operator.csv-spec | 18 +- .../esql/src/main/antlr/EsqlBaseLexer.g4 | 8 +- .../xpack/esql/parser/EsqlBaseLexer.interp | 2 +- .../xpack/esql/parser/EsqlBaseLexer.java | 1977 +++++++++-------- .../xpack/esql/analysis/VerifierTests.java | 12 +- 5 files changed, 1010 insertions(+), 1007 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec index 56eded5ce4603..dc7b8d30cb860 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec @@ -1,10 +1,10 @@ ############################################### -# Tests for MATCH operator +# Tests for matchstr operator # singleMatchWithTextField required_capability: match_operator -from books | where author match "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; +from books | where author matchstr "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; book_no:keyword | author:text 2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] @@ -16,7 +16,7 @@ book_no:keyword | author:text singleMatchWithKeywordField required_capability: match_operator -from books | where author.keyword match "William Faulkner" | keep book_no, author | sort book_no; +from books | where author.keyword matchstr "William Faulkner" | keep book_no, author | sort book_no; book_no:keyword | author:text 2713 | William Faulkner @@ -33,8 +33,8 @@ book_no:keyword | author:text multipleMatch required_capability: match_operator from books -| where (description match "Sauron" OR description match "Dark Lord") AND - (author match "J. R. R. Tolkien" OR author match "John Ronald Reuel Tolkien") +| where (description matchstr "Sauron" OR description matchstr "Dark Lord") AND + (author matchstr "J. R. R. Tolkien" OR author matchstr "John Ronald Reuel Tolkien") | keep book_no, title, author | sort book_no | limit 4 @@ -50,8 +50,8 @@ book_no:keyword | title:text multipleWhereWithMatch required_capability: match_operator from books -| where title match "short stories" -| where author match "Ursula K. Le Guin" +| where title matchstr "short stories" +| where author matchstr "Ursula K. Le Guin" | keep book_no, title, author | sort book_no ; @@ -63,7 +63,7 @@ book_no:keyword | title:text | author:text combinedMatchWithFunctions required_capability: match_operator from books -| where title match "Tolkien" AND author match "Tolkien" AND year > 2000 +| where title matchstr "Tolkien" AND author matchstr "Tolkien" AND year > 2000 | where mv_count(author) == 1 | keep book_no, title, author, year | sort book_no @@ -76,7 +76,7 @@ book_no:keyword | title:text | author:text | year:integer matchWithStats required_capability: match_operator from books -| where author match "faulkner" AND year > 1990 +| where author matchstr "faulkner" AND year > 1990 | where mv_count(author) == 1 | stats count(*) BY author.keyword | sort author.keyword diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 index 6570a25469971..4ea7838a8fd1e 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 @@ -85,10 +85,10 @@ WHERE : 'where' -> pushMode(EXPRESSION_MODE); // Once the command has been stabilized, remove the DEV_ prefix and the {}? conditional and move the command to the // main section while preserving alphabetical order: // MYCOMMAND : 'mycommand' -> ... -DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); -DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); -DEV_MATCH : {this.isDevVersion()}? 'match' -> pushMode(EXPRESSION_MODE); -DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); +DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); +DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); +DEV_MATCH : {this.isDevVersion()}? 'matchstr' -> pushMode(EXPRESSION_MODE); +DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); // // Catch-all for unrecognized commands - don't define any beyond this line diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 8122a56884280..7942dfd056ac0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -475,4 +475,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 125, 1474, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 591, 8, 21, 11, 21, 12, 21, 592, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 601, 8, 22, 10, 22, 12, 22, 604, 9, 22, 1, 22, 3, 22, 607, 8, 22, 1, 22, 3, 22, 610, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 619, 8, 23, 10, 23, 12, 23, 622, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 630, 8, 24, 11, 24, 12, 24, 631, 1, 24, 1, 24, 1, 25, 1, 25, 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, 3, 30, 651, 8, 30, 1, 30, 4, 30, 654, 8, 30, 11, 30, 12, 30, 655, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 665, 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 672, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 677, 8, 36, 10, 36, 12, 36, 680, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 688, 8, 36, 10, 36, 12, 36, 691, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 698, 8, 36, 1, 36, 3, 36, 701, 8, 36, 3, 36, 703, 8, 36, 1, 37, 4, 37, 706, 8, 37, 11, 37, 12, 37, 707, 1, 38, 4, 38, 711, 8, 38, 11, 38, 12, 38, 712, 1, 38, 1, 38, 5, 38, 717, 8, 38, 10, 38, 12, 38, 720, 9, 38, 1, 38, 1, 38, 4, 38, 724, 8, 38, 11, 38, 12, 38, 725, 1, 38, 4, 38, 729, 8, 38, 11, 38, 12, 38, 730, 1, 38, 1, 38, 5, 38, 735, 8, 38, 10, 38, 12, 38, 738, 9, 38, 3, 38, 740, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 4, 38, 746, 8, 38, 11, 38, 12, 38, 747, 1, 38, 1, 38, 3, 38, 752, 8, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 3, 75, 879, 8, 75, 1, 75, 5, 75, 882, 8, 75, 10, 75, 12, 75, 885, 9, 75, 1, 75, 1, 75, 4, 75, 889, 8, 75, 11, 75, 12, 75, 890, 3, 75, 893, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 907, 8, 78, 10, 78, 12, 78, 910, 9, 78, 1, 78, 1, 78, 3, 78, 914, 8, 78, 1, 78, 4, 78, 917, 8, 78, 11, 78, 12, 78, 918, 3, 78, 921, 8, 78, 1, 79, 1, 79, 4, 79, 925, 8, 79, 11, 79, 12, 79, 926, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 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, 3, 96, 1004, 8, 96, 1, 97, 4, 97, 1007, 8, 97, 11, 97, 12, 97, 1008, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1048, 8, 106, 1, 107, 1, 107, 3, 107, 1052, 8, 107, 1, 107, 5, 107, 1055, 8, 107, 10, 107, 12, 107, 1058, 9, 107, 1, 107, 1, 107, 3, 107, 1062, 8, 107, 1, 107, 4, 107, 1065, 8, 107, 11, 107, 12, 107, 1066, 3, 107, 1069, 8, 107, 1, 108, 1, 108, 4, 108, 1073, 8, 108, 11, 108, 12, 108, 1074, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 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, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1150, 8, 126, 11, 126, 12, 126, 1151, 1, 126, 1, 126, 3, 126, 1156, 8, 126, 1, 126, 4, 126, 1159, 8, 126, 11, 126, 12, 126, 1160, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 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, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 4, 160, 1311, 8, 160, 11, 160, 12, 160, 1312, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 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, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 620, 689, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 0, 166, 65, 168, 66, 170, 67, 172, 68, 174, 0, 176, 69, 178, 70, 180, 71, 182, 72, 184, 0, 186, 0, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 0, 214, 0, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 81, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 0, 246, 0, 248, 85, 250, 0, 252, 86, 254, 87, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 0, 268, 91, 270, 0, 272, 92, 274, 93, 276, 94, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 95, 294, 96, 296, 97, 298, 0, 300, 0, 302, 0, 304, 0, 306, 98, 308, 99, 310, 100, 312, 0, 314, 101, 316, 102, 318, 103, 320, 104, 322, 0, 324, 105, 326, 106, 328, 107, 330, 108, 332, 0, 334, 109, 336, 110, 338, 111, 340, 112, 342, 113, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 115, 362, 116, 364, 0, 366, 0, 368, 0, 370, 0, 372, 117, 374, 118, 376, 119, 378, 0, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 123, 396, 124, 398, 125, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1501, 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, 1, 66, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 172, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 472, 1, 0, 0, 0, 34, 480, 1, 0, 0, 0, 36, 487, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 514, 1, 0, 0, 0, 44, 521, 1, 0, 0, 0, 46, 528, 1, 0, 0, 0, 48, 536, 1, 0, 0, 0, 50, 544, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 578, 1, 0, 0, 0, 58, 590, 1, 0, 0, 0, 60, 596, 1, 0, 0, 0, 62, 613, 1, 0, 0, 0, 64, 629, 1, 0, 0, 0, 66, 635, 1, 0, 0, 0, 68, 639, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 646, 1, 0, 0, 0, 76, 648, 1, 0, 0, 0, 78, 657, 1, 0, 0, 0, 80, 659, 1, 0, 0, 0, 82, 664, 1, 0, 0, 0, 84, 666, 1, 0, 0, 0, 86, 671, 1, 0, 0, 0, 88, 702, 1, 0, 0, 0, 90, 705, 1, 0, 0, 0, 92, 751, 1, 0, 0, 0, 94, 753, 1, 0, 0, 0, 96, 756, 1, 0, 0, 0, 98, 760, 1, 0, 0, 0, 100, 764, 1, 0, 0, 0, 102, 766, 1, 0, 0, 0, 104, 769, 1, 0, 0, 0, 106, 771, 1, 0, 0, 0, 108, 776, 1, 0, 0, 0, 110, 778, 1, 0, 0, 0, 112, 784, 1, 0, 0, 0, 114, 790, 1, 0, 0, 0, 116, 793, 1, 0, 0, 0, 118, 796, 1, 0, 0, 0, 120, 801, 1, 0, 0, 0, 122, 806, 1, 0, 0, 0, 124, 808, 1, 0, 0, 0, 126, 812, 1, 0, 0, 0, 128, 817, 1, 0, 0, 0, 130, 823, 1, 0, 0, 0, 132, 826, 1, 0, 0, 0, 134, 828, 1, 0, 0, 0, 136, 834, 1, 0, 0, 0, 138, 836, 1, 0, 0, 0, 140, 841, 1, 0, 0, 0, 142, 844, 1, 0, 0, 0, 144, 847, 1, 0, 0, 0, 146, 850, 1, 0, 0, 0, 148, 852, 1, 0, 0, 0, 150, 855, 1, 0, 0, 0, 152, 857, 1, 0, 0, 0, 154, 860, 1, 0, 0, 0, 156, 862, 1, 0, 0, 0, 158, 864, 1, 0, 0, 0, 160, 866, 1, 0, 0, 0, 162, 868, 1, 0, 0, 0, 164, 870, 1, 0, 0, 0, 166, 892, 1, 0, 0, 0, 168, 894, 1, 0, 0, 0, 170, 899, 1, 0, 0, 0, 172, 920, 1, 0, 0, 0, 174, 922, 1, 0, 0, 0, 176, 930, 1, 0, 0, 0, 178, 932, 1, 0, 0, 0, 180, 936, 1, 0, 0, 0, 182, 940, 1, 0, 0, 0, 184, 944, 1, 0, 0, 0, 186, 949, 1, 0, 0, 0, 188, 954, 1, 0, 0, 0, 190, 958, 1, 0, 0, 0, 192, 962, 1, 0, 0, 0, 194, 966, 1, 0, 0, 0, 196, 971, 1, 0, 0, 0, 198, 975, 1, 0, 0, 0, 200, 979, 1, 0, 0, 0, 202, 983, 1, 0, 0, 0, 204, 987, 1, 0, 0, 0, 206, 991, 1, 0, 0, 0, 208, 1003, 1, 0, 0, 0, 210, 1006, 1, 0, 0, 0, 212, 1010, 1, 0, 0, 0, 214, 1014, 1, 0, 0, 0, 216, 1018, 1, 0, 0, 0, 218, 1022, 1, 0, 0, 0, 220, 1026, 1, 0, 0, 0, 222, 1030, 1, 0, 0, 0, 224, 1035, 1, 0, 0, 0, 226, 1039, 1, 0, 0, 0, 228, 1047, 1, 0, 0, 0, 230, 1068, 1, 0, 0, 0, 232, 1072, 1, 0, 0, 0, 234, 1076, 1, 0, 0, 0, 236, 1080, 1, 0, 0, 0, 238, 1084, 1, 0, 0, 0, 240, 1088, 1, 0, 0, 0, 242, 1093, 1, 0, 0, 0, 244, 1097, 1, 0, 0, 0, 246, 1101, 1, 0, 0, 0, 248, 1105, 1, 0, 0, 0, 250, 1108, 1, 0, 0, 0, 252, 1112, 1, 0, 0, 0, 254, 1116, 1, 0, 0, 0, 256, 1120, 1, 0, 0, 0, 258, 1124, 1, 0, 0, 0, 260, 1129, 1, 0, 0, 0, 262, 1134, 1, 0, 0, 0, 264, 1139, 1, 0, 0, 0, 266, 1146, 1, 0, 0, 0, 268, 1155, 1, 0, 0, 0, 270, 1162, 1, 0, 0, 0, 272, 1166, 1, 0, 0, 0, 274, 1170, 1, 0, 0, 0, 276, 1174, 1, 0, 0, 0, 278, 1178, 1, 0, 0, 0, 280, 1184, 1, 0, 0, 0, 282, 1188, 1, 0, 0, 0, 284, 1192, 1, 0, 0, 0, 286, 1196, 1, 0, 0, 0, 288, 1200, 1, 0, 0, 0, 290, 1204, 1, 0, 0, 0, 292, 1208, 1, 0, 0, 0, 294, 1212, 1, 0, 0, 0, 296, 1216, 1, 0, 0, 0, 298, 1220, 1, 0, 0, 0, 300, 1225, 1, 0, 0, 0, 302, 1229, 1, 0, 0, 0, 304, 1233, 1, 0, 0, 0, 306, 1237, 1, 0, 0, 0, 308, 1241, 1, 0, 0, 0, 310, 1245, 1, 0, 0, 0, 312, 1249, 1, 0, 0, 0, 314, 1254, 1, 0, 0, 0, 316, 1259, 1, 0, 0, 0, 318, 1263, 1, 0, 0, 0, 320, 1267, 1, 0, 0, 0, 322, 1271, 1, 0, 0, 0, 324, 1276, 1, 0, 0, 0, 326, 1286, 1, 0, 0, 0, 328, 1290, 1, 0, 0, 0, 330, 1294, 1, 0, 0, 0, 332, 1298, 1, 0, 0, 0, 334, 1303, 1, 0, 0, 0, 336, 1310, 1, 0, 0, 0, 338, 1314, 1, 0, 0, 0, 340, 1318, 1, 0, 0, 0, 342, 1322, 1, 0, 0, 0, 344, 1326, 1, 0, 0, 0, 346, 1331, 1, 0, 0, 0, 348, 1335, 1, 0, 0, 0, 350, 1339, 1, 0, 0, 0, 352, 1343, 1, 0, 0, 0, 354, 1348, 1, 0, 0, 0, 356, 1352, 1, 0, 0, 0, 358, 1356, 1, 0, 0, 0, 360, 1360, 1, 0, 0, 0, 362, 1364, 1, 0, 0, 0, 364, 1368, 1, 0, 0, 0, 366, 1374, 1, 0, 0, 0, 368, 1378, 1, 0, 0, 0, 370, 1382, 1, 0, 0, 0, 372, 1386, 1, 0, 0, 0, 374, 1390, 1, 0, 0, 0, 376, 1394, 1, 0, 0, 0, 378, 1398, 1, 0, 0, 0, 380, 1403, 1, 0, 0, 0, 382, 1409, 1, 0, 0, 0, 384, 1415, 1, 0, 0, 0, 386, 1419, 1, 0, 0, 0, 388, 1423, 1, 0, 0, 0, 390, 1427, 1, 0, 0, 0, 392, 1433, 1, 0, 0, 0, 394, 1439, 1, 0, 0, 0, 396, 1443, 1, 0, 0, 0, 398, 1447, 1, 0, 0, 0, 400, 1451, 1, 0, 0, 0, 402, 1457, 1, 0, 0, 0, 404, 1463, 1, 0, 0, 0, 406, 1469, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 7, 1, 0, 471, 31, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 8, 0, 0, 479, 33, 1, 0, 0, 0, 480, 481, 7, 16, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 5, 0, 0, 483, 484, 7, 12, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 9, 5, 0, 486, 35, 1, 0, 0, 0, 487, 488, 7, 16, 0, 0, 488, 489, 7, 11, 0, 0, 489, 490, 5, 95, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 14, 0, 0, 492, 493, 7, 8, 0, 0, 493, 494, 7, 12, 0, 0, 494, 495, 7, 9, 0, 0, 495, 496, 7, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 6, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 9, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 7, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 6, 0, 0, 509, 510, 7, 7, 0, 0, 510, 511, 7, 19, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 12, 0, 0, 513, 41, 1, 0, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 19, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 6, 13, 8, 0, 520, 43, 1, 0, 0, 0, 521, 522, 7, 2, 0, 0, 522, 523, 7, 7, 0, 0, 523, 524, 7, 6, 0, 0, 524, 525, 7, 5, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 14, 0, 0, 527, 45, 1, 0, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 12, 0, 0, 531, 532, 7, 5, 0, 0, 532, 533, 7, 2, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 15, 0, 0, 535, 47, 1, 0, 0, 0, 536, 537, 7, 19, 0, 0, 537, 538, 7, 10, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 3, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 16, 0, 0, 543, 49, 1, 0, 0, 0, 544, 545, 4, 17, 0, 0, 545, 546, 7, 1, 0, 0, 546, 547, 7, 9, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 1, 0, 0, 549, 550, 7, 9, 0, 0, 550, 551, 7, 3, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 12, 0, 0, 554, 555, 7, 5, 0, 0, 555, 556, 7, 2, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 4, 18, 1, 0, 560, 561, 7, 13, 0, 0, 561, 562, 7, 7, 0, 0, 562, 563, 7, 7, 0, 0, 563, 564, 7, 18, 0, 0, 564, 565, 7, 20, 0, 0, 565, 566, 7, 8, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 9, 0, 568, 53, 1, 0, 0, 0, 569, 570, 4, 19, 2, 0, 570, 571, 7, 16, 0, 0, 571, 572, 7, 12, 0, 0, 572, 573, 7, 5, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 10, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 19, 0, 0, 577, 55, 1, 0, 0, 0, 578, 579, 4, 20, 3, 0, 579, 580, 7, 16, 0, 0, 580, 581, 7, 3, 0, 0, 581, 582, 7, 5, 0, 0, 582, 583, 7, 6, 0, 0, 583, 584, 7, 1, 0, 0, 584, 585, 7, 4, 0, 0, 585, 586, 7, 2, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 6, 20, 10, 0, 588, 57, 1, 0, 0, 0, 589, 591, 8, 21, 0, 0, 590, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 6, 21, 0, 0, 595, 59, 1, 0, 0, 0, 596, 597, 5, 47, 0, 0, 597, 598, 5, 47, 0, 0, 598, 602, 1, 0, 0, 0, 599, 601, 8, 22, 0, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 606, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 607, 5, 13, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 10, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 6, 22, 11, 0, 612, 61, 1, 0, 0, 0, 613, 614, 5, 47, 0, 0, 614, 615, 5, 42, 0, 0, 615, 620, 1, 0, 0, 0, 616, 619, 3, 62, 23, 0, 617, 619, 9, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 617, 1, 0, 0, 0, 619, 622, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 623, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 624, 5, 42, 0, 0, 624, 625, 5, 47, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 23, 11, 0, 627, 63, 1, 0, 0, 0, 628, 630, 7, 23, 0, 0, 629, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 24, 11, 0, 634, 65, 1, 0, 0, 0, 635, 636, 5, 124, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 6, 25, 12, 0, 638, 67, 1, 0, 0, 0, 639, 640, 7, 24, 0, 0, 640, 69, 1, 0, 0, 0, 641, 642, 7, 25, 0, 0, 642, 71, 1, 0, 0, 0, 643, 644, 5, 92, 0, 0, 644, 645, 7, 26, 0, 0, 645, 73, 1, 0, 0, 0, 646, 647, 8, 27, 0, 0, 647, 75, 1, 0, 0, 0, 648, 650, 7, 3, 0, 0, 649, 651, 7, 28, 0, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 653, 1, 0, 0, 0, 652, 654, 3, 68, 26, 0, 653, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 77, 1, 0, 0, 0, 657, 658, 5, 64, 0, 0, 658, 79, 1, 0, 0, 0, 659, 660, 5, 96, 0, 0, 660, 81, 1, 0, 0, 0, 661, 665, 8, 29, 0, 0, 662, 663, 5, 96, 0, 0, 663, 665, 5, 96, 0, 0, 664, 661, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 83, 1, 0, 0, 0, 666, 667, 5, 95, 0, 0, 667, 85, 1, 0, 0, 0, 668, 672, 3, 70, 27, 0, 669, 672, 3, 68, 26, 0, 670, 672, 3, 84, 34, 0, 671, 668, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 670, 1, 0, 0, 0, 672, 87, 1, 0, 0, 0, 673, 678, 5, 34, 0, 0, 674, 677, 3, 72, 28, 0, 675, 677, 3, 74, 29, 0, 676, 674, 1, 0, 0, 0, 676, 675, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 703, 5, 34, 0, 0, 682, 683, 5, 34, 0, 0, 683, 684, 5, 34, 0, 0, 684, 685, 5, 34, 0, 0, 685, 689, 1, 0, 0, 0, 686, 688, 8, 22, 0, 0, 687, 686, 1, 0, 0, 0, 688, 691, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 692, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 692, 693, 5, 34, 0, 0, 693, 694, 5, 34, 0, 0, 694, 695, 5, 34, 0, 0, 695, 697, 1, 0, 0, 0, 696, 698, 5, 34, 0, 0, 697, 696, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 5, 34, 0, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 703, 1, 0, 0, 0, 702, 673, 1, 0, 0, 0, 702, 682, 1, 0, 0, 0, 703, 89, 1, 0, 0, 0, 704, 706, 3, 68, 26, 0, 705, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 91, 1, 0, 0, 0, 709, 711, 3, 68, 26, 0, 710, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 718, 3, 108, 46, 0, 715, 717, 3, 68, 26, 0, 716, 715, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 752, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 723, 3, 108, 46, 0, 722, 724, 3, 68, 26, 0, 723, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 752, 1, 0, 0, 0, 727, 729, 3, 68, 26, 0, 728, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 739, 1, 0, 0, 0, 732, 736, 3, 108, 46, 0, 733, 735, 3, 68, 26, 0, 734, 733, 1, 0, 0, 0, 735, 738, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 732, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 3, 76, 30, 0, 742, 752, 1, 0, 0, 0, 743, 745, 3, 108, 46, 0, 744, 746, 3, 68, 26, 0, 745, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 3, 76, 30, 0, 750, 752, 1, 0, 0, 0, 751, 710, 1, 0, 0, 0, 751, 721, 1, 0, 0, 0, 751, 728, 1, 0, 0, 0, 751, 743, 1, 0, 0, 0, 752, 93, 1, 0, 0, 0, 753, 754, 7, 30, 0, 0, 754, 755, 7, 31, 0, 0, 755, 95, 1, 0, 0, 0, 756, 757, 7, 12, 0, 0, 757, 758, 7, 9, 0, 0, 758, 759, 7, 0, 0, 0, 759, 97, 1, 0, 0, 0, 760, 761, 7, 12, 0, 0, 761, 762, 7, 2, 0, 0, 762, 763, 7, 4, 0, 0, 763, 99, 1, 0, 0, 0, 764, 765, 5, 61, 0, 0, 765, 101, 1, 0, 0, 0, 766, 767, 5, 58, 0, 0, 767, 768, 5, 58, 0, 0, 768, 103, 1, 0, 0, 0, 769, 770, 5, 44, 0, 0, 770, 105, 1, 0, 0, 0, 771, 772, 7, 0, 0, 0, 772, 773, 7, 3, 0, 0, 773, 774, 7, 2, 0, 0, 774, 775, 7, 4, 0, 0, 775, 107, 1, 0, 0, 0, 776, 777, 5, 46, 0, 0, 777, 109, 1, 0, 0, 0, 778, 779, 7, 15, 0, 0, 779, 780, 7, 12, 0, 0, 780, 781, 7, 13, 0, 0, 781, 782, 7, 2, 0, 0, 782, 783, 7, 3, 0, 0, 783, 111, 1, 0, 0, 0, 784, 785, 7, 15, 0, 0, 785, 786, 7, 1, 0, 0, 786, 787, 7, 6, 0, 0, 787, 788, 7, 2, 0, 0, 788, 789, 7, 5, 0, 0, 789, 113, 1, 0, 0, 0, 790, 791, 7, 1, 0, 0, 791, 792, 7, 9, 0, 0, 792, 115, 1, 0, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 2, 0, 0, 795, 117, 1, 0, 0, 0, 796, 797, 7, 13, 0, 0, 797, 798, 7, 12, 0, 0, 798, 799, 7, 2, 0, 0, 799, 800, 7, 5, 0, 0, 800, 119, 1, 0, 0, 0, 801, 802, 7, 13, 0, 0, 802, 803, 7, 1, 0, 0, 803, 804, 7, 18, 0, 0, 804, 805, 7, 3, 0, 0, 805, 121, 1, 0, 0, 0, 806, 807, 5, 40, 0, 0, 807, 123, 1, 0, 0, 0, 808, 809, 7, 9, 0, 0, 809, 810, 7, 7, 0, 0, 810, 811, 7, 5, 0, 0, 811, 125, 1, 0, 0, 0, 812, 813, 7, 9, 0, 0, 813, 814, 7, 20, 0, 0, 814, 815, 7, 13, 0, 0, 815, 816, 7, 13, 0, 0, 816, 127, 1, 0, 0, 0, 817, 818, 7, 9, 0, 0, 818, 819, 7, 20, 0, 0, 819, 820, 7, 13, 0, 0, 820, 821, 7, 13, 0, 0, 821, 822, 7, 2, 0, 0, 822, 129, 1, 0, 0, 0, 823, 824, 7, 7, 0, 0, 824, 825, 7, 6, 0, 0, 825, 131, 1, 0, 0, 0, 826, 827, 5, 63, 0, 0, 827, 133, 1, 0, 0, 0, 828, 829, 7, 6, 0, 0, 829, 830, 7, 13, 0, 0, 830, 831, 7, 1, 0, 0, 831, 832, 7, 18, 0, 0, 832, 833, 7, 3, 0, 0, 833, 135, 1, 0, 0, 0, 834, 835, 5, 41, 0, 0, 835, 137, 1, 0, 0, 0, 836, 837, 7, 5, 0, 0, 837, 838, 7, 6, 0, 0, 838, 839, 7, 20, 0, 0, 839, 840, 7, 3, 0, 0, 840, 139, 1, 0, 0, 0, 841, 842, 5, 61, 0, 0, 842, 843, 5, 61, 0, 0, 843, 141, 1, 0, 0, 0, 844, 845, 5, 61, 0, 0, 845, 846, 5, 126, 0, 0, 846, 143, 1, 0, 0, 0, 847, 848, 5, 33, 0, 0, 848, 849, 5, 61, 0, 0, 849, 145, 1, 0, 0, 0, 850, 851, 5, 60, 0, 0, 851, 147, 1, 0, 0, 0, 852, 853, 5, 60, 0, 0, 853, 854, 5, 61, 0, 0, 854, 149, 1, 0, 0, 0, 855, 856, 5, 62, 0, 0, 856, 151, 1, 0, 0, 0, 857, 858, 5, 62, 0, 0, 858, 859, 5, 61, 0, 0, 859, 153, 1, 0, 0, 0, 860, 861, 5, 43, 0, 0, 861, 155, 1, 0, 0, 0, 862, 863, 5, 45, 0, 0, 863, 157, 1, 0, 0, 0, 864, 865, 5, 42, 0, 0, 865, 159, 1, 0, 0, 0, 866, 867, 5, 47, 0, 0, 867, 161, 1, 0, 0, 0, 868, 869, 5, 37, 0, 0, 869, 163, 1, 0, 0, 0, 870, 871, 4, 74, 4, 0, 871, 872, 3, 54, 19, 0, 872, 873, 1, 0, 0, 0, 873, 874, 6, 74, 13, 0, 874, 165, 1, 0, 0, 0, 875, 878, 3, 132, 58, 0, 876, 879, 3, 70, 27, 0, 877, 879, 3, 84, 34, 0, 878, 876, 1, 0, 0, 0, 878, 877, 1, 0, 0, 0, 879, 883, 1, 0, 0, 0, 880, 882, 3, 86, 35, 0, 881, 880, 1, 0, 0, 0, 882, 885, 1, 0, 0, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 893, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 888, 3, 132, 58, 0, 887, 889, 3, 68, 26, 0, 888, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 1, 0, 0, 0, 892, 875, 1, 0, 0, 0, 892, 886, 1, 0, 0, 0, 893, 167, 1, 0, 0, 0, 894, 895, 5, 91, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 6, 76, 0, 0, 897, 898, 6, 76, 0, 0, 898, 169, 1, 0, 0, 0, 899, 900, 5, 93, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 6, 77, 12, 0, 902, 903, 6, 77, 12, 0, 903, 171, 1, 0, 0, 0, 904, 908, 3, 70, 27, 0, 905, 907, 3, 86, 35, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 921, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 914, 3, 84, 34, 0, 912, 914, 3, 78, 31, 0, 913, 911, 1, 0, 0, 0, 913, 912, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 917, 3, 86, 35, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 921, 173, 1, 0, 0, 0, 922, 924, 3, 80, 32, 0, 923, 925, 3, 82, 33, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 3, 80, 32, 0, 929, 175, 1, 0, 0, 0, 930, 931, 3, 174, 79, 0, 931, 177, 1, 0, 0, 0, 932, 933, 3, 60, 22, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 81, 11, 0, 935, 179, 1, 0, 0, 0, 936, 937, 3, 62, 23, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 82, 11, 0, 939, 181, 1, 0, 0, 0, 940, 941, 3, 64, 24, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 83, 11, 0, 943, 183, 1, 0, 0, 0, 944, 945, 3, 168, 76, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 84, 14, 0, 947, 948, 6, 84, 15, 0, 948, 185, 1, 0, 0, 0, 949, 950, 3, 66, 25, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 85, 16, 0, 952, 953, 6, 85, 12, 0, 953, 187, 1, 0, 0, 0, 954, 955, 3, 64, 24, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 86, 11, 0, 957, 189, 1, 0, 0, 0, 958, 959, 3, 60, 22, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 87, 11, 0, 961, 191, 1, 0, 0, 0, 962, 963, 3, 62, 23, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 88, 11, 0, 965, 193, 1, 0, 0, 0, 966, 967, 3, 66, 25, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 89, 16, 0, 969, 970, 6, 89, 12, 0, 970, 195, 1, 0, 0, 0, 971, 972, 3, 168, 76, 0, 972, 973, 1, 0, 0, 0, 973, 974, 6, 90, 14, 0, 974, 197, 1, 0, 0, 0, 975, 976, 3, 170, 77, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 91, 17, 0, 978, 199, 1, 0, 0, 0, 979, 980, 3, 334, 159, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 92, 18, 0, 982, 201, 1, 0, 0, 0, 983, 984, 3, 104, 44, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 93, 19, 0, 986, 203, 1, 0, 0, 0, 987, 988, 3, 100, 42, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 94, 20, 0, 990, 205, 1, 0, 0, 0, 991, 992, 7, 16, 0, 0, 992, 993, 7, 3, 0, 0, 993, 994, 7, 5, 0, 0, 994, 995, 7, 12, 0, 0, 995, 996, 7, 0, 0, 0, 996, 997, 7, 12, 0, 0, 997, 998, 7, 5, 0, 0, 998, 999, 7, 12, 0, 0, 999, 207, 1, 0, 0, 0, 1000, 1004, 8, 32, 0, 0, 1001, 1002, 5, 47, 0, 0, 1002, 1004, 8, 33, 0, 0, 1003, 1000, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 209, 1, 0, 0, 0, 1005, 1007, 3, 208, 96, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 211, 1, 0, 0, 0, 1010, 1011, 3, 210, 97, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 98, 21, 0, 1013, 213, 1, 0, 0, 0, 1014, 1015, 3, 88, 36, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 99, 22, 0, 1017, 215, 1, 0, 0, 0, 1018, 1019, 3, 60, 22, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 100, 11, 0, 1021, 217, 1, 0, 0, 0, 1022, 1023, 3, 62, 23, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 101, 11, 0, 1025, 219, 1, 0, 0, 0, 1026, 1027, 3, 64, 24, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 102, 11, 0, 1029, 221, 1, 0, 0, 0, 1030, 1031, 3, 66, 25, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 103, 16, 0, 1033, 1034, 6, 103, 12, 0, 1034, 223, 1, 0, 0, 0, 1035, 1036, 3, 108, 46, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 104, 23, 0, 1038, 225, 1, 0, 0, 0, 1039, 1040, 3, 104, 44, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 105, 19, 0, 1042, 227, 1, 0, 0, 0, 1043, 1048, 3, 70, 27, 0, 1044, 1048, 3, 68, 26, 0, 1045, 1048, 3, 84, 34, 0, 1046, 1048, 3, 158, 71, 0, 1047, 1043, 1, 0, 0, 0, 1047, 1044, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1046, 1, 0, 0, 0, 1048, 229, 1, 0, 0, 0, 1049, 1052, 3, 70, 27, 0, 1050, 1052, 3, 158, 71, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 1056, 1, 0, 0, 0, 1053, 1055, 3, 228, 106, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1058, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1069, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1059, 1062, 3, 84, 34, 0, 1060, 1062, 3, 78, 31, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1065, 3, 228, 106, 0, 1064, 1063, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1069, 1, 0, 0, 0, 1068, 1051, 1, 0, 0, 0, 1068, 1061, 1, 0, 0, 0, 1069, 231, 1, 0, 0, 0, 1070, 1073, 3, 230, 107, 0, 1071, 1073, 3, 174, 79, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1071, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 233, 1, 0, 0, 0, 1076, 1077, 3, 60, 22, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 109, 11, 0, 1079, 235, 1, 0, 0, 0, 1080, 1081, 3, 62, 23, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 110, 11, 0, 1083, 237, 1, 0, 0, 0, 1084, 1085, 3, 64, 24, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 111, 11, 0, 1087, 239, 1, 0, 0, 0, 1088, 1089, 3, 66, 25, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 112, 16, 0, 1091, 1092, 6, 112, 12, 0, 1092, 241, 1, 0, 0, 0, 1093, 1094, 3, 100, 42, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 113, 20, 0, 1096, 243, 1, 0, 0, 0, 1097, 1098, 3, 104, 44, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 114, 19, 0, 1100, 245, 1, 0, 0, 0, 1101, 1102, 3, 108, 46, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 115, 23, 0, 1104, 247, 1, 0, 0, 0, 1105, 1106, 7, 12, 0, 0, 1106, 1107, 7, 2, 0, 0, 1107, 249, 1, 0, 0, 0, 1108, 1109, 3, 232, 108, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 117, 24, 0, 1111, 251, 1, 0, 0, 0, 1112, 1113, 3, 60, 22, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 6, 118, 11, 0, 1115, 253, 1, 0, 0, 0, 1116, 1117, 3, 62, 23, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 119, 11, 0, 1119, 255, 1, 0, 0, 0, 1120, 1121, 3, 64, 24, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 120, 11, 0, 1123, 257, 1, 0, 0, 0, 1124, 1125, 3, 66, 25, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 121, 16, 0, 1127, 1128, 6, 121, 12, 0, 1128, 259, 1, 0, 0, 0, 1129, 1130, 3, 168, 76, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 122, 14, 0, 1132, 1133, 6, 122, 25, 0, 1133, 261, 1, 0, 0, 0, 1134, 1135, 7, 7, 0, 0, 1135, 1136, 7, 9, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 123, 26, 0, 1138, 263, 1, 0, 0, 0, 1139, 1140, 7, 19, 0, 0, 1140, 1141, 7, 1, 0, 0, 1141, 1142, 7, 5, 0, 0, 1142, 1143, 7, 10, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 124, 26, 0, 1145, 265, 1, 0, 0, 0, 1146, 1147, 8, 34, 0, 0, 1147, 267, 1, 0, 0, 0, 1148, 1150, 3, 266, 125, 0, 1149, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 3, 334, 159, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1149, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1159, 3, 266, 125, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 269, 1, 0, 0, 0, 1162, 1163, 3, 268, 126, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 127, 27, 0, 1165, 271, 1, 0, 0, 0, 1166, 1167, 3, 60, 22, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 128, 11, 0, 1169, 273, 1, 0, 0, 0, 1170, 1171, 3, 62, 23, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 129, 11, 0, 1173, 275, 1, 0, 0, 0, 1174, 1175, 3, 64, 24, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 130, 11, 0, 1177, 277, 1, 0, 0, 0, 1178, 1179, 3, 66, 25, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 131, 16, 0, 1181, 1182, 6, 131, 12, 0, 1182, 1183, 6, 131, 12, 0, 1183, 279, 1, 0, 0, 0, 1184, 1185, 3, 100, 42, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 132, 20, 0, 1187, 281, 1, 0, 0, 0, 1188, 1189, 3, 104, 44, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 133, 19, 0, 1191, 283, 1, 0, 0, 0, 1192, 1193, 3, 108, 46, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 134, 23, 0, 1195, 285, 1, 0, 0, 0, 1196, 1197, 3, 264, 124, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 135, 28, 0, 1199, 287, 1, 0, 0, 0, 1200, 1201, 3, 232, 108, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 136, 24, 0, 1203, 289, 1, 0, 0, 0, 1204, 1205, 3, 176, 80, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 137, 29, 0, 1207, 291, 1, 0, 0, 0, 1208, 1209, 3, 60, 22, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 138, 11, 0, 1211, 293, 1, 0, 0, 0, 1212, 1213, 3, 62, 23, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 139, 11, 0, 1215, 295, 1, 0, 0, 0, 1216, 1217, 3, 64, 24, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 140, 11, 0, 1219, 297, 1, 0, 0, 0, 1220, 1221, 3, 66, 25, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 141, 16, 0, 1223, 1224, 6, 141, 12, 0, 1224, 299, 1, 0, 0, 0, 1225, 1226, 3, 108, 46, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 142, 23, 0, 1228, 301, 1, 0, 0, 0, 1229, 1230, 3, 176, 80, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 143, 29, 0, 1232, 303, 1, 0, 0, 0, 1233, 1234, 3, 172, 78, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 144, 30, 0, 1236, 305, 1, 0, 0, 0, 1237, 1238, 3, 60, 22, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 6, 145, 11, 0, 1240, 307, 1, 0, 0, 0, 1241, 1242, 3, 62, 23, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 6, 146, 11, 0, 1244, 309, 1, 0, 0, 0, 1245, 1246, 3, 64, 24, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 6, 147, 11, 0, 1248, 311, 1, 0, 0, 0, 1249, 1250, 3, 66, 25, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 6, 148, 16, 0, 1252, 1253, 6, 148, 12, 0, 1253, 313, 1, 0, 0, 0, 1254, 1255, 7, 1, 0, 0, 1255, 1256, 7, 9, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 1258, 7, 7, 0, 0, 1258, 315, 1, 0, 0, 0, 1259, 1260, 3, 60, 22, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 150, 11, 0, 1262, 317, 1, 0, 0, 0, 1263, 1264, 3, 62, 23, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 6, 151, 11, 0, 1266, 319, 1, 0, 0, 0, 1267, 1268, 3, 64, 24, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 6, 152, 11, 0, 1270, 321, 1, 0, 0, 0, 1271, 1272, 3, 66, 25, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 6, 153, 16, 0, 1274, 1275, 6, 153, 12, 0, 1275, 323, 1, 0, 0, 0, 1276, 1277, 7, 15, 0, 0, 1277, 1278, 7, 20, 0, 0, 1278, 1279, 7, 9, 0, 0, 1279, 1280, 7, 4, 0, 0, 1280, 1281, 7, 5, 0, 0, 1281, 1282, 7, 1, 0, 0, 1282, 1283, 7, 7, 0, 0, 1283, 1284, 7, 9, 0, 0, 1284, 1285, 7, 2, 0, 0, 1285, 325, 1, 0, 0, 0, 1286, 1287, 3, 60, 22, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 155, 11, 0, 1289, 327, 1, 0, 0, 0, 1290, 1291, 3, 62, 23, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1293, 6, 156, 11, 0, 1293, 329, 1, 0, 0, 0, 1294, 1295, 3, 64, 24, 0, 1295, 1296, 1, 0, 0, 0, 1296, 1297, 6, 157, 11, 0, 1297, 331, 1, 0, 0, 0, 1298, 1299, 3, 170, 77, 0, 1299, 1300, 1, 0, 0, 0, 1300, 1301, 6, 158, 17, 0, 1301, 1302, 6, 158, 12, 0, 1302, 333, 1, 0, 0, 0, 1303, 1304, 5, 58, 0, 0, 1304, 335, 1, 0, 0, 0, 1305, 1311, 3, 78, 31, 0, 1306, 1311, 3, 68, 26, 0, 1307, 1311, 3, 108, 46, 0, 1308, 1311, 3, 70, 27, 0, 1309, 1311, 3, 84, 34, 0, 1310, 1305, 1, 0, 0, 0, 1310, 1306, 1, 0, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 337, 1, 0, 0, 0, 1314, 1315, 3, 60, 22, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 6, 161, 11, 0, 1317, 339, 1, 0, 0, 0, 1318, 1319, 3, 62, 23, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 162, 11, 0, 1321, 341, 1, 0, 0, 0, 1322, 1323, 3, 64, 24, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 163, 11, 0, 1325, 343, 1, 0, 0, 0, 1326, 1327, 3, 66, 25, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 164, 16, 0, 1329, 1330, 6, 164, 12, 0, 1330, 345, 1, 0, 0, 0, 1331, 1332, 3, 334, 159, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 165, 18, 0, 1334, 347, 1, 0, 0, 0, 1335, 1336, 3, 104, 44, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, 166, 19, 0, 1338, 349, 1, 0, 0, 0, 1339, 1340, 3, 108, 46, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1342, 6, 167, 23, 0, 1342, 351, 1, 0, 0, 0, 1343, 1344, 3, 262, 123, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 6, 168, 31, 0, 1346, 1347, 6, 168, 32, 0, 1347, 353, 1, 0, 0, 0, 1348, 1349, 3, 210, 97, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1351, 6, 169, 21, 0, 1351, 355, 1, 0, 0, 0, 1352, 1353, 3, 88, 36, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 6, 170, 22, 0, 1355, 357, 1, 0, 0, 0, 1356, 1357, 3, 60, 22, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 171, 11, 0, 1359, 359, 1, 0, 0, 0, 1360, 1361, 3, 62, 23, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1363, 6, 172, 11, 0, 1363, 361, 1, 0, 0, 0, 1364, 1365, 3, 64, 24, 0, 1365, 1366, 1, 0, 0, 0, 1366, 1367, 6, 173, 11, 0, 1367, 363, 1, 0, 0, 0, 1368, 1369, 3, 66, 25, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1371, 6, 174, 16, 0, 1371, 1372, 6, 174, 12, 0, 1372, 1373, 6, 174, 12, 0, 1373, 365, 1, 0, 0, 0, 1374, 1375, 3, 104, 44, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 175, 19, 0, 1377, 367, 1, 0, 0, 0, 1378, 1379, 3, 108, 46, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 6, 176, 23, 0, 1381, 369, 1, 0, 0, 0, 1382, 1383, 3, 232, 108, 0, 1383, 1384, 1, 0, 0, 0, 1384, 1385, 6, 177, 24, 0, 1385, 371, 1, 0, 0, 0, 1386, 1387, 3, 60, 22, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 178, 11, 0, 1389, 373, 1, 0, 0, 0, 1390, 1391, 3, 62, 23, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 11, 0, 1393, 375, 1, 0, 0, 0, 1394, 1395, 3, 64, 24, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 6, 180, 11, 0, 1397, 377, 1, 0, 0, 0, 1398, 1399, 3, 66, 25, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 6, 181, 16, 0, 1401, 1402, 6, 181, 12, 0, 1402, 379, 1, 0, 0, 0, 1403, 1404, 3, 210, 97, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 182, 21, 0, 1406, 1407, 6, 182, 12, 0, 1407, 1408, 6, 182, 33, 0, 1408, 381, 1, 0, 0, 0, 1409, 1410, 3, 88, 36, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1412, 6, 183, 22, 0, 1412, 1413, 6, 183, 12, 0, 1413, 1414, 6, 183, 33, 0, 1414, 383, 1, 0, 0, 0, 1415, 1416, 3, 60, 22, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 6, 184, 11, 0, 1418, 385, 1, 0, 0, 0, 1419, 1420, 3, 62, 23, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1422, 6, 185, 11, 0, 1422, 387, 1, 0, 0, 0, 1423, 1424, 3, 64, 24, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 186, 11, 0, 1426, 389, 1, 0, 0, 0, 1427, 1428, 3, 334, 159, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 187, 18, 0, 1430, 1431, 6, 187, 12, 0, 1431, 1432, 6, 187, 10, 0, 1432, 391, 1, 0, 0, 0, 1433, 1434, 3, 104, 44, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 188, 19, 0, 1436, 1437, 6, 188, 12, 0, 1437, 1438, 6, 188, 10, 0, 1438, 393, 1, 0, 0, 0, 1439, 1440, 3, 60, 22, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 6, 189, 11, 0, 1442, 395, 1, 0, 0, 0, 1443, 1444, 3, 62, 23, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 6, 190, 11, 0, 1446, 397, 1, 0, 0, 0, 1447, 1448, 3, 64, 24, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 6, 191, 11, 0, 1450, 399, 1, 0, 0, 0, 1451, 1452, 3, 176, 80, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 192, 12, 0, 1454, 1455, 6, 192, 0, 0, 1455, 1456, 6, 192, 29, 0, 1456, 401, 1, 0, 0, 0, 1457, 1458, 3, 172, 78, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 6, 193, 12, 0, 1460, 1461, 6, 193, 0, 0, 1461, 1462, 6, 193, 30, 0, 1462, 403, 1, 0, 0, 0, 1463, 1464, 3, 94, 39, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1466, 6, 194, 12, 0, 1466, 1467, 6, 194, 0, 0, 1467, 1468, 6, 194, 34, 0, 1468, 405, 1, 0, 0, 0, 1469, 1470, 3, 66, 25, 0, 1470, 1471, 1, 0, 0, 0, 1471, 1472, 6, 195, 16, 0, 1472, 1473, 6, 195, 12, 0, 1473, 407, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 592, 602, 606, 609, 618, 620, 631, 650, 655, 664, 671, 676, 678, 689, 697, 700, 702, 707, 712, 718, 725, 730, 736, 739, 747, 751, 878, 883, 890, 892, 908, 913, 918, 920, 926, 1003, 1008, 1047, 1051, 1056, 1061, 1066, 1068, 1072, 1074, 1151, 1155, 1160, 1310, 1312, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 20, 0, 7, 66, 0, 5, 0, 0, 7, 26, 0, 7, 67, 0, 7, 109, 0, 7, 35, 0, 7, 33, 0, 7, 77, 0, 7, 27, 0, 7, 37, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 30, 0] \ No newline at end of file +[4, 0, 125, 1477, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 594, 8, 21, 11, 21, 12, 21, 595, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 604, 8, 22, 10, 22, 12, 22, 607, 9, 22, 1, 22, 3, 22, 610, 8, 22, 1, 22, 3, 22, 613, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 622, 8, 23, 10, 23, 12, 23, 625, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 633, 8, 24, 11, 24, 12, 24, 634, 1, 24, 1, 24, 1, 25, 1, 25, 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, 3, 30, 654, 8, 30, 1, 30, 4, 30, 657, 8, 30, 11, 30, 12, 30, 658, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 668, 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 675, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 680, 8, 36, 10, 36, 12, 36, 683, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 691, 8, 36, 10, 36, 12, 36, 694, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 701, 8, 36, 1, 36, 3, 36, 704, 8, 36, 3, 36, 706, 8, 36, 1, 37, 4, 37, 709, 8, 37, 11, 37, 12, 37, 710, 1, 38, 4, 38, 714, 8, 38, 11, 38, 12, 38, 715, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 1, 38, 1, 38, 4, 38, 727, 8, 38, 11, 38, 12, 38, 728, 1, 38, 4, 38, 732, 8, 38, 11, 38, 12, 38, 733, 1, 38, 1, 38, 5, 38, 738, 8, 38, 10, 38, 12, 38, 741, 9, 38, 3, 38, 743, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 4, 38, 749, 8, 38, 11, 38, 12, 38, 750, 1, 38, 1, 38, 3, 38, 755, 8, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 3, 75, 882, 8, 75, 1, 75, 5, 75, 885, 8, 75, 10, 75, 12, 75, 888, 9, 75, 1, 75, 1, 75, 4, 75, 892, 8, 75, 11, 75, 12, 75, 893, 3, 75, 896, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 910, 8, 78, 10, 78, 12, 78, 913, 9, 78, 1, 78, 1, 78, 3, 78, 917, 8, 78, 1, 78, 4, 78, 920, 8, 78, 11, 78, 12, 78, 921, 3, 78, 924, 8, 78, 1, 79, 1, 79, 4, 79, 928, 8, 79, 11, 79, 12, 79, 929, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 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, 3, 96, 1007, 8, 96, 1, 97, 4, 97, 1010, 8, 97, 11, 97, 12, 97, 1011, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1051, 8, 106, 1, 107, 1, 107, 3, 107, 1055, 8, 107, 1, 107, 5, 107, 1058, 8, 107, 10, 107, 12, 107, 1061, 9, 107, 1, 107, 1, 107, 3, 107, 1065, 8, 107, 1, 107, 4, 107, 1068, 8, 107, 11, 107, 12, 107, 1069, 3, 107, 1072, 8, 107, 1, 108, 1, 108, 4, 108, 1076, 8, 108, 11, 108, 12, 108, 1077, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 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, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1153, 8, 126, 11, 126, 12, 126, 1154, 1, 126, 1, 126, 3, 126, 1159, 8, 126, 1, 126, 4, 126, 1162, 8, 126, 11, 126, 12, 126, 1163, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 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, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 4, 160, 1314, 8, 160, 11, 160, 12, 160, 1315, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 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, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 623, 692, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 0, 166, 65, 168, 66, 170, 67, 172, 68, 174, 0, 176, 69, 178, 70, 180, 71, 182, 72, 184, 0, 186, 0, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 0, 214, 0, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 81, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 0, 246, 0, 248, 85, 250, 0, 252, 86, 254, 87, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 0, 268, 91, 270, 0, 272, 92, 274, 93, 276, 94, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 95, 294, 96, 296, 97, 298, 0, 300, 0, 302, 0, 304, 0, 306, 98, 308, 99, 310, 100, 312, 0, 314, 101, 316, 102, 318, 103, 320, 104, 322, 0, 324, 105, 326, 106, 328, 107, 330, 108, 332, 0, 334, 109, 336, 110, 338, 111, 340, 112, 342, 113, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 115, 362, 116, 364, 0, 366, 0, 368, 0, 370, 0, 372, 117, 374, 118, 376, 119, 378, 0, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 123, 396, 124, 398, 125, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1504, 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, 1, 66, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 172, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 472, 1, 0, 0, 0, 34, 480, 1, 0, 0, 0, 36, 487, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 514, 1, 0, 0, 0, 44, 521, 1, 0, 0, 0, 46, 528, 1, 0, 0, 0, 48, 536, 1, 0, 0, 0, 50, 544, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 581, 1, 0, 0, 0, 58, 593, 1, 0, 0, 0, 60, 599, 1, 0, 0, 0, 62, 616, 1, 0, 0, 0, 64, 632, 1, 0, 0, 0, 66, 638, 1, 0, 0, 0, 68, 642, 1, 0, 0, 0, 70, 644, 1, 0, 0, 0, 72, 646, 1, 0, 0, 0, 74, 649, 1, 0, 0, 0, 76, 651, 1, 0, 0, 0, 78, 660, 1, 0, 0, 0, 80, 662, 1, 0, 0, 0, 82, 667, 1, 0, 0, 0, 84, 669, 1, 0, 0, 0, 86, 674, 1, 0, 0, 0, 88, 705, 1, 0, 0, 0, 90, 708, 1, 0, 0, 0, 92, 754, 1, 0, 0, 0, 94, 756, 1, 0, 0, 0, 96, 759, 1, 0, 0, 0, 98, 763, 1, 0, 0, 0, 100, 767, 1, 0, 0, 0, 102, 769, 1, 0, 0, 0, 104, 772, 1, 0, 0, 0, 106, 774, 1, 0, 0, 0, 108, 779, 1, 0, 0, 0, 110, 781, 1, 0, 0, 0, 112, 787, 1, 0, 0, 0, 114, 793, 1, 0, 0, 0, 116, 796, 1, 0, 0, 0, 118, 799, 1, 0, 0, 0, 120, 804, 1, 0, 0, 0, 122, 809, 1, 0, 0, 0, 124, 811, 1, 0, 0, 0, 126, 815, 1, 0, 0, 0, 128, 820, 1, 0, 0, 0, 130, 826, 1, 0, 0, 0, 132, 829, 1, 0, 0, 0, 134, 831, 1, 0, 0, 0, 136, 837, 1, 0, 0, 0, 138, 839, 1, 0, 0, 0, 140, 844, 1, 0, 0, 0, 142, 847, 1, 0, 0, 0, 144, 850, 1, 0, 0, 0, 146, 853, 1, 0, 0, 0, 148, 855, 1, 0, 0, 0, 150, 858, 1, 0, 0, 0, 152, 860, 1, 0, 0, 0, 154, 863, 1, 0, 0, 0, 156, 865, 1, 0, 0, 0, 158, 867, 1, 0, 0, 0, 160, 869, 1, 0, 0, 0, 162, 871, 1, 0, 0, 0, 164, 873, 1, 0, 0, 0, 166, 895, 1, 0, 0, 0, 168, 897, 1, 0, 0, 0, 170, 902, 1, 0, 0, 0, 172, 923, 1, 0, 0, 0, 174, 925, 1, 0, 0, 0, 176, 933, 1, 0, 0, 0, 178, 935, 1, 0, 0, 0, 180, 939, 1, 0, 0, 0, 182, 943, 1, 0, 0, 0, 184, 947, 1, 0, 0, 0, 186, 952, 1, 0, 0, 0, 188, 957, 1, 0, 0, 0, 190, 961, 1, 0, 0, 0, 192, 965, 1, 0, 0, 0, 194, 969, 1, 0, 0, 0, 196, 974, 1, 0, 0, 0, 198, 978, 1, 0, 0, 0, 200, 982, 1, 0, 0, 0, 202, 986, 1, 0, 0, 0, 204, 990, 1, 0, 0, 0, 206, 994, 1, 0, 0, 0, 208, 1006, 1, 0, 0, 0, 210, 1009, 1, 0, 0, 0, 212, 1013, 1, 0, 0, 0, 214, 1017, 1, 0, 0, 0, 216, 1021, 1, 0, 0, 0, 218, 1025, 1, 0, 0, 0, 220, 1029, 1, 0, 0, 0, 222, 1033, 1, 0, 0, 0, 224, 1038, 1, 0, 0, 0, 226, 1042, 1, 0, 0, 0, 228, 1050, 1, 0, 0, 0, 230, 1071, 1, 0, 0, 0, 232, 1075, 1, 0, 0, 0, 234, 1079, 1, 0, 0, 0, 236, 1083, 1, 0, 0, 0, 238, 1087, 1, 0, 0, 0, 240, 1091, 1, 0, 0, 0, 242, 1096, 1, 0, 0, 0, 244, 1100, 1, 0, 0, 0, 246, 1104, 1, 0, 0, 0, 248, 1108, 1, 0, 0, 0, 250, 1111, 1, 0, 0, 0, 252, 1115, 1, 0, 0, 0, 254, 1119, 1, 0, 0, 0, 256, 1123, 1, 0, 0, 0, 258, 1127, 1, 0, 0, 0, 260, 1132, 1, 0, 0, 0, 262, 1137, 1, 0, 0, 0, 264, 1142, 1, 0, 0, 0, 266, 1149, 1, 0, 0, 0, 268, 1158, 1, 0, 0, 0, 270, 1165, 1, 0, 0, 0, 272, 1169, 1, 0, 0, 0, 274, 1173, 1, 0, 0, 0, 276, 1177, 1, 0, 0, 0, 278, 1181, 1, 0, 0, 0, 280, 1187, 1, 0, 0, 0, 282, 1191, 1, 0, 0, 0, 284, 1195, 1, 0, 0, 0, 286, 1199, 1, 0, 0, 0, 288, 1203, 1, 0, 0, 0, 290, 1207, 1, 0, 0, 0, 292, 1211, 1, 0, 0, 0, 294, 1215, 1, 0, 0, 0, 296, 1219, 1, 0, 0, 0, 298, 1223, 1, 0, 0, 0, 300, 1228, 1, 0, 0, 0, 302, 1232, 1, 0, 0, 0, 304, 1236, 1, 0, 0, 0, 306, 1240, 1, 0, 0, 0, 308, 1244, 1, 0, 0, 0, 310, 1248, 1, 0, 0, 0, 312, 1252, 1, 0, 0, 0, 314, 1257, 1, 0, 0, 0, 316, 1262, 1, 0, 0, 0, 318, 1266, 1, 0, 0, 0, 320, 1270, 1, 0, 0, 0, 322, 1274, 1, 0, 0, 0, 324, 1279, 1, 0, 0, 0, 326, 1289, 1, 0, 0, 0, 328, 1293, 1, 0, 0, 0, 330, 1297, 1, 0, 0, 0, 332, 1301, 1, 0, 0, 0, 334, 1306, 1, 0, 0, 0, 336, 1313, 1, 0, 0, 0, 338, 1317, 1, 0, 0, 0, 340, 1321, 1, 0, 0, 0, 342, 1325, 1, 0, 0, 0, 344, 1329, 1, 0, 0, 0, 346, 1334, 1, 0, 0, 0, 348, 1338, 1, 0, 0, 0, 350, 1342, 1, 0, 0, 0, 352, 1346, 1, 0, 0, 0, 354, 1351, 1, 0, 0, 0, 356, 1355, 1, 0, 0, 0, 358, 1359, 1, 0, 0, 0, 360, 1363, 1, 0, 0, 0, 362, 1367, 1, 0, 0, 0, 364, 1371, 1, 0, 0, 0, 366, 1377, 1, 0, 0, 0, 368, 1381, 1, 0, 0, 0, 370, 1385, 1, 0, 0, 0, 372, 1389, 1, 0, 0, 0, 374, 1393, 1, 0, 0, 0, 376, 1397, 1, 0, 0, 0, 378, 1401, 1, 0, 0, 0, 380, 1406, 1, 0, 0, 0, 382, 1412, 1, 0, 0, 0, 384, 1418, 1, 0, 0, 0, 386, 1422, 1, 0, 0, 0, 388, 1426, 1, 0, 0, 0, 390, 1430, 1, 0, 0, 0, 392, 1436, 1, 0, 0, 0, 394, 1442, 1, 0, 0, 0, 396, 1446, 1, 0, 0, 0, 398, 1450, 1, 0, 0, 0, 400, 1454, 1, 0, 0, 0, 402, 1460, 1, 0, 0, 0, 404, 1466, 1, 0, 0, 0, 406, 1472, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 7, 1, 0, 471, 31, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 8, 0, 0, 479, 33, 1, 0, 0, 0, 480, 481, 7, 16, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 5, 0, 0, 483, 484, 7, 12, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 9, 5, 0, 486, 35, 1, 0, 0, 0, 487, 488, 7, 16, 0, 0, 488, 489, 7, 11, 0, 0, 489, 490, 5, 95, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 14, 0, 0, 492, 493, 7, 8, 0, 0, 493, 494, 7, 12, 0, 0, 494, 495, 7, 9, 0, 0, 495, 496, 7, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 6, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 9, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 7, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 6, 0, 0, 509, 510, 7, 7, 0, 0, 510, 511, 7, 19, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 12, 0, 0, 513, 41, 1, 0, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 19, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 6, 13, 8, 0, 520, 43, 1, 0, 0, 0, 521, 522, 7, 2, 0, 0, 522, 523, 7, 7, 0, 0, 523, 524, 7, 6, 0, 0, 524, 525, 7, 5, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 14, 0, 0, 527, 45, 1, 0, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 12, 0, 0, 531, 532, 7, 5, 0, 0, 532, 533, 7, 2, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 15, 0, 0, 535, 47, 1, 0, 0, 0, 536, 537, 7, 19, 0, 0, 537, 538, 7, 10, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 3, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 16, 0, 0, 543, 49, 1, 0, 0, 0, 544, 545, 4, 17, 0, 0, 545, 546, 7, 1, 0, 0, 546, 547, 7, 9, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 1, 0, 0, 549, 550, 7, 9, 0, 0, 550, 551, 7, 3, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 12, 0, 0, 554, 555, 7, 5, 0, 0, 555, 556, 7, 2, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 4, 18, 1, 0, 560, 561, 7, 13, 0, 0, 561, 562, 7, 7, 0, 0, 562, 563, 7, 7, 0, 0, 563, 564, 7, 18, 0, 0, 564, 565, 7, 20, 0, 0, 565, 566, 7, 8, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 9, 0, 568, 53, 1, 0, 0, 0, 569, 570, 4, 19, 2, 0, 570, 571, 7, 16, 0, 0, 571, 572, 7, 12, 0, 0, 572, 573, 7, 5, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 10, 0, 0, 575, 576, 7, 2, 0, 0, 576, 577, 7, 5, 0, 0, 577, 578, 7, 6, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 6, 19, 0, 0, 580, 55, 1, 0, 0, 0, 581, 582, 4, 20, 3, 0, 582, 583, 7, 16, 0, 0, 583, 584, 7, 3, 0, 0, 584, 585, 7, 5, 0, 0, 585, 586, 7, 6, 0, 0, 586, 587, 7, 1, 0, 0, 587, 588, 7, 4, 0, 0, 588, 589, 7, 2, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 6, 20, 10, 0, 591, 57, 1, 0, 0, 0, 592, 594, 8, 21, 0, 0, 593, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 6, 21, 0, 0, 598, 59, 1, 0, 0, 0, 599, 600, 5, 47, 0, 0, 600, 601, 5, 47, 0, 0, 601, 605, 1, 0, 0, 0, 602, 604, 8, 22, 0, 0, 603, 602, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 5, 13, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 613, 5, 10, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 6, 22, 11, 0, 615, 61, 1, 0, 0, 0, 616, 617, 5, 47, 0, 0, 617, 618, 5, 42, 0, 0, 618, 623, 1, 0, 0, 0, 619, 622, 3, 62, 23, 0, 620, 622, 9, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 625, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 624, 626, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 626, 627, 5, 42, 0, 0, 627, 628, 5, 47, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 6, 23, 11, 0, 630, 63, 1, 0, 0, 0, 631, 633, 7, 23, 0, 0, 632, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 637, 6, 24, 11, 0, 637, 65, 1, 0, 0, 0, 638, 639, 5, 124, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 25, 12, 0, 641, 67, 1, 0, 0, 0, 642, 643, 7, 24, 0, 0, 643, 69, 1, 0, 0, 0, 644, 645, 7, 25, 0, 0, 645, 71, 1, 0, 0, 0, 646, 647, 5, 92, 0, 0, 647, 648, 7, 26, 0, 0, 648, 73, 1, 0, 0, 0, 649, 650, 8, 27, 0, 0, 650, 75, 1, 0, 0, 0, 651, 653, 7, 3, 0, 0, 652, 654, 7, 28, 0, 0, 653, 652, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 656, 1, 0, 0, 0, 655, 657, 3, 68, 26, 0, 656, 655, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 77, 1, 0, 0, 0, 660, 661, 5, 64, 0, 0, 661, 79, 1, 0, 0, 0, 662, 663, 5, 96, 0, 0, 663, 81, 1, 0, 0, 0, 664, 668, 8, 29, 0, 0, 665, 666, 5, 96, 0, 0, 666, 668, 5, 96, 0, 0, 667, 664, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 668, 83, 1, 0, 0, 0, 669, 670, 5, 95, 0, 0, 670, 85, 1, 0, 0, 0, 671, 675, 3, 70, 27, 0, 672, 675, 3, 68, 26, 0, 673, 675, 3, 84, 34, 0, 674, 671, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 674, 673, 1, 0, 0, 0, 675, 87, 1, 0, 0, 0, 676, 681, 5, 34, 0, 0, 677, 680, 3, 72, 28, 0, 678, 680, 3, 74, 29, 0, 679, 677, 1, 0, 0, 0, 679, 678, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 684, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 706, 5, 34, 0, 0, 685, 686, 5, 34, 0, 0, 686, 687, 5, 34, 0, 0, 687, 688, 5, 34, 0, 0, 688, 692, 1, 0, 0, 0, 689, 691, 8, 22, 0, 0, 690, 689, 1, 0, 0, 0, 691, 694, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 692, 690, 1, 0, 0, 0, 693, 695, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 695, 696, 5, 34, 0, 0, 696, 697, 5, 34, 0, 0, 697, 698, 5, 34, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 5, 34, 0, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 703, 1, 0, 0, 0, 702, 704, 5, 34, 0, 0, 703, 702, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 1, 0, 0, 0, 705, 676, 1, 0, 0, 0, 705, 685, 1, 0, 0, 0, 706, 89, 1, 0, 0, 0, 707, 709, 3, 68, 26, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 91, 1, 0, 0, 0, 712, 714, 3, 68, 26, 0, 713, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 721, 3, 108, 46, 0, 718, 720, 3, 68, 26, 0, 719, 718, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 755, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 726, 3, 108, 46, 0, 725, 727, 3, 68, 26, 0, 726, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 755, 1, 0, 0, 0, 730, 732, 3, 68, 26, 0, 731, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 742, 1, 0, 0, 0, 735, 739, 3, 108, 46, 0, 736, 738, 3, 68, 26, 0, 737, 736, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 735, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 3, 76, 30, 0, 745, 755, 1, 0, 0, 0, 746, 748, 3, 108, 46, 0, 747, 749, 3, 68, 26, 0, 748, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 3, 76, 30, 0, 753, 755, 1, 0, 0, 0, 754, 713, 1, 0, 0, 0, 754, 724, 1, 0, 0, 0, 754, 731, 1, 0, 0, 0, 754, 746, 1, 0, 0, 0, 755, 93, 1, 0, 0, 0, 756, 757, 7, 30, 0, 0, 757, 758, 7, 31, 0, 0, 758, 95, 1, 0, 0, 0, 759, 760, 7, 12, 0, 0, 760, 761, 7, 9, 0, 0, 761, 762, 7, 0, 0, 0, 762, 97, 1, 0, 0, 0, 763, 764, 7, 12, 0, 0, 764, 765, 7, 2, 0, 0, 765, 766, 7, 4, 0, 0, 766, 99, 1, 0, 0, 0, 767, 768, 5, 61, 0, 0, 768, 101, 1, 0, 0, 0, 769, 770, 5, 58, 0, 0, 770, 771, 5, 58, 0, 0, 771, 103, 1, 0, 0, 0, 772, 773, 5, 44, 0, 0, 773, 105, 1, 0, 0, 0, 774, 775, 7, 0, 0, 0, 775, 776, 7, 3, 0, 0, 776, 777, 7, 2, 0, 0, 777, 778, 7, 4, 0, 0, 778, 107, 1, 0, 0, 0, 779, 780, 5, 46, 0, 0, 780, 109, 1, 0, 0, 0, 781, 782, 7, 15, 0, 0, 782, 783, 7, 12, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 2, 0, 0, 785, 786, 7, 3, 0, 0, 786, 111, 1, 0, 0, 0, 787, 788, 7, 15, 0, 0, 788, 789, 7, 1, 0, 0, 789, 790, 7, 6, 0, 0, 790, 791, 7, 2, 0, 0, 791, 792, 7, 5, 0, 0, 792, 113, 1, 0, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 9, 0, 0, 795, 115, 1, 0, 0, 0, 796, 797, 7, 1, 0, 0, 797, 798, 7, 2, 0, 0, 798, 117, 1, 0, 0, 0, 799, 800, 7, 13, 0, 0, 800, 801, 7, 12, 0, 0, 801, 802, 7, 2, 0, 0, 802, 803, 7, 5, 0, 0, 803, 119, 1, 0, 0, 0, 804, 805, 7, 13, 0, 0, 805, 806, 7, 1, 0, 0, 806, 807, 7, 18, 0, 0, 807, 808, 7, 3, 0, 0, 808, 121, 1, 0, 0, 0, 809, 810, 5, 40, 0, 0, 810, 123, 1, 0, 0, 0, 811, 812, 7, 9, 0, 0, 812, 813, 7, 7, 0, 0, 813, 814, 7, 5, 0, 0, 814, 125, 1, 0, 0, 0, 815, 816, 7, 9, 0, 0, 816, 817, 7, 20, 0, 0, 817, 818, 7, 13, 0, 0, 818, 819, 7, 13, 0, 0, 819, 127, 1, 0, 0, 0, 820, 821, 7, 9, 0, 0, 821, 822, 7, 20, 0, 0, 822, 823, 7, 13, 0, 0, 823, 824, 7, 13, 0, 0, 824, 825, 7, 2, 0, 0, 825, 129, 1, 0, 0, 0, 826, 827, 7, 7, 0, 0, 827, 828, 7, 6, 0, 0, 828, 131, 1, 0, 0, 0, 829, 830, 5, 63, 0, 0, 830, 133, 1, 0, 0, 0, 831, 832, 7, 6, 0, 0, 832, 833, 7, 13, 0, 0, 833, 834, 7, 1, 0, 0, 834, 835, 7, 18, 0, 0, 835, 836, 7, 3, 0, 0, 836, 135, 1, 0, 0, 0, 837, 838, 5, 41, 0, 0, 838, 137, 1, 0, 0, 0, 839, 840, 7, 5, 0, 0, 840, 841, 7, 6, 0, 0, 841, 842, 7, 20, 0, 0, 842, 843, 7, 3, 0, 0, 843, 139, 1, 0, 0, 0, 844, 845, 5, 61, 0, 0, 845, 846, 5, 61, 0, 0, 846, 141, 1, 0, 0, 0, 847, 848, 5, 61, 0, 0, 848, 849, 5, 126, 0, 0, 849, 143, 1, 0, 0, 0, 850, 851, 5, 33, 0, 0, 851, 852, 5, 61, 0, 0, 852, 145, 1, 0, 0, 0, 853, 854, 5, 60, 0, 0, 854, 147, 1, 0, 0, 0, 855, 856, 5, 60, 0, 0, 856, 857, 5, 61, 0, 0, 857, 149, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 151, 1, 0, 0, 0, 860, 861, 5, 62, 0, 0, 861, 862, 5, 61, 0, 0, 862, 153, 1, 0, 0, 0, 863, 864, 5, 43, 0, 0, 864, 155, 1, 0, 0, 0, 865, 866, 5, 45, 0, 0, 866, 157, 1, 0, 0, 0, 867, 868, 5, 42, 0, 0, 868, 159, 1, 0, 0, 0, 869, 870, 5, 47, 0, 0, 870, 161, 1, 0, 0, 0, 871, 872, 5, 37, 0, 0, 872, 163, 1, 0, 0, 0, 873, 874, 4, 74, 4, 0, 874, 875, 3, 54, 19, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 74, 13, 0, 877, 165, 1, 0, 0, 0, 878, 881, 3, 132, 58, 0, 879, 882, 3, 70, 27, 0, 880, 882, 3, 84, 34, 0, 881, 879, 1, 0, 0, 0, 881, 880, 1, 0, 0, 0, 882, 886, 1, 0, 0, 0, 883, 885, 3, 86, 35, 0, 884, 883, 1, 0, 0, 0, 885, 888, 1, 0, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 896, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 889, 891, 3, 132, 58, 0, 890, 892, 3, 68, 26, 0, 891, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 1, 0, 0, 0, 895, 878, 1, 0, 0, 0, 895, 889, 1, 0, 0, 0, 896, 167, 1, 0, 0, 0, 897, 898, 5, 91, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 6, 76, 0, 0, 900, 901, 6, 76, 0, 0, 901, 169, 1, 0, 0, 0, 902, 903, 5, 93, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 6, 77, 12, 0, 905, 906, 6, 77, 12, 0, 906, 171, 1, 0, 0, 0, 907, 911, 3, 70, 27, 0, 908, 910, 3, 86, 35, 0, 909, 908, 1, 0, 0, 0, 910, 913, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 924, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 914, 917, 3, 84, 34, 0, 915, 917, 3, 78, 31, 0, 916, 914, 1, 0, 0, 0, 916, 915, 1, 0, 0, 0, 917, 919, 1, 0, 0, 0, 918, 920, 3, 86, 35, 0, 919, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 924, 1, 0, 0, 0, 923, 907, 1, 0, 0, 0, 923, 916, 1, 0, 0, 0, 924, 173, 1, 0, 0, 0, 925, 927, 3, 80, 32, 0, 926, 928, 3, 82, 33, 0, 927, 926, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 3, 80, 32, 0, 932, 175, 1, 0, 0, 0, 933, 934, 3, 174, 79, 0, 934, 177, 1, 0, 0, 0, 935, 936, 3, 60, 22, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 81, 11, 0, 938, 179, 1, 0, 0, 0, 939, 940, 3, 62, 23, 0, 940, 941, 1, 0, 0, 0, 941, 942, 6, 82, 11, 0, 942, 181, 1, 0, 0, 0, 943, 944, 3, 64, 24, 0, 944, 945, 1, 0, 0, 0, 945, 946, 6, 83, 11, 0, 946, 183, 1, 0, 0, 0, 947, 948, 3, 168, 76, 0, 948, 949, 1, 0, 0, 0, 949, 950, 6, 84, 14, 0, 950, 951, 6, 84, 15, 0, 951, 185, 1, 0, 0, 0, 952, 953, 3, 66, 25, 0, 953, 954, 1, 0, 0, 0, 954, 955, 6, 85, 16, 0, 955, 956, 6, 85, 12, 0, 956, 187, 1, 0, 0, 0, 957, 958, 3, 64, 24, 0, 958, 959, 1, 0, 0, 0, 959, 960, 6, 86, 11, 0, 960, 189, 1, 0, 0, 0, 961, 962, 3, 60, 22, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 87, 11, 0, 964, 191, 1, 0, 0, 0, 965, 966, 3, 62, 23, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 88, 11, 0, 968, 193, 1, 0, 0, 0, 969, 970, 3, 66, 25, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 89, 16, 0, 972, 973, 6, 89, 12, 0, 973, 195, 1, 0, 0, 0, 974, 975, 3, 168, 76, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 90, 14, 0, 977, 197, 1, 0, 0, 0, 978, 979, 3, 170, 77, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 91, 17, 0, 981, 199, 1, 0, 0, 0, 982, 983, 3, 334, 159, 0, 983, 984, 1, 0, 0, 0, 984, 985, 6, 92, 18, 0, 985, 201, 1, 0, 0, 0, 986, 987, 3, 104, 44, 0, 987, 988, 1, 0, 0, 0, 988, 989, 6, 93, 19, 0, 989, 203, 1, 0, 0, 0, 990, 991, 3, 100, 42, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 94, 20, 0, 993, 205, 1, 0, 0, 0, 994, 995, 7, 16, 0, 0, 995, 996, 7, 3, 0, 0, 996, 997, 7, 5, 0, 0, 997, 998, 7, 12, 0, 0, 998, 999, 7, 0, 0, 0, 999, 1000, 7, 12, 0, 0, 1000, 1001, 7, 5, 0, 0, 1001, 1002, 7, 12, 0, 0, 1002, 207, 1, 0, 0, 0, 1003, 1007, 8, 32, 0, 0, 1004, 1005, 5, 47, 0, 0, 1005, 1007, 8, 33, 0, 0, 1006, 1003, 1, 0, 0, 0, 1006, 1004, 1, 0, 0, 0, 1007, 209, 1, 0, 0, 0, 1008, 1010, 3, 208, 96, 0, 1009, 1008, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 211, 1, 0, 0, 0, 1013, 1014, 3, 210, 97, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 6, 98, 21, 0, 1016, 213, 1, 0, 0, 0, 1017, 1018, 3, 88, 36, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 6, 99, 22, 0, 1020, 215, 1, 0, 0, 0, 1021, 1022, 3, 60, 22, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 6, 100, 11, 0, 1024, 217, 1, 0, 0, 0, 1025, 1026, 3, 62, 23, 0, 1026, 1027, 1, 0, 0, 0, 1027, 1028, 6, 101, 11, 0, 1028, 219, 1, 0, 0, 0, 1029, 1030, 3, 64, 24, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1032, 6, 102, 11, 0, 1032, 221, 1, 0, 0, 0, 1033, 1034, 3, 66, 25, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1036, 6, 103, 16, 0, 1036, 1037, 6, 103, 12, 0, 1037, 223, 1, 0, 0, 0, 1038, 1039, 3, 108, 46, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 104, 23, 0, 1041, 225, 1, 0, 0, 0, 1042, 1043, 3, 104, 44, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 6, 105, 19, 0, 1045, 227, 1, 0, 0, 0, 1046, 1051, 3, 70, 27, 0, 1047, 1051, 3, 68, 26, 0, 1048, 1051, 3, 84, 34, 0, 1049, 1051, 3, 158, 71, 0, 1050, 1046, 1, 0, 0, 0, 1050, 1047, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1049, 1, 0, 0, 0, 1051, 229, 1, 0, 0, 0, 1052, 1055, 3, 70, 27, 0, 1053, 1055, 3, 158, 71, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1059, 1, 0, 0, 0, 1056, 1058, 3, 228, 106, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1072, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1065, 3, 84, 34, 0, 1063, 1065, 3, 78, 31, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 1067, 1, 0, 0, 0, 1066, 1068, 3, 228, 106, 0, 1067, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1072, 1, 0, 0, 0, 1071, 1054, 1, 0, 0, 0, 1071, 1064, 1, 0, 0, 0, 1072, 231, 1, 0, 0, 0, 1073, 1076, 3, 230, 107, 0, 1074, 1076, 3, 174, 79, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 233, 1, 0, 0, 0, 1079, 1080, 3, 60, 22, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 109, 11, 0, 1082, 235, 1, 0, 0, 0, 1083, 1084, 3, 62, 23, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 110, 11, 0, 1086, 237, 1, 0, 0, 0, 1087, 1088, 3, 64, 24, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 111, 11, 0, 1090, 239, 1, 0, 0, 0, 1091, 1092, 3, 66, 25, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 112, 16, 0, 1094, 1095, 6, 112, 12, 0, 1095, 241, 1, 0, 0, 0, 1096, 1097, 3, 100, 42, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 113, 20, 0, 1099, 243, 1, 0, 0, 0, 1100, 1101, 3, 104, 44, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 114, 19, 0, 1103, 245, 1, 0, 0, 0, 1104, 1105, 3, 108, 46, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 115, 23, 0, 1107, 247, 1, 0, 0, 0, 1108, 1109, 7, 12, 0, 0, 1109, 1110, 7, 2, 0, 0, 1110, 249, 1, 0, 0, 0, 1111, 1112, 3, 232, 108, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 117, 24, 0, 1114, 251, 1, 0, 0, 0, 1115, 1116, 3, 60, 22, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 118, 11, 0, 1118, 253, 1, 0, 0, 0, 1119, 1120, 3, 62, 23, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 119, 11, 0, 1122, 255, 1, 0, 0, 0, 1123, 1124, 3, 64, 24, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 120, 11, 0, 1126, 257, 1, 0, 0, 0, 1127, 1128, 3, 66, 25, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 121, 16, 0, 1130, 1131, 6, 121, 12, 0, 1131, 259, 1, 0, 0, 0, 1132, 1133, 3, 168, 76, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 122, 14, 0, 1135, 1136, 6, 122, 25, 0, 1136, 261, 1, 0, 0, 0, 1137, 1138, 7, 7, 0, 0, 1138, 1139, 7, 9, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 123, 26, 0, 1141, 263, 1, 0, 0, 0, 1142, 1143, 7, 19, 0, 0, 1143, 1144, 7, 1, 0, 0, 1144, 1145, 7, 5, 0, 0, 1145, 1146, 7, 10, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 124, 26, 0, 1148, 265, 1, 0, 0, 0, 1149, 1150, 8, 34, 0, 0, 1150, 267, 1, 0, 0, 0, 1151, 1153, 3, 266, 125, 0, 1152, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 3, 334, 159, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1152, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1161, 1, 0, 0, 0, 1160, 1162, 3, 266, 125, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 269, 1, 0, 0, 0, 1165, 1166, 3, 268, 126, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 127, 27, 0, 1168, 271, 1, 0, 0, 0, 1169, 1170, 3, 60, 22, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 6, 128, 11, 0, 1172, 273, 1, 0, 0, 0, 1173, 1174, 3, 62, 23, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 6, 129, 11, 0, 1176, 275, 1, 0, 0, 0, 1177, 1178, 3, 64, 24, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1180, 6, 130, 11, 0, 1180, 277, 1, 0, 0, 0, 1181, 1182, 3, 66, 25, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 6, 131, 16, 0, 1184, 1185, 6, 131, 12, 0, 1185, 1186, 6, 131, 12, 0, 1186, 279, 1, 0, 0, 0, 1187, 1188, 3, 100, 42, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 132, 20, 0, 1190, 281, 1, 0, 0, 0, 1191, 1192, 3, 104, 44, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 133, 19, 0, 1194, 283, 1, 0, 0, 0, 1195, 1196, 3, 108, 46, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 134, 23, 0, 1198, 285, 1, 0, 0, 0, 1199, 1200, 3, 264, 124, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 135, 28, 0, 1202, 287, 1, 0, 0, 0, 1203, 1204, 3, 232, 108, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1206, 6, 136, 24, 0, 1206, 289, 1, 0, 0, 0, 1207, 1208, 3, 176, 80, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 6, 137, 29, 0, 1210, 291, 1, 0, 0, 0, 1211, 1212, 3, 60, 22, 0, 1212, 1213, 1, 0, 0, 0, 1213, 1214, 6, 138, 11, 0, 1214, 293, 1, 0, 0, 0, 1215, 1216, 3, 62, 23, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 6, 139, 11, 0, 1218, 295, 1, 0, 0, 0, 1219, 1220, 3, 64, 24, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 6, 140, 11, 0, 1222, 297, 1, 0, 0, 0, 1223, 1224, 3, 66, 25, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1226, 6, 141, 16, 0, 1226, 1227, 6, 141, 12, 0, 1227, 299, 1, 0, 0, 0, 1228, 1229, 3, 108, 46, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 142, 23, 0, 1231, 301, 1, 0, 0, 0, 1232, 1233, 3, 176, 80, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 143, 29, 0, 1235, 303, 1, 0, 0, 0, 1236, 1237, 3, 172, 78, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 144, 30, 0, 1239, 305, 1, 0, 0, 0, 1240, 1241, 3, 60, 22, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 145, 11, 0, 1243, 307, 1, 0, 0, 0, 1244, 1245, 3, 62, 23, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 146, 11, 0, 1247, 309, 1, 0, 0, 0, 1248, 1249, 3, 64, 24, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 147, 11, 0, 1251, 311, 1, 0, 0, 0, 1252, 1253, 3, 66, 25, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 148, 16, 0, 1255, 1256, 6, 148, 12, 0, 1256, 313, 1, 0, 0, 0, 1257, 1258, 7, 1, 0, 0, 1258, 1259, 7, 9, 0, 0, 1259, 1260, 7, 15, 0, 0, 1260, 1261, 7, 7, 0, 0, 1261, 315, 1, 0, 0, 0, 1262, 1263, 3, 60, 22, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 150, 11, 0, 1265, 317, 1, 0, 0, 0, 1266, 1267, 3, 62, 23, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 151, 11, 0, 1269, 319, 1, 0, 0, 0, 1270, 1271, 3, 64, 24, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 152, 11, 0, 1273, 321, 1, 0, 0, 0, 1274, 1275, 3, 66, 25, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 153, 16, 0, 1277, 1278, 6, 153, 12, 0, 1278, 323, 1, 0, 0, 0, 1279, 1280, 7, 15, 0, 0, 1280, 1281, 7, 20, 0, 0, 1281, 1282, 7, 9, 0, 0, 1282, 1283, 7, 4, 0, 0, 1283, 1284, 7, 5, 0, 0, 1284, 1285, 7, 1, 0, 0, 1285, 1286, 7, 7, 0, 0, 1286, 1287, 7, 9, 0, 0, 1287, 1288, 7, 2, 0, 0, 1288, 325, 1, 0, 0, 0, 1289, 1290, 3, 60, 22, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 155, 11, 0, 1292, 327, 1, 0, 0, 0, 1293, 1294, 3, 62, 23, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1296, 6, 156, 11, 0, 1296, 329, 1, 0, 0, 0, 1297, 1298, 3, 64, 24, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 6, 157, 11, 0, 1300, 331, 1, 0, 0, 0, 1301, 1302, 3, 170, 77, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 6, 158, 17, 0, 1304, 1305, 6, 158, 12, 0, 1305, 333, 1, 0, 0, 0, 1306, 1307, 5, 58, 0, 0, 1307, 335, 1, 0, 0, 0, 1308, 1314, 3, 78, 31, 0, 1309, 1314, 3, 68, 26, 0, 1310, 1314, 3, 108, 46, 0, 1311, 1314, 3, 70, 27, 0, 1312, 1314, 3, 84, 34, 0, 1313, 1308, 1, 0, 0, 0, 1313, 1309, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1313, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 337, 1, 0, 0, 0, 1317, 1318, 3, 60, 22, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 6, 161, 11, 0, 1320, 339, 1, 0, 0, 0, 1321, 1322, 3, 62, 23, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 6, 162, 11, 0, 1324, 341, 1, 0, 0, 0, 1325, 1326, 3, 64, 24, 0, 1326, 1327, 1, 0, 0, 0, 1327, 1328, 6, 163, 11, 0, 1328, 343, 1, 0, 0, 0, 1329, 1330, 3, 66, 25, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 6, 164, 16, 0, 1332, 1333, 6, 164, 12, 0, 1333, 345, 1, 0, 0, 0, 1334, 1335, 3, 334, 159, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 165, 18, 0, 1337, 347, 1, 0, 0, 0, 1338, 1339, 3, 104, 44, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 166, 19, 0, 1341, 349, 1, 0, 0, 0, 1342, 1343, 3, 108, 46, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 167, 23, 0, 1345, 351, 1, 0, 0, 0, 1346, 1347, 3, 262, 123, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 168, 31, 0, 1349, 1350, 6, 168, 32, 0, 1350, 353, 1, 0, 0, 0, 1351, 1352, 3, 210, 97, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 6, 169, 21, 0, 1354, 355, 1, 0, 0, 0, 1355, 1356, 3, 88, 36, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1358, 6, 170, 22, 0, 1358, 357, 1, 0, 0, 0, 1359, 1360, 3, 60, 22, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 171, 11, 0, 1362, 359, 1, 0, 0, 0, 1363, 1364, 3, 62, 23, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 172, 11, 0, 1366, 361, 1, 0, 0, 0, 1367, 1368, 3, 64, 24, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 6, 173, 11, 0, 1370, 363, 1, 0, 0, 0, 1371, 1372, 3, 66, 25, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1374, 6, 174, 16, 0, 1374, 1375, 6, 174, 12, 0, 1375, 1376, 6, 174, 12, 0, 1376, 365, 1, 0, 0, 0, 1377, 1378, 3, 104, 44, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 175, 19, 0, 1380, 367, 1, 0, 0, 0, 1381, 1382, 3, 108, 46, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, 176, 23, 0, 1384, 369, 1, 0, 0, 0, 1385, 1386, 3, 232, 108, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 6, 177, 24, 0, 1388, 371, 1, 0, 0, 0, 1389, 1390, 3, 60, 22, 0, 1390, 1391, 1, 0, 0, 0, 1391, 1392, 6, 178, 11, 0, 1392, 373, 1, 0, 0, 0, 1393, 1394, 3, 62, 23, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 179, 11, 0, 1396, 375, 1, 0, 0, 0, 1397, 1398, 3, 64, 24, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 6, 180, 11, 0, 1400, 377, 1, 0, 0, 0, 1401, 1402, 3, 66, 25, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 6, 181, 16, 0, 1404, 1405, 6, 181, 12, 0, 1405, 379, 1, 0, 0, 0, 1406, 1407, 3, 210, 97, 0, 1407, 1408, 1, 0, 0, 0, 1408, 1409, 6, 182, 21, 0, 1409, 1410, 6, 182, 12, 0, 1410, 1411, 6, 182, 33, 0, 1411, 381, 1, 0, 0, 0, 1412, 1413, 3, 88, 36, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1415, 6, 183, 22, 0, 1415, 1416, 6, 183, 12, 0, 1416, 1417, 6, 183, 33, 0, 1417, 383, 1, 0, 0, 0, 1418, 1419, 3, 60, 22, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 6, 184, 11, 0, 1421, 385, 1, 0, 0, 0, 1422, 1423, 3, 62, 23, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1425, 6, 185, 11, 0, 1425, 387, 1, 0, 0, 0, 1426, 1427, 3, 64, 24, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1429, 6, 186, 11, 0, 1429, 389, 1, 0, 0, 0, 1430, 1431, 3, 334, 159, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1433, 6, 187, 18, 0, 1433, 1434, 6, 187, 12, 0, 1434, 1435, 6, 187, 10, 0, 1435, 391, 1, 0, 0, 0, 1436, 1437, 3, 104, 44, 0, 1437, 1438, 1, 0, 0, 0, 1438, 1439, 6, 188, 19, 0, 1439, 1440, 6, 188, 12, 0, 1440, 1441, 6, 188, 10, 0, 1441, 393, 1, 0, 0, 0, 1442, 1443, 3, 60, 22, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1445, 6, 189, 11, 0, 1445, 395, 1, 0, 0, 0, 1446, 1447, 3, 62, 23, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 6, 190, 11, 0, 1449, 397, 1, 0, 0, 0, 1450, 1451, 3, 64, 24, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 6, 191, 11, 0, 1453, 399, 1, 0, 0, 0, 1454, 1455, 3, 176, 80, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 192, 12, 0, 1457, 1458, 6, 192, 0, 0, 1458, 1459, 6, 192, 29, 0, 1459, 401, 1, 0, 0, 0, 1460, 1461, 3, 172, 78, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 6, 193, 12, 0, 1463, 1464, 6, 193, 0, 0, 1464, 1465, 6, 193, 30, 0, 1465, 403, 1, 0, 0, 0, 1466, 1467, 3, 94, 39, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 6, 194, 12, 0, 1469, 1470, 6, 194, 0, 0, 1470, 1471, 6, 194, 34, 0, 1471, 405, 1, 0, 0, 0, 1472, 1473, 3, 66, 25, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 195, 16, 0, 1475, 1476, 6, 195, 12, 0, 1476, 407, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 595, 605, 609, 612, 621, 623, 634, 653, 658, 667, 674, 679, 681, 692, 700, 703, 705, 710, 715, 721, 728, 733, 739, 742, 750, 754, 881, 886, 893, 895, 911, 916, 921, 923, 929, 1006, 1011, 1050, 1054, 1059, 1064, 1069, 1071, 1075, 1077, 1154, 1158, 1163, 1313, 1315, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 20, 0, 7, 66, 0, 5, 0, 0, 7, 26, 0, 7, 67, 0, 7, 109, 0, 7, 35, 0, 7, 33, 0, 7, 77, 0, 7, 27, 0, 7, 37, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 30, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index a746a0d49004f..a253523bb50ab 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -8,14 +8,16 @@ * 2.0. */ -import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.RuntimeMetaData; +import org.antlr.v4.runtime.Vocabulary; +import org.antlr.v4.runtime.VocabularyImpl; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.atn.ATNDeserializer; +import org.antlr.v4.runtime.atn.LexerATNSimulator; +import org.antlr.v4.runtime.atn.PredictionContextCache; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) public class EsqlBaseLexer extends LexerConfig { @@ -25,90 +27,90 @@ public class EsqlBaseLexer extends LexerConfig { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, - LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, - WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, - UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, - QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, - ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, - IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, - PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, - GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, - OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, - EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, - EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, - FROM_LINE_COMMENT=78, FROM_MULTILINE_COMMENT=79, FROM_WS=80, ID_PATTERN=81, - PROJECT_LINE_COMMENT=82, PROJECT_MULTILINE_COMMENT=83, PROJECT_WS=84, - AS=85, RENAME_LINE_COMMENT=86, RENAME_MULTILINE_COMMENT=87, RENAME_WS=88, - ON=89, WITH=90, ENRICH_POLICY_NAME=91, ENRICH_LINE_COMMENT=92, ENRICH_MULTILINE_COMMENT=93, - ENRICH_WS=94, ENRICH_FIELD_LINE_COMMENT=95, ENRICH_FIELD_MULTILINE_COMMENT=96, - ENRICH_FIELD_WS=97, MVEXPAND_LINE_COMMENT=98, MVEXPAND_MULTILINE_COMMENT=99, - MVEXPAND_WS=100, INFO=101, SHOW_LINE_COMMENT=102, SHOW_MULTILINE_COMMENT=103, - SHOW_WS=104, FUNCTIONS=105, META_LINE_COMMENT=106, META_MULTILINE_COMMENT=107, - META_WS=108, COLON=109, SETTING=110, SETTING_LINE_COMMENT=111, SETTTING_MULTILINE_COMMENT=112, - SETTING_WS=113, LOOKUP_LINE_COMMENT=114, LOOKUP_MULTILINE_COMMENT=115, - LOOKUP_WS=116, LOOKUP_FIELD_LINE_COMMENT=117, LOOKUP_FIELD_MULTILINE_COMMENT=118, - LOOKUP_FIELD_WS=119, METRICS_LINE_COMMENT=120, METRICS_MULTILINE_COMMENT=121, - METRICS_WS=122, CLOSING_METRICS_LINE_COMMENT=123, CLOSING_METRICS_MULTILINE_COMMENT=124, + DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, + LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, + WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, + UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, + QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, + ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, + IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, + PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, + GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, + OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, + EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, + EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, + FROM_LINE_COMMENT=78, FROM_MULTILINE_COMMENT=79, FROM_WS=80, ID_PATTERN=81, + PROJECT_LINE_COMMENT=82, PROJECT_MULTILINE_COMMENT=83, PROJECT_WS=84, + AS=85, RENAME_LINE_COMMENT=86, RENAME_MULTILINE_COMMENT=87, RENAME_WS=88, + ON=89, WITH=90, ENRICH_POLICY_NAME=91, ENRICH_LINE_COMMENT=92, ENRICH_MULTILINE_COMMENT=93, + ENRICH_WS=94, ENRICH_FIELD_LINE_COMMENT=95, ENRICH_FIELD_MULTILINE_COMMENT=96, + ENRICH_FIELD_WS=97, MVEXPAND_LINE_COMMENT=98, MVEXPAND_MULTILINE_COMMENT=99, + MVEXPAND_WS=100, INFO=101, SHOW_LINE_COMMENT=102, SHOW_MULTILINE_COMMENT=103, + SHOW_WS=104, FUNCTIONS=105, META_LINE_COMMENT=106, META_MULTILINE_COMMENT=107, + META_WS=108, COLON=109, SETTING=110, SETTING_LINE_COMMENT=111, SETTTING_MULTILINE_COMMENT=112, + SETTING_WS=113, LOOKUP_LINE_COMMENT=114, LOOKUP_MULTILINE_COMMENT=115, + LOOKUP_WS=116, LOOKUP_FIELD_LINE_COMMENT=117, LOOKUP_FIELD_MULTILINE_COMMENT=118, + LOOKUP_FIELD_WS=119, METRICS_LINE_COMMENT=120, METRICS_MULTILINE_COMMENT=121, + METRICS_WS=122, CLOSING_METRICS_LINE_COMMENT=123, CLOSING_METRICS_MULTILINE_COMMENT=124, CLOSING_METRICS_WS=125; public static final int - EXPRESSION_MODE=1, EXPLAIN_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, - ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, META_MODE=10, - SETTING_MODE=11, LOOKUP_MODE=12, LOOKUP_FIELD_MODE=13, METRICS_MODE=14, + EXPRESSION_MODE=1, EXPLAIN_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, + ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, META_MODE=10, + SETTING_MODE=11, LOOKUP_MODE=12, LOOKUP_FIELD_MODE=13, METRICS_MODE=14, CLOSING_METRICS_MODE=15; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; public static String[] modeNames = { - "DEFAULT_MODE", "EXPRESSION_MODE", "EXPLAIN_MODE", "FROM_MODE", "PROJECT_MODE", - "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", - "META_MODE", "SETTING_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "METRICS_MODE", + "DEFAULT_MODE", "EXPRESSION_MODE", "EXPLAIN_MODE", "FROM_MODE", "PROJECT_MODE", + "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", + "META_MODE", "SETTING_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "METRICS_MODE", "CLOSING_METRICS_MODE" }; private static String[] makeRuleNames() { return new String[] { - "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", - "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", - "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", - "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DEV_MATCH_OP", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", - "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", - "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", - "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", - "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", - "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", - "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", - "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", - "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_PIPE", "LOOKUP_COLON", - "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", - "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", - "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", - "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", - "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", - "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", + "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", + "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", + "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", + "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", + "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", + "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", + "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", + "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", + "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", + "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "DEV_MATCH_OP", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", + "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", + "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", + "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", + "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", + "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", + "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", + "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", + "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", + "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", + "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", + "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_PIPE", "LOOKUP_COLON", + "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", + "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", + "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", + "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", + "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE" }; } @@ -116,47 +118,47 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { - null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", - "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", - "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, - null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", - "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", - "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", - "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", - null, null, null, null, null, null, null, null, "'metadata'", null, null, - null, null, null, null, null, null, "'as'", null, null, null, "'on'", - "'with'", null, null, null, null, null, null, null, null, null, null, + null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", + "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", + "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, + null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", + "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", + "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", + "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", + "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", + null, null, null, null, null, null, null, null, "'metadata'", null, null, + null, null, null, null, null, null, "'as'", null, null, null, "'on'", + "'with'", null, null, null, null, null, null, null, null, null, null, "'info'", null, null, null, "'functions'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", - "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", - "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", - "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", - "META_MULTILINE_COMMENT", "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", - "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", + "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", + "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", + "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", + "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", + "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", + "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", + "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", + "META_MULTILINE_COMMENT", "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", + "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS" }; } @@ -272,7 +274,7 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0000}\u05c2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000}\u05c5\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ @@ -354,881 +356,882 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0004\u0015\u024f\b\u0015\u000b\u0015\f"+ - "\u0015\u0250\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0005\u0016\u0259\b\u0016\n\u0016\f\u0016\u025c\t\u0016\u0001"+ - "\u0016\u0003\u0016\u025f\b\u0016\u0001\u0016\u0003\u0016\u0262\b\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0005\u0017\u026b\b\u0017\n\u0017\f\u0017\u026e\t\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0004"+ - "\u0018\u0276\b\u0018\u000b\u0018\f\u0018\u0277\u0001\u0018\u0001\u0018"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ - "\u0001\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u028b\b\u001e\u0001\u001e"+ - "\u0004\u001e\u028e\b\u001e\u000b\u001e\f\u001e\u028f\u0001\u001f\u0001"+ - "\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0003!\u0299\b!\u0001\"\u0001"+ - "\"\u0001#\u0001#\u0001#\u0003#\u02a0\b#\u0001$\u0001$\u0001$\u0005$\u02a5"+ - "\b$\n$\f$\u02a8\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u02b0"+ - "\b$\n$\f$\u02b3\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0003$\u02ba\b$"+ - "\u0001$\u0003$\u02bd\b$\u0003$\u02bf\b$\u0001%\u0004%\u02c2\b%\u000b%"+ - "\f%\u02c3\u0001&\u0004&\u02c7\b&\u000b&\f&\u02c8\u0001&\u0001&\u0005&"+ - "\u02cd\b&\n&\f&\u02d0\t&\u0001&\u0001&\u0004&\u02d4\b&\u000b&\f&\u02d5"+ - "\u0001&\u0004&\u02d9\b&\u000b&\f&\u02da\u0001&\u0001&\u0005&\u02df\b&"+ - "\n&\f&\u02e2\t&\u0003&\u02e4\b&\u0001&\u0001&\u0001&\u0001&\u0004&\u02ea"+ - "\b&\u000b&\f&\u02eb\u0001&\u0001&\u0003&\u02f0\b&\u0001\'\u0001\'\u0001"+ - "\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ - "*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u0001"+ - "2\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ - "4\u00015\u00015\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ - "9\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ - "<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001"+ - "G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ - "K\u0001K\u0001K\u0003K\u036f\bK\u0001K\u0005K\u0372\bK\nK\fK\u0375\tK"+ - "\u0001K\u0001K\u0004K\u0379\bK\u000bK\fK\u037a\u0003K\u037d\bK\u0001L"+ - "\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "N\u0001N\u0005N\u038b\bN\nN\fN\u038e\tN\u0001N\u0001N\u0003N\u0392\bN"+ - "\u0001N\u0004N\u0395\bN\u000bN\fN\u0396\u0003N\u0399\bN\u0001O\u0001O"+ - "\u0004O\u039d\bO\u000bO\fO\u039e\u0001O\u0001O\u0001P\u0001P\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ - "S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001"+ - "U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ - "X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0003"+ - "`\u03ec\b`\u0001a\u0004a\u03ef\ba\u000ba\fa\u03f0\u0001b\u0001b\u0001"+ - "b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ - "e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ - "i\u0001j\u0001j\u0001j\u0001j\u0003j\u0418\bj\u0001k\u0001k\u0003k\u041c"+ - "\bk\u0001k\u0005k\u041f\bk\nk\fk\u0422\tk\u0001k\u0001k\u0003k\u0426\b"+ - "k\u0001k\u0004k\u0429\bk\u000bk\fk\u042a\u0003k\u042d\bk\u0001l\u0001"+ - "l\u0004l\u0431\bl\u000bl\fl\u0432\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ - "n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001"+ - "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ - "s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+ - "u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001x\u0001"+ - "x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001"+ - "z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001"+ - "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0004~\u047e\b~\u000b"+ - "~\f~\u047f\u0001~\u0001~\u0003~\u0484\b~\u0001~\u0004~\u0487\b~\u000b"+ - "~\f~\u0488\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080"+ - "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083"+ - "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084"+ - "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085"+ - "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087"+ - "\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ - "\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a"+ - "\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c"+ - "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0004\u00a0"+ - "\u051f\b\u00a0\u000b\u00a0\f\u00a0\u0520\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ - "\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ - "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ - "\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+ - "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ - "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001"+ - "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001"+ - "\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001"+ - "\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ - "\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001"+ - "\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ - "\u00c3\u0001\u00c3\u0002\u026c\u02b1\u0000\u00c4\u0010\u0001\u0012\u0002"+ - "\u0014\u0003\u0016\u0004\u0018\u0005\u001a\u0006\u001c\u0007\u001e\b "+ - "\t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u00112\u00124\u00136\u00148"+ - "\u0015:\u0016<\u0017>\u0018@\u0019B\u001aD\u0000F\u0000H\u0000J\u0000"+ - "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u001bZ\u001c\\\u001d^\u001e"+ - "`\u001fb d!f\"h#j$l%n&p\'r(t)v*x+z,|-~.\u0080/\u00820\u00841\u00862\u0088"+ - "3\u008a4\u008c5\u008e6\u00907\u00928\u00949\u0096:\u0098;\u009a<\u009c"+ - "=\u009e>\u00a0?\u00a2@\u00a4\u0000\u00a6A\u00a8B\u00aaC\u00acD\u00ae\u0000"+ - "\u00b0E\u00b2F\u00b4G\u00b6H\u00b8\u0000\u00ba\u0000\u00bcI\u00beJ\u00c0"+ - "K\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc\u0000"+ - "\u00ceL\u00d0\u0000\u00d2M\u00d4\u0000\u00d6\u0000\u00d8N\u00daO\u00dc"+ - "P\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\u0000\u00e8Q\u00ea"+ - "R\u00ecS\u00eeT\u00f0\u0000\u00f2\u0000\u00f4\u0000\u00f6\u0000\u00f8"+ - "U\u00fa\u0000\u00fcV\u00feW\u0100X\u0102\u0000\u0104\u0000\u0106Y\u0108"+ - "Z\u010a\u0000\u010c[\u010e\u0000\u0110\\\u0112]\u0114^\u0116\u0000\u0118"+ - "\u0000\u011a\u0000\u011c\u0000\u011e\u0000\u0120\u0000\u0122\u0000\u0124"+ - "_\u0126`\u0128a\u012a\u0000\u012c\u0000\u012e\u0000\u0130\u0000\u0132"+ - "b\u0134c\u0136d\u0138\u0000\u013ae\u013cf\u013eg\u0140h\u0142\u0000\u0144"+ - "i\u0146j\u0148k\u014al\u014c\u0000\u014em\u0150n\u0152o\u0154p\u0156q"+ - "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0000\u0160\u0000\u0162\u0000"+ - "\u0164\u0000\u0166r\u0168s\u016at\u016c\u0000\u016e\u0000\u0170\u0000"+ - "\u0172\u0000\u0174u\u0176v\u0178w\u017a\u0000\u017c\u0000\u017e\u0000"+ - "\u0180x\u0182y\u0184z\u0186\u0000\u0188\u0000\u018a{\u018c|\u018e}\u0190"+ - "\u0000\u0192\u0000\u0194\u0000\u0196\u0000\u0010\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd"+ - "\u0002\u0000IIii\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ - "\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000"+ - "NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002"+ - "\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002\u0000GGgg\u0002\u0000"+ - "KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\u0002"+ - "\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002\u0000AZaz\b\u0000"+ - "\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001"+ - "\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\u000b\u0000\t\n\r\r \"\",,/"+ - "/::==[[]]||\u0002\u0000**//\u000b\u0000\t\n\r\r \"#,,//::<<>?\\\\||\u05dd"+ - "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ - "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ - "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ - "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ - "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ - "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ - "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ - "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ - "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ - "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ - "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ - "@\u0001\u0000\u0000\u0000\u0001B\u0001\u0000\u0000\u0000\u0001X\u0001"+ - "\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000\u0000\u0001\\\u0001\u0000"+ - "\u0000\u0000\u0001^\u0001\u0000\u0000\u0000\u0001`\u0001\u0000\u0000\u0000"+ - "\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001f"+ - "\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000"+ - "\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000"+ - "\u0001p\u0001\u0000\u0000\u0000\u0001r\u0001\u0000\u0000\u0000\u0001t"+ - "\u0001\u0000\u0000\u0000\u0001v\u0001\u0000\u0000\u0000\u0001x\u0001\u0000"+ - "\u0000\u0000\u0001z\u0001\u0000\u0000\u0000\u0001|\u0001\u0000\u0000\u0000"+ - "\u0001~\u0001\u0000\u0000\u0000\u0001\u0080\u0001\u0000\u0000\u0000\u0001"+ - "\u0082\u0001\u0000\u0000\u0000\u0001\u0084\u0001\u0000\u0000\u0000\u0001"+ - "\u0086\u0001\u0000\u0000\u0000\u0001\u0088\u0001\u0000\u0000\u0000\u0001"+ - "\u008a\u0001\u0000\u0000\u0000\u0001\u008c\u0001\u0000\u0000\u0000\u0001"+ - "\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001"+ - "\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0001"+ - "\u0096\u0001\u0000\u0000\u0000\u0001\u0098\u0001\u0000\u0000\u0000\u0001"+ - "\u009a\u0001\u0000\u0000\u0000\u0001\u009c\u0001\u0000\u0000\u0000\u0001"+ - "\u009e\u0001\u0000\u0000\u0000\u0001\u00a0\u0001\u0000\u0000\u0000\u0001"+ - "\u00a2\u0001\u0000\u0000\u0000\u0001\u00a4\u0001\u0000\u0000\u0000\u0001"+ - "\u00a6\u0001\u0000\u0000\u0000\u0001\u00a8\u0001\u0000\u0000\u0000\u0001"+ - "\u00aa\u0001\u0000\u0000\u0000\u0001\u00ac\u0001\u0000\u0000\u0000\u0001"+ - "\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2\u0001\u0000\u0000\u0000\u0001"+ - "\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6\u0001\u0000\u0000\u0000\u0002"+ - "\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba\u0001\u0000\u0000\u0000\u0002"+ - "\u00bc\u0001\u0000\u0000\u0000\u0002\u00be\u0001\u0000\u0000\u0000\u0002"+ - "\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2\u0001\u0000\u0000\u0000\u0003"+ - "\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6\u0001\u0000\u0000\u0000\u0003"+ - "\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca\u0001\u0000\u0000\u0000\u0003"+ - "\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce\u0001\u0000\u0000\u0000\u0003"+ - "\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4\u0001\u0000\u0000\u0000\u0003"+ - "\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8\u0001\u0000\u0000\u0000\u0003"+ - "\u00da\u0001\u0000\u0000\u0000\u0003\u00dc\u0001\u0000\u0000\u0000\u0004"+ - "\u00de\u0001\u0000\u0000\u0000\u0004\u00e0\u0001\u0000\u0000\u0000\u0004"+ - "\u00e2\u0001\u0000\u0000\u0000\u0004\u00e8\u0001\u0000\u0000\u0000\u0004"+ - "\u00ea\u0001\u0000\u0000\u0000\u0004\u00ec\u0001\u0000\u0000\u0000\u0004"+ - "\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005"+ - "\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005"+ - "\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005"+ - "\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005"+ - "\u00fe\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0006"+ - "\u0102\u0001\u0000\u0000\u0000\u0006\u0104\u0001\u0000\u0000\u0000\u0006"+ - "\u0106\u0001\u0000\u0000\u0000\u0006\u0108\u0001\u0000\u0000\u0000\u0006"+ - "\u010c\u0001\u0000\u0000\u0000\u0006\u010e\u0001\u0000\u0000\u0000\u0006"+ - "\u0110\u0001\u0000\u0000\u0000\u0006\u0112\u0001\u0000\u0000\u0000\u0006"+ - "\u0114\u0001\u0000\u0000\u0000\u0007\u0116\u0001\u0000\u0000\u0000\u0007"+ - "\u0118\u0001\u0000\u0000\u0000\u0007\u011a\u0001\u0000\u0000\u0000\u0007"+ - "\u011c\u0001\u0000\u0000\u0000\u0007\u011e\u0001\u0000\u0000\u0000\u0007"+ - "\u0120\u0001\u0000\u0000\u0000\u0007\u0122\u0001\u0000\u0000\u0000\u0007"+ - "\u0124\u0001\u0000\u0000\u0000\u0007\u0126\u0001\u0000\u0000\u0000\u0007"+ - "\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001\u0000\u0000\u0000\b\u012c"+ - "\u0001\u0000\u0000\u0000\b\u012e\u0001\u0000\u0000\u0000\b\u0130\u0001"+ - "\u0000\u0000\u0000\b\u0132\u0001\u0000\u0000\u0000\b\u0134\u0001\u0000"+ - "\u0000\u0000\b\u0136\u0001\u0000\u0000\u0000\t\u0138\u0001\u0000\u0000"+ - "\u0000\t\u013a\u0001\u0000\u0000\u0000\t\u013c\u0001\u0000\u0000\u0000"+ - "\t\u013e\u0001\u0000\u0000\u0000\t\u0140\u0001\u0000\u0000\u0000\n\u0142"+ - "\u0001\u0000\u0000\u0000\n\u0144\u0001\u0000\u0000\u0000\n\u0146\u0001"+ - "\u0000\u0000\u0000\n\u0148\u0001\u0000\u0000\u0000\n\u014a\u0001\u0000"+ - "\u0000\u0000\u000b\u014c\u0001\u0000\u0000\u0000\u000b\u014e\u0001\u0000"+ - "\u0000\u0000\u000b\u0150\u0001\u0000\u0000\u0000\u000b\u0152\u0001\u0000"+ - "\u0000\u0000\u000b\u0154\u0001\u0000\u0000\u0000\u000b\u0156\u0001\u0000"+ - "\u0000\u0000\f\u0158\u0001\u0000\u0000\u0000\f\u015a\u0001\u0000\u0000"+ - "\u0000\f\u015c\u0001\u0000\u0000\u0000\f\u015e\u0001\u0000\u0000\u0000"+ - "\f\u0160\u0001\u0000\u0000\u0000\f\u0162\u0001\u0000\u0000\u0000\f\u0164"+ - "\u0001\u0000\u0000\u0000\f\u0166\u0001\u0000\u0000\u0000\f\u0168\u0001"+ - "\u0000\u0000\u0000\f\u016a\u0001\u0000\u0000\u0000\r\u016c\u0001\u0000"+ - "\u0000\u0000\r\u016e\u0001\u0000\u0000\u0000\r\u0170\u0001\u0000\u0000"+ - "\u0000\r\u0172\u0001\u0000\u0000\u0000\r\u0174\u0001\u0000\u0000\u0000"+ - "\r\u0176\u0001\u0000\u0000\u0000\r\u0178\u0001\u0000\u0000\u0000\u000e"+ - "\u017a\u0001\u0000\u0000\u0000\u000e\u017c\u0001\u0000\u0000\u0000\u000e"+ - "\u017e\u0001\u0000\u0000\u0000\u000e\u0180\u0001\u0000\u0000\u0000\u000e"+ - "\u0182\u0001\u0000\u0000\u0000\u000e\u0184\u0001\u0000\u0000\u0000\u000f"+ - "\u0186\u0001\u0000\u0000\u0000\u000f\u0188\u0001\u0000\u0000\u0000\u000f"+ - "\u018a\u0001\u0000\u0000\u0000\u000f\u018c\u0001\u0000\u0000\u0000\u000f"+ - "\u018e\u0001\u0000\u0000\u0000\u000f\u0190\u0001\u0000\u0000\u0000\u000f"+ - "\u0192\u0001\u0000\u0000\u0000\u000f\u0194\u0001\u0000\u0000\u0000\u000f"+ - "\u0196\u0001\u0000\u0000\u0000\u0010\u0198\u0001\u0000\u0000\u0000\u0012"+ - "\u01a2\u0001\u0000\u0000\u0000\u0014\u01a9\u0001\u0000\u0000\u0000\u0016"+ - "\u01b2\u0001\u0000\u0000\u0000\u0018\u01b9\u0001\u0000\u0000\u0000\u001a"+ - "\u01c3\u0001\u0000\u0000\u0000\u001c\u01ca\u0001\u0000\u0000\u0000\u001e"+ - "\u01d1\u0001\u0000\u0000\u0000 \u01d8\u0001\u0000\u0000\u0000\"\u01e0"+ - "\u0001\u0000\u0000\u0000$\u01e7\u0001\u0000\u0000\u0000&\u01f3\u0001\u0000"+ - "\u0000\u0000(\u01fc\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000"+ - ",\u0209\u0001\u0000\u0000\u0000.\u0210\u0001\u0000\u0000\u00000\u0218"+ - "\u0001\u0000\u0000\u00002\u0220\u0001\u0000\u0000\u00004\u022f\u0001\u0000"+ - "\u0000\u00006\u0239\u0001\u0000\u0000\u00008\u0242\u0001\u0000\u0000\u0000"+ - ":\u024e\u0001\u0000\u0000\u0000<\u0254\u0001\u0000\u0000\u0000>\u0265"+ - "\u0001\u0000\u0000\u0000@\u0275\u0001\u0000\u0000\u0000B\u027b\u0001\u0000"+ - "\u0000\u0000D\u027f\u0001\u0000\u0000\u0000F\u0281\u0001\u0000\u0000\u0000"+ - "H\u0283\u0001\u0000\u0000\u0000J\u0286\u0001\u0000\u0000\u0000L\u0288"+ - "\u0001\u0000\u0000\u0000N\u0291\u0001\u0000\u0000\u0000P\u0293\u0001\u0000"+ - "\u0000\u0000R\u0298\u0001\u0000\u0000\u0000T\u029a\u0001\u0000\u0000\u0000"+ - "V\u029f\u0001\u0000\u0000\u0000X\u02be\u0001\u0000\u0000\u0000Z\u02c1"+ - "\u0001\u0000\u0000\u0000\\\u02ef\u0001\u0000\u0000\u0000^\u02f1\u0001"+ - "\u0000\u0000\u0000`\u02f4\u0001\u0000\u0000\u0000b\u02f8\u0001\u0000\u0000"+ - "\u0000d\u02fc\u0001\u0000\u0000\u0000f\u02fe\u0001\u0000\u0000\u0000h"+ - "\u0301\u0001\u0000\u0000\u0000j\u0303\u0001\u0000\u0000\u0000l\u0308\u0001"+ - "\u0000\u0000\u0000n\u030a\u0001\u0000\u0000\u0000p\u0310\u0001\u0000\u0000"+ - "\u0000r\u0316\u0001\u0000\u0000\u0000t\u0319\u0001\u0000\u0000\u0000v"+ - "\u031c\u0001\u0000\u0000\u0000x\u0321\u0001\u0000\u0000\u0000z\u0326\u0001"+ - "\u0000\u0000\u0000|\u0328\u0001\u0000\u0000\u0000~\u032c\u0001\u0000\u0000"+ - "\u0000\u0080\u0331\u0001\u0000\u0000\u0000\u0082\u0337\u0001\u0000\u0000"+ - "\u0000\u0084\u033a\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000"+ - "\u0000\u0088\u0342\u0001\u0000\u0000\u0000\u008a\u0344\u0001\u0000\u0000"+ - "\u0000\u008c\u0349\u0001\u0000\u0000\u0000\u008e\u034c\u0001\u0000\u0000"+ - "\u0000\u0090\u034f\u0001\u0000\u0000\u0000\u0092\u0352\u0001\u0000\u0000"+ - "\u0000\u0094\u0354\u0001\u0000\u0000\u0000\u0096\u0357\u0001\u0000\u0000"+ - "\u0000\u0098\u0359\u0001\u0000\u0000\u0000\u009a\u035c\u0001\u0000\u0000"+ - "\u0000\u009c\u035e\u0001\u0000\u0000\u0000\u009e\u0360\u0001\u0000\u0000"+ - "\u0000\u00a0\u0362\u0001\u0000\u0000\u0000\u00a2\u0364\u0001\u0000\u0000"+ - "\u0000\u00a4\u0366\u0001\u0000\u0000\u0000\u00a6\u037c\u0001\u0000\u0000"+ - "\u0000\u00a8\u037e\u0001\u0000\u0000\u0000\u00aa\u0383\u0001\u0000\u0000"+ - "\u0000\u00ac\u0398\u0001\u0000\u0000\u0000\u00ae\u039a\u0001\u0000\u0000"+ - "\u0000\u00b0\u03a2\u0001\u0000\u0000\u0000\u00b2\u03a4\u0001\u0000\u0000"+ - "\u0000\u00b4\u03a8\u0001\u0000\u0000\u0000\u00b6\u03ac\u0001\u0000\u0000"+ - "\u0000\u00b8\u03b0\u0001\u0000\u0000\u0000\u00ba\u03b5\u0001\u0000\u0000"+ - "\u0000\u00bc\u03ba\u0001\u0000\u0000\u0000\u00be\u03be\u0001\u0000\u0000"+ - "\u0000\u00c0\u03c2\u0001\u0000\u0000\u0000\u00c2\u03c6\u0001\u0000\u0000"+ - "\u0000\u00c4\u03cb\u0001\u0000\u0000\u0000\u00c6\u03cf\u0001\u0000\u0000"+ - "\u0000\u00c8\u03d3\u0001\u0000\u0000\u0000\u00ca\u03d7\u0001\u0000\u0000"+ - "\u0000\u00cc\u03db\u0001\u0000\u0000\u0000\u00ce\u03df\u0001\u0000\u0000"+ - "\u0000\u00d0\u03eb\u0001\u0000\u0000\u0000\u00d2\u03ee\u0001\u0000\u0000"+ - "\u0000\u00d4\u03f2\u0001\u0000\u0000\u0000\u00d6\u03f6\u0001\u0000\u0000"+ - "\u0000\u00d8\u03fa\u0001\u0000\u0000\u0000\u00da\u03fe\u0001\u0000\u0000"+ - "\u0000\u00dc\u0402\u0001\u0000\u0000\u0000\u00de\u0406\u0001\u0000\u0000"+ - "\u0000\u00e0\u040b\u0001\u0000\u0000\u0000\u00e2\u040f\u0001\u0000\u0000"+ - "\u0000\u00e4\u0417\u0001\u0000\u0000\u0000\u00e6\u042c\u0001\u0000\u0000"+ - "\u0000\u00e8\u0430\u0001\u0000\u0000\u0000\u00ea\u0434\u0001\u0000\u0000"+ - "\u0000\u00ec\u0438\u0001\u0000\u0000\u0000\u00ee\u043c\u0001\u0000\u0000"+ - "\u0000\u00f0\u0440\u0001\u0000\u0000\u0000\u00f2\u0445\u0001\u0000\u0000"+ - "\u0000\u00f4\u0449\u0001\u0000\u0000\u0000\u00f6\u044d\u0001\u0000\u0000"+ - "\u0000\u00f8\u0451\u0001\u0000\u0000\u0000\u00fa\u0454\u0001\u0000\u0000"+ - "\u0000\u00fc\u0458\u0001\u0000\u0000\u0000\u00fe\u045c\u0001\u0000\u0000"+ - "\u0000\u0100\u0460\u0001\u0000\u0000\u0000\u0102\u0464\u0001\u0000\u0000"+ - "\u0000\u0104\u0469\u0001\u0000\u0000\u0000\u0106\u046e\u0001\u0000\u0000"+ - "\u0000\u0108\u0473\u0001\u0000\u0000\u0000\u010a\u047a\u0001\u0000\u0000"+ - "\u0000\u010c\u0483\u0001\u0000\u0000\u0000\u010e\u048a\u0001\u0000\u0000"+ - "\u0000\u0110\u048e\u0001\u0000\u0000\u0000\u0112\u0492\u0001\u0000\u0000"+ - "\u0000\u0114\u0496\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000"+ - "\u0000\u0118\u04a0\u0001\u0000\u0000\u0000\u011a\u04a4\u0001\u0000\u0000"+ - "\u0000\u011c\u04a8\u0001\u0000\u0000\u0000\u011e\u04ac\u0001\u0000\u0000"+ - "\u0000\u0120\u04b0\u0001\u0000\u0000\u0000\u0122\u04b4\u0001\u0000\u0000"+ - "\u0000\u0124\u04b8\u0001\u0000\u0000\u0000\u0126\u04bc\u0001\u0000\u0000"+ - "\u0000\u0128\u04c0\u0001\u0000\u0000\u0000\u012a\u04c4\u0001\u0000\u0000"+ - "\u0000\u012c\u04c9\u0001\u0000\u0000\u0000\u012e\u04cd\u0001\u0000\u0000"+ - "\u0000\u0130\u04d1\u0001\u0000\u0000\u0000\u0132\u04d5\u0001\u0000\u0000"+ - "\u0000\u0134\u04d9\u0001\u0000\u0000\u0000\u0136\u04dd\u0001\u0000\u0000"+ - "\u0000\u0138\u04e1\u0001\u0000\u0000\u0000\u013a\u04e6\u0001\u0000\u0000"+ - "\u0000\u013c\u04eb\u0001\u0000\u0000\u0000\u013e\u04ef\u0001\u0000\u0000"+ - "\u0000\u0140\u04f3\u0001\u0000\u0000\u0000\u0142\u04f7\u0001\u0000\u0000"+ - "\u0000\u0144\u04fc\u0001\u0000\u0000\u0000\u0146\u0506\u0001\u0000\u0000"+ - "\u0000\u0148\u050a\u0001\u0000\u0000\u0000\u014a\u050e\u0001\u0000\u0000"+ - "\u0000\u014c\u0512\u0001\u0000\u0000\u0000\u014e\u0517\u0001\u0000\u0000"+ - "\u0000\u0150\u051e\u0001\u0000\u0000\u0000\u0152\u0522\u0001\u0000\u0000"+ - "\u0000\u0154\u0526\u0001\u0000\u0000\u0000\u0156\u052a\u0001\u0000\u0000"+ - "\u0000\u0158\u052e\u0001\u0000\u0000\u0000\u015a\u0533\u0001\u0000\u0000"+ - "\u0000\u015c\u0537\u0001\u0000\u0000\u0000\u015e\u053b\u0001\u0000\u0000"+ - "\u0000\u0160\u053f\u0001\u0000\u0000\u0000\u0162\u0544\u0001\u0000\u0000"+ - "\u0000\u0164\u0548\u0001\u0000\u0000\u0000\u0166\u054c\u0001\u0000\u0000"+ - "\u0000\u0168\u0550\u0001\u0000\u0000\u0000\u016a\u0554\u0001\u0000\u0000"+ - "\u0000\u016c\u0558\u0001\u0000\u0000\u0000\u016e\u055e\u0001\u0000\u0000"+ - "\u0000\u0170\u0562\u0001\u0000\u0000\u0000\u0172\u0566\u0001\u0000\u0000"+ - "\u0000\u0174\u056a\u0001\u0000\u0000\u0000\u0176\u056e\u0001\u0000\u0000"+ - "\u0000\u0178\u0572\u0001\u0000\u0000\u0000\u017a\u0576\u0001\u0000\u0000"+ - "\u0000\u017c\u057b\u0001\u0000\u0000\u0000\u017e\u0581\u0001\u0000\u0000"+ - "\u0000\u0180\u0587\u0001\u0000\u0000\u0000\u0182\u058b\u0001\u0000\u0000"+ - "\u0000\u0184\u058f\u0001\u0000\u0000\u0000\u0186\u0593\u0001\u0000\u0000"+ - "\u0000\u0188\u0599\u0001\u0000\u0000\u0000\u018a\u059f\u0001\u0000\u0000"+ - "\u0000\u018c\u05a3\u0001\u0000\u0000\u0000\u018e\u05a7\u0001\u0000\u0000"+ - "\u0000\u0190\u05ab\u0001\u0000\u0000\u0000\u0192\u05b1\u0001\u0000\u0000"+ - "\u0000\u0194\u05b7\u0001\u0000\u0000\u0000\u0196\u05bd\u0001\u0000\u0000"+ - "\u0000\u0198\u0199\u0007\u0000\u0000\u0000\u0199\u019a\u0007\u0001\u0000"+ - "\u0000\u019a\u019b\u0007\u0002\u0000\u0000\u019b\u019c\u0007\u0002\u0000"+ - "\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e\u0007\u0004\u0000"+ - "\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ - "\u0000\u01a0\u01a1\u0006\u0000\u0000\u0000\u01a1\u0011\u0001\u0000\u0000"+ - "\u0000\u01a2\u01a3\u0007\u0000\u0000\u0000\u01a3\u01a4\u0007\u0006\u0000"+ - "\u0000\u01a4\u01a5\u0007\u0007\u0000\u0000\u01a5\u01a6\u0007\b\u0000\u0000"+ - "\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a8\u0006\u0001\u0001\u0000"+ - "\u01a8\u0013\u0001\u0000\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000\u0000"+ - "\u01aa\u01ab\u0007\t\u0000\u0000\u01ab\u01ac\u0007\u0006\u0000\u0000\u01ac"+ - "\u01ad\u0007\u0001\u0000\u0000\u01ad\u01ae\u0007\u0004\u0000\u0000\u01ae"+ - "\u01af\u0007\n\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0\u01b1"+ - "\u0006\u0002\u0002\u0000\u01b1\u0015\u0001\u0000\u0000\u0000\u01b2\u01b3"+ - "\u0007\u0003\u0000\u0000\u01b3\u01b4\u0007\u000b\u0000\u0000\u01b4\u01b5"+ - "\u0007\f\u0000\u0000\u01b5\u01b6\u0007\r\u0000\u0000\u01b6\u01b7\u0001"+ - "\u0000\u0000\u0000\u01b7\u01b8\u0006\u0003\u0000\u0000\u01b8\u0017\u0001"+ - "\u0000\u0000\u0000\u01b9\u01ba\u0007\u0003\u0000\u0000\u01ba\u01bb\u0007"+ - "\u000e\u0000\u0000\u01bb\u01bc\u0007\b\u0000\u0000\u01bc\u01bd\u0007\r"+ - "\u0000\u0000\u01bd\u01be\u0007\f\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ - "\u0000\u01bf\u01c0\u0007\t\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000"+ - "\u01c1\u01c2\u0006\u0004\u0003\u0000\u01c2\u0019\u0001\u0000\u0000\u0000"+ - "\u01c3\u01c4\u0007\u000f\u0000\u0000\u01c4\u01c5\u0007\u0006\u0000\u0000"+ - "\u01c5\u01c6\u0007\u0007\u0000\u0000\u01c6\u01c7\u0007\u0010\u0000\u0000"+ - "\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0006\u0005\u0004\u0000"+ - "\u01c9\u001b\u0001\u0000\u0000\u0000\u01ca\u01cb\u0007\u0011\u0000\u0000"+ - "\u01cb\u01cc\u0007\u0006\u0000\u0000\u01cc\u01cd\u0007\u0007\u0000\u0000"+ - "\u01cd\u01ce\u0007\u0012\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000"+ - "\u01cf\u01d0\u0006\u0006\u0000\u0000\u01d0\u001d\u0001\u0000\u0000\u0000"+ - "\u01d1\u01d2\u0007\u0012\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000"+ - "\u01d3\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5\u0007\b\u0000\u0000\u01d5"+ - "\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006\u0007\u0001\u0000\u01d7"+ - "\u001f\u0001\u0000\u0000\u0000\u01d8\u01d9\u0007\r\u0000\u0000\u01d9\u01da"+ - "\u0007\u0001\u0000\u0000\u01da\u01db\u0007\u0010\u0000\u0000\u01db\u01dc"+ - "\u0007\u0001\u0000\u0000\u01dc\u01dd\u0007\u0005\u0000\u0000\u01dd\u01de"+ - "\u0001\u0000\u0000\u0000\u01de\u01df\u0006\b\u0000\u0000\u01df!\u0001"+ - "\u0000\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ - "\u0003\u0000\u0000\u01e2\u01e3\u0007\u0005\u0000\u0000\u01e3\u01e4\u0007"+ - "\f\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5\u01e6\u0006\t"+ - "\u0005\u0000\u01e6#\u0001\u0000\u0000\u0000\u01e7\u01e8\u0007\u0010\u0000"+ - "\u0000\u01e8\u01e9\u0007\u000b\u0000\u0000\u01e9\u01ea\u0005_\u0000\u0000"+ - "\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007\u000e\u0000\u0000"+ - "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\f\u0000\u0000\u01ee"+ - "\u01ef\u0007\t\u0000\u0000\u01ef\u01f0\u0007\u0000\u0000\u0000\u01f0\u01f1"+ - "\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\n\u0006\u0000\u01f2%\u0001"+ - "\u0000\u0000\u0000\u01f3\u01f4\u0007\u0006\u0000\u0000\u01f4\u01f5\u0007"+ - "\u0003\u0000\u0000\u01f5\u01f6\u0007\t\u0000\u0000\u01f6\u01f7\u0007\f"+ - "\u0000\u0000\u01f7\u01f8\u0007\u0010\u0000\u0000\u01f8\u01f9\u0007\u0003"+ - "\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u000b"+ - "\u0007\u0000\u01fb\'\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0006\u0000"+ - "\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007\u0013\u0000"+ - "\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\f\u0000\u0000"+ - "\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0002\u0000\u0000\u0203"+ - "\u0204\u0007\n\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205\u0206"+ - "\u0007\u0013\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207\u0208"+ - "\u0006\r\b\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0007\u0002"+ - "\u0000\u0000\u020a\u020b\u0007\u0007\u0000\u0000\u020b\u020c\u0007\u0006"+ - "\u0000\u0000\u020c\u020d\u0007\u0005\u0000\u0000\u020d\u020e\u0001\u0000"+ - "\u0000\u0000\u020e\u020f\u0006\u000e\u0000\u0000\u020f-\u0001\u0000\u0000"+ - "\u0000\u0210\u0211\u0007\u0002\u0000\u0000\u0211\u0212\u0007\u0005\u0000"+ - "\u0000\u0212\u0213\u0007\f\u0000\u0000\u0213\u0214\u0007\u0005\u0000\u0000"+ - "\u0214\u0215\u0007\u0002\u0000\u0000\u0215\u0216\u0001\u0000\u0000\u0000"+ - "\u0216\u0217\u0006\u000f\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ - "\u0219\u0007\u0013\u0000\u0000\u0219\u021a\u0007\n\u0000\u0000\u021a\u021b"+ - "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u0006\u0000\u0000\u021c\u021d"+ - "\u0007\u0003\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e\u021f"+ - "\u0006\u0010\u0000\u0000\u021f1\u0001\u0000\u0000\u0000\u0220\u0221\u0004"+ - "\u0011\u0000\u0000\u0221\u0222\u0007\u0001\u0000\u0000\u0222\u0223\u0007"+ - "\t\u0000\u0000\u0223\u0224\u0007\r\u0000\u0000\u0224\u0225\u0007\u0001"+ - "\u0000\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0003\u0000"+ - "\u0000\u0227\u0228\u0007\u0002\u0000\u0000\u0228\u0229\u0007\u0005\u0000"+ - "\u0000\u0229\u022a\u0007\f\u0000\u0000\u022a\u022b\u0007\u0005\u0000\u0000"+ - "\u022b\u022c\u0007\u0002\u0000\u0000\u022c\u022d\u0001\u0000\u0000\u0000"+ - "\u022d\u022e\u0006\u0011\u0000\u0000\u022e3\u0001\u0000\u0000\u0000\u022f"+ - "\u0230\u0004\u0012\u0001\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232"+ - "\u0007\u0007\u0000\u0000\u0232\u0233\u0007\u0007\u0000\u0000\u0233\u0234"+ - "\u0007\u0012\u0000\u0000\u0234\u0235\u0007\u0014\u0000\u0000\u0235\u0236"+ - "\u0007\b\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238\u0006"+ - "\u0012\t\u0000\u02385\u0001\u0000\u0000\u0000\u0239\u023a\u0004\u0013"+ - "\u0002\u0000\u023a\u023b\u0007\u0010\u0000\u0000\u023b\u023c\u0007\f\u0000"+ - "\u0000\u023c\u023d\u0007\u0005\u0000\u0000\u023d\u023e\u0007\u0004\u0000"+ - "\u0000\u023e\u023f\u0007\n\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000"+ - "\u0240\u0241\u0006\u0013\u0000\u0000\u02417\u0001\u0000\u0000\u0000\u0242"+ - "\u0243\u0004\u0014\u0003\u0000\u0243\u0244\u0007\u0010\u0000\u0000\u0244"+ - "\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007\u0005\u0000\u0000\u0246"+ - "\u0247\u0007\u0006\u0000\u0000\u0247\u0248\u0007\u0001\u0000\u0000\u0248"+ - "\u0249\u0007\u0004\u0000\u0000\u0249\u024a\u0007\u0002\u0000\u0000\u024a"+ - "\u024b\u0001\u0000\u0000\u0000\u024b\u024c\u0006\u0014\n\u0000\u024c9"+ - "\u0001\u0000\u0000\u0000\u024d\u024f\b\u0015\u0000\u0000\u024e\u024d\u0001"+ - "\u0000\u0000\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u024e\u0001"+ - "\u0000\u0000\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0252\u0001"+ - "\u0000\u0000\u0000\u0252\u0253\u0006\u0015\u0000\u0000\u0253;\u0001\u0000"+ - "\u0000\u0000\u0254\u0255\u0005/\u0000\u0000\u0255\u0256\u0005/\u0000\u0000"+ - "\u0256\u025a\u0001\u0000\u0000\u0000\u0257\u0259\b\u0016\u0000\u0000\u0258"+ - "\u0257\u0001\u0000\u0000\u0000\u0259\u025c\u0001\u0000\u0000\u0000\u025a"+ - "\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b"+ - "\u025e\u0001\u0000\u0000\u0000\u025c\u025a\u0001\u0000\u0000\u0000\u025d"+ - "\u025f\u0005\r\u0000\u0000\u025e\u025d\u0001\u0000\u0000\u0000\u025e\u025f"+ - "\u0001\u0000\u0000\u0000\u025f\u0261\u0001\u0000\u0000\u0000\u0260\u0262"+ - "\u0005\n\u0000\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0261\u0262\u0001"+ - "\u0000\u0000\u0000\u0262\u0263\u0001\u0000\u0000\u0000\u0263\u0264\u0006"+ - "\u0016\u000b\u0000\u0264=\u0001\u0000\u0000\u0000\u0265\u0266\u0005/\u0000"+ - "\u0000\u0266\u0267\u0005*\u0000\u0000\u0267\u026c\u0001\u0000\u0000\u0000"+ - "\u0268\u026b\u0003>\u0017\u0000\u0269\u026b\t\u0000\u0000\u0000\u026a"+ - "\u0268\u0001\u0000\u0000\u0000\u026a\u0269\u0001\u0000\u0000\u0000\u026b"+ - "\u026e\u0001\u0000\u0000\u0000\u026c\u026d\u0001\u0000\u0000\u0000\u026c"+ - "\u026a\u0001\u0000\u0000\u0000\u026d\u026f\u0001\u0000\u0000\u0000\u026e"+ - "\u026c\u0001\u0000\u0000\u0000\u026f\u0270\u0005*\u0000\u0000\u0270\u0271"+ - "\u0005/\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0006"+ - "\u0017\u000b\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0276\u0007\u0017"+ - "\u0000\u0000\u0275\u0274\u0001\u0000\u0000\u0000\u0276\u0277\u0001\u0000"+ - "\u0000\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000"+ - "\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0006\u0018"+ - "\u000b\u0000\u027aA\u0001\u0000\u0000\u0000\u027b\u027c\u0005|\u0000\u0000"+ - "\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027e\u0006\u0019\f\u0000\u027e"+ - "C\u0001\u0000\u0000\u0000\u027f\u0280\u0007\u0018\u0000\u0000\u0280E\u0001"+ - "\u0000\u0000\u0000\u0281\u0282\u0007\u0019\u0000\u0000\u0282G\u0001\u0000"+ - "\u0000\u0000\u0283\u0284\u0005\\\u0000\u0000\u0284\u0285\u0007\u001a\u0000"+ - "\u0000\u0285I\u0001\u0000\u0000\u0000\u0286\u0287\b\u001b\u0000\u0000"+ - "\u0287K\u0001\u0000\u0000\u0000\u0288\u028a\u0007\u0003\u0000\u0000\u0289"+ - "\u028b\u0007\u001c\u0000\u0000\u028a\u0289\u0001\u0000\u0000\u0000\u028a"+ - "\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c"+ - "\u028e\u0003D\u001a\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0001\u0000\u0000\u0000\u028f\u028d\u0001\u0000\u0000\u0000\u028f\u0290"+ - "\u0001\u0000\u0000\u0000\u0290M\u0001\u0000\u0000\u0000\u0291\u0292\u0005"+ - "@\u0000\u0000\u0292O\u0001\u0000\u0000\u0000\u0293\u0294\u0005`\u0000"+ - "\u0000\u0294Q\u0001\u0000\u0000\u0000\u0295\u0299\b\u001d\u0000\u0000"+ - "\u0296\u0297\u0005`\u0000\u0000\u0297\u0299\u0005`\u0000\u0000\u0298\u0295"+ - "\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299S\u0001"+ - "\u0000\u0000\u0000\u029a\u029b\u0005_\u0000\u0000\u029bU\u0001\u0000\u0000"+ - "\u0000\u029c\u02a0\u0003F\u001b\u0000\u029d\u02a0\u0003D\u001a\u0000\u029e"+ - "\u02a0\u0003T\"\u0000\u029f\u029c\u0001\u0000\u0000\u0000\u029f\u029d"+ - "\u0001\u0000\u0000\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u02a0W\u0001"+ - "\u0000\u0000\u0000\u02a1\u02a6\u0005\"\u0000\u0000\u02a2\u02a5\u0003H"+ - "\u001c\u0000\u02a3\u02a5\u0003J\u001d\u0000\u02a4\u02a2\u0001\u0000\u0000"+ - "\u0000\u02a4\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a8\u0001\u0000\u0000"+ - "\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000"+ - "\u0000\u02a7\u02a9\u0001\u0000\u0000\u0000\u02a8\u02a6\u0001\u0000\u0000"+ - "\u0000\u02a9\u02bf\u0005\"\u0000\u0000\u02aa\u02ab\u0005\"\u0000\u0000"+ - "\u02ab\u02ac\u0005\"\u0000\u0000\u02ac\u02ad\u0005\"\u0000\u0000\u02ad"+ - "\u02b1\u0001\u0000\u0000\u0000\u02ae\u02b0\b\u0016\u0000\u0000\u02af\u02ae"+ - "\u0001\u0000\u0000\u0000\u02b0\u02b3\u0001\u0000\u0000\u0000\u02b1\u02b2"+ - "\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b4"+ - "\u0001\u0000\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b4\u02b5"+ - "\u0005\"\u0000\u0000\u02b5\u02b6\u0005\"\u0000\u0000\u02b6\u02b7\u0005"+ - "\"\u0000\u0000\u02b7\u02b9\u0001\u0000\u0000\u0000\u02b8\u02ba\u0005\""+ - "\u0000\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000"+ - "\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02bd\u0005\"\u0000"+ - "\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000"+ - "\u0000\u02bd\u02bf\u0001\u0000\u0000\u0000\u02be\u02a1\u0001\u0000\u0000"+ - "\u0000\u02be\u02aa\u0001\u0000\u0000\u0000\u02bfY\u0001\u0000\u0000\u0000"+ - "\u02c0\u02c2\u0003D\u001a\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2"+ - "\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3"+ - "\u02c4\u0001\u0000\u0000\u0000\u02c4[\u0001\u0000\u0000\u0000\u02c5\u02c7"+ - "\u0003D\u001a\u0000\u02c6\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001"+ - "\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001"+ - "\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca\u02ce\u0003"+ - "l.\u0000\u02cb\u02cd\u0003D\u001a\u0000\u02cc\u02cb\u0001\u0000\u0000"+ - "\u0000\u02cd\u02d0\u0001\u0000\u0000\u0000\u02ce\u02cc\u0001\u0000\u0000"+ - "\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02f0\u0001\u0000\u0000"+ - "\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d1\u02d3\u0003l.\u0000\u02d2"+ - "\u02d4\u0003D\u001a\u0000\u02d3\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d5"+ - "\u0001\u0000\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d6"+ - "\u0001\u0000\u0000\u0000\u02d6\u02f0\u0001\u0000\u0000\u0000\u02d7\u02d9"+ - "\u0003D\u001a\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d9\u02da\u0001"+ - "\u0000\u0000\u0000\u02da\u02d8\u0001\u0000\u0000\u0000\u02da\u02db\u0001"+ - "\u0000\u0000\u0000\u02db\u02e3\u0001\u0000\u0000\u0000\u02dc\u02e0\u0003"+ - "l.\u0000\u02dd\u02df\u0003D\u001a\u0000\u02de\u02dd\u0001\u0000\u0000"+ - "\u0000\u02df\u02e2\u0001\u0000\u0000\u0000\u02e0\u02de\u0001\u0000\u0000"+ - "\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000\u02e1\u02e4\u0001\u0000\u0000"+ - "\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u02dc\u0001\u0000\u0000"+ - "\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0003L\u001e\u0000\u02e6\u02f0\u0001\u0000\u0000\u0000"+ - "\u02e7\u02e9\u0003l.\u0000\u02e8\u02ea\u0003D\u001a\u0000\u02e9\u02e8"+ - "\u0001\u0000\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000\u02eb\u02e9"+ - "\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000\u02ec\u02ed"+ - "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0003L\u001e\u0000\u02ee\u02f0\u0001"+ - "\u0000\u0000\u0000\u02ef\u02c6\u0001\u0000\u0000\u0000\u02ef\u02d1\u0001"+ - "\u0000\u0000\u0000\u02ef\u02d8\u0001\u0000\u0000\u0000\u02ef\u02e7\u0001"+ - "\u0000\u0000\u0000\u02f0]\u0001\u0000\u0000\u0000\u02f1\u02f2\u0007\u001e"+ - "\u0000\u0000\u02f2\u02f3\u0007\u001f\u0000\u0000\u02f3_\u0001\u0000\u0000"+ - "\u0000\u02f4\u02f5\u0007\f\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000"+ - "\u02f6\u02f7\u0007\u0000\u0000\u0000\u02f7a\u0001\u0000\u0000\u0000\u02f8"+ - "\u02f9\u0007\f\u0000\u0000\u02f9\u02fa\u0007\u0002\u0000\u0000\u02fa\u02fb"+ - "\u0007\u0004\u0000\u0000\u02fbc\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005"+ - "=\u0000\u0000\u02fde\u0001\u0000\u0000\u0000\u02fe\u02ff\u0005:\u0000"+ - "\u0000\u02ff\u0300\u0005:\u0000\u0000\u0300g\u0001\u0000\u0000\u0000\u0301"+ - "\u0302\u0005,\u0000\u0000\u0302i\u0001\u0000\u0000\u0000\u0303\u0304\u0007"+ - "\u0000\u0000\u0000\u0304\u0305\u0007\u0003\u0000\u0000\u0305\u0306\u0007"+ - "\u0002\u0000\u0000\u0306\u0307\u0007\u0004\u0000\u0000\u0307k\u0001\u0000"+ - "\u0000\u0000\u0308\u0309\u0005.\u0000\u0000\u0309m\u0001\u0000\u0000\u0000"+ - "\u030a\u030b\u0007\u000f\u0000\u0000\u030b\u030c\u0007\f\u0000\u0000\u030c"+ - "\u030d\u0007\r\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f"+ - "\u0007\u0003\u0000\u0000\u030fo\u0001\u0000\u0000\u0000\u0310\u0311\u0007"+ - "\u000f\u0000\u0000\u0311\u0312\u0007\u0001\u0000\u0000\u0312\u0313\u0007"+ - "\u0006\u0000\u0000\u0313\u0314\u0007\u0002\u0000\u0000\u0314\u0315\u0007"+ - "\u0005\u0000\u0000\u0315q\u0001\u0000\u0000\u0000\u0316\u0317\u0007\u0001"+ - "\u0000\u0000\u0317\u0318\u0007\t\u0000\u0000\u0318s\u0001\u0000\u0000"+ - "\u0000\u0319\u031a\u0007\u0001\u0000\u0000\u031a\u031b\u0007\u0002\u0000"+ - "\u0000\u031bu\u0001\u0000\u0000\u0000\u031c\u031d\u0007\r\u0000\u0000"+ - "\u031d\u031e\u0007\f\u0000\u0000\u031e\u031f\u0007\u0002\u0000\u0000\u031f"+ - "\u0320\u0007\u0005\u0000\u0000\u0320w\u0001\u0000\u0000\u0000\u0321\u0322"+ - "\u0007\r\u0000\u0000\u0322\u0323\u0007\u0001\u0000\u0000\u0323\u0324\u0007"+ - "\u0012\u0000\u0000\u0324\u0325\u0007\u0003\u0000\u0000\u0325y\u0001\u0000"+ - "\u0000\u0000\u0326\u0327\u0005(\u0000\u0000\u0327{\u0001\u0000\u0000\u0000"+ - "\u0328\u0329\u0007\t\u0000\u0000\u0329\u032a\u0007\u0007\u0000\u0000\u032a"+ - "\u032b\u0007\u0005\u0000\u0000\u032b}\u0001\u0000\u0000\u0000\u032c\u032d"+ - "\u0007\t\u0000\u0000\u032d\u032e\u0007\u0014\u0000\u0000\u032e\u032f\u0007"+ - "\r\u0000\u0000\u032f\u0330\u0007\r\u0000\u0000\u0330\u007f\u0001\u0000"+ - "\u0000\u0000\u0331\u0332\u0007\t\u0000\u0000\u0332\u0333\u0007\u0014\u0000"+ - "\u0000\u0333\u0334\u0007\r\u0000\u0000\u0334\u0335\u0007\r\u0000\u0000"+ - "\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0081\u0001\u0000\u0000\u0000"+ - "\u0337\u0338\u0007\u0007\u0000\u0000\u0338\u0339\u0007\u0006\u0000\u0000"+ - "\u0339\u0083\u0001\u0000\u0000\u0000\u033a\u033b\u0005?\u0000\u0000\u033b"+ - "\u0085\u0001\u0000\u0000\u0000\u033c\u033d\u0007\u0006\u0000\u0000\u033d"+ - "\u033e\u0007\r\u0000\u0000\u033e\u033f\u0007\u0001\u0000\u0000\u033f\u0340"+ - "\u0007\u0012\u0000\u0000\u0340\u0341\u0007\u0003\u0000\u0000\u0341\u0087"+ - "\u0001\u0000\u0000\u0000\u0342\u0343\u0005)\u0000\u0000\u0343\u0089\u0001"+ - "\u0000\u0000\u0000\u0344\u0345\u0007\u0005\u0000\u0000\u0345\u0346\u0007"+ - "\u0006\u0000\u0000\u0346\u0347\u0007\u0014\u0000\u0000\u0347\u0348\u0007"+ - "\u0003\u0000\u0000\u0348\u008b\u0001\u0000\u0000\u0000\u0349\u034a\u0005"+ - "=\u0000\u0000\u034a\u034b\u0005=\u0000\u0000\u034b\u008d\u0001\u0000\u0000"+ - "\u0000\u034c\u034d\u0005=\u0000\u0000\u034d\u034e\u0005~\u0000\u0000\u034e"+ - "\u008f\u0001\u0000\u0000\u0000\u034f\u0350\u0005!\u0000\u0000\u0350\u0351"+ - "\u0005=\u0000\u0000\u0351\u0091\u0001\u0000\u0000\u0000\u0352\u0353\u0005"+ - "<\u0000\u0000\u0353\u0093\u0001\u0000\u0000\u0000\u0354\u0355\u0005<\u0000"+ - "\u0000\u0355\u0356\u0005=\u0000\u0000\u0356\u0095\u0001\u0000\u0000\u0000"+ - "\u0357\u0358\u0005>\u0000\u0000\u0358\u0097\u0001\u0000\u0000\u0000\u0359"+ - "\u035a\u0005>\u0000\u0000\u035a\u035b\u0005=\u0000\u0000\u035b\u0099\u0001"+ - "\u0000\u0000\u0000\u035c\u035d\u0005+\u0000\u0000\u035d\u009b\u0001\u0000"+ - "\u0000\u0000\u035e\u035f\u0005-\u0000\u0000\u035f\u009d\u0001\u0000\u0000"+ - "\u0000\u0360\u0361\u0005*\u0000\u0000\u0361\u009f\u0001\u0000\u0000\u0000"+ - "\u0362\u0363\u0005/\u0000\u0000\u0363\u00a1\u0001\u0000\u0000\u0000\u0364"+ - "\u0365\u0005%\u0000\u0000\u0365\u00a3\u0001\u0000\u0000\u0000\u0366\u0367"+ - "\u0004J\u0004\u0000\u0367\u0368\u00036\u0013\u0000\u0368\u0369\u0001\u0000"+ - "\u0000\u0000\u0369\u036a\u0006J\r\u0000\u036a\u00a5\u0001\u0000\u0000"+ - "\u0000\u036b\u036e\u0003\u0084:\u0000\u036c\u036f\u0003F\u001b\u0000\u036d"+ - "\u036f\u0003T\"\u0000\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036d"+ - "\u0001\u0000\u0000\u0000\u036f\u0373\u0001\u0000\u0000\u0000\u0370\u0372"+ - "\u0003V#\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372\u0375\u0001\u0000"+ - "\u0000\u0000\u0373\u0371\u0001\u0000\u0000\u0000\u0373\u0374\u0001\u0000"+ - "\u0000\u0000\u0374\u037d\u0001\u0000\u0000\u0000\u0375\u0373\u0001\u0000"+ - "\u0000\u0000\u0376\u0378\u0003\u0084:\u0000\u0377\u0379\u0003D\u001a\u0000"+ - "\u0378\u0377\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000"+ - "\u037a\u0378\u0001\u0000\u0000\u0000\u037a\u037b\u0001\u0000\u0000\u0000"+ - "\u037b\u037d\u0001\u0000\u0000\u0000\u037c\u036b\u0001\u0000\u0000\u0000"+ - "\u037c\u0376\u0001\u0000\u0000\u0000\u037d\u00a7\u0001\u0000\u0000\u0000"+ - "\u037e\u037f\u0005[\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380"+ - "\u0381\u0006L\u0000\u0000\u0381\u0382\u0006L\u0000\u0000\u0382\u00a9\u0001"+ - "\u0000\u0000\u0000\u0383\u0384\u0005]\u0000\u0000\u0384\u0385\u0001\u0000"+ - "\u0000\u0000\u0385\u0386\u0006M\f\u0000\u0386\u0387\u0006M\f\u0000\u0387"+ - "\u00ab\u0001\u0000\u0000\u0000\u0388\u038c\u0003F\u001b\u0000\u0389\u038b"+ - "\u0003V#\u0000\u038a\u0389\u0001\u0000\u0000\u0000\u038b\u038e\u0001\u0000"+ - "\u0000\u0000\u038c\u038a\u0001\u0000\u0000\u0000\u038c\u038d\u0001\u0000"+ - "\u0000\u0000\u038d\u0399\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000"+ - "\u0000\u0000\u038f\u0392\u0003T\"\u0000\u0390\u0392\u0003N\u001f\u0000"+ - "\u0391\u038f\u0001\u0000\u0000\u0000\u0391\u0390\u0001\u0000\u0000\u0000"+ - "\u0392\u0394\u0001\u0000\u0000\u0000\u0393\u0395\u0003V#\u0000\u0394\u0393"+ - "\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u0394"+ - "\u0001\u0000\u0000\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0399"+ - "\u0001\u0000\u0000\u0000\u0398\u0388\u0001\u0000\u0000\u0000\u0398\u0391"+ - "\u0001\u0000\u0000\u0000\u0399\u00ad\u0001\u0000\u0000\u0000\u039a\u039c"+ - "\u0003P \u0000\u039b\u039d\u0003R!\u0000\u039c\u039b\u0001\u0000\u0000"+ - "\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ - "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ - "\u0000\u03a0\u03a1\u0003P \u0000\u03a1\u00af\u0001\u0000\u0000\u0000\u03a2"+ - "\u03a3\u0003\u00aeO\u0000\u03a3\u00b1\u0001\u0000\u0000\u0000\u03a4\u03a5"+ - "\u0003<\u0016\u0000\u03a5\u03a6\u0001\u0000\u0000\u0000\u03a6\u03a7\u0006"+ - "Q\u000b\u0000\u03a7\u00b3\u0001\u0000\u0000\u0000\u03a8\u03a9\u0003>\u0017"+ - "\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u03ab\u0006R\u000b\u0000"+ - "\u03ab\u00b5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0003@\u0018\u0000\u03ad"+ - "\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0006S\u000b\u0000\u03af\u00b7"+ - "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0003\u00a8L\u0000\u03b1\u03b2\u0001"+ - "\u0000\u0000\u0000\u03b2\u03b3\u0006T\u000e\u0000\u03b3\u03b4\u0006T\u000f"+ - "\u0000\u03b4\u00b9\u0001\u0000\u0000\u0000\u03b5\u03b6\u0003B\u0019\u0000"+ - "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0006U\u0010\u0000\u03b8"+ - "\u03b9\u0006U\f\u0000\u03b9\u00bb\u0001\u0000\u0000\u0000\u03ba\u03bb"+ - "\u0003@\u0018\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03bd\u0006"+ - "V\u000b\u0000\u03bd\u00bd\u0001\u0000\u0000\u0000\u03be\u03bf\u0003<\u0016"+ - "\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006W\u000b\u0000"+ - "\u03c1\u00bf\u0001\u0000\u0000\u0000\u03c2\u03c3\u0003>\u0017\u0000\u03c3"+ - "\u03c4\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006X\u000b\u0000\u03c5\u00c1"+ - "\u0001\u0000\u0000\u0000\u03c6\u03c7\u0003B\u0019\u0000\u03c7\u03c8\u0001"+ - "\u0000\u0000\u0000\u03c8\u03c9\u0006Y\u0010\u0000\u03c9\u03ca\u0006Y\f"+ - "\u0000\u03ca\u00c3\u0001\u0000\u0000\u0000\u03cb\u03cc\u0003\u00a8L\u0000"+ - "\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03ce\u0006Z\u000e\u0000\u03ce"+ - "\u00c5\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u00aaM\u0000\u03d0\u03d1"+ - "\u0001\u0000\u0000\u0000\u03d1\u03d2\u0006[\u0011\u0000\u03d2\u00c7\u0001"+ - "\u0000\u0000\u0000\u03d3\u03d4\u0003\u014e\u009f\u0000\u03d4\u03d5\u0001"+ - "\u0000\u0000\u0000\u03d5\u03d6\u0006\\\u0012\u0000\u03d6\u00c9\u0001\u0000"+ - "\u0000\u0000\u03d7\u03d8\u0003h,\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000"+ - "\u03d9\u03da\u0006]\u0013\u0000\u03da\u00cb\u0001\u0000\u0000\u0000\u03db"+ - "\u03dc\u0003d*\u0000\u03dc\u03dd\u0001\u0000\u0000\u0000\u03dd\u03de\u0006"+ - "^\u0014\u0000\u03de\u00cd\u0001\u0000\u0000\u0000\u03df\u03e0\u0007\u0010"+ - "\u0000\u0000\u03e0\u03e1\u0007\u0003\u0000\u0000\u03e1\u03e2\u0007\u0005"+ - "\u0000\u0000\u03e2\u03e3\u0007\f\u0000\u0000\u03e3\u03e4\u0007\u0000\u0000"+ - "\u0000\u03e4\u03e5\u0007\f\u0000\u0000\u03e5\u03e6\u0007\u0005\u0000\u0000"+ - "\u03e6\u03e7\u0007\f\u0000\u0000\u03e7\u00cf\u0001\u0000\u0000\u0000\u03e8"+ - "\u03ec\b \u0000\u0000\u03e9\u03ea\u0005/\u0000\u0000\u03ea\u03ec\b!\u0000"+ - "\u0000\u03eb\u03e8\u0001\u0000\u0000\u0000\u03eb\u03e9\u0001\u0000\u0000"+ - "\u0000\u03ec\u00d1\u0001\u0000\u0000\u0000\u03ed\u03ef\u0003\u00d0`\u0000"+ - "\u03ee\u03ed\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000"+ - "\u03f0\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000"+ - "\u03f1\u00d3\u0001\u0000\u0000\u0000\u03f2\u03f3\u0003\u00d2a\u0000\u03f3"+ - "\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006b\u0015\u0000\u03f5\u00d5"+ - "\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003X$\u0000\u03f7\u03f8\u0001\u0000"+ - "\u0000\u0000\u03f8\u03f9\u0006c\u0016\u0000\u03f9\u00d7\u0001\u0000\u0000"+ - "\u0000\u03fa\u03fb\u0003<\u0016\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000"+ - "\u03fc\u03fd\u0006d\u000b\u0000\u03fd\u00d9\u0001\u0000\u0000\u0000\u03fe"+ - "\u03ff\u0003>\u0017\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401"+ - "\u0006e\u000b\u0000\u0401\u00db\u0001\u0000\u0000\u0000\u0402\u0403\u0003"+ - "@\u0018\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0006f\u000b"+ - "\u0000\u0405\u00dd\u0001\u0000\u0000\u0000\u0406\u0407\u0003B\u0019\u0000"+ - "\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0006g\u0010\u0000\u0409"+ - "\u040a\u0006g\f\u0000\u040a\u00df\u0001\u0000\u0000\u0000\u040b\u040c"+ - "\u0003l.\u0000\u040c\u040d\u0001\u0000\u0000\u0000\u040d\u040e\u0006h"+ - "\u0017\u0000\u040e\u00e1\u0001\u0000\u0000\u0000\u040f\u0410\u0003h,\u0000"+ - "\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u0412\u0006i\u0013\u0000\u0412"+ - "\u00e3\u0001\u0000\u0000\u0000\u0413\u0418\u0003F\u001b\u0000\u0414\u0418"+ - "\u0003D\u001a\u0000\u0415\u0418\u0003T\"\u0000\u0416\u0418\u0003\u009e"+ - "G\u0000\u0417\u0413\u0001\u0000\u0000\u0000\u0417\u0414\u0001\u0000\u0000"+ - "\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0416\u0001\u0000\u0000"+ - "\u0000\u0418\u00e5\u0001\u0000\u0000\u0000\u0419\u041c\u0003F\u001b\u0000"+ - "\u041a\u041c\u0003\u009eG\u0000\u041b\u0419\u0001\u0000\u0000\u0000\u041b"+ - "\u041a\u0001\u0000\u0000\u0000\u041c\u0420\u0001\u0000\u0000\u0000\u041d"+ - "\u041f\u0003\u00e4j\u0000\u041e\u041d\u0001\u0000\u0000\u0000\u041f\u0422"+ - "\u0001\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u0421"+ - "\u0001\u0000\u0000\u0000\u0421\u042d\u0001\u0000\u0000\u0000\u0422\u0420"+ - "\u0001\u0000\u0000\u0000\u0423\u0426\u0003T\"\u0000\u0424\u0426\u0003"+ - "N\u001f\u0000\u0425\u0423\u0001\u0000\u0000\u0000\u0425\u0424\u0001\u0000"+ - "\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000\u0427\u0429\u0003\u00e4"+ - "j\u0000\u0428\u0427\u0001\u0000\u0000\u0000\u0429\u042a\u0001\u0000\u0000"+ - "\u0000\u042a\u0428\u0001\u0000\u0000\u0000\u042a\u042b\u0001\u0000\u0000"+ - "\u0000\u042b\u042d\u0001\u0000\u0000\u0000\u042c\u041b\u0001\u0000\u0000"+ - "\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042d\u00e7\u0001\u0000\u0000"+ - "\u0000\u042e\u0431\u0003\u00e6k\u0000\u042f\u0431\u0003\u00aeO\u0000\u0430"+ - "\u042e\u0001\u0000\u0000\u0000\u0430\u042f\u0001\u0000\u0000\u0000\u0431"+ - "\u0432\u0001\u0000\u0000\u0000\u0432\u0430\u0001\u0000\u0000\u0000\u0432"+ - "\u0433\u0001\u0000\u0000\u0000\u0433\u00e9\u0001\u0000\u0000\u0000\u0434"+ - "\u0435\u0003<\u0016\u0000\u0435\u0436\u0001\u0000\u0000\u0000\u0436\u0437"+ - "\u0006m\u000b\u0000\u0437\u00eb\u0001\u0000\u0000\u0000\u0438\u0439\u0003"+ - ">\u0017\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006n\u000b"+ - "\u0000\u043b\u00ed\u0001\u0000\u0000\u0000\u043c\u043d\u0003@\u0018\u0000"+ - "\u043d\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0006o\u000b\u0000\u043f"+ - "\u00ef\u0001\u0000\u0000\u0000\u0440\u0441\u0003B\u0019\u0000\u0441\u0442"+ - "\u0001\u0000\u0000\u0000\u0442\u0443\u0006p\u0010\u0000\u0443\u0444\u0006"+ - "p\f\u0000\u0444\u00f1\u0001\u0000\u0000\u0000\u0445\u0446\u0003d*\u0000"+ - "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006q\u0014\u0000\u0448"+ - "\u00f3\u0001\u0000\u0000\u0000\u0449\u044a\u0003h,\u0000\u044a\u044b\u0001"+ - "\u0000\u0000\u0000\u044b\u044c\u0006r\u0013\u0000\u044c\u00f5\u0001\u0000"+ - "\u0000\u0000\u044d\u044e\u0003l.\u0000\u044e\u044f\u0001\u0000\u0000\u0000"+ - "\u044f\u0450\u0006s\u0017\u0000\u0450\u00f7\u0001\u0000\u0000\u0000\u0451"+ - "\u0452\u0007\f\u0000\u0000\u0452\u0453\u0007\u0002\u0000\u0000\u0453\u00f9"+ - "\u0001\u0000\u0000\u0000\u0454\u0455\u0003\u00e8l\u0000\u0455\u0456\u0001"+ - "\u0000\u0000\u0000\u0456\u0457\u0006u\u0018\u0000\u0457\u00fb\u0001\u0000"+ - "\u0000\u0000\u0458\u0459\u0003<\u0016\u0000\u0459\u045a\u0001\u0000\u0000"+ - "\u0000\u045a\u045b\u0006v\u000b\u0000\u045b\u00fd\u0001\u0000\u0000\u0000"+ - "\u045c\u045d\u0003>\u0017\u0000\u045d\u045e\u0001\u0000\u0000\u0000\u045e"+ - "\u045f\u0006w\u000b\u0000\u045f\u00ff\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0003@\u0018\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463\u0006"+ - "x\u000b\u0000\u0463\u0101\u0001\u0000\u0000\u0000\u0464\u0465\u0003B\u0019"+ - "\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466\u0467\u0006y\u0010\u0000"+ - "\u0467\u0468\u0006y\f\u0000\u0468\u0103\u0001\u0000\u0000\u0000\u0469"+ - "\u046a\u0003\u00a8L\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c"+ - "\u0006z\u000e\u0000\u046c\u046d\u0006z\u0019\u0000\u046d\u0105\u0001\u0000"+ - "\u0000\u0000\u046e\u046f\u0007\u0007\u0000\u0000\u046f\u0470\u0007\t\u0000"+ - "\u0000\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0472\u0006{\u001a\u0000"+ - "\u0472\u0107\u0001\u0000\u0000\u0000\u0473\u0474\u0007\u0013\u0000\u0000"+ - "\u0474\u0475\u0007\u0001\u0000\u0000\u0475\u0476\u0007\u0005\u0000\u0000"+ - "\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0001\u0000\u0000\u0000\u0478"+ - "\u0479\u0006|\u001a\u0000\u0479\u0109\u0001\u0000\u0000\u0000\u047a\u047b"+ - "\b\"\u0000\u0000\u047b\u010b\u0001\u0000\u0000\u0000\u047c\u047e\u0003"+ - "\u010a}\u0000\u047d\u047c\u0001\u0000\u0000\u0000\u047e\u047f\u0001\u0000"+ - "\u0000\u0000\u047f\u047d\u0001\u0000\u0000\u0000\u047f\u0480\u0001\u0000"+ - "\u0000\u0000\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0482\u0003\u014e"+ - "\u009f\u0000\u0482\u0484\u0001\u0000\u0000\u0000\u0483\u047d\u0001\u0000"+ - "\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0486\u0001\u0000"+ - "\u0000\u0000\u0485\u0487\u0003\u010a}\u0000\u0486\u0485\u0001\u0000\u0000"+ - "\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0486\u0001\u0000\u0000"+ - "\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u010d\u0001\u0000\u0000"+ - "\u0000\u048a\u048b\u0003\u010c~\u0000\u048b\u048c\u0001\u0000\u0000\u0000"+ - "\u048c\u048d\u0006\u007f\u001b\u0000\u048d\u010f\u0001\u0000\u0000\u0000"+ - "\u048e\u048f\u0003<\u0016\u0000\u048f\u0490\u0001\u0000\u0000\u0000\u0490"+ - "\u0491\u0006\u0080\u000b\u0000\u0491\u0111\u0001\u0000\u0000\u0000\u0492"+ - "\u0493\u0003>\u0017\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0495"+ - "\u0006\u0081\u000b\u0000\u0495\u0113\u0001\u0000\u0000\u0000\u0496\u0497"+ - "\u0003@\u0018\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499\u0006"+ - "\u0082\u000b\u0000\u0499\u0115\u0001\u0000\u0000\u0000\u049a\u049b\u0003"+ - "B\u0019\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006\u0083"+ - "\u0010\u0000\u049d\u049e\u0006\u0083\f\u0000\u049e\u049f\u0006\u0083\f"+ - "\u0000\u049f\u0117\u0001\u0000\u0000\u0000\u04a0\u04a1\u0003d*\u0000\u04a1"+ - "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0006\u0084\u0014\u0000\u04a3"+ - "\u0119\u0001\u0000\u0000\u0000\u04a4\u04a5\u0003h,\u0000\u04a5\u04a6\u0001"+ - "\u0000\u0000\u0000\u04a6\u04a7\u0006\u0085\u0013\u0000\u04a7\u011b\u0001"+ - "\u0000\u0000\u0000\u04a8\u04a9\u0003l.\u0000\u04a9\u04aa\u0001\u0000\u0000"+ - "\u0000\u04aa\u04ab\u0006\u0086\u0017\u0000\u04ab\u011d\u0001\u0000\u0000"+ - "\u0000\u04ac\u04ad\u0003\u0108|\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000"+ - "\u04ae\u04af\u0006\u0087\u001c\u0000\u04af\u011f\u0001\u0000\u0000\u0000"+ - "\u04b0\u04b1\u0003\u00e8l\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2"+ - "\u04b3\u0006\u0088\u0018\u0000\u04b3\u0121\u0001\u0000\u0000\u0000\u04b4"+ - "\u04b5\u0003\u00b0P\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7"+ - "\u0006\u0089\u001d\u0000\u04b7\u0123\u0001\u0000\u0000\u0000\u04b8\u04b9"+ - "\u0003<\u0016\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006"+ - "\u008a\u000b\u0000\u04bb\u0125\u0001\u0000\u0000\u0000\u04bc\u04bd\u0003"+ - ">\u0017\u0000\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u04bf\u0006\u008b"+ - "\u000b\u0000\u04bf\u0127\u0001\u0000\u0000\u0000\u04c0\u04c1\u0003@\u0018"+ - "\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006\u008c\u000b"+ - "\u0000\u04c3\u0129\u0001\u0000\u0000\u0000\u04c4\u04c5\u0003B\u0019\u0000"+ - "\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0010\u0000"+ - "\u04c7\u04c8\u0006\u008d\f\u0000\u04c8\u012b\u0001\u0000\u0000\u0000\u04c9"+ - "\u04ca\u0003l.\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb\u04cc\u0006"+ - "\u008e\u0017\u0000\u04cc\u012d\u0001\u0000\u0000\u0000\u04cd\u04ce\u0003"+ - "\u00b0P\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf\u04d0\u0006\u008f"+ - "\u001d\u0000\u04d0\u012f\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003\u00ac"+ - "N\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0006\u0090\u001e"+ - "\u0000\u04d4\u0131\u0001\u0000\u0000\u0000\u04d5\u04d6\u0003<\u0016\u0000"+ - "\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0006\u0091\u000b\u0000"+ - "\u04d8\u0133\u0001\u0000\u0000\u0000\u04d9\u04da\u0003>\u0017\u0000\u04da"+ - "\u04db\u0001\u0000\u0000\u0000\u04db\u04dc\u0006\u0092\u000b\u0000\u04dc"+ - "\u0135\u0001\u0000\u0000\u0000\u04dd\u04de\u0003@\u0018\u0000\u04de\u04df"+ - "\u0001\u0000\u0000\u0000\u04df\u04e0\u0006\u0093\u000b\u0000\u04e0\u0137"+ - "\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003B\u0019\u0000\u04e2\u04e3\u0001"+ - "\u0000\u0000\u0000\u04e3\u04e4\u0006\u0094\u0010\u0000\u04e4\u04e5\u0006"+ - "\u0094\f\u0000\u04e5\u0139\u0001\u0000\u0000\u0000\u04e6\u04e7\u0007\u0001"+ - "\u0000\u0000\u04e7\u04e8\u0007\t\u0000\u0000\u04e8\u04e9\u0007\u000f\u0000"+ - "\u0000\u04e9\u04ea\u0007\u0007\u0000\u0000\u04ea\u013b\u0001\u0000\u0000"+ - "\u0000\u04eb\u04ec\u0003<\u0016\u0000\u04ec\u04ed\u0001\u0000\u0000\u0000"+ - "\u04ed\u04ee\u0006\u0096\u000b\u0000\u04ee\u013d\u0001\u0000\u0000\u0000"+ - "\u04ef\u04f0\u0003>\u0017\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1"+ - "\u04f2\u0006\u0097\u000b\u0000\u04f2\u013f\u0001\u0000\u0000\u0000\u04f3"+ - "\u04f4\u0003@\u0018\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6"+ - "\u0006\u0098\u000b\u0000\u04f6\u0141\u0001\u0000\u0000\u0000\u04f7\u04f8"+ - "\u0003B\u0019\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u04fa\u0006"+ - "\u0099\u0010\u0000\u04fa\u04fb\u0006\u0099\f\u0000\u04fb\u0143\u0001\u0000"+ - "\u0000\u0000\u04fc\u04fd\u0007\u000f\u0000\u0000\u04fd\u04fe\u0007\u0014"+ - "\u0000\u0000\u04fe\u04ff\u0007\t\u0000\u0000\u04ff\u0500\u0007\u0004\u0000"+ - "\u0000\u0500\u0501\u0007\u0005\u0000\u0000\u0501\u0502\u0007\u0001\u0000"+ - "\u0000\u0502\u0503\u0007\u0007\u0000\u0000\u0503\u0504\u0007\t\u0000\u0000"+ - "\u0504\u0505\u0007\u0002\u0000\u0000\u0505\u0145\u0001\u0000\u0000\u0000"+ - "\u0506\u0507\u0003<\u0016\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508"+ - "\u0509\u0006\u009b\u000b\u0000\u0509\u0147\u0001\u0000\u0000\u0000\u050a"+ - "\u050b\u0003>\u0017\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c\u050d"+ - "\u0006\u009c\u000b\u0000\u050d\u0149\u0001\u0000\u0000\u0000\u050e\u050f"+ - "\u0003@\u0018\u0000\u050f\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0006"+ - "\u009d\u000b\u0000\u0511\u014b\u0001\u0000\u0000\u0000\u0512\u0513\u0003"+ - "\u00aaM\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u009e"+ - "\u0011\u0000\u0515\u0516\u0006\u009e\f\u0000\u0516\u014d\u0001\u0000\u0000"+ - "\u0000\u0517\u0518\u0005:\u0000\u0000\u0518\u014f\u0001\u0000\u0000\u0000"+ - "\u0519\u051f\u0003N\u001f\u0000\u051a\u051f\u0003D\u001a\u0000\u051b\u051f"+ - "\u0003l.\u0000\u051c\u051f\u0003F\u001b\u0000\u051d\u051f\u0003T\"\u0000"+ - "\u051e\u0519\u0001\u0000\u0000\u0000\u051e\u051a\u0001\u0000\u0000\u0000"+ - "\u051e\u051b\u0001\u0000\u0000\u0000\u051e\u051c\u0001\u0000\u0000\u0000"+ - "\u051e\u051d\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000"+ - "\u0520\u051e\u0001\u0000\u0000\u0000\u0520\u0521\u0001\u0000\u0000\u0000"+ - "\u0521\u0151\u0001\u0000\u0000\u0000\u0522\u0523\u0003<\u0016\u0000\u0523"+ - "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0006\u00a1\u000b\u0000\u0525"+ - "\u0153\u0001\u0000\u0000\u0000\u0526\u0527\u0003>\u0017\u0000\u0527\u0528"+ - "\u0001\u0000\u0000\u0000\u0528\u0529\u0006\u00a2\u000b\u0000\u0529\u0155"+ - "\u0001\u0000\u0000\u0000\u052a\u052b\u0003@\u0018\u0000\u052b\u052c\u0001"+ - "\u0000\u0000\u0000\u052c\u052d\u0006\u00a3\u000b\u0000\u052d\u0157\u0001"+ - "\u0000\u0000\u0000\u052e\u052f\u0003B\u0019\u0000\u052f\u0530\u0001\u0000"+ - "\u0000\u0000\u0530\u0531\u0006\u00a4\u0010\u0000\u0531\u0532\u0006\u00a4"+ - "\f\u0000\u0532\u0159\u0001\u0000\u0000\u0000\u0533\u0534\u0003\u014e\u009f"+ - "\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0536\u0006\u00a5\u0012"+ - "\u0000\u0536\u015b\u0001\u0000\u0000\u0000\u0537\u0538\u0003h,\u0000\u0538"+ - "\u0539\u0001\u0000\u0000\u0000\u0539\u053a\u0006\u00a6\u0013\u0000\u053a"+ - "\u015d\u0001\u0000\u0000\u0000\u053b\u053c\u0003l.\u0000\u053c\u053d\u0001"+ - "\u0000\u0000\u0000\u053d\u053e\u0006\u00a7\u0017\u0000\u053e\u015f\u0001"+ - "\u0000\u0000\u0000\u053f\u0540\u0003\u0106{\u0000\u0540\u0541\u0001\u0000"+ - "\u0000\u0000\u0541\u0542\u0006\u00a8\u001f\u0000\u0542\u0543\u0006\u00a8"+ - " \u0000\u0543\u0161\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u00d2a\u0000"+ - "\u0545\u0546\u0001\u0000\u0000\u0000\u0546\u0547\u0006\u00a9\u0015\u0000"+ - "\u0547\u0163\u0001\u0000\u0000\u0000\u0548\u0549\u0003X$\u0000\u0549\u054a"+ - "\u0001\u0000\u0000\u0000\u054a\u054b\u0006\u00aa\u0016\u0000\u054b\u0165"+ - "\u0001\u0000\u0000\u0000\u054c\u054d\u0003<\u0016\u0000\u054d\u054e\u0001"+ - "\u0000\u0000\u0000\u054e\u054f\u0006\u00ab\u000b\u0000\u054f\u0167\u0001"+ - "\u0000\u0000\u0000\u0550\u0551\u0003>\u0017\u0000\u0551\u0552\u0001\u0000"+ - "\u0000\u0000\u0552\u0553\u0006\u00ac\u000b\u0000\u0553\u0169\u0001\u0000"+ - "\u0000\u0000\u0554\u0555\u0003@\u0018\u0000\u0555\u0556\u0001\u0000\u0000"+ - "\u0000\u0556\u0557\u0006\u00ad\u000b\u0000\u0557\u016b\u0001\u0000\u0000"+ - "\u0000\u0558\u0559\u0003B\u0019\u0000\u0559\u055a\u0001\u0000\u0000\u0000"+ - "\u055a\u055b\u0006\u00ae\u0010\u0000\u055b\u055c\u0006\u00ae\f\u0000\u055c"+ - "\u055d\u0006\u00ae\f\u0000\u055d\u016d\u0001\u0000\u0000\u0000\u055e\u055f"+ - "\u0003h,\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560\u0561\u0006\u00af"+ - "\u0013\u0000\u0561\u016f\u0001\u0000\u0000\u0000\u0562\u0563\u0003l.\u0000"+ - "\u0563\u0564\u0001\u0000\u0000\u0000\u0564\u0565\u0006\u00b0\u0017\u0000"+ - "\u0565\u0171\u0001\u0000\u0000\u0000\u0566\u0567\u0003\u00e8l\u0000\u0567"+ - "\u0568\u0001\u0000\u0000\u0000\u0568\u0569\u0006\u00b1\u0018\u0000\u0569"+ - "\u0173\u0001\u0000\u0000\u0000\u056a\u056b\u0003<\u0016\u0000\u056b\u056c"+ - "\u0001\u0000\u0000\u0000\u056c\u056d\u0006\u00b2\u000b\u0000\u056d\u0175"+ - "\u0001\u0000\u0000\u0000\u056e\u056f\u0003>\u0017\u0000\u056f\u0570\u0001"+ - "\u0000\u0000\u0000\u0570\u0571\u0006\u00b3\u000b\u0000\u0571\u0177\u0001"+ - "\u0000\u0000\u0000\u0572\u0573\u0003@\u0018\u0000\u0573\u0574\u0001\u0000"+ - "\u0000\u0000\u0574\u0575\u0006\u00b4\u000b\u0000\u0575\u0179\u0001\u0000"+ - "\u0000\u0000\u0576\u0577\u0003B\u0019\u0000\u0577\u0578\u0001\u0000\u0000"+ - "\u0000\u0578\u0579\u0006\u00b5\u0010\u0000\u0579\u057a\u0006\u00b5\f\u0000"+ - "\u057a\u017b\u0001\u0000\u0000\u0000\u057b\u057c\u0003\u00d2a\u0000\u057c"+ - "\u057d\u0001\u0000\u0000\u0000\u057d\u057e\u0006\u00b6\u0015\u0000\u057e"+ - "\u057f\u0006\u00b6\f\u0000\u057f\u0580\u0006\u00b6!\u0000\u0580\u017d"+ - "\u0001\u0000\u0000\u0000\u0581\u0582\u0003X$\u0000\u0582\u0583\u0001\u0000"+ - "\u0000\u0000\u0583\u0584\u0006\u00b7\u0016\u0000\u0584\u0585\u0006\u00b7"+ - "\f\u0000\u0585\u0586\u0006\u00b7!\u0000\u0586\u017f\u0001\u0000\u0000"+ - "\u0000\u0587\u0588\u0003<\u0016\u0000\u0588\u0589\u0001\u0000\u0000\u0000"+ - "\u0589\u058a\u0006\u00b8\u000b\u0000\u058a\u0181\u0001\u0000\u0000\u0000"+ - "\u058b\u058c\u0003>\u0017\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d"+ - "\u058e\u0006\u00b9\u000b\u0000\u058e\u0183\u0001\u0000\u0000\u0000\u058f"+ - "\u0590\u0003@\u0018\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0592"+ - "\u0006\u00ba\u000b\u0000\u0592\u0185\u0001\u0000\u0000\u0000\u0593\u0594"+ - "\u0003\u014e\u009f\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596"+ - "\u0006\u00bb\u0012\u0000\u0596\u0597\u0006\u00bb\f\u0000\u0597\u0598\u0006"+ - "\u00bb\n\u0000\u0598\u0187\u0001\u0000\u0000\u0000\u0599\u059a\u0003h"+ - ",\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u0006\u00bc\u0013"+ - "\u0000\u059c\u059d\u0006\u00bc\f\u0000\u059d\u059e\u0006\u00bc\n\u0000"+ - "\u059e\u0189\u0001\u0000\u0000\u0000\u059f\u05a0\u0003<\u0016\u0000\u05a0"+ - "\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2\u0006\u00bd\u000b\u0000\u05a2"+ - "\u018b\u0001\u0000\u0000\u0000\u05a3\u05a4\u0003>\u0017\u0000\u05a4\u05a5"+ - "\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00be\u000b\u0000\u05a6\u018d"+ - "\u0001\u0000\u0000\u0000\u05a7\u05a8\u0003@\u0018\u0000\u05a8\u05a9\u0001"+ - "\u0000\u0000\u0000\u05a9\u05aa\u0006\u00bf\u000b\u0000\u05aa\u018f\u0001"+ - "\u0000\u0000\u0000\u05ab\u05ac\u0003\u00b0P\u0000\u05ac\u05ad\u0001\u0000"+ - "\u0000\u0000\u05ad\u05ae\u0006\u00c0\f\u0000\u05ae\u05af\u0006\u00c0\u0000"+ - "\u0000\u05af\u05b0\u0006\u00c0\u001d\u0000\u05b0\u0191\u0001\u0000\u0000"+ - "\u0000\u05b1\u05b2\u0003\u00acN\u0000\u05b2\u05b3\u0001\u0000\u0000\u0000"+ - "\u05b3\u05b4\u0006\u00c1\f\u0000\u05b4\u05b5\u0006\u00c1\u0000\u0000\u05b5"+ - "\u05b6\u0006\u00c1\u001e\u0000\u05b6\u0193\u0001\u0000\u0000\u0000\u05b7"+ - "\u05b8\u0003^\'\u0000\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba"+ - "\u0006\u00c2\f\u0000\u05ba\u05bb\u0006\u00c2\u0000\u0000\u05bb\u05bc\u0006"+ - "\u00c2\"\u0000\u05bc\u0195\u0001\u0000\u0000\u0000\u05bd\u05be\u0003B"+ - "\u0019\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u0006\u00c3"+ - "\u0010\u0000\u05c0\u05c1\u0006\u00c3\f\u0000\u05c1\u0197\u0001\u0000\u0000"+ - "\u0000B\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ - "\r\u000e\u000f\u0250\u025a\u025e\u0261\u026a\u026c\u0277\u028a\u028f\u0298"+ - "\u029f\u02a4\u02a6\u02b1\u02b9\u02bc\u02be\u02c3\u02c8\u02ce\u02d5\u02da"+ - "\u02e0\u02e3\u02eb\u02ef\u036e\u0373\u037a\u037c\u038c\u0391\u0396\u0398"+ - "\u039e\u03eb\u03f0\u0417\u041b\u0420\u0425\u042a\u042c\u0430\u0432\u047f"+ - "\u0483\u0488\u051e\u0520#\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006"+ - "\u0000\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000"+ - "\u0005\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000"+ - "\u0001\u0000\u0004\u0000\u0000\u0007\u0014\u0000\u0007B\u0000\u0005\u0000"+ - "\u0000\u0007\u001a\u0000\u0007C\u0000\u0007m\u0000\u0007#\u0000\u0007"+ - "!\u0000\u0007M\u0000\u0007\u001b\u0000\u0007%\u0000\u0007Q\u0000\u0005"+ - "\u000b\u0000\u0005\u0007\u0000\u0007[\u0000\u0007Z\u0000\u0007E\u0000"+ - "\u0007D\u0000\u0007Y\u0000\u0005\r\u0000\u0005\u000f\u0000\u0007\u001e"+ - "\u0000"; + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0004"+ + "\u0015\u0252\b\u0015\u000b\u0015\f\u0015\u0253\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u025c\b\u0016"+ + "\n\u0016\f\u0016\u025f\t\u0016\u0001\u0016\u0003\u0016\u0262\b\u0016\u0001"+ + "\u0016\u0003\u0016\u0265\b\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0005\u0017\u026e\b\u0017\n"+ + "\u0017\f\u0017\u0271\t\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0018\u0004\u0018\u0279\b\u0018\u000b\u0018\f"+ + "\u0018\u027a\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0003\u001e\u028e\b\u001e\u0001\u001e\u0004\u001e\u0291\b\u001e\u000b"+ + "\u001e\f\u001e\u0292\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001"+ + "!\u0001!\u0003!\u029c\b!\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0003#\u02a3"+ + "\b#\u0001$\u0001$\u0001$\u0005$\u02a8\b$\n$\f$\u02ab\t$\u0001$\u0001$"+ + "\u0001$\u0001$\u0001$\u0001$\u0005$\u02b3\b$\n$\f$\u02b6\t$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0003$\u02bd\b$\u0001$\u0003$\u02c0\b$\u0003$\u02c2"+ + "\b$\u0001%\u0004%\u02c5\b%\u000b%\f%\u02c6\u0001&\u0004&\u02ca\b&\u000b"+ + "&\f&\u02cb\u0001&\u0001&\u0005&\u02d0\b&\n&\f&\u02d3\t&\u0001&\u0001&"+ + "\u0004&\u02d7\b&\u000b&\f&\u02d8\u0001&\u0004&\u02dc\b&\u000b&\f&\u02dd"+ + "\u0001&\u0001&\u0005&\u02e2\b&\n&\f&\u02e5\t&\u0003&\u02e7\b&\u0001&\u0001"+ + "&\u0001&\u0001&\u0004&\u02ed\b&\u000b&\f&\u02ee\u0001&\u0001&\u0003&\u02f3"+ + "\b&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)"+ + "\u0001)\u0001)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001"+ + "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00015\u00015\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ + "8\u00018\u00019\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001;\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001"+ + "A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001"+ + "E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001"+ + "J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0003K\u0372\bK\u0001K\u0005"+ + "K\u0375\bK\nK\fK\u0378\tK\u0001K\u0001K\u0004K\u037c\bK\u000bK\fK\u037d"+ + "\u0003K\u0380\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001"+ + "M\u0001M\u0001M\u0001N\u0001N\u0005N\u038e\bN\nN\fN\u0391\tN\u0001N\u0001"+ + "N\u0003N\u0395\bN\u0001N\u0004N\u0398\bN\u000bN\fN\u0399\u0003N\u039c"+ + "\bN\u0001O\u0001O\u0004O\u03a0\bO\u000bO\fO\u03a1\u0001O\u0001O\u0001"+ + "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001"+ + "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ + "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ + "`\u0001`\u0001`\u0003`\u03ef\b`\u0001a\u0004a\u03f2\ba\u000ba\fa\u03f3"+ + "\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ + "d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ + "f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001"+ + "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0003j\u041b\bj\u0001"+ + "k\u0001k\u0003k\u041f\bk\u0001k\u0005k\u0422\bk\nk\fk\u0425\tk\u0001k"+ + "\u0001k\u0003k\u0429\bk\u0001k\u0004k\u042c\bk\u000bk\fk\u042d\u0003k"+ + "\u0430\bk\u0001l\u0001l\u0004l\u0434\bl\u000bl\fl\u0435\u0001m\u0001m"+ + "\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ + "o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001"+ + "r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001"+ + "t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001"+ + "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ + "y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001"+ + "{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001"+ + "}\u0001~\u0004~\u0481\b~\u000b~\f~\u0482\u0001~\u0001~\u0003~\u0487\b"+ + "~\u0001~\u0004~\u048a\b~\u000b~\f~\u048b\u0001\u007f\u0001\u007f\u0001"+ + "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+ + "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001"+ + "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001"+ + "\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001"+ + "\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ + "\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001"+ + "\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ + "\u00a0\u0001\u00a0\u0004\u00a0\u0522\b\u00a0\u000b\u00a0\f\u00a0\u0523"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ + "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8"+ + "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ + "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2"+ + "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0002\u026f\u02b4\u0000"+ + "\u00c4\u0010\u0001\u0012\u0002\u0014\u0003\u0016\u0004\u0018\u0005\u001a"+ + "\u0006\u001c\u0007\u001e\b \t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u0011"+ + "2\u00124\u00136\u00148\u0015:\u0016<\u0017>\u0018@\u0019B\u001aD\u0000"+ + "F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u001b"+ + "Z\u001c\\\u001d^\u001e`\u001fb d!f\"h#j$l%n&p\'r(t)v*x+z,|-~.\u0080/\u0082"+ + "0\u00841\u00862\u00883\u008a4\u008c5\u008e6\u00907\u00928\u00949\u0096"+ + ":\u0098;\u009a<\u009c=\u009e>\u00a0?\u00a2@\u00a4\u0000\u00a6A\u00a8B"+ + "\u00aaC\u00acD\u00ae\u0000\u00b0E\u00b2F\u00b4G\u00b6H\u00b8\u0000\u00ba"+ + "\u0000\u00bcI\u00beJ\u00c0K\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8"+ + "\u0000\u00ca\u0000\u00cc\u0000\u00ceL\u00d0\u0000\u00d2M\u00d4\u0000\u00d6"+ + "\u0000\u00d8N\u00daO\u00dcP\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4"+ + "\u0000\u00e6\u0000\u00e8Q\u00eaR\u00ecS\u00eeT\u00f0\u0000\u00f2\u0000"+ + "\u00f4\u0000\u00f6\u0000\u00f8U\u00fa\u0000\u00fcV\u00feW\u0100X\u0102"+ + "\u0000\u0104\u0000\u0106Y\u0108Z\u010a\u0000\u010c[\u010e\u0000\u0110"+ + "\\\u0112]\u0114^\u0116\u0000\u0118\u0000\u011a\u0000\u011c\u0000\u011e"+ + "\u0000\u0120\u0000\u0122\u0000\u0124_\u0126`\u0128a\u012a\u0000\u012c"+ + "\u0000\u012e\u0000\u0130\u0000\u0132b\u0134c\u0136d\u0138\u0000\u013a"+ + "e\u013cf\u013eg\u0140h\u0142\u0000\u0144i\u0146j\u0148k\u014al\u014c\u0000"+ + "\u014em\u0150n\u0152o\u0154p\u0156q\u0158\u0000\u015a\u0000\u015c\u0000"+ + "\u015e\u0000\u0160\u0000\u0162\u0000\u0164\u0000\u0166r\u0168s\u016at"+ + "\u016c\u0000\u016e\u0000\u0170\u0000\u0172\u0000\u0174u\u0176v\u0178w"+ + "\u017a\u0000\u017c\u0000\u017e\u0000\u0180x\u0182y\u0184z\u0186\u0000"+ + "\u0188\u0000\u018a{\u018c|\u018e}\u0190\u0000\u0192\u0000\u0194\u0000"+ + "\u0196\u0000\u0010\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ + "\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000"+ + "SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+ + "\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000"+ + "VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002"+ + "\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ + "UUuu\u0006\u0000\t\n\r\r //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r"+ + "\r \u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000"+ + "\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000"+ + "YYyy\u000b\u0000\t\n\r\r \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000"+ + "\t\n\r\r \"#,,//::<<>?\\\\||\u05e0\u0000\u0010\u0001\u0000\u0000\u0000"+ + "\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000"+ + "\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000"+ + "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ + "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ + "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ + "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ + "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ + "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ + "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ + "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ + ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0001B\u0001"+ + "\u0000\u0000\u0000\u0001X\u0001\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000"+ + "\u0000\u0001\\\u0001\u0000\u0000\u0000\u0001^\u0001\u0000\u0000\u0000"+ + "\u0001`\u0001\u0000\u0000\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d"+ + "\u0001\u0000\u0000\u0000\u0001f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000"+ + "\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000"+ + "\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000\u0001r"+ + "\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v\u0001\u0000"+ + "\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000\u0000\u0000"+ + "\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000\u0001\u0080"+ + "\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000\u0001\u0084"+ + "\u0001\u0000\u0000\u0000\u0001\u0086\u0001\u0000\u0000\u0000\u0001\u0088"+ + "\u0001\u0000\u0000\u0000\u0001\u008a\u0001\u0000\u0000\u0000\u0001\u008c"+ + "\u0001\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0001\u0090"+ + "\u0001\u0000\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000\u0001\u0094"+ + "\u0001\u0000\u0000\u0000\u0001\u0096\u0001\u0000\u0000\u0000\u0001\u0098"+ + "\u0001\u0000\u0000\u0000\u0001\u009a\u0001\u0000\u0000\u0000\u0001\u009c"+ + "\u0001\u0000\u0000\u0000\u0001\u009e\u0001\u0000\u0000\u0000\u0001\u00a0"+ + "\u0001\u0000\u0000\u0000\u0001\u00a2\u0001\u0000\u0000\u0000\u0001\u00a4"+ + "\u0001\u0000\u0000\u0000\u0001\u00a6\u0001\u0000\u0000\u0000\u0001\u00a8"+ + "\u0001\u0000\u0000\u0000\u0001\u00aa\u0001\u0000\u0000\u0000\u0001\u00ac"+ + "\u0001\u0000\u0000\u0000\u0001\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2"+ + "\u0001\u0000\u0000\u0000\u0001\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6"+ + "\u0001\u0000\u0000\u0000\u0002\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba"+ + "\u0001\u0000\u0000\u0000\u0002\u00bc\u0001\u0000\u0000\u0000\u0002\u00be"+ + "\u0001\u0000\u0000\u0000\u0002\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2"+ + "\u0001\u0000\u0000\u0000\u0003\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6"+ + "\u0001\u0000\u0000\u0000\u0003\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca"+ + "\u0001\u0000\u0000\u0000\u0003\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce"+ + "\u0001\u0000\u0000\u0000\u0003\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4"+ + "\u0001\u0000\u0000\u0000\u0003\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8"+ + "\u0001\u0000\u0000\u0000\u0003\u00da\u0001\u0000\u0000\u0000\u0003\u00dc"+ + "\u0001\u0000\u0000\u0000\u0004\u00de\u0001\u0000\u0000\u0000\u0004\u00e0"+ + "\u0001\u0000\u0000\u0000\u0004\u00e2\u0001\u0000\u0000\u0000\u0004\u00e8"+ + "\u0001\u0000\u0000\u0000\u0004\u00ea\u0001\u0000\u0000\u0000\u0004\u00ec"+ + "\u0001\u0000\u0000\u0000\u0004\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0"+ + "\u0001\u0000\u0000\u0000\u0005\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4"+ + "\u0001\u0000\u0000\u0000\u0005\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8"+ + "\u0001\u0000\u0000\u0000\u0005\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc"+ + "\u0001\u0000\u0000\u0000\u0005\u00fe\u0001\u0000\u0000\u0000\u0005\u0100"+ + "\u0001\u0000\u0000\u0000\u0006\u0102\u0001\u0000\u0000\u0000\u0006\u0104"+ + "\u0001\u0000\u0000\u0000\u0006\u0106\u0001\u0000\u0000\u0000\u0006\u0108"+ + "\u0001\u0000\u0000\u0000\u0006\u010c\u0001\u0000\u0000\u0000\u0006\u010e"+ + "\u0001\u0000\u0000\u0000\u0006\u0110\u0001\u0000\u0000\u0000\u0006\u0112"+ + "\u0001\u0000\u0000\u0000\u0006\u0114\u0001\u0000\u0000\u0000\u0007\u0116"+ + "\u0001\u0000\u0000\u0000\u0007\u0118\u0001\u0000\u0000\u0000\u0007\u011a"+ + "\u0001\u0000\u0000\u0000\u0007\u011c\u0001\u0000\u0000\u0000\u0007\u011e"+ + "\u0001\u0000\u0000\u0000\u0007\u0120\u0001\u0000\u0000\u0000\u0007\u0122"+ + "\u0001\u0000\u0000\u0000\u0007\u0124\u0001\u0000\u0000\u0000\u0007\u0126"+ + "\u0001\u0000\u0000\u0000\u0007\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001"+ + "\u0000\u0000\u0000\b\u012c\u0001\u0000\u0000\u0000\b\u012e\u0001\u0000"+ + "\u0000\u0000\b\u0130\u0001\u0000\u0000\u0000\b\u0132\u0001\u0000\u0000"+ + "\u0000\b\u0134\u0001\u0000\u0000\u0000\b\u0136\u0001\u0000\u0000\u0000"+ + "\t\u0138\u0001\u0000\u0000\u0000\t\u013a\u0001\u0000\u0000\u0000\t\u013c"+ + "\u0001\u0000\u0000\u0000\t\u013e\u0001\u0000\u0000\u0000\t\u0140\u0001"+ + "\u0000\u0000\u0000\n\u0142\u0001\u0000\u0000\u0000\n\u0144\u0001\u0000"+ + "\u0000\u0000\n\u0146\u0001\u0000\u0000\u0000\n\u0148\u0001\u0000\u0000"+ + "\u0000\n\u014a\u0001\u0000\u0000\u0000\u000b\u014c\u0001\u0000\u0000\u0000"+ + "\u000b\u014e\u0001\u0000\u0000\u0000\u000b\u0150\u0001\u0000\u0000\u0000"+ + "\u000b\u0152\u0001\u0000\u0000\u0000\u000b\u0154\u0001\u0000\u0000\u0000"+ + "\u000b\u0156\u0001\u0000\u0000\u0000\f\u0158\u0001\u0000\u0000\u0000\f"+ + "\u015a\u0001\u0000\u0000\u0000\f\u015c\u0001\u0000\u0000\u0000\f\u015e"+ + "\u0001\u0000\u0000\u0000\f\u0160\u0001\u0000\u0000\u0000\f\u0162\u0001"+ + "\u0000\u0000\u0000\f\u0164\u0001\u0000\u0000\u0000\f\u0166\u0001\u0000"+ + "\u0000\u0000\f\u0168\u0001\u0000\u0000\u0000\f\u016a\u0001\u0000\u0000"+ + "\u0000\r\u016c\u0001\u0000\u0000\u0000\r\u016e\u0001\u0000\u0000\u0000"+ + "\r\u0170\u0001\u0000\u0000\u0000\r\u0172\u0001\u0000\u0000\u0000\r\u0174"+ + "\u0001\u0000\u0000\u0000\r\u0176\u0001\u0000\u0000\u0000\r\u0178\u0001"+ + "\u0000\u0000\u0000\u000e\u017a\u0001\u0000\u0000\u0000\u000e\u017c\u0001"+ + "\u0000\u0000\u0000\u000e\u017e\u0001\u0000\u0000\u0000\u000e\u0180\u0001"+ + "\u0000\u0000\u0000\u000e\u0182\u0001\u0000\u0000\u0000\u000e\u0184\u0001"+ + "\u0000\u0000\u0000\u000f\u0186\u0001\u0000\u0000\u0000\u000f\u0188\u0001"+ + "\u0000\u0000\u0000\u000f\u018a\u0001\u0000\u0000\u0000\u000f\u018c\u0001"+ + "\u0000\u0000\u0000\u000f\u018e\u0001\u0000\u0000\u0000\u000f\u0190\u0001"+ + "\u0000\u0000\u0000\u000f\u0192\u0001\u0000\u0000\u0000\u000f\u0194\u0001"+ + "\u0000\u0000\u0000\u000f\u0196\u0001\u0000\u0000\u0000\u0010\u0198\u0001"+ + "\u0000\u0000\u0000\u0012\u01a2\u0001\u0000\u0000\u0000\u0014\u01a9\u0001"+ + "\u0000\u0000\u0000\u0016\u01b2\u0001\u0000\u0000\u0000\u0018\u01b9\u0001"+ + "\u0000\u0000\u0000\u001a\u01c3\u0001\u0000\u0000\u0000\u001c\u01ca\u0001"+ + "\u0000\u0000\u0000\u001e\u01d1\u0001\u0000\u0000\u0000 \u01d8\u0001\u0000"+ + "\u0000\u0000\"\u01e0\u0001\u0000\u0000\u0000$\u01e7\u0001\u0000\u0000"+ + "\u0000&\u01f3\u0001\u0000\u0000\u0000(\u01fc\u0001\u0000\u0000\u0000*"+ + "\u0202\u0001\u0000\u0000\u0000,\u0209\u0001\u0000\u0000\u0000.\u0210\u0001"+ + "\u0000\u0000\u00000\u0218\u0001\u0000\u0000\u00002\u0220\u0001\u0000\u0000"+ + "\u00004\u022f\u0001\u0000\u0000\u00006\u0239\u0001\u0000\u0000\u00008"+ + "\u0245\u0001\u0000\u0000\u0000:\u0251\u0001\u0000\u0000\u0000<\u0257\u0001"+ + "\u0000\u0000\u0000>\u0268\u0001\u0000\u0000\u0000@\u0278\u0001\u0000\u0000"+ + "\u0000B\u027e\u0001\u0000\u0000\u0000D\u0282\u0001\u0000\u0000\u0000F"+ + "\u0284\u0001\u0000\u0000\u0000H\u0286\u0001\u0000\u0000\u0000J\u0289\u0001"+ + "\u0000\u0000\u0000L\u028b\u0001\u0000\u0000\u0000N\u0294\u0001\u0000\u0000"+ + "\u0000P\u0296\u0001\u0000\u0000\u0000R\u029b\u0001\u0000\u0000\u0000T"+ + "\u029d\u0001\u0000\u0000\u0000V\u02a2\u0001\u0000\u0000\u0000X\u02c1\u0001"+ + "\u0000\u0000\u0000Z\u02c4\u0001\u0000\u0000\u0000\\\u02f2\u0001\u0000"+ + "\u0000\u0000^\u02f4\u0001\u0000\u0000\u0000`\u02f7\u0001\u0000\u0000\u0000"+ + "b\u02fb\u0001\u0000\u0000\u0000d\u02ff\u0001\u0000\u0000\u0000f\u0301"+ + "\u0001\u0000\u0000\u0000h\u0304\u0001\u0000\u0000\u0000j\u0306\u0001\u0000"+ + "\u0000\u0000l\u030b\u0001\u0000\u0000\u0000n\u030d\u0001\u0000\u0000\u0000"+ + "p\u0313\u0001\u0000\u0000\u0000r\u0319\u0001\u0000\u0000\u0000t\u031c"+ + "\u0001\u0000\u0000\u0000v\u031f\u0001\u0000\u0000\u0000x\u0324\u0001\u0000"+ + "\u0000\u0000z\u0329\u0001\u0000\u0000\u0000|\u032b\u0001\u0000\u0000\u0000"+ + "~\u032f\u0001\u0000\u0000\u0000\u0080\u0334\u0001\u0000\u0000\u0000\u0082"+ + "\u033a\u0001\u0000\u0000\u0000\u0084\u033d\u0001\u0000\u0000\u0000\u0086"+ + "\u033f\u0001\u0000\u0000\u0000\u0088\u0345\u0001\u0000\u0000\u0000\u008a"+ + "\u0347\u0001\u0000\u0000\u0000\u008c\u034c\u0001\u0000\u0000\u0000\u008e"+ + "\u034f\u0001\u0000\u0000\u0000\u0090\u0352\u0001\u0000\u0000\u0000\u0092"+ + "\u0355\u0001\u0000\u0000\u0000\u0094\u0357\u0001\u0000\u0000\u0000\u0096"+ + "\u035a\u0001\u0000\u0000\u0000\u0098\u035c\u0001\u0000\u0000\u0000\u009a"+ + "\u035f\u0001\u0000\u0000\u0000\u009c\u0361\u0001\u0000\u0000\u0000\u009e"+ + "\u0363\u0001\u0000\u0000\u0000\u00a0\u0365\u0001\u0000\u0000\u0000\u00a2"+ + "\u0367\u0001\u0000\u0000\u0000\u00a4\u0369\u0001\u0000\u0000\u0000\u00a6"+ + "\u037f\u0001\u0000\u0000\u0000\u00a8\u0381\u0001\u0000\u0000\u0000\u00aa"+ + "\u0386\u0001\u0000\u0000\u0000\u00ac\u039b\u0001\u0000\u0000\u0000\u00ae"+ + "\u039d\u0001\u0000\u0000\u0000\u00b0\u03a5\u0001\u0000\u0000\u0000\u00b2"+ + "\u03a7\u0001\u0000\u0000\u0000\u00b4\u03ab\u0001\u0000\u0000\u0000\u00b6"+ + "\u03af\u0001\u0000\u0000\u0000\u00b8\u03b3\u0001\u0000\u0000\u0000\u00ba"+ + "\u03b8\u0001\u0000\u0000\u0000\u00bc\u03bd\u0001\u0000\u0000\u0000\u00be"+ + "\u03c1\u0001\u0000\u0000\u0000\u00c0\u03c5\u0001\u0000\u0000\u0000\u00c2"+ + "\u03c9\u0001\u0000\u0000\u0000\u00c4\u03ce\u0001\u0000\u0000\u0000\u00c6"+ + "\u03d2\u0001\u0000\u0000\u0000\u00c8\u03d6\u0001\u0000\u0000\u0000\u00ca"+ + "\u03da\u0001\u0000\u0000\u0000\u00cc\u03de\u0001\u0000\u0000\u0000\u00ce"+ + "\u03e2\u0001\u0000\u0000\u0000\u00d0\u03ee\u0001\u0000\u0000\u0000\u00d2"+ + "\u03f1\u0001\u0000\u0000\u0000\u00d4\u03f5\u0001\u0000\u0000\u0000\u00d6"+ + "\u03f9\u0001\u0000\u0000\u0000\u00d8\u03fd\u0001\u0000\u0000\u0000\u00da"+ + "\u0401\u0001\u0000\u0000\u0000\u00dc\u0405\u0001\u0000\u0000\u0000\u00de"+ + "\u0409\u0001\u0000\u0000\u0000\u00e0\u040e\u0001\u0000\u0000\u0000\u00e2"+ + "\u0412\u0001\u0000\u0000\u0000\u00e4\u041a\u0001\u0000\u0000\u0000\u00e6"+ + "\u042f\u0001\u0000\u0000\u0000\u00e8\u0433\u0001\u0000\u0000\u0000\u00ea"+ + "\u0437\u0001\u0000\u0000\u0000\u00ec\u043b\u0001\u0000\u0000\u0000\u00ee"+ + "\u043f\u0001\u0000\u0000\u0000\u00f0\u0443\u0001\u0000\u0000\u0000\u00f2"+ + "\u0448\u0001\u0000\u0000\u0000\u00f4\u044c\u0001\u0000\u0000\u0000\u00f6"+ + "\u0450\u0001\u0000\u0000\u0000\u00f8\u0454\u0001\u0000\u0000\u0000\u00fa"+ + "\u0457\u0001\u0000\u0000\u0000\u00fc\u045b\u0001\u0000\u0000\u0000\u00fe"+ + "\u045f\u0001\u0000\u0000\u0000\u0100\u0463\u0001\u0000\u0000\u0000\u0102"+ + "\u0467\u0001\u0000\u0000\u0000\u0104\u046c\u0001\u0000\u0000\u0000\u0106"+ + "\u0471\u0001\u0000\u0000\u0000\u0108\u0476\u0001\u0000\u0000\u0000\u010a"+ + "\u047d\u0001\u0000\u0000\u0000\u010c\u0486\u0001\u0000\u0000\u0000\u010e"+ + "\u048d\u0001\u0000\u0000\u0000\u0110\u0491\u0001\u0000\u0000\u0000\u0112"+ + "\u0495\u0001\u0000\u0000\u0000\u0114\u0499\u0001\u0000\u0000\u0000\u0116"+ + "\u049d\u0001\u0000\u0000\u0000\u0118\u04a3\u0001\u0000\u0000\u0000\u011a"+ + "\u04a7\u0001\u0000\u0000\u0000\u011c\u04ab\u0001\u0000\u0000\u0000\u011e"+ + "\u04af\u0001\u0000\u0000\u0000\u0120\u04b3\u0001\u0000\u0000\u0000\u0122"+ + "\u04b7\u0001\u0000\u0000\u0000\u0124\u04bb\u0001\u0000\u0000\u0000\u0126"+ + "\u04bf\u0001\u0000\u0000\u0000\u0128\u04c3\u0001\u0000\u0000\u0000\u012a"+ + "\u04c7\u0001\u0000\u0000\u0000\u012c\u04cc\u0001\u0000\u0000\u0000\u012e"+ + "\u04d0\u0001\u0000\u0000\u0000\u0130\u04d4\u0001\u0000\u0000\u0000\u0132"+ + "\u04d8\u0001\u0000\u0000\u0000\u0134\u04dc\u0001\u0000\u0000\u0000\u0136"+ + "\u04e0\u0001\u0000\u0000\u0000\u0138\u04e4\u0001\u0000\u0000\u0000\u013a"+ + "\u04e9\u0001\u0000\u0000\u0000\u013c\u04ee\u0001\u0000\u0000\u0000\u013e"+ + "\u04f2\u0001\u0000\u0000\u0000\u0140\u04f6\u0001\u0000\u0000\u0000\u0142"+ + "\u04fa\u0001\u0000\u0000\u0000\u0144\u04ff\u0001\u0000\u0000\u0000\u0146"+ + "\u0509\u0001\u0000\u0000\u0000\u0148\u050d\u0001\u0000\u0000\u0000\u014a"+ + "\u0511\u0001\u0000\u0000\u0000\u014c\u0515\u0001\u0000\u0000\u0000\u014e"+ + "\u051a\u0001\u0000\u0000\u0000\u0150\u0521\u0001\u0000\u0000\u0000\u0152"+ + "\u0525\u0001\u0000\u0000\u0000\u0154\u0529\u0001\u0000\u0000\u0000\u0156"+ + "\u052d\u0001\u0000\u0000\u0000\u0158\u0531\u0001\u0000\u0000\u0000\u015a"+ + "\u0536\u0001\u0000\u0000\u0000\u015c\u053a\u0001\u0000\u0000\u0000\u015e"+ + "\u053e\u0001\u0000\u0000\u0000\u0160\u0542\u0001\u0000\u0000\u0000\u0162"+ + "\u0547\u0001\u0000\u0000\u0000\u0164\u054b\u0001\u0000\u0000\u0000\u0166"+ + "\u054f\u0001\u0000\u0000\u0000\u0168\u0553\u0001\u0000\u0000\u0000\u016a"+ + "\u0557\u0001\u0000\u0000\u0000\u016c\u055b\u0001\u0000\u0000\u0000\u016e"+ + "\u0561\u0001\u0000\u0000\u0000\u0170\u0565\u0001\u0000\u0000\u0000\u0172"+ + "\u0569\u0001\u0000\u0000\u0000\u0174\u056d\u0001\u0000\u0000\u0000\u0176"+ + "\u0571\u0001\u0000\u0000\u0000\u0178\u0575\u0001\u0000\u0000\u0000\u017a"+ + "\u0579\u0001\u0000\u0000\u0000\u017c\u057e\u0001\u0000\u0000\u0000\u017e"+ + "\u0584\u0001\u0000\u0000\u0000\u0180\u058a\u0001\u0000\u0000\u0000\u0182"+ + "\u058e\u0001\u0000\u0000\u0000\u0184\u0592\u0001\u0000\u0000\u0000\u0186"+ + "\u0596\u0001\u0000\u0000\u0000\u0188\u059c\u0001\u0000\u0000\u0000\u018a"+ + "\u05a2\u0001\u0000\u0000\u0000\u018c\u05a6\u0001\u0000\u0000\u0000\u018e"+ + "\u05aa\u0001\u0000\u0000\u0000\u0190\u05ae\u0001\u0000\u0000\u0000\u0192"+ + "\u05b4\u0001\u0000\u0000\u0000\u0194\u05ba\u0001\u0000\u0000\u0000\u0196"+ + "\u05c0\u0001\u0000\u0000\u0000\u0198\u0199\u0007\u0000\u0000\u0000\u0199"+ + "\u019a\u0007\u0001\u0000\u0000\u019a\u019b\u0007\u0002\u0000\u0000\u019b"+ + "\u019c\u0007\u0002\u0000\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d"+ + "\u019e\u0007\u0004\u0000\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f"+ + "\u01a0\u0001\u0000\u0000\u0000\u01a0\u01a1\u0006\u0000\u0000\u0000\u01a1"+ + "\u0011\u0001\u0000\u0000\u0000\u01a2\u01a3\u0007\u0000\u0000\u0000\u01a3"+ + "\u01a4\u0007\u0006\u0000\u0000\u01a4\u01a5\u0007\u0007\u0000\u0000\u01a5"+ + "\u01a6\u0007\b\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a8"+ + "\u0006\u0001\u0001\u0000\u01a8\u0013\u0001\u0000\u0000\u0000\u01a9\u01aa"+ + "\u0007\u0003\u0000\u0000\u01aa\u01ab\u0007\t\u0000\u0000\u01ab\u01ac\u0007"+ + "\u0006\u0000\u0000\u01ac\u01ad\u0007\u0001\u0000\u0000\u01ad\u01ae\u0007"+ + "\u0004\u0000\u0000\u01ae\u01af\u0007\n\u0000\u0000\u01af\u01b0\u0001\u0000"+ + "\u0000\u0000\u01b0\u01b1\u0006\u0002\u0002\u0000\u01b1\u0015\u0001\u0000"+ + "\u0000\u0000\u01b2\u01b3\u0007\u0003\u0000\u0000\u01b3\u01b4\u0007\u000b"+ + "\u0000\u0000\u01b4\u01b5\u0007\f\u0000\u0000\u01b5\u01b6\u0007\r\u0000"+ + "\u0000\u01b6\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b8\u0006\u0003\u0000"+ + "\u0000\u01b8\u0017\u0001\u0000\u0000\u0000\u01b9\u01ba\u0007\u0003\u0000"+ + "\u0000\u01ba\u01bb\u0007\u000e\u0000\u0000\u01bb\u01bc\u0007\b\u0000\u0000"+ + "\u01bc\u01bd\u0007\r\u0000\u0000\u01bd\u01be\u0007\f\u0000\u0000\u01be"+ + "\u01bf\u0007\u0001\u0000\u0000\u01bf\u01c0\u0007\t\u0000\u0000\u01c0\u01c1"+ + "\u0001\u0000\u0000\u0000\u01c1\u01c2\u0006\u0004\u0003\u0000\u01c2\u0019"+ + "\u0001\u0000\u0000\u0000\u01c3\u01c4\u0007\u000f\u0000\u0000\u01c4\u01c5"+ + "\u0007\u0006\u0000\u0000\u01c5\u01c6\u0007\u0007\u0000\u0000\u01c6\u01c7"+ + "\u0007\u0010\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9"+ + "\u0006\u0005\u0004\u0000\u01c9\u001b\u0001\u0000\u0000\u0000\u01ca\u01cb"+ + "\u0007\u0011\u0000\u0000\u01cb\u01cc\u0007\u0006\u0000\u0000\u01cc\u01cd"+ + "\u0007\u0007\u0000\u0000\u01cd\u01ce\u0007\u0012\u0000\u0000\u01ce\u01cf"+ + "\u0001\u0000\u0000\u0000\u01cf\u01d0\u0006\u0006\u0000\u0000\u01d0\u001d"+ + "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0007\u0012\u0000\u0000\u01d2\u01d3"+ + "\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5"+ + "\u0007\b\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006"+ + "\u0007\u0001\u0000\u01d7\u001f\u0001\u0000\u0000\u0000\u01d8\u01d9\u0007"+ + "\r\u0000\u0000\u01d9\u01da\u0007\u0001\u0000\u0000\u01da\u01db\u0007\u0010"+ + "\u0000\u0000\u01db\u01dc\u0007\u0001\u0000\u0000\u01dc\u01dd\u0007\u0005"+ + "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01df\u0006\b\u0000"+ + "\u0000\u01df!\u0001\u0000\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000"+ + "\u01e1\u01e2\u0007\u0003\u0000\u0000\u01e2\u01e3\u0007\u0005\u0000\u0000"+ + "\u01e3\u01e4\u0007\f\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5"+ + "\u01e6\u0006\t\u0005\u0000\u01e6#\u0001\u0000\u0000\u0000\u01e7\u01e8"+ + "\u0007\u0010\u0000\u0000\u01e8\u01e9\u0007\u000b\u0000\u0000\u01e9\u01ea"+ + "\u0005_\u0000\u0000\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007"+ + "\u000e\u0000\u0000\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\f"+ + "\u0000\u0000\u01ee\u01ef\u0007\t\u0000\u0000\u01ef\u01f0\u0007\u0000\u0000"+ + "\u0000\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\n\u0006\u0000"+ + "\u01f2%\u0001\u0000\u0000\u0000\u01f3\u01f4\u0007\u0006\u0000\u0000\u01f4"+ + "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\t\u0000\u0000\u01f6\u01f7"+ + "\u0007\f\u0000\u0000\u01f7\u01f8\u0007\u0010\u0000\u0000\u01f8\u01f9\u0007"+ + "\u0003\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006"+ + "\u000b\u0007\u0000\u01fb\'\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0006"+ + "\u0000\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007\u0013"+ + "\u0000\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\f\u0000"+ + "\u0000\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0002\u0000\u0000"+ + "\u0203\u0204\u0007\n\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205"+ + "\u0206\u0007\u0013\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207"+ + "\u0208\u0006\r\b\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0007"+ + "\u0002\u0000\u0000\u020a\u020b\u0007\u0007\u0000\u0000\u020b\u020c\u0007"+ + "\u0006\u0000\u0000\u020c\u020d\u0007\u0005\u0000\u0000\u020d\u020e\u0001"+ + "\u0000\u0000\u0000\u020e\u020f\u0006\u000e\u0000\u0000\u020f-\u0001\u0000"+ + "\u0000\u0000\u0210\u0211\u0007\u0002\u0000\u0000\u0211\u0212\u0007\u0005"+ + "\u0000\u0000\u0212\u0213\u0007\f\u0000\u0000\u0213\u0214\u0007\u0005\u0000"+ + "\u0000\u0214\u0215\u0007\u0002\u0000\u0000\u0215\u0216\u0001\u0000\u0000"+ + "\u0000\u0216\u0217\u0006\u000f\u0000\u0000\u0217/\u0001\u0000\u0000\u0000"+ + "\u0218\u0219\u0007\u0013\u0000\u0000\u0219\u021a\u0007\n\u0000\u0000\u021a"+ + "\u021b\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u0006\u0000\u0000\u021c"+ + "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e"+ + "\u021f\u0006\u0010\u0000\u0000\u021f1\u0001\u0000\u0000\u0000\u0220\u0221"+ + "\u0004\u0011\u0000\u0000\u0221\u0222\u0007\u0001\u0000\u0000\u0222\u0223"+ + "\u0007\t\u0000\u0000\u0223\u0224\u0007\r\u0000\u0000\u0224\u0225\u0007"+ + "\u0001\u0000\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0003"+ + "\u0000\u0000\u0227\u0228\u0007\u0002\u0000\u0000\u0228\u0229\u0007\u0005"+ + "\u0000\u0000\u0229\u022a\u0007\f\u0000\u0000\u022a\u022b\u0007\u0005\u0000"+ + "\u0000\u022b\u022c\u0007\u0002\u0000\u0000\u022c\u022d\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0006\u0011\u0000\u0000\u022e3\u0001\u0000\u0000\u0000"+ + "\u022f\u0230\u0004\u0012\u0001\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231"+ + "\u0232\u0007\u0007\u0000\u0000\u0232\u0233\u0007\u0007\u0000\u0000\u0233"+ + "\u0234\u0007\u0012\u0000\u0000\u0234\u0235\u0007\u0014\u0000\u0000\u0235"+ + "\u0236\u0007\b\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238"+ + "\u0006\u0012\t\u0000\u02385\u0001\u0000\u0000\u0000\u0239\u023a\u0004"+ + "\u0013\u0002\u0000\u023a\u023b\u0007\u0010\u0000\u0000\u023b\u023c\u0007"+ + "\f\u0000\u0000\u023c\u023d\u0007\u0005\u0000\u0000\u023d\u023e\u0007\u0004"+ + "\u0000\u0000\u023e\u023f\u0007\n\u0000\u0000\u023f\u0240\u0007\u0002\u0000"+ + "\u0000\u0240\u0241\u0007\u0005\u0000\u0000\u0241\u0242\u0007\u0006\u0000"+ + "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0244\u0006\u0013\u0000"+ + "\u0000\u02447\u0001\u0000\u0000\u0000\u0245\u0246\u0004\u0014\u0003\u0000"+ + "\u0246\u0247\u0007\u0010\u0000\u0000\u0247\u0248\u0007\u0003\u0000\u0000"+ + "\u0248\u0249\u0007\u0005\u0000\u0000\u0249\u024a\u0007\u0006\u0000\u0000"+ + "\u024a\u024b\u0007\u0001\u0000\u0000\u024b\u024c\u0007\u0004\u0000\u0000"+ + "\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000"+ + "\u024e\u024f\u0006\u0014\n\u0000\u024f9\u0001\u0000\u0000\u0000\u0250"+ + "\u0252\b\u0015\u0000\u0000\u0251\u0250\u0001\u0000\u0000\u0000\u0252\u0253"+ + "\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254"+ + "\u0001\u0000\u0000\u0000\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0256"+ + "\u0006\u0015\u0000\u0000\u0256;\u0001\u0000\u0000\u0000\u0257\u0258\u0005"+ + "/\u0000\u0000\u0258\u0259\u0005/\u0000\u0000\u0259\u025d\u0001\u0000\u0000"+ + "\u0000\u025a\u025c\b\u0016\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ + "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ + "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0261\u0001\u0000\u0000\u0000"+ + "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0005\r\u0000\u0000\u0261"+ + "\u0260\u0001\u0000\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000\u0262"+ + "\u0264\u0001\u0000\u0000\u0000\u0263\u0265\u0005\n\u0000\u0000\u0264\u0263"+ + "\u0001\u0000\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266"+ + "\u0001\u0000\u0000\u0000\u0266\u0267\u0006\u0016\u000b\u0000\u0267=\u0001"+ + "\u0000\u0000\u0000\u0268\u0269\u0005/\u0000\u0000\u0269\u026a\u0005*\u0000"+ + "\u0000\u026a\u026f\u0001\u0000\u0000\u0000\u026b\u026e\u0003>\u0017\u0000"+ + "\u026c\u026e\t\u0000\u0000\u0000\u026d\u026b\u0001\u0000\u0000\u0000\u026d"+ + "\u026c\u0001\u0000\u0000\u0000\u026e\u0271\u0001\u0000\u0000\u0000\u026f"+ + "\u0270\u0001\u0000\u0000\u0000\u026f\u026d\u0001\u0000\u0000\u0000\u0270"+ + "\u0272\u0001\u0000\u0000\u0000\u0271\u026f\u0001\u0000\u0000\u0000\u0272"+ + "\u0273\u0005*\u0000\u0000\u0273\u0274\u0005/\u0000\u0000\u0274\u0275\u0001"+ + "\u0000\u0000\u0000\u0275\u0276\u0006\u0017\u000b\u0000\u0276?\u0001\u0000"+ + "\u0000\u0000\u0277\u0279\u0007\u0017\u0000\u0000\u0278\u0277\u0001\u0000"+ + "\u0000\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a\u0278\u0001\u0000"+ + "\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000\u027b\u027c\u0001\u0000"+ + "\u0000\u0000\u027c\u027d\u0006\u0018\u000b\u0000\u027dA\u0001\u0000\u0000"+ + "\u0000\u027e\u027f\u0005|\u0000\u0000\u027f\u0280\u0001\u0000\u0000\u0000"+ + "\u0280\u0281\u0006\u0019\f\u0000\u0281C\u0001\u0000\u0000\u0000\u0282"+ + "\u0283\u0007\u0018\u0000\u0000\u0283E\u0001\u0000\u0000\u0000\u0284\u0285"+ + "\u0007\u0019\u0000\u0000\u0285G\u0001\u0000\u0000\u0000\u0286\u0287\u0005"+ + "\\\u0000\u0000\u0287\u0288\u0007\u001a\u0000\u0000\u0288I\u0001\u0000"+ + "\u0000\u0000\u0289\u028a\b\u001b\u0000\u0000\u028aK\u0001\u0000\u0000"+ + "\u0000\u028b\u028d\u0007\u0003\u0000\u0000\u028c\u028e\u0007\u001c\u0000"+ + "\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028d\u028e\u0001\u0000\u0000"+ + "\u0000\u028e\u0290\u0001\u0000\u0000\u0000\u028f\u0291\u0003D\u001a\u0000"+ + "\u0290\u028f\u0001\u0000\u0000\u0000\u0291\u0292\u0001\u0000\u0000\u0000"+ + "\u0292\u0290\u0001\u0000\u0000\u0000\u0292\u0293\u0001\u0000\u0000\u0000"+ + "\u0293M\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295O"+ + "\u0001\u0000\u0000\u0000\u0296\u0297\u0005`\u0000\u0000\u0297Q\u0001\u0000"+ + "\u0000\u0000\u0298\u029c\b\u001d\u0000\u0000\u0299\u029a\u0005`\u0000"+ + "\u0000\u029a\u029c\u0005`\u0000\u0000\u029b\u0298\u0001\u0000\u0000\u0000"+ + "\u029b\u0299\u0001\u0000\u0000\u0000\u029cS\u0001\u0000\u0000\u0000\u029d"+ + "\u029e\u0005_\u0000\u0000\u029eU\u0001\u0000\u0000\u0000\u029f\u02a3\u0003"+ + "F\u001b\u0000\u02a0\u02a3\u0003D\u001a\u0000\u02a1\u02a3\u0003T\"\u0000"+ + "\u02a2\u029f\u0001\u0000\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000"+ + "\u02a2\u02a1\u0001\u0000\u0000\u0000\u02a3W\u0001\u0000\u0000\u0000\u02a4"+ + "\u02a9\u0005\"\u0000\u0000\u02a5\u02a8\u0003H\u001c\u0000\u02a6\u02a8"+ + "\u0003J\u001d\u0000\u02a7\u02a5\u0001\u0000\u0000\u0000\u02a7\u02a6\u0001"+ + "\u0000\u0000\u0000\u02a8\u02ab\u0001\u0000\u0000\u0000\u02a9\u02a7\u0001"+ + "\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u02ac\u0001"+ + "\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ac\u02c2\u0005"+ + "\"\u0000\u0000\u02ad\u02ae\u0005\"\u0000\u0000\u02ae\u02af\u0005\"\u0000"+ + "\u0000\u02af\u02b0\u0005\"\u0000\u0000\u02b0\u02b4\u0001\u0000\u0000\u0000"+ + "\u02b1\u02b3\b\u0016\u0000\u0000\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3"+ + "\u02b6\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001\u0000\u0000\u0000\u02b4"+ + "\u02b2\u0001\u0000\u0000\u0000\u02b5\u02b7\u0001\u0000\u0000\u0000\u02b6"+ + "\u02b4\u0001\u0000\u0000\u0000\u02b7\u02b8\u0005\"\u0000\u0000\u02b8\u02b9"+ + "\u0005\"\u0000\u0000\u02b9\u02ba\u0005\"\u0000\u0000\u02ba\u02bc\u0001"+ + "\u0000\u0000\u0000\u02bb\u02bd\u0005\"\u0000\u0000\u02bc\u02bb\u0001\u0000"+ + "\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u02bf\u0001\u0000"+ + "\u0000\u0000\u02be\u02c0\u0005\"\u0000\u0000\u02bf\u02be\u0001\u0000\u0000"+ + "\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c2\u0001\u0000\u0000"+ + "\u0000\u02c1\u02a4\u0001\u0000\u0000\u0000\u02c1\u02ad\u0001\u0000\u0000"+ + "\u0000\u02c2Y\u0001\u0000\u0000\u0000\u02c3\u02c5\u0003D\u001a\u0000\u02c4"+ + "\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000\u0000\u02c6"+ + "\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7"+ + "[\u0001\u0000\u0000\u0000\u02c8\u02ca\u0003D\u001a\u0000\u02c9\u02c8\u0001"+ + "\u0000\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02c9\u0001"+ + "\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001"+ + "\u0000\u0000\u0000\u02cd\u02d1\u0003l.\u0000\u02ce\u02d0\u0003D\u001a"+ + "\u0000\u02cf\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d3\u0001\u0000\u0000"+ + "\u0000\u02d1\u02cf\u0001\u0000\u0000\u0000\u02d1\u02d2\u0001\u0000\u0000"+ + "\u0000\u02d2\u02f3\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000"+ + "\u0000\u02d4\u02d6\u0003l.\u0000\u02d5\u02d7\u0003D\u001a\u0000\u02d6"+ + "\u02d5\u0001\u0000\u0000\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8"+ + "\u02d6\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9"+ + "\u02f3\u0001\u0000\u0000\u0000\u02da\u02dc\u0003D\u001a\u0000\u02db\u02da"+ + "\u0001\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02db"+ + "\u0001\u0000\u0000\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02e6"+ + "\u0001\u0000\u0000\u0000\u02df\u02e3\u0003l.\u0000\u02e0\u02e2\u0003D"+ + "\u001a\u0000\u02e1\u02e0\u0001\u0000\u0000\u0000\u02e2\u02e5\u0001\u0000"+ + "\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000"+ + "\u0000\u0000\u02e4\u02e7\u0001\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000"+ + "\u0000\u0000\u02e6\u02df\u0001\u0000\u0000\u0000\u02e6\u02e7\u0001\u0000"+ + "\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e8\u02e9\u0003L\u001e"+ + "\u0000\u02e9\u02f3\u0001\u0000\u0000\u0000\u02ea\u02ec\u0003l.\u0000\u02eb"+ + "\u02ed\u0003D\u001a\u0000\u02ec\u02eb\u0001\u0000\u0000\u0000\u02ed\u02ee"+ + "\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02ee\u02ef"+ + "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1"+ + "\u0003L\u001e\u0000\u02f1\u02f3\u0001\u0000\u0000\u0000\u02f2\u02c9\u0001"+ + "\u0000\u0000\u0000\u02f2\u02d4\u0001\u0000\u0000\u0000\u02f2\u02db\u0001"+ + "\u0000\u0000\u0000\u02f2\u02ea\u0001\u0000\u0000\u0000\u02f3]\u0001\u0000"+ + "\u0000\u0000\u02f4\u02f5\u0007\u001e\u0000\u0000\u02f5\u02f6\u0007\u001f"+ + "\u0000\u0000\u02f6_\u0001\u0000\u0000\u0000\u02f7\u02f8\u0007\f\u0000"+ + "\u0000\u02f8\u02f9\u0007\t\u0000\u0000\u02f9\u02fa\u0007\u0000\u0000\u0000"+ + "\u02faa\u0001\u0000\u0000\u0000\u02fb\u02fc\u0007\f\u0000\u0000\u02fc"+ + "\u02fd\u0007\u0002\u0000\u0000\u02fd\u02fe\u0007\u0004\u0000\u0000\u02fe"+ + "c\u0001\u0000\u0000\u0000\u02ff\u0300\u0005=\u0000\u0000\u0300e\u0001"+ + "\u0000\u0000\u0000\u0301\u0302\u0005:\u0000\u0000\u0302\u0303\u0005:\u0000"+ + "\u0000\u0303g\u0001\u0000\u0000\u0000\u0304\u0305\u0005,\u0000\u0000\u0305"+ + "i\u0001\u0000\u0000\u0000\u0306\u0307\u0007\u0000\u0000\u0000\u0307\u0308"+ + "\u0007\u0003\u0000\u0000\u0308\u0309\u0007\u0002\u0000\u0000\u0309\u030a"+ + "\u0007\u0004\u0000\u0000\u030ak\u0001\u0000\u0000\u0000\u030b\u030c\u0005"+ + ".\u0000\u0000\u030cm\u0001\u0000\u0000\u0000\u030d\u030e\u0007\u000f\u0000"+ + "\u0000\u030e\u030f\u0007\f\u0000\u0000\u030f\u0310\u0007\r\u0000\u0000"+ + "\u0310\u0311\u0007\u0002\u0000\u0000\u0311\u0312\u0007\u0003\u0000\u0000"+ + "\u0312o\u0001\u0000\u0000\u0000\u0313\u0314\u0007\u000f\u0000\u0000\u0314"+ + "\u0315\u0007\u0001\u0000\u0000\u0315\u0316\u0007\u0006\u0000\u0000\u0316"+ + "\u0317\u0007\u0002\u0000\u0000\u0317\u0318\u0007\u0005\u0000\u0000\u0318"+ + "q\u0001\u0000\u0000\u0000\u0319\u031a\u0007\u0001\u0000\u0000\u031a\u031b"+ + "\u0007\t\u0000\u0000\u031bs\u0001\u0000\u0000\u0000\u031c\u031d\u0007"+ + "\u0001\u0000\u0000\u031d\u031e\u0007\u0002\u0000\u0000\u031eu\u0001\u0000"+ + "\u0000\u0000\u031f\u0320\u0007\r\u0000\u0000\u0320\u0321\u0007\f\u0000"+ + "\u0000\u0321\u0322\u0007\u0002\u0000\u0000\u0322\u0323\u0007\u0005\u0000"+ + "\u0000\u0323w\u0001\u0000\u0000\u0000\u0324\u0325\u0007\r\u0000\u0000"+ + "\u0325\u0326\u0007\u0001\u0000\u0000\u0326\u0327\u0007\u0012\u0000\u0000"+ + "\u0327\u0328\u0007\u0003\u0000\u0000\u0328y\u0001\u0000\u0000\u0000\u0329"+ + "\u032a\u0005(\u0000\u0000\u032a{\u0001\u0000\u0000\u0000\u032b\u032c\u0007"+ + "\t\u0000\u0000\u032c\u032d\u0007\u0007\u0000\u0000\u032d\u032e\u0007\u0005"+ + "\u0000\u0000\u032e}\u0001\u0000\u0000\u0000\u032f\u0330\u0007\t\u0000"+ + "\u0000\u0330\u0331\u0007\u0014\u0000\u0000\u0331\u0332\u0007\r\u0000\u0000"+ + "\u0332\u0333\u0007\r\u0000\u0000\u0333\u007f\u0001\u0000\u0000\u0000\u0334"+ + "\u0335\u0007\t\u0000\u0000\u0335\u0336\u0007\u0014\u0000\u0000\u0336\u0337"+ + "\u0007\r\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007"+ + "\u0002\u0000\u0000\u0339\u0081\u0001\u0000\u0000\u0000\u033a\u033b\u0007"+ + "\u0007\u0000\u0000\u033b\u033c\u0007\u0006\u0000\u0000\u033c\u0083\u0001"+ + "\u0000\u0000\u0000\u033d\u033e\u0005?\u0000\u0000\u033e\u0085\u0001\u0000"+ + "\u0000\u0000\u033f\u0340\u0007\u0006\u0000\u0000\u0340\u0341\u0007\r\u0000"+ + "\u0000\u0341\u0342\u0007\u0001\u0000\u0000\u0342\u0343\u0007\u0012\u0000"+ + "\u0000\u0343\u0344\u0007\u0003\u0000\u0000\u0344\u0087\u0001\u0000\u0000"+ + "\u0000\u0345\u0346\u0005)\u0000\u0000\u0346\u0089\u0001\u0000\u0000\u0000"+ + "\u0347\u0348\u0007\u0005\u0000\u0000\u0348\u0349\u0007\u0006\u0000\u0000"+ + "\u0349\u034a\u0007\u0014\u0000\u0000\u034a\u034b\u0007\u0003\u0000\u0000"+ + "\u034b\u008b\u0001\u0000\u0000\u0000\u034c\u034d\u0005=\u0000\u0000\u034d"+ + "\u034e\u0005=\u0000\u0000\u034e\u008d\u0001\u0000\u0000\u0000\u034f\u0350"+ + "\u0005=\u0000\u0000\u0350\u0351\u0005~\u0000\u0000\u0351\u008f\u0001\u0000"+ + "\u0000\u0000\u0352\u0353\u0005!\u0000\u0000\u0353\u0354\u0005=\u0000\u0000"+ + "\u0354\u0091\u0001\u0000\u0000\u0000\u0355\u0356\u0005<\u0000\u0000\u0356"+ + "\u0093\u0001\u0000\u0000\u0000\u0357\u0358\u0005<\u0000\u0000\u0358\u0359"+ + "\u0005=\u0000\u0000\u0359\u0095\u0001\u0000\u0000\u0000\u035a\u035b\u0005"+ + ">\u0000\u0000\u035b\u0097\u0001\u0000\u0000\u0000\u035c\u035d\u0005>\u0000"+ + "\u0000\u035d\u035e\u0005=\u0000\u0000\u035e\u0099\u0001\u0000\u0000\u0000"+ + "\u035f\u0360\u0005+\u0000\u0000\u0360\u009b\u0001\u0000\u0000\u0000\u0361"+ + "\u0362\u0005-\u0000\u0000\u0362\u009d\u0001\u0000\u0000\u0000\u0363\u0364"+ + "\u0005*\u0000\u0000\u0364\u009f\u0001\u0000\u0000\u0000\u0365\u0366\u0005"+ + "/\u0000\u0000\u0366\u00a1\u0001\u0000\u0000\u0000\u0367\u0368\u0005%\u0000"+ + "\u0000\u0368\u00a3\u0001\u0000\u0000\u0000\u0369\u036a\u0004J\u0004\u0000"+ + "\u036a\u036b\u00036\u0013\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c"+ + "\u036d\u0006J\r\u0000\u036d\u00a5\u0001\u0000\u0000\u0000\u036e\u0371"+ + "\u0003\u0084:\u0000\u036f\u0372\u0003F\u001b\u0000\u0370\u0372\u0003T"+ + "\"\u0000\u0371\u036f\u0001\u0000\u0000\u0000\u0371\u0370\u0001\u0000\u0000"+ + "\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373\u0375\u0003V#\u0000\u0374"+ + "\u0373\u0001\u0000\u0000\u0000\u0375\u0378\u0001\u0000\u0000\u0000\u0376"+ + "\u0374\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ + "\u0380\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0379"+ + "\u037b\u0003\u0084:\u0000\u037a\u037c\u0003D\u001a\u0000\u037b\u037a\u0001"+ + "\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d\u037b\u0001"+ + "\u0000\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u0380\u0001"+ + "\u0000\u0000\u0000\u037f\u036e\u0001\u0000\u0000\u0000\u037f\u0379\u0001"+ + "\u0000\u0000\u0000\u0380\u00a7\u0001\u0000\u0000\u0000\u0381\u0382\u0005"+ + "[\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383\u0384\u0006L\u0000"+ + "\u0000\u0384\u0385\u0006L\u0000\u0000\u0385\u00a9\u0001\u0000\u0000\u0000"+ + "\u0386\u0387\u0005]\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000\u0388"+ + "\u0389\u0006M\f\u0000\u0389\u038a\u0006M\f\u0000\u038a\u00ab\u0001\u0000"+ + "\u0000\u0000\u038b\u038f\u0003F\u001b\u0000\u038c\u038e\u0003V#\u0000"+ + "\u038d\u038c\u0001\u0000\u0000\u0000\u038e\u0391\u0001\u0000\u0000\u0000"+ + "\u038f\u038d\u0001\u0000\u0000\u0000\u038f\u0390\u0001\u0000\u0000\u0000"+ + "\u0390\u039c\u0001\u0000\u0000\u0000\u0391\u038f\u0001\u0000\u0000\u0000"+ + "\u0392\u0395\u0003T\"\u0000\u0393\u0395\u0003N\u001f\u0000\u0394\u0392"+ + "\u0001\u0000\u0000\u0000\u0394\u0393\u0001\u0000\u0000\u0000\u0395\u0397"+ + "\u0001\u0000\u0000\u0000\u0396\u0398\u0003V#\u0000\u0397\u0396\u0001\u0000"+ + "\u0000\u0000\u0398\u0399\u0001\u0000\u0000\u0000\u0399\u0397\u0001\u0000"+ + "\u0000\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u039c\u0001\u0000"+ + "\u0000\u0000\u039b\u038b\u0001\u0000\u0000\u0000\u039b\u0394\u0001\u0000"+ + "\u0000\u0000\u039c\u00ad\u0001\u0000\u0000\u0000\u039d\u039f\u0003P \u0000"+ + "\u039e\u03a0\u0003R!\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u03a0\u03a1"+ + "\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000\u0000\u03a1\u03a2"+ + "\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4"+ + "\u0003P \u0000\u03a4\u00af\u0001\u0000\u0000\u0000\u03a5\u03a6\u0003\u00ae"+ + "O\u0000\u03a6\u00b1\u0001\u0000\u0000\u0000\u03a7\u03a8\u0003<\u0016\u0000"+ + "\u03a8\u03a9\u0001\u0000\u0000\u0000\u03a9\u03aa\u0006Q\u000b\u0000\u03aa"+ + "\u00b3\u0001\u0000\u0000\u0000\u03ab\u03ac\u0003>\u0017\u0000\u03ac\u03ad"+ + "\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006R\u000b\u0000\u03ae\u00b5\u0001"+ + "\u0000\u0000\u0000\u03af\u03b0\u0003@\u0018\u0000\u03b0\u03b1\u0001\u0000"+ + "\u0000\u0000\u03b1\u03b2\u0006S\u000b\u0000\u03b2\u00b7\u0001\u0000\u0000"+ + "\u0000\u03b3\u03b4\u0003\u00a8L\u0000\u03b4\u03b5\u0001\u0000\u0000\u0000"+ + "\u03b5\u03b6\u0006T\u000e\u0000\u03b6\u03b7\u0006T\u000f\u0000\u03b7\u00b9"+ + "\u0001\u0000\u0000\u0000\u03b8\u03b9\u0003B\u0019\u0000\u03b9\u03ba\u0001"+ + "\u0000\u0000\u0000\u03ba\u03bb\u0006U\u0010\u0000\u03bb\u03bc\u0006U\f"+ + "\u0000\u03bc\u00bb\u0001\u0000\u0000\u0000\u03bd\u03be\u0003@\u0018\u0000"+ + "\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0006V\u000b\u0000\u03c0"+ + "\u00bd\u0001\u0000\u0000\u0000\u03c1\u03c2\u0003<\u0016\u0000\u03c2\u03c3"+ + "\u0001\u0000\u0000\u0000\u03c3\u03c4\u0006W\u000b\u0000\u03c4\u00bf\u0001"+ + "\u0000\u0000\u0000\u03c5\u03c6\u0003>\u0017\u0000\u03c6\u03c7\u0001\u0000"+ + "\u0000\u0000\u03c7\u03c8\u0006X\u000b\u0000\u03c8\u00c1\u0001\u0000\u0000"+ + "\u0000\u03c9\u03ca\u0003B\u0019\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000"+ + "\u03cb\u03cc\u0006Y\u0010\u0000\u03cc\u03cd\u0006Y\f\u0000\u03cd\u00c3"+ + "\u0001\u0000\u0000\u0000\u03ce\u03cf\u0003\u00a8L\u0000\u03cf\u03d0\u0001"+ + "\u0000\u0000\u0000\u03d0\u03d1\u0006Z\u000e\u0000\u03d1\u00c5\u0001\u0000"+ + "\u0000\u0000\u03d2\u03d3\u0003\u00aaM\u0000\u03d3\u03d4\u0001\u0000\u0000"+ + "\u0000\u03d4\u03d5\u0006[\u0011\u0000\u03d5\u00c7\u0001\u0000\u0000\u0000"+ + "\u03d6\u03d7\u0003\u014e\u009f\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000"+ + "\u03d8\u03d9\u0006\\\u0012\u0000\u03d9\u00c9\u0001\u0000\u0000\u0000\u03da"+ + "\u03db\u0003h,\u0000\u03db\u03dc\u0001\u0000\u0000\u0000\u03dc\u03dd\u0006"+ + "]\u0013\u0000\u03dd\u00cb\u0001\u0000\u0000\u0000\u03de\u03df\u0003d*"+ + "\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u0006^\u0014\u0000"+ + "\u03e1\u00cd\u0001\u0000\u0000\u0000\u03e2\u03e3\u0007\u0010\u0000\u0000"+ + "\u03e3\u03e4\u0007\u0003\u0000\u0000\u03e4\u03e5\u0007\u0005\u0000\u0000"+ + "\u03e5\u03e6\u0007\f\u0000\u0000\u03e6\u03e7\u0007\u0000\u0000\u0000\u03e7"+ + "\u03e8\u0007\f\u0000\u0000\u03e8\u03e9\u0007\u0005\u0000\u0000\u03e9\u03ea"+ + "\u0007\f\u0000\u0000\u03ea\u00cf\u0001\u0000\u0000\u0000\u03eb\u03ef\b"+ + " \u0000\u0000\u03ec\u03ed\u0005/\u0000\u0000\u03ed\u03ef\b!\u0000\u0000"+ + "\u03ee\u03eb\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000\u0000"+ + "\u03ef\u00d1\u0001\u0000\u0000\u0000\u03f0\u03f2\u0003\u00d0`\u0000\u03f1"+ + "\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3"+ + "\u03f1\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4"+ + "\u00d3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0003\u00d2a\u0000\u03f6\u03f7"+ + "\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006b\u0015\u0000\u03f8\u00d5\u0001"+ + "\u0000\u0000\u0000\u03f9\u03fa\u0003X$\u0000\u03fa\u03fb\u0001\u0000\u0000"+ + "\u0000\u03fb\u03fc\u0006c\u0016\u0000\u03fc\u00d7\u0001\u0000\u0000\u0000"+ + "\u03fd\u03fe\u0003<\u0016\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff"+ + "\u0400\u0006d\u000b\u0000\u0400\u00d9\u0001\u0000\u0000\u0000\u0401\u0402"+ + "\u0003>\u0017\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403\u0404\u0006"+ + "e\u000b\u0000\u0404\u00db\u0001\u0000\u0000\u0000\u0405\u0406\u0003@\u0018"+ + "\u0000\u0406\u0407\u0001\u0000\u0000\u0000\u0407\u0408\u0006f\u000b\u0000"+ + "\u0408\u00dd\u0001\u0000\u0000\u0000\u0409\u040a\u0003B\u0019\u0000\u040a"+ + "\u040b\u0001\u0000\u0000\u0000\u040b\u040c\u0006g\u0010\u0000\u040c\u040d"+ + "\u0006g\f\u0000\u040d\u00df\u0001\u0000\u0000\u0000\u040e\u040f\u0003"+ + "l.\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0411\u0006h\u0017"+ + "\u0000\u0411\u00e1\u0001\u0000\u0000\u0000\u0412\u0413\u0003h,\u0000\u0413"+ + "\u0414\u0001\u0000\u0000\u0000\u0414\u0415\u0006i\u0013\u0000\u0415\u00e3"+ + "\u0001\u0000\u0000\u0000\u0416\u041b\u0003F\u001b\u0000\u0417\u041b\u0003"+ + "D\u001a\u0000\u0418\u041b\u0003T\"\u0000\u0419\u041b\u0003\u009eG\u0000"+ + "\u041a\u0416\u0001\u0000\u0000\u0000\u041a\u0417\u0001\u0000\u0000\u0000"+ + "\u041a\u0418\u0001\u0000\u0000\u0000\u041a\u0419\u0001\u0000\u0000\u0000"+ + "\u041b\u00e5\u0001\u0000\u0000\u0000\u041c\u041f\u0003F\u001b\u0000\u041d"+ + "\u041f\u0003\u009eG\u0000\u041e\u041c\u0001\u0000\u0000\u0000\u041e\u041d"+ + "\u0001\u0000\u0000\u0000\u041f\u0423\u0001\u0000\u0000\u0000\u0420\u0422"+ + "\u0003\u00e4j\u0000\u0421\u0420\u0001\u0000\u0000\u0000\u0422\u0425\u0001"+ + "\u0000\u0000\u0000\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0424\u0001"+ + "\u0000\u0000\u0000\u0424\u0430\u0001\u0000\u0000\u0000\u0425\u0423\u0001"+ + "\u0000\u0000\u0000\u0426\u0429\u0003T\"\u0000\u0427\u0429\u0003N\u001f"+ + "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0427\u0001\u0000\u0000"+ + "\u0000\u0429\u042b\u0001\u0000\u0000\u0000\u042a\u042c\u0003\u00e4j\u0000"+ + "\u042b\u042a\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000\u0000"+ + "\u042d\u042b\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000"+ + "\u042e\u0430\u0001\u0000\u0000\u0000\u042f\u041e\u0001\u0000\u0000\u0000"+ + "\u042f\u0428\u0001\u0000\u0000\u0000\u0430\u00e7\u0001\u0000\u0000\u0000"+ + "\u0431\u0434\u0003\u00e6k\u0000\u0432\u0434\u0003\u00aeO\u0000\u0433\u0431"+ + "\u0001\u0000\u0000\u0000\u0433\u0432\u0001\u0000\u0000\u0000\u0434\u0435"+ + "\u0001\u0000\u0000\u0000\u0435\u0433\u0001\u0000\u0000\u0000\u0435\u0436"+ + "\u0001\u0000\u0000\u0000\u0436\u00e9\u0001\u0000\u0000\u0000\u0437\u0438"+ + "\u0003<\u0016\u0000\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0006"+ + "m\u000b\u0000\u043a\u00eb\u0001\u0000\u0000\u0000\u043b\u043c\u0003>\u0017"+ + "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0006n\u000b\u0000"+ + "\u043e\u00ed\u0001\u0000\u0000\u0000\u043f\u0440\u0003@\u0018\u0000\u0440"+ + "\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0006o\u000b\u0000\u0442\u00ef"+ + "\u0001\u0000\u0000\u0000\u0443\u0444\u0003B\u0019\u0000\u0444\u0445\u0001"+ + "\u0000\u0000\u0000\u0445\u0446\u0006p\u0010\u0000\u0446\u0447\u0006p\f"+ + "\u0000\u0447\u00f1\u0001\u0000\u0000\u0000\u0448\u0449\u0003d*\u0000\u0449"+ + "\u044a\u0001\u0000\u0000\u0000\u044a\u044b\u0006q\u0014\u0000\u044b\u00f3"+ + "\u0001\u0000\u0000\u0000\u044c\u044d\u0003h,\u0000\u044d\u044e\u0001\u0000"+ + "\u0000\u0000\u044e\u044f\u0006r\u0013\u0000\u044f\u00f5\u0001\u0000\u0000"+ + "\u0000\u0450\u0451\u0003l.\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452"+ + "\u0453\u0006s\u0017\u0000\u0453\u00f7\u0001\u0000\u0000\u0000\u0454\u0455"+ + "\u0007\f\u0000\u0000\u0455\u0456\u0007\u0002\u0000\u0000\u0456\u00f9\u0001"+ + "\u0000\u0000\u0000\u0457\u0458\u0003\u00e8l\u0000\u0458\u0459\u0001\u0000"+ + "\u0000\u0000\u0459\u045a\u0006u\u0018\u0000\u045a\u00fb\u0001\u0000\u0000"+ + "\u0000\u045b\u045c\u0003<\u0016\u0000\u045c\u045d\u0001\u0000\u0000\u0000"+ + "\u045d\u045e\u0006v\u000b\u0000\u045e\u00fd\u0001\u0000\u0000\u0000\u045f"+ + "\u0460\u0003>\u0017\u0000\u0460\u0461\u0001\u0000\u0000\u0000\u0461\u0462"+ + "\u0006w\u000b\u0000\u0462\u00ff\u0001\u0000\u0000\u0000\u0463\u0464\u0003"+ + "@\u0018\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u0466\u0006x\u000b"+ + "\u0000\u0466\u0101\u0001\u0000\u0000\u0000\u0467\u0468\u0003B\u0019\u0000"+ + "\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a\u0006y\u0010\u0000\u046a"+ + "\u046b\u0006y\f\u0000\u046b\u0103\u0001\u0000\u0000\u0000\u046c\u046d"+ + "\u0003\u00a8L\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u046f\u0006"+ + "z\u000e\u0000\u046f\u0470\u0006z\u0019\u0000\u0470\u0105\u0001\u0000\u0000"+ + "\u0000\u0471\u0472\u0007\u0007\u0000\u0000\u0472\u0473\u0007\t\u0000\u0000"+ + "\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0475\u0006{\u001a\u0000\u0475"+ + "\u0107\u0001\u0000\u0000\u0000\u0476\u0477\u0007\u0013\u0000\u0000\u0477"+ + "\u0478\u0007\u0001\u0000\u0000\u0478\u0479\u0007\u0005\u0000\u0000\u0479"+ + "\u047a\u0007\n\u0000\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047c"+ + "\u0006|\u001a\u0000\u047c\u0109\u0001\u0000\u0000\u0000\u047d\u047e\b"+ + "\"\u0000\u0000\u047e\u010b\u0001\u0000\u0000\u0000\u047f\u0481\u0003\u010a"+ + "}\u0000\u0480\u047f\u0001\u0000\u0000\u0000\u0481\u0482\u0001\u0000\u0000"+ + "\u0000\u0482\u0480\u0001\u0000\u0000\u0000\u0482\u0483\u0001\u0000\u0000"+ + "\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485\u0003\u014e\u009f"+ + "\u0000\u0485\u0487\u0001\u0000\u0000\u0000\u0486\u0480\u0001\u0000\u0000"+ + "\u0000\u0486\u0487\u0001\u0000\u0000\u0000\u0487\u0489\u0001\u0000\u0000"+ + "\u0000\u0488\u048a\u0003\u010a}\u0000\u0489\u0488\u0001\u0000\u0000\u0000"+ + "\u048a\u048b\u0001\u0000\u0000\u0000\u048b\u0489\u0001\u0000\u0000\u0000"+ + "\u048b\u048c\u0001\u0000\u0000\u0000\u048c\u010d\u0001\u0000\u0000\u0000"+ + "\u048d\u048e\u0003\u010c~\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f"+ + "\u0490\u0006\u007f\u001b\u0000\u0490\u010f\u0001\u0000\u0000\u0000\u0491"+ + "\u0492\u0003<\u0016\u0000\u0492\u0493\u0001\u0000\u0000\u0000\u0493\u0494"+ + "\u0006\u0080\u000b\u0000\u0494\u0111\u0001\u0000\u0000\u0000\u0495\u0496"+ + "\u0003>\u0017\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u0006"+ + "\u0081\u000b\u0000\u0498\u0113\u0001\u0000\u0000\u0000\u0499\u049a\u0003"+ + "@\u0018\u0000\u049a\u049b\u0001\u0000\u0000\u0000\u049b\u049c\u0006\u0082"+ + "\u000b\u0000\u049c\u0115\u0001\u0000\u0000\u0000\u049d\u049e\u0003B\u0019"+ + "\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a0\u0006\u0083\u0010"+ + "\u0000\u04a0\u04a1\u0006\u0083\f\u0000\u04a1\u04a2\u0006\u0083\f\u0000"+ + "\u04a2\u0117\u0001\u0000\u0000\u0000\u04a3\u04a4\u0003d*\u0000\u04a4\u04a5"+ + "\u0001\u0000\u0000\u0000\u04a5\u04a6\u0006\u0084\u0014\u0000\u04a6\u0119"+ + "\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003h,\u0000\u04a8\u04a9\u0001\u0000"+ + "\u0000\u0000\u04a9\u04aa\u0006\u0085\u0013\u0000\u04aa\u011b\u0001\u0000"+ + "\u0000\u0000\u04ab\u04ac\u0003l.\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000"+ + "\u04ad\u04ae\u0006\u0086\u0017\u0000\u04ae\u011d\u0001\u0000\u0000\u0000"+ + "\u04af\u04b0\u0003\u0108|\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1"+ + "\u04b2\u0006\u0087\u001c\u0000\u04b2\u011f\u0001\u0000\u0000\u0000\u04b3"+ + "\u04b4\u0003\u00e8l\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6"+ + "\u0006\u0088\u0018\u0000\u04b6\u0121\u0001\u0000\u0000\u0000\u04b7\u04b8"+ + "\u0003\u00b0P\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006"+ + "\u0089\u001d\u0000\u04ba\u0123\u0001\u0000\u0000\u0000\u04bb\u04bc\u0003"+ + "<\u0016\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0006\u008a"+ + "\u000b\u0000\u04be\u0125\u0001\u0000\u0000\u0000\u04bf\u04c0\u0003>\u0017"+ + "\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04c2\u0006\u008b\u000b"+ + "\u0000\u04c2\u0127\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003@\u0018\u0000"+ + "\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0006\u008c\u000b\u0000"+ + "\u04c6\u0129\u0001\u0000\u0000\u0000\u04c7\u04c8\u0003B\u0019\u0000\u04c8"+ + "\u04c9\u0001\u0000\u0000\u0000\u04c9\u04ca\u0006\u008d\u0010\u0000\u04ca"+ + "\u04cb\u0006\u008d\f\u0000\u04cb\u012b\u0001\u0000\u0000\u0000\u04cc\u04cd"+ + "\u0003l.\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce\u04cf\u0006\u008e"+ + "\u0017\u0000\u04cf\u012d\u0001\u0000\u0000\u0000\u04d0\u04d1\u0003\u00b0"+ + "P\u0000\u04d1\u04d2\u0001\u0000\u0000\u0000\u04d2\u04d3\u0006\u008f\u001d"+ + "\u0000\u04d3\u012f\u0001\u0000\u0000\u0000\u04d4\u04d5\u0003\u00acN\u0000"+ + "\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006\u0090\u001e\u0000"+ + "\u04d7\u0131\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003<\u0016\u0000\u04d9"+ + "\u04da\u0001\u0000\u0000\u0000\u04da\u04db\u0006\u0091\u000b\u0000\u04db"+ + "\u0133\u0001\u0000\u0000\u0000\u04dc\u04dd\u0003>\u0017\u0000\u04dd\u04de"+ + "\u0001\u0000\u0000\u0000\u04de\u04df\u0006\u0092\u000b\u0000\u04df\u0135"+ + "\u0001\u0000\u0000\u0000\u04e0\u04e1\u0003@\u0018\u0000\u04e1\u04e2\u0001"+ + "\u0000\u0000\u0000\u04e2\u04e3\u0006\u0093\u000b\u0000\u04e3\u0137\u0001"+ + "\u0000\u0000\u0000\u04e4\u04e5\u0003B\u0019\u0000\u04e5\u04e6\u0001\u0000"+ + "\u0000\u0000\u04e6\u04e7\u0006\u0094\u0010\u0000\u04e7\u04e8\u0006\u0094"+ + "\f\u0000\u04e8\u0139\u0001\u0000\u0000\u0000\u04e9\u04ea\u0007\u0001\u0000"+ + "\u0000\u04ea\u04eb\u0007\t\u0000\u0000\u04eb\u04ec\u0007\u000f\u0000\u0000"+ + "\u04ec\u04ed\u0007\u0007\u0000\u0000\u04ed\u013b\u0001\u0000\u0000\u0000"+ + "\u04ee\u04ef\u0003<\u0016\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0"+ + "\u04f1\u0006\u0096\u000b\u0000\u04f1\u013d\u0001\u0000\u0000\u0000\u04f2"+ + "\u04f3\u0003>\u0017\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f5"+ + "\u0006\u0097\u000b\u0000\u04f5\u013f\u0001\u0000\u0000\u0000\u04f6\u04f7"+ + "\u0003@\u0018\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04f9\u0006"+ + "\u0098\u000b\u0000\u04f9\u0141\u0001\u0000\u0000\u0000\u04fa\u04fb\u0003"+ + "B\u0019\u0000\u04fb\u04fc\u0001\u0000\u0000\u0000\u04fc\u04fd\u0006\u0099"+ + "\u0010\u0000\u04fd\u04fe\u0006\u0099\f\u0000\u04fe\u0143\u0001\u0000\u0000"+ + "\u0000\u04ff\u0500\u0007\u000f\u0000\u0000\u0500\u0501\u0007\u0014\u0000"+ + "\u0000\u0501\u0502\u0007\t\u0000\u0000\u0502\u0503\u0007\u0004\u0000\u0000"+ + "\u0503\u0504\u0007\u0005\u0000\u0000\u0504\u0505\u0007\u0001\u0000\u0000"+ + "\u0505\u0506\u0007\u0007\u0000\u0000\u0506\u0507\u0007\t\u0000\u0000\u0507"+ + "\u0508\u0007\u0002\u0000\u0000\u0508\u0145\u0001\u0000\u0000\u0000\u0509"+ + "\u050a\u0003<\u0016\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c"+ + "\u0006\u009b\u000b\u0000\u050c\u0147\u0001\u0000\u0000\u0000\u050d\u050e"+ + "\u0003>\u0017\u0000\u050e\u050f\u0001\u0000\u0000\u0000\u050f\u0510\u0006"+ + "\u009c\u000b\u0000\u0510\u0149\u0001\u0000\u0000\u0000\u0511\u0512\u0003"+ + "@\u0018\u0000\u0512\u0513\u0001\u0000\u0000\u0000\u0513\u0514\u0006\u009d"+ + "\u000b\u0000\u0514\u014b\u0001\u0000\u0000\u0000\u0515\u0516\u0003\u00aa"+ + "M\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0006\u009e\u0011"+ + "\u0000\u0518\u0519\u0006\u009e\f\u0000\u0519\u014d\u0001\u0000\u0000\u0000"+ + "\u051a\u051b\u0005:\u0000\u0000\u051b\u014f\u0001\u0000\u0000\u0000\u051c"+ + "\u0522\u0003N\u001f\u0000\u051d\u0522\u0003D\u001a\u0000\u051e\u0522\u0003"+ + "l.\u0000\u051f\u0522\u0003F\u001b\u0000\u0520\u0522\u0003T\"\u0000\u0521"+ + "\u051c\u0001\u0000\u0000\u0000\u0521\u051d\u0001\u0000\u0000\u0000\u0521"+ + "\u051e\u0001\u0000\u0000\u0000\u0521\u051f\u0001\u0000\u0000\u0000\u0521"+ + "\u0520\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ + "\u0521\u0001\u0000\u0000\u0000\u0523\u0524\u0001\u0000\u0000\u0000\u0524"+ + "\u0151\u0001\u0000\u0000\u0000\u0525\u0526\u0003<\u0016\u0000\u0526\u0527"+ + "\u0001\u0000\u0000\u0000\u0527\u0528\u0006\u00a1\u000b\u0000\u0528\u0153"+ + "\u0001\u0000\u0000\u0000\u0529\u052a\u0003>\u0017\u0000\u052a\u052b\u0001"+ + "\u0000\u0000\u0000\u052b\u052c\u0006\u00a2\u000b\u0000\u052c\u0155\u0001"+ + "\u0000\u0000\u0000\u052d\u052e\u0003@\u0018\u0000\u052e\u052f\u0001\u0000"+ + "\u0000\u0000\u052f\u0530\u0006\u00a3\u000b\u0000\u0530\u0157\u0001\u0000"+ + "\u0000\u0000\u0531\u0532\u0003B\u0019\u0000\u0532\u0533\u0001\u0000\u0000"+ + "\u0000\u0533\u0534\u0006\u00a4\u0010\u0000\u0534\u0535\u0006\u00a4\f\u0000"+ + "\u0535\u0159\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u014e\u009f\u0000"+ + "\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0006\u00a5\u0012\u0000"+ + "\u0539\u015b\u0001\u0000\u0000\u0000\u053a\u053b\u0003h,\u0000\u053b\u053c"+ + "\u0001\u0000\u0000\u0000\u053c\u053d\u0006\u00a6\u0013\u0000\u053d\u015d"+ + "\u0001\u0000\u0000\u0000\u053e\u053f\u0003l.\u0000\u053f\u0540\u0001\u0000"+ + "\u0000\u0000\u0540\u0541\u0006\u00a7\u0017\u0000\u0541\u015f\u0001\u0000"+ + "\u0000\u0000\u0542\u0543\u0003\u0106{\u0000\u0543\u0544\u0001\u0000\u0000"+ + "\u0000\u0544\u0545\u0006\u00a8\u001f\u0000\u0545\u0546\u0006\u00a8 \u0000"+ + "\u0546\u0161\u0001\u0000\u0000\u0000\u0547\u0548\u0003\u00d2a\u0000\u0548"+ + "\u0549\u0001\u0000\u0000\u0000\u0549\u054a\u0006\u00a9\u0015\u0000\u054a"+ + "\u0163\u0001\u0000\u0000\u0000\u054b\u054c\u0003X$\u0000\u054c\u054d\u0001"+ + "\u0000\u0000\u0000\u054d\u054e\u0006\u00aa\u0016\u0000\u054e\u0165\u0001"+ + "\u0000\u0000\u0000\u054f\u0550\u0003<\u0016\u0000\u0550\u0551\u0001\u0000"+ + "\u0000\u0000\u0551\u0552\u0006\u00ab\u000b\u0000\u0552\u0167\u0001\u0000"+ + "\u0000\u0000\u0553\u0554\u0003>\u0017\u0000\u0554\u0555\u0001\u0000\u0000"+ + "\u0000\u0555\u0556\u0006\u00ac\u000b\u0000\u0556\u0169\u0001\u0000\u0000"+ + "\u0000\u0557\u0558\u0003@\u0018\u0000\u0558\u0559\u0001\u0000\u0000\u0000"+ + "\u0559\u055a\u0006\u00ad\u000b\u0000\u055a\u016b\u0001\u0000\u0000\u0000"+ + "\u055b\u055c\u0003B\u0019\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d"+ + "\u055e\u0006\u00ae\u0010\u0000\u055e\u055f\u0006\u00ae\f\u0000\u055f\u0560"+ + "\u0006\u00ae\f\u0000\u0560\u016d\u0001\u0000\u0000\u0000\u0561\u0562\u0003"+ + "h,\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u00af\u0013"+ + "\u0000\u0564\u016f\u0001\u0000\u0000\u0000\u0565\u0566\u0003l.\u0000\u0566"+ + "\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u0006\u00b0\u0017\u0000\u0568"+ + "\u0171\u0001\u0000\u0000\u0000\u0569\u056a\u0003\u00e8l\u0000\u056a\u056b"+ + "\u0001\u0000\u0000\u0000\u056b\u056c\u0006\u00b1\u0018\u0000\u056c\u0173"+ + "\u0001\u0000\u0000\u0000\u056d\u056e\u0003<\u0016\u0000\u056e\u056f\u0001"+ + "\u0000\u0000\u0000\u056f\u0570\u0006\u00b2\u000b\u0000\u0570\u0175\u0001"+ + "\u0000\u0000\u0000\u0571\u0572\u0003>\u0017\u0000\u0572\u0573\u0001\u0000"+ + "\u0000\u0000\u0573\u0574\u0006\u00b3\u000b\u0000\u0574\u0177\u0001\u0000"+ + "\u0000\u0000\u0575\u0576\u0003@\u0018\u0000\u0576\u0577\u0001\u0000\u0000"+ + "\u0000\u0577\u0578\u0006\u00b4\u000b\u0000\u0578\u0179\u0001\u0000\u0000"+ + "\u0000\u0579\u057a\u0003B\u0019\u0000\u057a\u057b\u0001\u0000\u0000\u0000"+ + "\u057b\u057c\u0006\u00b5\u0010\u0000\u057c\u057d\u0006\u00b5\f\u0000\u057d"+ + "\u017b\u0001\u0000\u0000\u0000\u057e\u057f\u0003\u00d2a\u0000\u057f\u0580"+ + "\u0001\u0000\u0000\u0000\u0580\u0581\u0006\u00b6\u0015\u0000\u0581\u0582"+ + "\u0006\u00b6\f\u0000\u0582\u0583\u0006\u00b6!\u0000\u0583\u017d\u0001"+ + "\u0000\u0000\u0000\u0584\u0585\u0003X$\u0000\u0585\u0586\u0001\u0000\u0000"+ + "\u0000\u0586\u0587\u0006\u00b7\u0016\u0000\u0587\u0588\u0006\u00b7\f\u0000"+ + "\u0588\u0589\u0006\u00b7!\u0000\u0589\u017f\u0001\u0000\u0000\u0000\u058a"+ + "\u058b\u0003<\u0016\u0000\u058b\u058c\u0001\u0000\u0000\u0000\u058c\u058d"+ + "\u0006\u00b8\u000b\u0000\u058d\u0181\u0001\u0000\u0000\u0000\u058e\u058f"+ + "\u0003>\u0017\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591\u0006"+ + "\u00b9\u000b\u0000\u0591\u0183\u0001\u0000\u0000\u0000\u0592\u0593\u0003"+ + "@\u0018\u0000\u0593\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u0006\u00ba"+ + "\u000b\u0000\u0595\u0185\u0001\u0000\u0000\u0000\u0596\u0597\u0003\u014e"+ + "\u009f\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u0599\u0006\u00bb"+ + "\u0012\u0000\u0599\u059a\u0006\u00bb\f\u0000\u059a\u059b\u0006\u00bb\n"+ + "\u0000\u059b\u0187\u0001\u0000\u0000\u0000\u059c\u059d\u0003h,\u0000\u059d"+ + "\u059e\u0001\u0000\u0000\u0000\u059e\u059f\u0006\u00bc\u0013\u0000\u059f"+ + "\u05a0\u0006\u00bc\f\u0000\u05a0\u05a1\u0006\u00bc\n\u0000\u05a1\u0189"+ + "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0003<\u0016\u0000\u05a3\u05a4\u0001"+ + "\u0000\u0000\u0000\u05a4\u05a5\u0006\u00bd\u000b\u0000\u05a5\u018b\u0001"+ + "\u0000\u0000\u0000\u05a6\u05a7\u0003>\u0017\u0000\u05a7\u05a8\u0001\u0000"+ + "\u0000\u0000\u05a8\u05a9\u0006\u00be\u000b\u0000\u05a9\u018d\u0001\u0000"+ + "\u0000\u0000\u05aa\u05ab\u0003@\u0018\u0000\u05ab\u05ac\u0001\u0000\u0000"+ + "\u0000\u05ac\u05ad\u0006\u00bf\u000b\u0000\u05ad\u018f\u0001\u0000\u0000"+ + "\u0000\u05ae\u05af\u0003\u00b0P\u0000\u05af\u05b0\u0001\u0000\u0000\u0000"+ + "\u05b0\u05b1\u0006\u00c0\f\u0000\u05b1\u05b2\u0006\u00c0\u0000\u0000\u05b2"+ + "\u05b3\u0006\u00c0\u001d\u0000\u05b3\u0191\u0001\u0000\u0000\u0000\u05b4"+ + "\u05b5\u0003\u00acN\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7"+ + "\u0006\u00c1\f\u0000\u05b7\u05b8\u0006\u00c1\u0000\u0000\u05b8\u05b9\u0006"+ + "\u00c1\u001e\u0000\u05b9\u0193\u0001\u0000\u0000\u0000\u05ba\u05bb\u0003"+ + "^\'\u0000\u05bb\u05bc\u0001\u0000\u0000\u0000\u05bc\u05bd\u0006\u00c2"+ + "\f\u0000\u05bd\u05be\u0006\u00c2\u0000\u0000\u05be\u05bf\u0006\u00c2\""+ + "\u0000\u05bf\u0195\u0001\u0000\u0000\u0000\u05c0\u05c1\u0003B\u0019\u0000"+ + "\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c2\u05c3\u0006\u00c3\u0010\u0000"+ + "\u05c3\u05c4\u0006\u00c3\f\u0000\u05c4\u0197\u0001\u0000\u0000\u0000B"+ + "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+ + "\u000f\u0253\u025d\u0261\u0264\u026d\u026f\u027a\u028d\u0292\u029b\u02a2"+ + "\u02a7\u02a9\u02b4\u02bc\u02bf\u02c1\u02c6\u02cb\u02d1\u02d8\u02dd\u02e3"+ + "\u02e6\u02ee\u02f2\u0371\u0376\u037d\u037f\u038f\u0394\u0399\u039b\u03a1"+ + "\u03ee\u03f3\u041a\u041e\u0423\u0428\u042d\u042f\u0433\u0435\u0482\u0486"+ + "\u048b\u0521\u0523#\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000"+ + "\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000\u0005"+ + "\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000\u0001"+ + "\u0000\u0004\u0000\u0000\u0007\u0014\u0000\u0007B\u0000\u0005\u0000\u0000"+ + "\u0007\u001a\u0000\u0007C\u0000\u0007m\u0000\u0007#\u0000\u0007!\u0000"+ + "\u0007M\u0000\u0007\u001b\u0000\u0007%\u0000\u0007Q\u0000\u0005\u000b"+ + "\u0000\u0005\u0007\u0000\u0007[\u0000\u0007Z\u0000\u0007E\u0000\u0007"+ + "D\u0000\u0007Y\u0000\u0005\r\u0000\u0005\u000f\u0000\u0007\u001e\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 41e13e1e05c54..dcee8a6d08d60 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1045,7 +1045,7 @@ public void testWeightedAvg() { public void testMatchInsideEval() throws Exception { assumeTrue("Match operator is available just for snapshots", Build.current().isSnapshot()); - assertEquals("1:36: EVAL does not support MATCH expressions", error("row title = \"brown fox\" | eval x = title match \"fox\" ")); + assertEquals("1:36: EVAL does not support MATCH expressions", error("row title = \"brown fox\" | eval x = title matchstr \"fox\" ")); } public void testMatchFilter() throws Exception { @@ -1053,27 +1053,27 @@ public void testMatchFilter() throws Exception { assertEquals( "1:63: MATCH requires a mapped index field, found [name]", - error("from test | eval name = concat(first_name, last_name) | where name match \"Anna\"") + error("from test | eval name = concat(first_name, last_name) | where name matchstr \"Anna\"") ); assertEquals( "1:19: MATCH requires a text or keyword field, but [salary] has type [integer]", - error("from test | where salary match \"100\"") + error("from test | where salary matchstr \"100\"") ); assertEquals( "1:19: Invalid condition using MATCH", - error("from test | where first_name match \"Anna\" or starts_with(first_name, \"Anne\")") + error("from test | where first_name matchstr \"Anna\" or starts_with(first_name, \"Anne\")") ); assertEquals( "1:51: Invalid condition using MATCH", - error("from test | eval new_salary = salary + 10 | where first_name match \"Anna\" OR new_salary > 100") + error("from test | eval new_salary = salary + 10 | where first_name matchstr \"Anna\" OR new_salary > 100") ); assertEquals( "1:45: MATCH requires a mapped index field, found [fn]", - error("from test | rename first_name as fn | where fn match \"Anna\"") + error("from test | rename first_name as fn | where fn matchstr \"Anna\"") ); } From 862374d13cad5c6f6b624983c0f1d03f27d9888d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 14:35:20 +0200 Subject: [PATCH 19/93] Rename matchstr function to match --- .../{matchstr.asciidoc => match.asciidoc} | 0 .../{matchstr.asciidoc => match.asciidoc} | 0 .../definition/{matchstr.json => match.json} | 4 +-- .../kibana/docs/{matchstr.md => match.md} | 4 +-- .../{matchstr.asciidoc => match.asciidoc} | 14 +++++----- .../{matchstr.asciidoc => match.asciidoc} | 0 .../esql/functions/signature/match.svg | 1 + .../esql/functions/signature/matchstr.svg | 1 - .../{matchstr.asciidoc => match.asciidoc} | 0 .../main/resources/match-function.csv-spec | 18 ++++++------- .../function/EsqlFunctionRegistry.java | 2 +- .../function/fulltext/MatchFunction.java | 2 +- .../xpack/esql/analysis/VerifierTests.java | 27 ++++++++++--------- .../function/fulltext/MatchFunctionTests.java | 2 +- 14 files changed, 39 insertions(+), 36 deletions(-) rename docs/reference/esql/functions/description/{matchstr.asciidoc => match.asciidoc} (100%) rename docs/reference/esql/functions/examples/{matchstr.asciidoc => match.asciidoc} (100%) rename docs/reference/esql/functions/kibana/definition/{matchstr.json => match.json} (94%) rename docs/reference/esql/functions/kibana/docs/{matchstr.md => match.md} (85%) rename docs/reference/esql/functions/layout/{matchstr.asciidoc => match.asciidoc} (61%) rename docs/reference/esql/functions/parameters/{matchstr.asciidoc => match.asciidoc} (100%) create mode 100644 docs/reference/esql/functions/signature/match.svg delete mode 100644 docs/reference/esql/functions/signature/matchstr.svg rename docs/reference/esql/functions/types/{matchstr.asciidoc => match.asciidoc} (100%) diff --git a/docs/reference/esql/functions/description/matchstr.asciidoc b/docs/reference/esql/functions/description/match.asciidoc similarity index 100% rename from docs/reference/esql/functions/description/matchstr.asciidoc rename to docs/reference/esql/functions/description/match.asciidoc diff --git a/docs/reference/esql/functions/examples/matchstr.asciidoc b/docs/reference/esql/functions/examples/match.asciidoc similarity index 100% rename from docs/reference/esql/functions/examples/matchstr.asciidoc rename to docs/reference/esql/functions/examples/match.asciidoc diff --git a/docs/reference/esql/functions/kibana/definition/matchstr.json b/docs/reference/esql/functions/kibana/definition/match.json similarity index 94% rename from docs/reference/esql/functions/kibana/definition/matchstr.json rename to docs/reference/esql/functions/kibana/definition/match.json index 1b46239dff7b8..0d3839903eebf 100644 --- a/docs/reference/esql/functions/kibana/definition/matchstr.json +++ b/docs/reference/esql/functions/kibana/definition/match.json @@ -1,7 +1,7 @@ { "comment" : "This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.", "type" : "eval", - "name" : "matchstr", + "name" : "match", "description" : "Performs a match query on the specified fields. Returns true if the provided query matches the row.", "signatures" : [ { @@ -78,7 +78,7 @@ } ], "examples" : [ - "from books \n| where matchstr(author, \"Faulkner\")\n| keep book_no, author \n| sort book_no \n| limit 5;" + "from books \n| where match(author, \"Faulkner\")\n| keep book_no, author \n| sort book_no \n| limit 5;" ], "preview" : true } diff --git a/docs/reference/esql/functions/kibana/docs/matchstr.md b/docs/reference/esql/functions/kibana/docs/match.md similarity index 85% rename from docs/reference/esql/functions/kibana/docs/matchstr.md rename to docs/reference/esql/functions/kibana/docs/match.md index bfa7d8e204f58..a757605d720b6 100644 --- a/docs/reference/esql/functions/kibana/docs/matchstr.md +++ b/docs/reference/esql/functions/kibana/docs/match.md @@ -2,12 +2,12 @@ This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. --> -### MATCHSTR +### MATCH Performs a match query on the specified fields. Returns true if the provided query matches the row. ``` from books -| where matchstr(author, "Faulkner") +| where match(author, "Faulkner") | keep book_no, author | sort book_no | limit 5; diff --git a/docs/reference/esql/functions/layout/matchstr.asciidoc b/docs/reference/esql/functions/layout/match.asciidoc similarity index 61% rename from docs/reference/esql/functions/layout/matchstr.asciidoc rename to docs/reference/esql/functions/layout/match.asciidoc index 5ba5ccee260d2..e62c81548c2b1 100644 --- a/docs/reference/esql/functions/layout/matchstr.asciidoc +++ b/docs/reference/esql/functions/layout/match.asciidoc @@ -1,17 +1,17 @@ // This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it. [discrete] -[[esql-matchstr]] -=== `MATCHSTR` +[[esql-match]] +=== `MATCH` preview::["Do not use on production environments. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features."] *Syntax* [.text-center] -image::esql/functions/signature/matchstr.svg[Embedded,opts=inline] +image::esql/functions/signature/match.svg[Embedded,opts=inline] -include::../parameters/matchstr.asciidoc[] -include::../description/matchstr.asciidoc[] -include::../types/matchstr.asciidoc[] -include::../examples/matchstr.asciidoc[] +include::../parameters/match.asciidoc[] +include::../description/match.asciidoc[] +include::../types/match.asciidoc[] +include::../examples/match.asciidoc[] diff --git a/docs/reference/esql/functions/parameters/matchstr.asciidoc b/docs/reference/esql/functions/parameters/match.asciidoc similarity index 100% rename from docs/reference/esql/functions/parameters/matchstr.asciidoc rename to docs/reference/esql/functions/parameters/match.asciidoc diff --git a/docs/reference/esql/functions/signature/match.svg b/docs/reference/esql/functions/signature/match.svg new file mode 100644 index 0000000000000..e7bb001247a9d --- /dev/null +++ b/docs/reference/esql/functions/signature/match.svg @@ -0,0 +1 @@ +MATCH(field,query) diff --git a/docs/reference/esql/functions/signature/matchstr.svg b/docs/reference/esql/functions/signature/matchstr.svg deleted file mode 100644 index dc6e8297c5970..0000000000000 --- a/docs/reference/esql/functions/signature/matchstr.svg +++ /dev/null @@ -1 +0,0 @@ -MATCHSTR(field,query) diff --git a/docs/reference/esql/functions/types/matchstr.asciidoc b/docs/reference/esql/functions/types/match.asciidoc similarity index 100% rename from docs/reference/esql/functions/types/matchstr.asciidoc rename to docs/reference/esql/functions/types/match.asciidoc diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index ae3bbdde72cb5..201e6b70ac650 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -7,7 +7,7 @@ required_capability: match_function // tag::match-with-field[] from books -| where matchstr(author, "Faulkner") +| where match(author, "Faulkner") | keep book_no, author | sort book_no | limit 5; @@ -27,7 +27,7 @@ matchWithMultipleFunctions required_capability: match_function from books -| where matchstr(title, "Return") AND matchstr(author, "Tolkien") +| where match(title, "Return") AND match(author, "Tolkien") | keep book_no, title; ignoreOrder:true @@ -40,7 +40,7 @@ matchWithQueryExpressions required_capability: match_function from books -| where matchstr(title, CONCAT("Return ", " King")) +| where match(title, CONCAT("Return ", " King")) | keep book_no, title; ignoreOrder:true @@ -53,7 +53,7 @@ matchWithDisjunction required_capability: match_function from books -| where matchstr(title, "Return") or year > 2020 +| where match(title, "Return") or year > 2020 | keep book_no, title; ignoreOrder:true @@ -67,7 +67,7 @@ matchWithConjunction required_capability: match_function from books -| where matchstr(title, "Rings") and ratings > 4.6 +| where match(title, "Rings") and ratings > 4.6 | keep book_no, title; ignoreOrder:true @@ -80,7 +80,7 @@ matchWithFunctionPushedToLucene required_capability: match_function from hosts -| where matchstr(host, "beta") and cidr_match(ip1, "127.0.0.2/32", "127.0.0.3/32") +| where match(host, "beta") and cidr_match(ip1, "127.0.0.2/32", "127.0.0.3/32") | keep card, host, ip0, ip1; ignoreOrder:true @@ -92,7 +92,7 @@ matchWithFunctionNotPushedToLucene required_capability: match_function from books -| where matchstr(title, "rings") and length(description) > 600 +| where match(title, "rings") and length(description) > 600 | keep book_no, title; ignoreOrder:true @@ -105,8 +105,8 @@ matchWithMultipleWhereClauses required_capability: match_function from books -| where matchstr(title, "rings") -| where matchstr(title, "lord") +| where match(title, "rings") +| where match(title, "lord") | keep book_no, title; ignoreOrder:true diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java index 2a5ea495ddcd8..6016602802feb 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java @@ -392,7 +392,7 @@ private static FunctionDefinition[][] snapshotFunctions() { def(Rate.class, Rate::withUnresolvedTimestamp, "rate"), // Full text functions def(QueryStringFunction.class, QueryStringFunction::new, "qstr"), - def(MatchFunction.class, MatchFunction::new, "matchstr") } }; + def(MatchFunction.class, MatchFunction::new, "match") } }; } public EsqlFunctionRegistry snapshotRegistry() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 4f33211cd15e7..a333b511162d2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -39,7 +39,7 @@ public class MatchFunction extends FullTextFunction { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Expression.class, - "Matchstr", + "Match", MatchFunction::new ); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index dcee8a6d08d60..71e6a591b73dd 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1045,7 +1045,10 @@ public void testWeightedAvg() { public void testMatchInsideEval() throws Exception { assumeTrue("Match operator is available just for snapshots", Build.current().isSnapshot()); - assertEquals("1:36: EVAL does not support MATCH expressions", error("row title = \"brown fox\" | eval x = title matchstr \"fox\" ")); + assertEquals( + "1:36: EVAL does not support MATCH expressions", + error("row title = \"brown fox\" | eval x = title matchstr \"fox\" ") + ); } public void testMatchFilter() throws Exception { @@ -1088,8 +1091,8 @@ public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { public void testMatchFunctionNotAllowedAfterCommands() throws Exception { assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - assertEquals("1:13: [MATCHSTR] function cannot be used after SHOW", error("show info | where matchstr(version, \"8.*\")")); - checkFullTextFunctionNotAllowedAfterCommands("MATCHSTR", "matchstr(first_name, \"Anna\")"); + assertEquals("1:13: [MATCHSTR] function cannot be used after SHOW", error("show info | where match(version, \"8.*\")")); + checkFullTextFunctionNotAllowedAfterCommands("MATCHSTR", "match(first_name, \"Anna\")"); } private void checkFullTextFunctionNotAllowedAfterCommands(String functionName, String functionInvocation) throws Exception { @@ -1172,7 +1175,7 @@ public void testQueryStringFunctionOnlyAllowedInWhere() throws Exception { public void testMatchFunctionOnlyAllowedInWhere() throws Exception { assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - checkFullTextFunctionsOnlyAllowedInWhere("MATCHSTR", "matchstr(first_name, \"Anna\")"); + checkFullTextFunctionsOnlyAllowedInWhere("MATCHSTR", "match(first_name, \"Anna\")"); } private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, String functionInvocation) throws Exception { @@ -1206,16 +1209,16 @@ public void testMatchFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:19: first argument of [matchstr(null, \"Anna\")] cannot be null, received [null]", - error("from test | where matchstr(null, \"Anna\")") + "1:19: first argument of [match(null, \"Anna\")] cannot be null, received [null]", + error("from test | where match(null, \"Anna\")") ); assertEquals( - "1:19: second argument of [matchstr(first_name, null)] cannot be null, received [null]", - error("from test | where matchstr(first_name, null)") + "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", + error("from test | where match(first_name, null)") ); assertEquals( - "1:19: second argument of [matchstr(first_name, first_name)] must be a constant, received [first_name]", - error("from test | where matchstr(first_name, first_name)") + "1:19: second argument of [match(first_name, first_name)] must be a constant, received [first_name]", + error("from test | where match(first_name, first_name)") ); // Other value types are tested in QueryStringFunctionTests } @@ -1224,8 +1227,8 @@ public void testMatchFunctionNoField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:19: second argument of [matchstr(\"first_name\", null)] cannot be null, received [null]", - error("from test | where matchstr(\"first_name\", null)") + "1:19: second argument of [match(\"first_name\", null)] cannot be null, received [null]", + error("from test | where match(\"first_name\", null)") ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index d177cdd1ed967..be5baef39335b 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -30,7 +30,7 @@ import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.MATCH_FUNCTION; import static org.hamcrest.Matchers.equalTo; -@FunctionName("matchstr") +@FunctionName("match") public class MatchFunctionTests extends AbstractFunctionTestCase { @BeforeClass From f9371b14e8ad85ffc23448998d44c514b41255ef Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 14:40:02 +0200 Subject: [PATCH 20/93] Rename matchstr function to match --- .../src/test/java/org/elasticsearch/xpack/esql/CsvTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java index 792d271c48f31..2641a2cf9110a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java @@ -252,7 +252,7 @@ public final void test() throws Throwable { testCase.requiredCapabilities.contains(EsqlCapabilities.Cap.QSTR_FUNCTION.capabilityName()) ); assumeFalse( - "can't use MATCHSTR function in csv tests", + "can't use MATCH function in csv tests", testCase.requiredCapabilities.contains(EsqlCapabilities.Cap.MATCH_FUNCTION.capabilityName()) ); From 0a05d5b79881fbf8df094b3e4520fcfc6c384c31 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 17:16:55 +0200 Subject: [PATCH 21/93] Rename match operator to matchstr --- .../main/resources/match-operator.csv-spec | 12 ++++---- .../LocalPhysicalPlanOptimizerTests.java | 6 ++-- .../test/esql/180_match_operator.yml | 30 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec index dc7b8d30cb860..405079001f3d1 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec @@ -3,7 +3,7 @@ # singleMatchWithTextField -required_capability: match_operator +required_capability: match_function from books | where author matchstr "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; book_no:keyword | author:text @@ -15,7 +15,7 @@ book_no:keyword | author:text ; singleMatchWithKeywordField -required_capability: match_operator +required_capability: match_function from books | where author.keyword matchstr "William Faulkner" | keep book_no, author | sort book_no; book_no:keyword | author:text @@ -31,7 +31,7 @@ book_no:keyword | author:text ; multipleMatch -required_capability: match_operator +required_capability: match_function from books | where (description matchstr "Sauron" OR description matchstr "Dark Lord") AND (author matchstr "J. R. R. Tolkien" OR author matchstr "John Ronald Reuel Tolkien") @@ -48,7 +48,7 @@ book_no:keyword | title:text ; multipleWhereWithMatch -required_capability: match_operator +required_capability: match_function from books | where title matchstr "short stories" | where author matchstr "Ursula K. Le Guin" @@ -61,7 +61,7 @@ book_no:keyword | title:text | author:text ; combinedMatchWithFunctions -required_capability: match_operator +required_capability: match_function from books | where title matchstr "Tolkien" AND author matchstr "Tolkien" AND year > 2000 | where mv_count(author) == 1 @@ -74,7 +74,7 @@ book_no:keyword | title:text | author:text | year:integer ; matchWithStats -required_capability: match_operator +required_capability: match_function from books | where author matchstr "faulkner" AND year > 1990 | where mv_count(author) == 1 diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index c2779b7dbc46d..97bf2fbeac852 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -963,7 +963,7 @@ public void testSingleMatchFilterPushdown() { var plan = plannerOptimizer.plan(""" from test - | where first_name match "Anna" + | where first_name matchstr "Anna" """); var limit = as(plan, LimitExec.class); @@ -995,11 +995,11 @@ public void testMultipleMatchFilterPushdown() { String query = """ from test - | where first_name match "Anna" OR first_name match "Anneke" + | where first_name matchstr "Anna" OR first_name matchstr "Anneke" | sort emp_no | where emp_no > 10000 | eval description = concat("emp_no: ", to_str(emp_no), ", name: ", first_name, " ", last_name) - | where last_name match "Xinglin" + | where last_name matchstr "Xinglin" """; var plan = plannerOptimizer.plan(query); diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml index 959581b18c11a..24ab666f39709 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml @@ -44,7 +44,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCH "fox" | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCHSTR "fox" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -59,7 +59,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCH "fox" AND id > 5 | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCHSTR "fox" AND id > 5 | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -73,7 +73,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCH "fox" OR content MATCH "brown" | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCHSTR "fox" OR content MATCHSTR "brown" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -91,7 +91,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE NOT content MATCH "brown fox" | KEEP id | SORT id' + query: 'FROM test | WHERE NOT content MATCHSTR "brown fox" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -106,7 +106,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE something match "fox"' + query: 'FROM test | WHERE something matchstr "fox"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -120,11 +120,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | EVAL upper_content = to_upper(content) | WHERE upper_content MATCH "FOX" | KEEP id' + query: 'FROM test | EVAL upper_content = to_upper(content) | WHERE upper_content MATCHSTR "FOX" | KEEP id' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:60: MATCH requires a mapped index field, found [upper_content]" } + - match: { error.reason: "Found 1 problem\nline 1:60: MATCHSTR requires a mapped index field, found [upper_content]" } --- "match on overwritten column": @@ -134,11 +134,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | DROP content | EVAL content = CONCAT("ID: ", to_str(id)) | WHERE content match "fox"' + query: 'FROM test | DROP content | EVAL content = CONCAT("ID: ", to_str(id)) | WHERE content matchstr "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:78: MATCH requires a mapped index field, found [content]" } + - match: { error.reason: "Found 1 problem\nline 1:78: MATCHSTR requires a mapped index field, found [content]" } --- "match after stats": @@ -148,7 +148,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | STATS count(*) | WHERE content match "fox"' + query: 'FROM test | STATS count(*) | WHERE content matchstr "fox"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -162,7 +162,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCH "fox" OR to_upper(content) == "FOX"' + query: 'FROM test | WHERE content MATCHSTR "fox" OR to_upper(content) == "FOX"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -176,11 +176,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | EVAL matches_query = content MATCH "fox"' + query: 'FROM test | EVAL matches_query = content MATCHSTR "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:34: EVAL does not support MATCH expressions" } + - match: { error.reason: "Found 1 problem\nline 1:34: EVAL does not support MATCHSTR expressions" } --- "match with non text field": @@ -190,8 +190,8 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE id MATCH "fox"' + query: 'FROM test | WHERE id MATCHSTR "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:19: MATCH requires a text or keyword field, but [id] has type [integer]" } + - match: { error.reason: "Found 1 problem\nline 1:19: MATCHSTR requires a text or keyword field, but [id] has type [integer]" } From 6601dfa268bb07d9220dad628a54d4ea5d627a19 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 25 Sep 2024 19:18:20 +0200 Subject: [PATCH 22/93] Don't run REST compat test for match operator --- x-pack/plugin/build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/build.gradle b/x-pack/plugin/build.gradle index 4fdc4c3af4190..23dfad4dc06d6 100644 --- a/x-pack/plugin/build.gradle +++ b/x-pack/plugin/build.gradle @@ -1,5 +1,3 @@ -import org.elasticsearch.gradle.Version -import org.elasticsearch.gradle.VersionProperties import org.elasticsearch.gradle.internal.info.BuildParams import org.elasticsearch.gradle.testclusters.StandaloneRestIntegTestTask import org.elasticsearch.gradle.util.GradleUtils @@ -80,3 +78,8 @@ tasks.named("precommit").configure { dependsOn 'enforceYamlTestConvention', 'enforceApiSpecsConvention' } +tasks.named("yamlRestCompatTestTransform").configure({ task -> + task.skipTestsByFilePattern("**/esql/180_match_operator.yml", "match operator changed name - do not check compatibility") +}) + + From dd6df1270b6a7029239c2af1232c09486540da1b Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 26 Sep 2024 08:53:14 +0200 Subject: [PATCH 23/93] Revert "Rename match operator to matchstr" This reverts commit 0a05d5b79881fbf8df094b3e4520fcfc6c384c31. --- .../main/resources/match-operator.csv-spec | 12 ++++---- .../LocalPhysicalPlanOptimizerTests.java | 6 ++-- .../test/esql/180_match_operator.yml | 30 +++++++++---------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec index 405079001f3d1..dc7b8d30cb860 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec @@ -3,7 +3,7 @@ # singleMatchWithTextField -required_capability: match_function +required_capability: match_operator from books | where author matchstr "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; book_no:keyword | author:text @@ -15,7 +15,7 @@ book_no:keyword | author:text ; singleMatchWithKeywordField -required_capability: match_function +required_capability: match_operator from books | where author.keyword matchstr "William Faulkner" | keep book_no, author | sort book_no; book_no:keyword | author:text @@ -31,7 +31,7 @@ book_no:keyword | author:text ; multipleMatch -required_capability: match_function +required_capability: match_operator from books | where (description matchstr "Sauron" OR description matchstr "Dark Lord") AND (author matchstr "J. R. R. Tolkien" OR author matchstr "John Ronald Reuel Tolkien") @@ -48,7 +48,7 @@ book_no:keyword | title:text ; multipleWhereWithMatch -required_capability: match_function +required_capability: match_operator from books | where title matchstr "short stories" | where author matchstr "Ursula K. Le Guin" @@ -61,7 +61,7 @@ book_no:keyword | title:text | author:text ; combinedMatchWithFunctions -required_capability: match_function +required_capability: match_operator from books | where title matchstr "Tolkien" AND author matchstr "Tolkien" AND year > 2000 | where mv_count(author) == 1 @@ -74,7 +74,7 @@ book_no:keyword | title:text | author:text | year:integer ; matchWithStats -required_capability: match_function +required_capability: match_operator from books | where author matchstr "faulkner" AND year > 1990 | where mv_count(author) == 1 diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 97bf2fbeac852..c2779b7dbc46d 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -963,7 +963,7 @@ public void testSingleMatchFilterPushdown() { var plan = plannerOptimizer.plan(""" from test - | where first_name matchstr "Anna" + | where first_name match "Anna" """); var limit = as(plan, LimitExec.class); @@ -995,11 +995,11 @@ public void testMultipleMatchFilterPushdown() { String query = """ from test - | where first_name matchstr "Anna" OR first_name matchstr "Anneke" + | where first_name match "Anna" OR first_name match "Anneke" | sort emp_no | where emp_no > 10000 | eval description = concat("emp_no: ", to_str(emp_no), ", name: ", first_name, " ", last_name) - | where last_name matchstr "Xinglin" + | where last_name match "Xinglin" """; var plan = plannerOptimizer.plan(query); diff --git a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml index 24ab666f39709..959581b18c11a 100644 --- a/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml +++ b/x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/esql/180_match_operator.yml @@ -44,7 +44,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCHSTR "fox" | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCH "fox" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -59,7 +59,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCHSTR "fox" AND id > 5 | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCH "fox" AND id > 5 | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -73,7 +73,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCHSTR "fox" OR content MATCHSTR "brown" | KEEP id | SORT id' + query: 'FROM test | WHERE content MATCH "fox" OR content MATCH "brown" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -91,7 +91,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE NOT content MATCHSTR "brown fox" | KEEP id | SORT id' + query: 'FROM test | WHERE NOT content MATCH "brown fox" | KEEP id | SORT id' - match: { columns.0.name: "id" } - match: { columns.0.type: "integer" } @@ -106,7 +106,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE something matchstr "fox"' + query: 'FROM test | WHERE something match "fox"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -120,11 +120,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | EVAL upper_content = to_upper(content) | WHERE upper_content MATCHSTR "FOX" | KEEP id' + query: 'FROM test | EVAL upper_content = to_upper(content) | WHERE upper_content MATCH "FOX" | KEEP id' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:60: MATCHSTR requires a mapped index field, found [upper_content]" } + - match: { error.reason: "Found 1 problem\nline 1:60: MATCH requires a mapped index field, found [upper_content]" } --- "match on overwritten column": @@ -134,11 +134,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | DROP content | EVAL content = CONCAT("ID: ", to_str(id)) | WHERE content matchstr "fox"' + query: 'FROM test | DROP content | EVAL content = CONCAT("ID: ", to_str(id)) | WHERE content match "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:78: MATCHSTR requires a mapped index field, found [content]" } + - match: { error.reason: "Found 1 problem\nline 1:78: MATCH requires a mapped index field, found [content]" } --- "match after stats": @@ -148,7 +148,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | STATS count(*) | WHERE content matchstr "fox"' + query: 'FROM test | STATS count(*) | WHERE content match "fox"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -162,7 +162,7 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE content MATCHSTR "fox" OR to_upper(content) == "FOX"' + query: 'FROM test | WHERE content MATCH "fox" OR to_upper(content) == "FOX"' - match: { status: 400 } - match: { error.type: verification_exception } @@ -176,11 +176,11 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | EVAL matches_query = content MATCHSTR "fox"' + query: 'FROM test | EVAL matches_query = content MATCH "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:34: EVAL does not support MATCHSTR expressions" } + - match: { error.reason: "Found 1 problem\nline 1:34: EVAL does not support MATCH expressions" } --- "match with non text field": @@ -190,8 +190,8 @@ setup: - "No limit defined, adding default limit of \\[.*\\]" esql.query: body: - query: 'FROM test | WHERE id MATCHSTR "fox"' + query: 'FROM test | WHERE id MATCH "fox"' - match: { status: 400 } - match: { error.type: verification_exception } - - match: { error.reason: "Found 1 problem\nline 1:19: MATCHSTR requires a text or keyword field, but [id] has type [integer]" } + - match: { error.reason: "Found 1 problem\nline 1:19: MATCH requires a text or keyword field, but [id] has type [integer]" } From 16d88b03fc30cea6d9e5c519b30af612f3773d10 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 26 Sep 2024 08:54:47 +0200 Subject: [PATCH 24/93] Revert "Rename match operator to matchstr" This reverts commit e23eef3f --- .../main/resources/match-operator.csv-spec | 18 +- .../esql/src/main/antlr/EsqlBaseLexer.g4 | 8 +- .../xpack/esql/parser/EsqlBaseLexer.interp | 2 +- .../xpack/esql/parser/EsqlBaseLexer.java | 1751 ++++++++--------- .../xpack/esql/analysis/VerifierTests.java | 15 +- 5 files changed, 895 insertions(+), 899 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec index dc7b8d30cb860..56eded5ce4603 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-operator.csv-spec @@ -1,10 +1,10 @@ ############################################### -# Tests for matchstr operator +# Tests for MATCH operator # singleMatchWithTextField required_capability: match_operator -from books | where author matchstr "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; +from books | where author match "William Faulkner" | keep book_no, author | sort book_no | LIMIT 5; book_no:keyword | author:text 2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] @@ -16,7 +16,7 @@ book_no:keyword | author:text singleMatchWithKeywordField required_capability: match_operator -from books | where author.keyword matchstr "William Faulkner" | keep book_no, author | sort book_no; +from books | where author.keyword match "William Faulkner" | keep book_no, author | sort book_no; book_no:keyword | author:text 2713 | William Faulkner @@ -33,8 +33,8 @@ book_no:keyword | author:text multipleMatch required_capability: match_operator from books -| where (description matchstr "Sauron" OR description matchstr "Dark Lord") AND - (author matchstr "J. R. R. Tolkien" OR author matchstr "John Ronald Reuel Tolkien") +| where (description match "Sauron" OR description match "Dark Lord") AND + (author match "J. R. R. Tolkien" OR author match "John Ronald Reuel Tolkien") | keep book_no, title, author | sort book_no | limit 4 @@ -50,8 +50,8 @@ book_no:keyword | title:text multipleWhereWithMatch required_capability: match_operator from books -| where title matchstr "short stories" -| where author matchstr "Ursula K. Le Guin" +| where title match "short stories" +| where author match "Ursula K. Le Guin" | keep book_no, title, author | sort book_no ; @@ -63,7 +63,7 @@ book_no:keyword | title:text | author:text combinedMatchWithFunctions required_capability: match_operator from books -| where title matchstr "Tolkien" AND author matchstr "Tolkien" AND year > 2000 +| where title match "Tolkien" AND author match "Tolkien" AND year > 2000 | where mv_count(author) == 1 | keep book_no, title, author, year | sort book_no @@ -76,7 +76,7 @@ book_no:keyword | title:text | author:text | year:integer matchWithStats required_capability: match_operator from books -| where author matchstr "faulkner" AND year > 1990 +| where author match "faulkner" AND year > 1990 | where mv_count(author) == 1 | stats count(*) BY author.keyword | sort author.keyword diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 index 4ea7838a8fd1e..6570a25469971 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 @@ -85,10 +85,10 @@ WHERE : 'where' -> pushMode(EXPRESSION_MODE); // Once the command has been stabilized, remove the DEV_ prefix and the {}? conditional and move the command to the // main section while preserving alphabetical order: // MYCOMMAND : 'mycommand' -> ... -DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); -DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); -DEV_MATCH : {this.isDevVersion()}? 'matchstr' -> pushMode(EXPRESSION_MODE); -DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); +DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); +DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); +DEV_MATCH : {this.isDevVersion()}? 'match' -> pushMode(EXPRESSION_MODE); +DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); // // Catch-all for unrecognized commands - don't define any beyond this line diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 7942dfd056ac0..8122a56884280 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -475,4 +475,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 125, 1477, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 594, 8, 21, 11, 21, 12, 21, 595, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 604, 8, 22, 10, 22, 12, 22, 607, 9, 22, 1, 22, 3, 22, 610, 8, 22, 1, 22, 3, 22, 613, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 622, 8, 23, 10, 23, 12, 23, 625, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 633, 8, 24, 11, 24, 12, 24, 634, 1, 24, 1, 24, 1, 25, 1, 25, 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, 3, 30, 654, 8, 30, 1, 30, 4, 30, 657, 8, 30, 11, 30, 12, 30, 658, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 668, 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 675, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 680, 8, 36, 10, 36, 12, 36, 683, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 691, 8, 36, 10, 36, 12, 36, 694, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 701, 8, 36, 1, 36, 3, 36, 704, 8, 36, 3, 36, 706, 8, 36, 1, 37, 4, 37, 709, 8, 37, 11, 37, 12, 37, 710, 1, 38, 4, 38, 714, 8, 38, 11, 38, 12, 38, 715, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 1, 38, 1, 38, 4, 38, 727, 8, 38, 11, 38, 12, 38, 728, 1, 38, 4, 38, 732, 8, 38, 11, 38, 12, 38, 733, 1, 38, 1, 38, 5, 38, 738, 8, 38, 10, 38, 12, 38, 741, 9, 38, 3, 38, 743, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 4, 38, 749, 8, 38, 11, 38, 12, 38, 750, 1, 38, 1, 38, 3, 38, 755, 8, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 3, 75, 882, 8, 75, 1, 75, 5, 75, 885, 8, 75, 10, 75, 12, 75, 888, 9, 75, 1, 75, 1, 75, 4, 75, 892, 8, 75, 11, 75, 12, 75, 893, 3, 75, 896, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 910, 8, 78, 10, 78, 12, 78, 913, 9, 78, 1, 78, 1, 78, 3, 78, 917, 8, 78, 1, 78, 4, 78, 920, 8, 78, 11, 78, 12, 78, 921, 3, 78, 924, 8, 78, 1, 79, 1, 79, 4, 79, 928, 8, 79, 11, 79, 12, 79, 929, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 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, 3, 96, 1007, 8, 96, 1, 97, 4, 97, 1010, 8, 97, 11, 97, 12, 97, 1011, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1051, 8, 106, 1, 107, 1, 107, 3, 107, 1055, 8, 107, 1, 107, 5, 107, 1058, 8, 107, 10, 107, 12, 107, 1061, 9, 107, 1, 107, 1, 107, 3, 107, 1065, 8, 107, 1, 107, 4, 107, 1068, 8, 107, 11, 107, 12, 107, 1069, 3, 107, 1072, 8, 107, 1, 108, 1, 108, 4, 108, 1076, 8, 108, 11, 108, 12, 108, 1077, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 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, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1153, 8, 126, 11, 126, 12, 126, 1154, 1, 126, 1, 126, 3, 126, 1159, 8, 126, 1, 126, 4, 126, 1162, 8, 126, 11, 126, 12, 126, 1163, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 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, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 4, 160, 1314, 8, 160, 11, 160, 12, 160, 1315, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 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, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 623, 692, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 0, 166, 65, 168, 66, 170, 67, 172, 68, 174, 0, 176, 69, 178, 70, 180, 71, 182, 72, 184, 0, 186, 0, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 0, 214, 0, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 81, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 0, 246, 0, 248, 85, 250, 0, 252, 86, 254, 87, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 0, 268, 91, 270, 0, 272, 92, 274, 93, 276, 94, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 95, 294, 96, 296, 97, 298, 0, 300, 0, 302, 0, 304, 0, 306, 98, 308, 99, 310, 100, 312, 0, 314, 101, 316, 102, 318, 103, 320, 104, 322, 0, 324, 105, 326, 106, 328, 107, 330, 108, 332, 0, 334, 109, 336, 110, 338, 111, 340, 112, 342, 113, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 115, 362, 116, 364, 0, 366, 0, 368, 0, 370, 0, 372, 117, 374, 118, 376, 119, 378, 0, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 123, 396, 124, 398, 125, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1504, 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, 1, 66, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 172, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 472, 1, 0, 0, 0, 34, 480, 1, 0, 0, 0, 36, 487, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 514, 1, 0, 0, 0, 44, 521, 1, 0, 0, 0, 46, 528, 1, 0, 0, 0, 48, 536, 1, 0, 0, 0, 50, 544, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 581, 1, 0, 0, 0, 58, 593, 1, 0, 0, 0, 60, 599, 1, 0, 0, 0, 62, 616, 1, 0, 0, 0, 64, 632, 1, 0, 0, 0, 66, 638, 1, 0, 0, 0, 68, 642, 1, 0, 0, 0, 70, 644, 1, 0, 0, 0, 72, 646, 1, 0, 0, 0, 74, 649, 1, 0, 0, 0, 76, 651, 1, 0, 0, 0, 78, 660, 1, 0, 0, 0, 80, 662, 1, 0, 0, 0, 82, 667, 1, 0, 0, 0, 84, 669, 1, 0, 0, 0, 86, 674, 1, 0, 0, 0, 88, 705, 1, 0, 0, 0, 90, 708, 1, 0, 0, 0, 92, 754, 1, 0, 0, 0, 94, 756, 1, 0, 0, 0, 96, 759, 1, 0, 0, 0, 98, 763, 1, 0, 0, 0, 100, 767, 1, 0, 0, 0, 102, 769, 1, 0, 0, 0, 104, 772, 1, 0, 0, 0, 106, 774, 1, 0, 0, 0, 108, 779, 1, 0, 0, 0, 110, 781, 1, 0, 0, 0, 112, 787, 1, 0, 0, 0, 114, 793, 1, 0, 0, 0, 116, 796, 1, 0, 0, 0, 118, 799, 1, 0, 0, 0, 120, 804, 1, 0, 0, 0, 122, 809, 1, 0, 0, 0, 124, 811, 1, 0, 0, 0, 126, 815, 1, 0, 0, 0, 128, 820, 1, 0, 0, 0, 130, 826, 1, 0, 0, 0, 132, 829, 1, 0, 0, 0, 134, 831, 1, 0, 0, 0, 136, 837, 1, 0, 0, 0, 138, 839, 1, 0, 0, 0, 140, 844, 1, 0, 0, 0, 142, 847, 1, 0, 0, 0, 144, 850, 1, 0, 0, 0, 146, 853, 1, 0, 0, 0, 148, 855, 1, 0, 0, 0, 150, 858, 1, 0, 0, 0, 152, 860, 1, 0, 0, 0, 154, 863, 1, 0, 0, 0, 156, 865, 1, 0, 0, 0, 158, 867, 1, 0, 0, 0, 160, 869, 1, 0, 0, 0, 162, 871, 1, 0, 0, 0, 164, 873, 1, 0, 0, 0, 166, 895, 1, 0, 0, 0, 168, 897, 1, 0, 0, 0, 170, 902, 1, 0, 0, 0, 172, 923, 1, 0, 0, 0, 174, 925, 1, 0, 0, 0, 176, 933, 1, 0, 0, 0, 178, 935, 1, 0, 0, 0, 180, 939, 1, 0, 0, 0, 182, 943, 1, 0, 0, 0, 184, 947, 1, 0, 0, 0, 186, 952, 1, 0, 0, 0, 188, 957, 1, 0, 0, 0, 190, 961, 1, 0, 0, 0, 192, 965, 1, 0, 0, 0, 194, 969, 1, 0, 0, 0, 196, 974, 1, 0, 0, 0, 198, 978, 1, 0, 0, 0, 200, 982, 1, 0, 0, 0, 202, 986, 1, 0, 0, 0, 204, 990, 1, 0, 0, 0, 206, 994, 1, 0, 0, 0, 208, 1006, 1, 0, 0, 0, 210, 1009, 1, 0, 0, 0, 212, 1013, 1, 0, 0, 0, 214, 1017, 1, 0, 0, 0, 216, 1021, 1, 0, 0, 0, 218, 1025, 1, 0, 0, 0, 220, 1029, 1, 0, 0, 0, 222, 1033, 1, 0, 0, 0, 224, 1038, 1, 0, 0, 0, 226, 1042, 1, 0, 0, 0, 228, 1050, 1, 0, 0, 0, 230, 1071, 1, 0, 0, 0, 232, 1075, 1, 0, 0, 0, 234, 1079, 1, 0, 0, 0, 236, 1083, 1, 0, 0, 0, 238, 1087, 1, 0, 0, 0, 240, 1091, 1, 0, 0, 0, 242, 1096, 1, 0, 0, 0, 244, 1100, 1, 0, 0, 0, 246, 1104, 1, 0, 0, 0, 248, 1108, 1, 0, 0, 0, 250, 1111, 1, 0, 0, 0, 252, 1115, 1, 0, 0, 0, 254, 1119, 1, 0, 0, 0, 256, 1123, 1, 0, 0, 0, 258, 1127, 1, 0, 0, 0, 260, 1132, 1, 0, 0, 0, 262, 1137, 1, 0, 0, 0, 264, 1142, 1, 0, 0, 0, 266, 1149, 1, 0, 0, 0, 268, 1158, 1, 0, 0, 0, 270, 1165, 1, 0, 0, 0, 272, 1169, 1, 0, 0, 0, 274, 1173, 1, 0, 0, 0, 276, 1177, 1, 0, 0, 0, 278, 1181, 1, 0, 0, 0, 280, 1187, 1, 0, 0, 0, 282, 1191, 1, 0, 0, 0, 284, 1195, 1, 0, 0, 0, 286, 1199, 1, 0, 0, 0, 288, 1203, 1, 0, 0, 0, 290, 1207, 1, 0, 0, 0, 292, 1211, 1, 0, 0, 0, 294, 1215, 1, 0, 0, 0, 296, 1219, 1, 0, 0, 0, 298, 1223, 1, 0, 0, 0, 300, 1228, 1, 0, 0, 0, 302, 1232, 1, 0, 0, 0, 304, 1236, 1, 0, 0, 0, 306, 1240, 1, 0, 0, 0, 308, 1244, 1, 0, 0, 0, 310, 1248, 1, 0, 0, 0, 312, 1252, 1, 0, 0, 0, 314, 1257, 1, 0, 0, 0, 316, 1262, 1, 0, 0, 0, 318, 1266, 1, 0, 0, 0, 320, 1270, 1, 0, 0, 0, 322, 1274, 1, 0, 0, 0, 324, 1279, 1, 0, 0, 0, 326, 1289, 1, 0, 0, 0, 328, 1293, 1, 0, 0, 0, 330, 1297, 1, 0, 0, 0, 332, 1301, 1, 0, 0, 0, 334, 1306, 1, 0, 0, 0, 336, 1313, 1, 0, 0, 0, 338, 1317, 1, 0, 0, 0, 340, 1321, 1, 0, 0, 0, 342, 1325, 1, 0, 0, 0, 344, 1329, 1, 0, 0, 0, 346, 1334, 1, 0, 0, 0, 348, 1338, 1, 0, 0, 0, 350, 1342, 1, 0, 0, 0, 352, 1346, 1, 0, 0, 0, 354, 1351, 1, 0, 0, 0, 356, 1355, 1, 0, 0, 0, 358, 1359, 1, 0, 0, 0, 360, 1363, 1, 0, 0, 0, 362, 1367, 1, 0, 0, 0, 364, 1371, 1, 0, 0, 0, 366, 1377, 1, 0, 0, 0, 368, 1381, 1, 0, 0, 0, 370, 1385, 1, 0, 0, 0, 372, 1389, 1, 0, 0, 0, 374, 1393, 1, 0, 0, 0, 376, 1397, 1, 0, 0, 0, 378, 1401, 1, 0, 0, 0, 380, 1406, 1, 0, 0, 0, 382, 1412, 1, 0, 0, 0, 384, 1418, 1, 0, 0, 0, 386, 1422, 1, 0, 0, 0, 388, 1426, 1, 0, 0, 0, 390, 1430, 1, 0, 0, 0, 392, 1436, 1, 0, 0, 0, 394, 1442, 1, 0, 0, 0, 396, 1446, 1, 0, 0, 0, 398, 1450, 1, 0, 0, 0, 400, 1454, 1, 0, 0, 0, 402, 1460, 1, 0, 0, 0, 404, 1466, 1, 0, 0, 0, 406, 1472, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 7, 1, 0, 471, 31, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 8, 0, 0, 479, 33, 1, 0, 0, 0, 480, 481, 7, 16, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 5, 0, 0, 483, 484, 7, 12, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 9, 5, 0, 486, 35, 1, 0, 0, 0, 487, 488, 7, 16, 0, 0, 488, 489, 7, 11, 0, 0, 489, 490, 5, 95, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 14, 0, 0, 492, 493, 7, 8, 0, 0, 493, 494, 7, 12, 0, 0, 494, 495, 7, 9, 0, 0, 495, 496, 7, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 6, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 9, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 7, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 6, 0, 0, 509, 510, 7, 7, 0, 0, 510, 511, 7, 19, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 12, 0, 0, 513, 41, 1, 0, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 19, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 6, 13, 8, 0, 520, 43, 1, 0, 0, 0, 521, 522, 7, 2, 0, 0, 522, 523, 7, 7, 0, 0, 523, 524, 7, 6, 0, 0, 524, 525, 7, 5, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 14, 0, 0, 527, 45, 1, 0, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 12, 0, 0, 531, 532, 7, 5, 0, 0, 532, 533, 7, 2, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 15, 0, 0, 535, 47, 1, 0, 0, 0, 536, 537, 7, 19, 0, 0, 537, 538, 7, 10, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 3, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 16, 0, 0, 543, 49, 1, 0, 0, 0, 544, 545, 4, 17, 0, 0, 545, 546, 7, 1, 0, 0, 546, 547, 7, 9, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 1, 0, 0, 549, 550, 7, 9, 0, 0, 550, 551, 7, 3, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 12, 0, 0, 554, 555, 7, 5, 0, 0, 555, 556, 7, 2, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 4, 18, 1, 0, 560, 561, 7, 13, 0, 0, 561, 562, 7, 7, 0, 0, 562, 563, 7, 7, 0, 0, 563, 564, 7, 18, 0, 0, 564, 565, 7, 20, 0, 0, 565, 566, 7, 8, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 9, 0, 568, 53, 1, 0, 0, 0, 569, 570, 4, 19, 2, 0, 570, 571, 7, 16, 0, 0, 571, 572, 7, 12, 0, 0, 572, 573, 7, 5, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 10, 0, 0, 575, 576, 7, 2, 0, 0, 576, 577, 7, 5, 0, 0, 577, 578, 7, 6, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 6, 19, 0, 0, 580, 55, 1, 0, 0, 0, 581, 582, 4, 20, 3, 0, 582, 583, 7, 16, 0, 0, 583, 584, 7, 3, 0, 0, 584, 585, 7, 5, 0, 0, 585, 586, 7, 6, 0, 0, 586, 587, 7, 1, 0, 0, 587, 588, 7, 4, 0, 0, 588, 589, 7, 2, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 6, 20, 10, 0, 591, 57, 1, 0, 0, 0, 592, 594, 8, 21, 0, 0, 593, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 593, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 6, 21, 0, 0, 598, 59, 1, 0, 0, 0, 599, 600, 5, 47, 0, 0, 600, 601, 5, 47, 0, 0, 601, 605, 1, 0, 0, 0, 602, 604, 8, 22, 0, 0, 603, 602, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 610, 5, 13, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 613, 5, 10, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 6, 22, 11, 0, 615, 61, 1, 0, 0, 0, 616, 617, 5, 47, 0, 0, 617, 618, 5, 42, 0, 0, 618, 623, 1, 0, 0, 0, 619, 622, 3, 62, 23, 0, 620, 622, 9, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 625, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 624, 626, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 626, 627, 5, 42, 0, 0, 627, 628, 5, 47, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 6, 23, 11, 0, 630, 63, 1, 0, 0, 0, 631, 633, 7, 23, 0, 0, 632, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 637, 6, 24, 11, 0, 637, 65, 1, 0, 0, 0, 638, 639, 5, 124, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 6, 25, 12, 0, 641, 67, 1, 0, 0, 0, 642, 643, 7, 24, 0, 0, 643, 69, 1, 0, 0, 0, 644, 645, 7, 25, 0, 0, 645, 71, 1, 0, 0, 0, 646, 647, 5, 92, 0, 0, 647, 648, 7, 26, 0, 0, 648, 73, 1, 0, 0, 0, 649, 650, 8, 27, 0, 0, 650, 75, 1, 0, 0, 0, 651, 653, 7, 3, 0, 0, 652, 654, 7, 28, 0, 0, 653, 652, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 656, 1, 0, 0, 0, 655, 657, 3, 68, 26, 0, 656, 655, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 77, 1, 0, 0, 0, 660, 661, 5, 64, 0, 0, 661, 79, 1, 0, 0, 0, 662, 663, 5, 96, 0, 0, 663, 81, 1, 0, 0, 0, 664, 668, 8, 29, 0, 0, 665, 666, 5, 96, 0, 0, 666, 668, 5, 96, 0, 0, 667, 664, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 668, 83, 1, 0, 0, 0, 669, 670, 5, 95, 0, 0, 670, 85, 1, 0, 0, 0, 671, 675, 3, 70, 27, 0, 672, 675, 3, 68, 26, 0, 673, 675, 3, 84, 34, 0, 674, 671, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 674, 673, 1, 0, 0, 0, 675, 87, 1, 0, 0, 0, 676, 681, 5, 34, 0, 0, 677, 680, 3, 72, 28, 0, 678, 680, 3, 74, 29, 0, 679, 677, 1, 0, 0, 0, 679, 678, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 684, 1, 0, 0, 0, 683, 681, 1, 0, 0, 0, 684, 706, 5, 34, 0, 0, 685, 686, 5, 34, 0, 0, 686, 687, 5, 34, 0, 0, 687, 688, 5, 34, 0, 0, 688, 692, 1, 0, 0, 0, 689, 691, 8, 22, 0, 0, 690, 689, 1, 0, 0, 0, 691, 694, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 692, 690, 1, 0, 0, 0, 693, 695, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 695, 696, 5, 34, 0, 0, 696, 697, 5, 34, 0, 0, 697, 698, 5, 34, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 5, 34, 0, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 703, 1, 0, 0, 0, 702, 704, 5, 34, 0, 0, 703, 702, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 1, 0, 0, 0, 705, 676, 1, 0, 0, 0, 705, 685, 1, 0, 0, 0, 706, 89, 1, 0, 0, 0, 707, 709, 3, 68, 26, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 91, 1, 0, 0, 0, 712, 714, 3, 68, 26, 0, 713, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 721, 3, 108, 46, 0, 718, 720, 3, 68, 26, 0, 719, 718, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 755, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 726, 3, 108, 46, 0, 725, 727, 3, 68, 26, 0, 726, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 755, 1, 0, 0, 0, 730, 732, 3, 68, 26, 0, 731, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 742, 1, 0, 0, 0, 735, 739, 3, 108, 46, 0, 736, 738, 3, 68, 26, 0, 737, 736, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 735, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 3, 76, 30, 0, 745, 755, 1, 0, 0, 0, 746, 748, 3, 108, 46, 0, 747, 749, 3, 68, 26, 0, 748, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 3, 76, 30, 0, 753, 755, 1, 0, 0, 0, 754, 713, 1, 0, 0, 0, 754, 724, 1, 0, 0, 0, 754, 731, 1, 0, 0, 0, 754, 746, 1, 0, 0, 0, 755, 93, 1, 0, 0, 0, 756, 757, 7, 30, 0, 0, 757, 758, 7, 31, 0, 0, 758, 95, 1, 0, 0, 0, 759, 760, 7, 12, 0, 0, 760, 761, 7, 9, 0, 0, 761, 762, 7, 0, 0, 0, 762, 97, 1, 0, 0, 0, 763, 764, 7, 12, 0, 0, 764, 765, 7, 2, 0, 0, 765, 766, 7, 4, 0, 0, 766, 99, 1, 0, 0, 0, 767, 768, 5, 61, 0, 0, 768, 101, 1, 0, 0, 0, 769, 770, 5, 58, 0, 0, 770, 771, 5, 58, 0, 0, 771, 103, 1, 0, 0, 0, 772, 773, 5, 44, 0, 0, 773, 105, 1, 0, 0, 0, 774, 775, 7, 0, 0, 0, 775, 776, 7, 3, 0, 0, 776, 777, 7, 2, 0, 0, 777, 778, 7, 4, 0, 0, 778, 107, 1, 0, 0, 0, 779, 780, 5, 46, 0, 0, 780, 109, 1, 0, 0, 0, 781, 782, 7, 15, 0, 0, 782, 783, 7, 12, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 2, 0, 0, 785, 786, 7, 3, 0, 0, 786, 111, 1, 0, 0, 0, 787, 788, 7, 15, 0, 0, 788, 789, 7, 1, 0, 0, 789, 790, 7, 6, 0, 0, 790, 791, 7, 2, 0, 0, 791, 792, 7, 5, 0, 0, 792, 113, 1, 0, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 9, 0, 0, 795, 115, 1, 0, 0, 0, 796, 797, 7, 1, 0, 0, 797, 798, 7, 2, 0, 0, 798, 117, 1, 0, 0, 0, 799, 800, 7, 13, 0, 0, 800, 801, 7, 12, 0, 0, 801, 802, 7, 2, 0, 0, 802, 803, 7, 5, 0, 0, 803, 119, 1, 0, 0, 0, 804, 805, 7, 13, 0, 0, 805, 806, 7, 1, 0, 0, 806, 807, 7, 18, 0, 0, 807, 808, 7, 3, 0, 0, 808, 121, 1, 0, 0, 0, 809, 810, 5, 40, 0, 0, 810, 123, 1, 0, 0, 0, 811, 812, 7, 9, 0, 0, 812, 813, 7, 7, 0, 0, 813, 814, 7, 5, 0, 0, 814, 125, 1, 0, 0, 0, 815, 816, 7, 9, 0, 0, 816, 817, 7, 20, 0, 0, 817, 818, 7, 13, 0, 0, 818, 819, 7, 13, 0, 0, 819, 127, 1, 0, 0, 0, 820, 821, 7, 9, 0, 0, 821, 822, 7, 20, 0, 0, 822, 823, 7, 13, 0, 0, 823, 824, 7, 13, 0, 0, 824, 825, 7, 2, 0, 0, 825, 129, 1, 0, 0, 0, 826, 827, 7, 7, 0, 0, 827, 828, 7, 6, 0, 0, 828, 131, 1, 0, 0, 0, 829, 830, 5, 63, 0, 0, 830, 133, 1, 0, 0, 0, 831, 832, 7, 6, 0, 0, 832, 833, 7, 13, 0, 0, 833, 834, 7, 1, 0, 0, 834, 835, 7, 18, 0, 0, 835, 836, 7, 3, 0, 0, 836, 135, 1, 0, 0, 0, 837, 838, 5, 41, 0, 0, 838, 137, 1, 0, 0, 0, 839, 840, 7, 5, 0, 0, 840, 841, 7, 6, 0, 0, 841, 842, 7, 20, 0, 0, 842, 843, 7, 3, 0, 0, 843, 139, 1, 0, 0, 0, 844, 845, 5, 61, 0, 0, 845, 846, 5, 61, 0, 0, 846, 141, 1, 0, 0, 0, 847, 848, 5, 61, 0, 0, 848, 849, 5, 126, 0, 0, 849, 143, 1, 0, 0, 0, 850, 851, 5, 33, 0, 0, 851, 852, 5, 61, 0, 0, 852, 145, 1, 0, 0, 0, 853, 854, 5, 60, 0, 0, 854, 147, 1, 0, 0, 0, 855, 856, 5, 60, 0, 0, 856, 857, 5, 61, 0, 0, 857, 149, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 151, 1, 0, 0, 0, 860, 861, 5, 62, 0, 0, 861, 862, 5, 61, 0, 0, 862, 153, 1, 0, 0, 0, 863, 864, 5, 43, 0, 0, 864, 155, 1, 0, 0, 0, 865, 866, 5, 45, 0, 0, 866, 157, 1, 0, 0, 0, 867, 868, 5, 42, 0, 0, 868, 159, 1, 0, 0, 0, 869, 870, 5, 47, 0, 0, 870, 161, 1, 0, 0, 0, 871, 872, 5, 37, 0, 0, 872, 163, 1, 0, 0, 0, 873, 874, 4, 74, 4, 0, 874, 875, 3, 54, 19, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 74, 13, 0, 877, 165, 1, 0, 0, 0, 878, 881, 3, 132, 58, 0, 879, 882, 3, 70, 27, 0, 880, 882, 3, 84, 34, 0, 881, 879, 1, 0, 0, 0, 881, 880, 1, 0, 0, 0, 882, 886, 1, 0, 0, 0, 883, 885, 3, 86, 35, 0, 884, 883, 1, 0, 0, 0, 885, 888, 1, 0, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 896, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 889, 891, 3, 132, 58, 0, 890, 892, 3, 68, 26, 0, 891, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 1, 0, 0, 0, 895, 878, 1, 0, 0, 0, 895, 889, 1, 0, 0, 0, 896, 167, 1, 0, 0, 0, 897, 898, 5, 91, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 6, 76, 0, 0, 900, 901, 6, 76, 0, 0, 901, 169, 1, 0, 0, 0, 902, 903, 5, 93, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 6, 77, 12, 0, 905, 906, 6, 77, 12, 0, 906, 171, 1, 0, 0, 0, 907, 911, 3, 70, 27, 0, 908, 910, 3, 86, 35, 0, 909, 908, 1, 0, 0, 0, 910, 913, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 924, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 914, 917, 3, 84, 34, 0, 915, 917, 3, 78, 31, 0, 916, 914, 1, 0, 0, 0, 916, 915, 1, 0, 0, 0, 917, 919, 1, 0, 0, 0, 918, 920, 3, 86, 35, 0, 919, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 924, 1, 0, 0, 0, 923, 907, 1, 0, 0, 0, 923, 916, 1, 0, 0, 0, 924, 173, 1, 0, 0, 0, 925, 927, 3, 80, 32, 0, 926, 928, 3, 82, 33, 0, 927, 926, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 3, 80, 32, 0, 932, 175, 1, 0, 0, 0, 933, 934, 3, 174, 79, 0, 934, 177, 1, 0, 0, 0, 935, 936, 3, 60, 22, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 81, 11, 0, 938, 179, 1, 0, 0, 0, 939, 940, 3, 62, 23, 0, 940, 941, 1, 0, 0, 0, 941, 942, 6, 82, 11, 0, 942, 181, 1, 0, 0, 0, 943, 944, 3, 64, 24, 0, 944, 945, 1, 0, 0, 0, 945, 946, 6, 83, 11, 0, 946, 183, 1, 0, 0, 0, 947, 948, 3, 168, 76, 0, 948, 949, 1, 0, 0, 0, 949, 950, 6, 84, 14, 0, 950, 951, 6, 84, 15, 0, 951, 185, 1, 0, 0, 0, 952, 953, 3, 66, 25, 0, 953, 954, 1, 0, 0, 0, 954, 955, 6, 85, 16, 0, 955, 956, 6, 85, 12, 0, 956, 187, 1, 0, 0, 0, 957, 958, 3, 64, 24, 0, 958, 959, 1, 0, 0, 0, 959, 960, 6, 86, 11, 0, 960, 189, 1, 0, 0, 0, 961, 962, 3, 60, 22, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 87, 11, 0, 964, 191, 1, 0, 0, 0, 965, 966, 3, 62, 23, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 88, 11, 0, 968, 193, 1, 0, 0, 0, 969, 970, 3, 66, 25, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 89, 16, 0, 972, 973, 6, 89, 12, 0, 973, 195, 1, 0, 0, 0, 974, 975, 3, 168, 76, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 90, 14, 0, 977, 197, 1, 0, 0, 0, 978, 979, 3, 170, 77, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 91, 17, 0, 981, 199, 1, 0, 0, 0, 982, 983, 3, 334, 159, 0, 983, 984, 1, 0, 0, 0, 984, 985, 6, 92, 18, 0, 985, 201, 1, 0, 0, 0, 986, 987, 3, 104, 44, 0, 987, 988, 1, 0, 0, 0, 988, 989, 6, 93, 19, 0, 989, 203, 1, 0, 0, 0, 990, 991, 3, 100, 42, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 94, 20, 0, 993, 205, 1, 0, 0, 0, 994, 995, 7, 16, 0, 0, 995, 996, 7, 3, 0, 0, 996, 997, 7, 5, 0, 0, 997, 998, 7, 12, 0, 0, 998, 999, 7, 0, 0, 0, 999, 1000, 7, 12, 0, 0, 1000, 1001, 7, 5, 0, 0, 1001, 1002, 7, 12, 0, 0, 1002, 207, 1, 0, 0, 0, 1003, 1007, 8, 32, 0, 0, 1004, 1005, 5, 47, 0, 0, 1005, 1007, 8, 33, 0, 0, 1006, 1003, 1, 0, 0, 0, 1006, 1004, 1, 0, 0, 0, 1007, 209, 1, 0, 0, 0, 1008, 1010, 3, 208, 96, 0, 1009, 1008, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 211, 1, 0, 0, 0, 1013, 1014, 3, 210, 97, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 6, 98, 21, 0, 1016, 213, 1, 0, 0, 0, 1017, 1018, 3, 88, 36, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 6, 99, 22, 0, 1020, 215, 1, 0, 0, 0, 1021, 1022, 3, 60, 22, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 6, 100, 11, 0, 1024, 217, 1, 0, 0, 0, 1025, 1026, 3, 62, 23, 0, 1026, 1027, 1, 0, 0, 0, 1027, 1028, 6, 101, 11, 0, 1028, 219, 1, 0, 0, 0, 1029, 1030, 3, 64, 24, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1032, 6, 102, 11, 0, 1032, 221, 1, 0, 0, 0, 1033, 1034, 3, 66, 25, 0, 1034, 1035, 1, 0, 0, 0, 1035, 1036, 6, 103, 16, 0, 1036, 1037, 6, 103, 12, 0, 1037, 223, 1, 0, 0, 0, 1038, 1039, 3, 108, 46, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 104, 23, 0, 1041, 225, 1, 0, 0, 0, 1042, 1043, 3, 104, 44, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 6, 105, 19, 0, 1045, 227, 1, 0, 0, 0, 1046, 1051, 3, 70, 27, 0, 1047, 1051, 3, 68, 26, 0, 1048, 1051, 3, 84, 34, 0, 1049, 1051, 3, 158, 71, 0, 1050, 1046, 1, 0, 0, 0, 1050, 1047, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1049, 1, 0, 0, 0, 1051, 229, 1, 0, 0, 0, 1052, 1055, 3, 70, 27, 0, 1053, 1055, 3, 158, 71, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1059, 1, 0, 0, 0, 1056, 1058, 3, 228, 106, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1072, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1065, 3, 84, 34, 0, 1063, 1065, 3, 78, 31, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 1067, 1, 0, 0, 0, 1066, 1068, 3, 228, 106, 0, 1067, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1072, 1, 0, 0, 0, 1071, 1054, 1, 0, 0, 0, 1071, 1064, 1, 0, 0, 0, 1072, 231, 1, 0, 0, 0, 1073, 1076, 3, 230, 107, 0, 1074, 1076, 3, 174, 79, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1078, 1, 0, 0, 0, 1078, 233, 1, 0, 0, 0, 1079, 1080, 3, 60, 22, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 109, 11, 0, 1082, 235, 1, 0, 0, 0, 1083, 1084, 3, 62, 23, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 110, 11, 0, 1086, 237, 1, 0, 0, 0, 1087, 1088, 3, 64, 24, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 111, 11, 0, 1090, 239, 1, 0, 0, 0, 1091, 1092, 3, 66, 25, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 112, 16, 0, 1094, 1095, 6, 112, 12, 0, 1095, 241, 1, 0, 0, 0, 1096, 1097, 3, 100, 42, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 113, 20, 0, 1099, 243, 1, 0, 0, 0, 1100, 1101, 3, 104, 44, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 114, 19, 0, 1103, 245, 1, 0, 0, 0, 1104, 1105, 3, 108, 46, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 115, 23, 0, 1107, 247, 1, 0, 0, 0, 1108, 1109, 7, 12, 0, 0, 1109, 1110, 7, 2, 0, 0, 1110, 249, 1, 0, 0, 0, 1111, 1112, 3, 232, 108, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 117, 24, 0, 1114, 251, 1, 0, 0, 0, 1115, 1116, 3, 60, 22, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 118, 11, 0, 1118, 253, 1, 0, 0, 0, 1119, 1120, 3, 62, 23, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 119, 11, 0, 1122, 255, 1, 0, 0, 0, 1123, 1124, 3, 64, 24, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 120, 11, 0, 1126, 257, 1, 0, 0, 0, 1127, 1128, 3, 66, 25, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 121, 16, 0, 1130, 1131, 6, 121, 12, 0, 1131, 259, 1, 0, 0, 0, 1132, 1133, 3, 168, 76, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 122, 14, 0, 1135, 1136, 6, 122, 25, 0, 1136, 261, 1, 0, 0, 0, 1137, 1138, 7, 7, 0, 0, 1138, 1139, 7, 9, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 123, 26, 0, 1141, 263, 1, 0, 0, 0, 1142, 1143, 7, 19, 0, 0, 1143, 1144, 7, 1, 0, 0, 1144, 1145, 7, 5, 0, 0, 1145, 1146, 7, 10, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 124, 26, 0, 1148, 265, 1, 0, 0, 0, 1149, 1150, 8, 34, 0, 0, 1150, 267, 1, 0, 0, 0, 1151, 1153, 3, 266, 125, 0, 1152, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 3, 334, 159, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1152, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1161, 1, 0, 0, 0, 1160, 1162, 3, 266, 125, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 269, 1, 0, 0, 0, 1165, 1166, 3, 268, 126, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 127, 27, 0, 1168, 271, 1, 0, 0, 0, 1169, 1170, 3, 60, 22, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 6, 128, 11, 0, 1172, 273, 1, 0, 0, 0, 1173, 1174, 3, 62, 23, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 6, 129, 11, 0, 1176, 275, 1, 0, 0, 0, 1177, 1178, 3, 64, 24, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1180, 6, 130, 11, 0, 1180, 277, 1, 0, 0, 0, 1181, 1182, 3, 66, 25, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 6, 131, 16, 0, 1184, 1185, 6, 131, 12, 0, 1185, 1186, 6, 131, 12, 0, 1186, 279, 1, 0, 0, 0, 1187, 1188, 3, 100, 42, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 132, 20, 0, 1190, 281, 1, 0, 0, 0, 1191, 1192, 3, 104, 44, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 133, 19, 0, 1194, 283, 1, 0, 0, 0, 1195, 1196, 3, 108, 46, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 134, 23, 0, 1198, 285, 1, 0, 0, 0, 1199, 1200, 3, 264, 124, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 135, 28, 0, 1202, 287, 1, 0, 0, 0, 1203, 1204, 3, 232, 108, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1206, 6, 136, 24, 0, 1206, 289, 1, 0, 0, 0, 1207, 1208, 3, 176, 80, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 6, 137, 29, 0, 1210, 291, 1, 0, 0, 0, 1211, 1212, 3, 60, 22, 0, 1212, 1213, 1, 0, 0, 0, 1213, 1214, 6, 138, 11, 0, 1214, 293, 1, 0, 0, 0, 1215, 1216, 3, 62, 23, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 6, 139, 11, 0, 1218, 295, 1, 0, 0, 0, 1219, 1220, 3, 64, 24, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 6, 140, 11, 0, 1222, 297, 1, 0, 0, 0, 1223, 1224, 3, 66, 25, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1226, 6, 141, 16, 0, 1226, 1227, 6, 141, 12, 0, 1227, 299, 1, 0, 0, 0, 1228, 1229, 3, 108, 46, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 142, 23, 0, 1231, 301, 1, 0, 0, 0, 1232, 1233, 3, 176, 80, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 143, 29, 0, 1235, 303, 1, 0, 0, 0, 1236, 1237, 3, 172, 78, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 144, 30, 0, 1239, 305, 1, 0, 0, 0, 1240, 1241, 3, 60, 22, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 145, 11, 0, 1243, 307, 1, 0, 0, 0, 1244, 1245, 3, 62, 23, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 146, 11, 0, 1247, 309, 1, 0, 0, 0, 1248, 1249, 3, 64, 24, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 147, 11, 0, 1251, 311, 1, 0, 0, 0, 1252, 1253, 3, 66, 25, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 148, 16, 0, 1255, 1256, 6, 148, 12, 0, 1256, 313, 1, 0, 0, 0, 1257, 1258, 7, 1, 0, 0, 1258, 1259, 7, 9, 0, 0, 1259, 1260, 7, 15, 0, 0, 1260, 1261, 7, 7, 0, 0, 1261, 315, 1, 0, 0, 0, 1262, 1263, 3, 60, 22, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 150, 11, 0, 1265, 317, 1, 0, 0, 0, 1266, 1267, 3, 62, 23, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 151, 11, 0, 1269, 319, 1, 0, 0, 0, 1270, 1271, 3, 64, 24, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 152, 11, 0, 1273, 321, 1, 0, 0, 0, 1274, 1275, 3, 66, 25, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 153, 16, 0, 1277, 1278, 6, 153, 12, 0, 1278, 323, 1, 0, 0, 0, 1279, 1280, 7, 15, 0, 0, 1280, 1281, 7, 20, 0, 0, 1281, 1282, 7, 9, 0, 0, 1282, 1283, 7, 4, 0, 0, 1283, 1284, 7, 5, 0, 0, 1284, 1285, 7, 1, 0, 0, 1285, 1286, 7, 7, 0, 0, 1286, 1287, 7, 9, 0, 0, 1287, 1288, 7, 2, 0, 0, 1288, 325, 1, 0, 0, 0, 1289, 1290, 3, 60, 22, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 155, 11, 0, 1292, 327, 1, 0, 0, 0, 1293, 1294, 3, 62, 23, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1296, 6, 156, 11, 0, 1296, 329, 1, 0, 0, 0, 1297, 1298, 3, 64, 24, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 6, 157, 11, 0, 1300, 331, 1, 0, 0, 0, 1301, 1302, 3, 170, 77, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 6, 158, 17, 0, 1304, 1305, 6, 158, 12, 0, 1305, 333, 1, 0, 0, 0, 1306, 1307, 5, 58, 0, 0, 1307, 335, 1, 0, 0, 0, 1308, 1314, 3, 78, 31, 0, 1309, 1314, 3, 68, 26, 0, 1310, 1314, 3, 108, 46, 0, 1311, 1314, 3, 70, 27, 0, 1312, 1314, 3, 84, 34, 0, 1313, 1308, 1, 0, 0, 0, 1313, 1309, 1, 0, 0, 0, 1313, 1310, 1, 0, 0, 0, 1313, 1311, 1, 0, 0, 0, 1313, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1313, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 337, 1, 0, 0, 0, 1317, 1318, 3, 60, 22, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 6, 161, 11, 0, 1320, 339, 1, 0, 0, 0, 1321, 1322, 3, 62, 23, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 6, 162, 11, 0, 1324, 341, 1, 0, 0, 0, 1325, 1326, 3, 64, 24, 0, 1326, 1327, 1, 0, 0, 0, 1327, 1328, 6, 163, 11, 0, 1328, 343, 1, 0, 0, 0, 1329, 1330, 3, 66, 25, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1332, 6, 164, 16, 0, 1332, 1333, 6, 164, 12, 0, 1333, 345, 1, 0, 0, 0, 1334, 1335, 3, 334, 159, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 165, 18, 0, 1337, 347, 1, 0, 0, 0, 1338, 1339, 3, 104, 44, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 166, 19, 0, 1341, 349, 1, 0, 0, 0, 1342, 1343, 3, 108, 46, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 167, 23, 0, 1345, 351, 1, 0, 0, 0, 1346, 1347, 3, 262, 123, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 168, 31, 0, 1349, 1350, 6, 168, 32, 0, 1350, 353, 1, 0, 0, 0, 1351, 1352, 3, 210, 97, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 6, 169, 21, 0, 1354, 355, 1, 0, 0, 0, 1355, 1356, 3, 88, 36, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1358, 6, 170, 22, 0, 1358, 357, 1, 0, 0, 0, 1359, 1360, 3, 60, 22, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 171, 11, 0, 1362, 359, 1, 0, 0, 0, 1363, 1364, 3, 62, 23, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 172, 11, 0, 1366, 361, 1, 0, 0, 0, 1367, 1368, 3, 64, 24, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 6, 173, 11, 0, 1370, 363, 1, 0, 0, 0, 1371, 1372, 3, 66, 25, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1374, 6, 174, 16, 0, 1374, 1375, 6, 174, 12, 0, 1375, 1376, 6, 174, 12, 0, 1376, 365, 1, 0, 0, 0, 1377, 1378, 3, 104, 44, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 175, 19, 0, 1380, 367, 1, 0, 0, 0, 1381, 1382, 3, 108, 46, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, 176, 23, 0, 1384, 369, 1, 0, 0, 0, 1385, 1386, 3, 232, 108, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 6, 177, 24, 0, 1388, 371, 1, 0, 0, 0, 1389, 1390, 3, 60, 22, 0, 1390, 1391, 1, 0, 0, 0, 1391, 1392, 6, 178, 11, 0, 1392, 373, 1, 0, 0, 0, 1393, 1394, 3, 62, 23, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 179, 11, 0, 1396, 375, 1, 0, 0, 0, 1397, 1398, 3, 64, 24, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 6, 180, 11, 0, 1400, 377, 1, 0, 0, 0, 1401, 1402, 3, 66, 25, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 6, 181, 16, 0, 1404, 1405, 6, 181, 12, 0, 1405, 379, 1, 0, 0, 0, 1406, 1407, 3, 210, 97, 0, 1407, 1408, 1, 0, 0, 0, 1408, 1409, 6, 182, 21, 0, 1409, 1410, 6, 182, 12, 0, 1410, 1411, 6, 182, 33, 0, 1411, 381, 1, 0, 0, 0, 1412, 1413, 3, 88, 36, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1415, 6, 183, 22, 0, 1415, 1416, 6, 183, 12, 0, 1416, 1417, 6, 183, 33, 0, 1417, 383, 1, 0, 0, 0, 1418, 1419, 3, 60, 22, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 6, 184, 11, 0, 1421, 385, 1, 0, 0, 0, 1422, 1423, 3, 62, 23, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1425, 6, 185, 11, 0, 1425, 387, 1, 0, 0, 0, 1426, 1427, 3, 64, 24, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1429, 6, 186, 11, 0, 1429, 389, 1, 0, 0, 0, 1430, 1431, 3, 334, 159, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1433, 6, 187, 18, 0, 1433, 1434, 6, 187, 12, 0, 1434, 1435, 6, 187, 10, 0, 1435, 391, 1, 0, 0, 0, 1436, 1437, 3, 104, 44, 0, 1437, 1438, 1, 0, 0, 0, 1438, 1439, 6, 188, 19, 0, 1439, 1440, 6, 188, 12, 0, 1440, 1441, 6, 188, 10, 0, 1441, 393, 1, 0, 0, 0, 1442, 1443, 3, 60, 22, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1445, 6, 189, 11, 0, 1445, 395, 1, 0, 0, 0, 1446, 1447, 3, 62, 23, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1449, 6, 190, 11, 0, 1449, 397, 1, 0, 0, 0, 1450, 1451, 3, 64, 24, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1453, 6, 191, 11, 0, 1453, 399, 1, 0, 0, 0, 1454, 1455, 3, 176, 80, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 192, 12, 0, 1457, 1458, 6, 192, 0, 0, 1458, 1459, 6, 192, 29, 0, 1459, 401, 1, 0, 0, 0, 1460, 1461, 3, 172, 78, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 6, 193, 12, 0, 1463, 1464, 6, 193, 0, 0, 1464, 1465, 6, 193, 30, 0, 1465, 403, 1, 0, 0, 0, 1466, 1467, 3, 94, 39, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 6, 194, 12, 0, 1469, 1470, 6, 194, 0, 0, 1470, 1471, 6, 194, 34, 0, 1471, 405, 1, 0, 0, 0, 1472, 1473, 3, 66, 25, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 195, 16, 0, 1475, 1476, 6, 195, 12, 0, 1476, 407, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 595, 605, 609, 612, 621, 623, 634, 653, 658, 667, 674, 679, 681, 692, 700, 703, 705, 710, 715, 721, 728, 733, 739, 742, 750, 754, 881, 886, 893, 895, 911, 916, 921, 923, 929, 1006, 1011, 1050, 1054, 1059, 1064, 1069, 1071, 1075, 1077, 1154, 1158, 1163, 1313, 1315, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 20, 0, 7, 66, 0, 5, 0, 0, 7, 26, 0, 7, 67, 0, 7, 109, 0, 7, 35, 0, 7, 33, 0, 7, 77, 0, 7, 27, 0, 7, 37, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 30, 0] \ No newline at end of file +[4, 0, 125, 1474, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 591, 8, 21, 11, 21, 12, 21, 592, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 601, 8, 22, 10, 22, 12, 22, 604, 9, 22, 1, 22, 3, 22, 607, 8, 22, 1, 22, 3, 22, 610, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 619, 8, 23, 10, 23, 12, 23, 622, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 630, 8, 24, 11, 24, 12, 24, 631, 1, 24, 1, 24, 1, 25, 1, 25, 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, 3, 30, 651, 8, 30, 1, 30, 4, 30, 654, 8, 30, 11, 30, 12, 30, 655, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 665, 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 672, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 677, 8, 36, 10, 36, 12, 36, 680, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 688, 8, 36, 10, 36, 12, 36, 691, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 698, 8, 36, 1, 36, 3, 36, 701, 8, 36, 3, 36, 703, 8, 36, 1, 37, 4, 37, 706, 8, 37, 11, 37, 12, 37, 707, 1, 38, 4, 38, 711, 8, 38, 11, 38, 12, 38, 712, 1, 38, 1, 38, 5, 38, 717, 8, 38, 10, 38, 12, 38, 720, 9, 38, 1, 38, 1, 38, 4, 38, 724, 8, 38, 11, 38, 12, 38, 725, 1, 38, 4, 38, 729, 8, 38, 11, 38, 12, 38, 730, 1, 38, 1, 38, 5, 38, 735, 8, 38, 10, 38, 12, 38, 738, 9, 38, 3, 38, 740, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 4, 38, 746, 8, 38, 11, 38, 12, 38, 747, 1, 38, 1, 38, 3, 38, 752, 8, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 3, 75, 879, 8, 75, 1, 75, 5, 75, 882, 8, 75, 10, 75, 12, 75, 885, 9, 75, 1, 75, 1, 75, 4, 75, 889, 8, 75, 11, 75, 12, 75, 890, 3, 75, 893, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 907, 8, 78, 10, 78, 12, 78, 910, 9, 78, 1, 78, 1, 78, 3, 78, 914, 8, 78, 1, 78, 4, 78, 917, 8, 78, 11, 78, 12, 78, 918, 3, 78, 921, 8, 78, 1, 79, 1, 79, 4, 79, 925, 8, 79, 11, 79, 12, 79, 926, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 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, 3, 96, 1004, 8, 96, 1, 97, 4, 97, 1007, 8, 97, 11, 97, 12, 97, 1008, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1048, 8, 106, 1, 107, 1, 107, 3, 107, 1052, 8, 107, 1, 107, 5, 107, 1055, 8, 107, 10, 107, 12, 107, 1058, 9, 107, 1, 107, 1, 107, 3, 107, 1062, 8, 107, 1, 107, 4, 107, 1065, 8, 107, 11, 107, 12, 107, 1066, 3, 107, 1069, 8, 107, 1, 108, 1, 108, 4, 108, 1073, 8, 108, 11, 108, 12, 108, 1074, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 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, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1150, 8, 126, 11, 126, 12, 126, 1151, 1, 126, 1, 126, 3, 126, 1156, 8, 126, 1, 126, 4, 126, 1159, 8, 126, 11, 126, 12, 126, 1160, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 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, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 4, 160, 1311, 8, 160, 11, 160, 12, 160, 1312, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 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, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 620, 689, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 0, 166, 65, 168, 66, 170, 67, 172, 68, 174, 0, 176, 69, 178, 70, 180, 71, 182, 72, 184, 0, 186, 0, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 0, 214, 0, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 81, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 0, 246, 0, 248, 85, 250, 0, 252, 86, 254, 87, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 0, 268, 91, 270, 0, 272, 92, 274, 93, 276, 94, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 95, 294, 96, 296, 97, 298, 0, 300, 0, 302, 0, 304, 0, 306, 98, 308, 99, 310, 100, 312, 0, 314, 101, 316, 102, 318, 103, 320, 104, 322, 0, 324, 105, 326, 106, 328, 107, 330, 108, 332, 0, 334, 109, 336, 110, 338, 111, 340, 112, 342, 113, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 115, 362, 116, 364, 0, 366, 0, 368, 0, 370, 0, 372, 117, 374, 118, 376, 119, 378, 0, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 123, 396, 124, 398, 125, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1501, 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, 1, 66, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 172, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 472, 1, 0, 0, 0, 34, 480, 1, 0, 0, 0, 36, 487, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 514, 1, 0, 0, 0, 44, 521, 1, 0, 0, 0, 46, 528, 1, 0, 0, 0, 48, 536, 1, 0, 0, 0, 50, 544, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 578, 1, 0, 0, 0, 58, 590, 1, 0, 0, 0, 60, 596, 1, 0, 0, 0, 62, 613, 1, 0, 0, 0, 64, 629, 1, 0, 0, 0, 66, 635, 1, 0, 0, 0, 68, 639, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 646, 1, 0, 0, 0, 76, 648, 1, 0, 0, 0, 78, 657, 1, 0, 0, 0, 80, 659, 1, 0, 0, 0, 82, 664, 1, 0, 0, 0, 84, 666, 1, 0, 0, 0, 86, 671, 1, 0, 0, 0, 88, 702, 1, 0, 0, 0, 90, 705, 1, 0, 0, 0, 92, 751, 1, 0, 0, 0, 94, 753, 1, 0, 0, 0, 96, 756, 1, 0, 0, 0, 98, 760, 1, 0, 0, 0, 100, 764, 1, 0, 0, 0, 102, 766, 1, 0, 0, 0, 104, 769, 1, 0, 0, 0, 106, 771, 1, 0, 0, 0, 108, 776, 1, 0, 0, 0, 110, 778, 1, 0, 0, 0, 112, 784, 1, 0, 0, 0, 114, 790, 1, 0, 0, 0, 116, 793, 1, 0, 0, 0, 118, 796, 1, 0, 0, 0, 120, 801, 1, 0, 0, 0, 122, 806, 1, 0, 0, 0, 124, 808, 1, 0, 0, 0, 126, 812, 1, 0, 0, 0, 128, 817, 1, 0, 0, 0, 130, 823, 1, 0, 0, 0, 132, 826, 1, 0, 0, 0, 134, 828, 1, 0, 0, 0, 136, 834, 1, 0, 0, 0, 138, 836, 1, 0, 0, 0, 140, 841, 1, 0, 0, 0, 142, 844, 1, 0, 0, 0, 144, 847, 1, 0, 0, 0, 146, 850, 1, 0, 0, 0, 148, 852, 1, 0, 0, 0, 150, 855, 1, 0, 0, 0, 152, 857, 1, 0, 0, 0, 154, 860, 1, 0, 0, 0, 156, 862, 1, 0, 0, 0, 158, 864, 1, 0, 0, 0, 160, 866, 1, 0, 0, 0, 162, 868, 1, 0, 0, 0, 164, 870, 1, 0, 0, 0, 166, 892, 1, 0, 0, 0, 168, 894, 1, 0, 0, 0, 170, 899, 1, 0, 0, 0, 172, 920, 1, 0, 0, 0, 174, 922, 1, 0, 0, 0, 176, 930, 1, 0, 0, 0, 178, 932, 1, 0, 0, 0, 180, 936, 1, 0, 0, 0, 182, 940, 1, 0, 0, 0, 184, 944, 1, 0, 0, 0, 186, 949, 1, 0, 0, 0, 188, 954, 1, 0, 0, 0, 190, 958, 1, 0, 0, 0, 192, 962, 1, 0, 0, 0, 194, 966, 1, 0, 0, 0, 196, 971, 1, 0, 0, 0, 198, 975, 1, 0, 0, 0, 200, 979, 1, 0, 0, 0, 202, 983, 1, 0, 0, 0, 204, 987, 1, 0, 0, 0, 206, 991, 1, 0, 0, 0, 208, 1003, 1, 0, 0, 0, 210, 1006, 1, 0, 0, 0, 212, 1010, 1, 0, 0, 0, 214, 1014, 1, 0, 0, 0, 216, 1018, 1, 0, 0, 0, 218, 1022, 1, 0, 0, 0, 220, 1026, 1, 0, 0, 0, 222, 1030, 1, 0, 0, 0, 224, 1035, 1, 0, 0, 0, 226, 1039, 1, 0, 0, 0, 228, 1047, 1, 0, 0, 0, 230, 1068, 1, 0, 0, 0, 232, 1072, 1, 0, 0, 0, 234, 1076, 1, 0, 0, 0, 236, 1080, 1, 0, 0, 0, 238, 1084, 1, 0, 0, 0, 240, 1088, 1, 0, 0, 0, 242, 1093, 1, 0, 0, 0, 244, 1097, 1, 0, 0, 0, 246, 1101, 1, 0, 0, 0, 248, 1105, 1, 0, 0, 0, 250, 1108, 1, 0, 0, 0, 252, 1112, 1, 0, 0, 0, 254, 1116, 1, 0, 0, 0, 256, 1120, 1, 0, 0, 0, 258, 1124, 1, 0, 0, 0, 260, 1129, 1, 0, 0, 0, 262, 1134, 1, 0, 0, 0, 264, 1139, 1, 0, 0, 0, 266, 1146, 1, 0, 0, 0, 268, 1155, 1, 0, 0, 0, 270, 1162, 1, 0, 0, 0, 272, 1166, 1, 0, 0, 0, 274, 1170, 1, 0, 0, 0, 276, 1174, 1, 0, 0, 0, 278, 1178, 1, 0, 0, 0, 280, 1184, 1, 0, 0, 0, 282, 1188, 1, 0, 0, 0, 284, 1192, 1, 0, 0, 0, 286, 1196, 1, 0, 0, 0, 288, 1200, 1, 0, 0, 0, 290, 1204, 1, 0, 0, 0, 292, 1208, 1, 0, 0, 0, 294, 1212, 1, 0, 0, 0, 296, 1216, 1, 0, 0, 0, 298, 1220, 1, 0, 0, 0, 300, 1225, 1, 0, 0, 0, 302, 1229, 1, 0, 0, 0, 304, 1233, 1, 0, 0, 0, 306, 1237, 1, 0, 0, 0, 308, 1241, 1, 0, 0, 0, 310, 1245, 1, 0, 0, 0, 312, 1249, 1, 0, 0, 0, 314, 1254, 1, 0, 0, 0, 316, 1259, 1, 0, 0, 0, 318, 1263, 1, 0, 0, 0, 320, 1267, 1, 0, 0, 0, 322, 1271, 1, 0, 0, 0, 324, 1276, 1, 0, 0, 0, 326, 1286, 1, 0, 0, 0, 328, 1290, 1, 0, 0, 0, 330, 1294, 1, 0, 0, 0, 332, 1298, 1, 0, 0, 0, 334, 1303, 1, 0, 0, 0, 336, 1310, 1, 0, 0, 0, 338, 1314, 1, 0, 0, 0, 340, 1318, 1, 0, 0, 0, 342, 1322, 1, 0, 0, 0, 344, 1326, 1, 0, 0, 0, 346, 1331, 1, 0, 0, 0, 348, 1335, 1, 0, 0, 0, 350, 1339, 1, 0, 0, 0, 352, 1343, 1, 0, 0, 0, 354, 1348, 1, 0, 0, 0, 356, 1352, 1, 0, 0, 0, 358, 1356, 1, 0, 0, 0, 360, 1360, 1, 0, 0, 0, 362, 1364, 1, 0, 0, 0, 364, 1368, 1, 0, 0, 0, 366, 1374, 1, 0, 0, 0, 368, 1378, 1, 0, 0, 0, 370, 1382, 1, 0, 0, 0, 372, 1386, 1, 0, 0, 0, 374, 1390, 1, 0, 0, 0, 376, 1394, 1, 0, 0, 0, 378, 1398, 1, 0, 0, 0, 380, 1403, 1, 0, 0, 0, 382, 1409, 1, 0, 0, 0, 384, 1415, 1, 0, 0, 0, 386, 1419, 1, 0, 0, 0, 388, 1423, 1, 0, 0, 0, 390, 1427, 1, 0, 0, 0, 392, 1433, 1, 0, 0, 0, 394, 1439, 1, 0, 0, 0, 396, 1443, 1, 0, 0, 0, 398, 1447, 1, 0, 0, 0, 400, 1451, 1, 0, 0, 0, 402, 1457, 1, 0, 0, 0, 404, 1463, 1, 0, 0, 0, 406, 1469, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 7, 1, 0, 471, 31, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 8, 0, 0, 479, 33, 1, 0, 0, 0, 480, 481, 7, 16, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 5, 0, 0, 483, 484, 7, 12, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 9, 5, 0, 486, 35, 1, 0, 0, 0, 487, 488, 7, 16, 0, 0, 488, 489, 7, 11, 0, 0, 489, 490, 5, 95, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 14, 0, 0, 492, 493, 7, 8, 0, 0, 493, 494, 7, 12, 0, 0, 494, 495, 7, 9, 0, 0, 495, 496, 7, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 6, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 9, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 7, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 6, 0, 0, 509, 510, 7, 7, 0, 0, 510, 511, 7, 19, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 12, 0, 0, 513, 41, 1, 0, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 19, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 6, 13, 8, 0, 520, 43, 1, 0, 0, 0, 521, 522, 7, 2, 0, 0, 522, 523, 7, 7, 0, 0, 523, 524, 7, 6, 0, 0, 524, 525, 7, 5, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 14, 0, 0, 527, 45, 1, 0, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 12, 0, 0, 531, 532, 7, 5, 0, 0, 532, 533, 7, 2, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 15, 0, 0, 535, 47, 1, 0, 0, 0, 536, 537, 7, 19, 0, 0, 537, 538, 7, 10, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 3, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 16, 0, 0, 543, 49, 1, 0, 0, 0, 544, 545, 4, 17, 0, 0, 545, 546, 7, 1, 0, 0, 546, 547, 7, 9, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 1, 0, 0, 549, 550, 7, 9, 0, 0, 550, 551, 7, 3, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 12, 0, 0, 554, 555, 7, 5, 0, 0, 555, 556, 7, 2, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 4, 18, 1, 0, 560, 561, 7, 13, 0, 0, 561, 562, 7, 7, 0, 0, 562, 563, 7, 7, 0, 0, 563, 564, 7, 18, 0, 0, 564, 565, 7, 20, 0, 0, 565, 566, 7, 8, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 9, 0, 568, 53, 1, 0, 0, 0, 569, 570, 4, 19, 2, 0, 570, 571, 7, 16, 0, 0, 571, 572, 7, 12, 0, 0, 572, 573, 7, 5, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 10, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 19, 0, 0, 577, 55, 1, 0, 0, 0, 578, 579, 4, 20, 3, 0, 579, 580, 7, 16, 0, 0, 580, 581, 7, 3, 0, 0, 581, 582, 7, 5, 0, 0, 582, 583, 7, 6, 0, 0, 583, 584, 7, 1, 0, 0, 584, 585, 7, 4, 0, 0, 585, 586, 7, 2, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 6, 20, 10, 0, 588, 57, 1, 0, 0, 0, 589, 591, 8, 21, 0, 0, 590, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 6, 21, 0, 0, 595, 59, 1, 0, 0, 0, 596, 597, 5, 47, 0, 0, 597, 598, 5, 47, 0, 0, 598, 602, 1, 0, 0, 0, 599, 601, 8, 22, 0, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 606, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 607, 5, 13, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 10, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 6, 22, 11, 0, 612, 61, 1, 0, 0, 0, 613, 614, 5, 47, 0, 0, 614, 615, 5, 42, 0, 0, 615, 620, 1, 0, 0, 0, 616, 619, 3, 62, 23, 0, 617, 619, 9, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 617, 1, 0, 0, 0, 619, 622, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 623, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 624, 5, 42, 0, 0, 624, 625, 5, 47, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 23, 11, 0, 627, 63, 1, 0, 0, 0, 628, 630, 7, 23, 0, 0, 629, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 24, 11, 0, 634, 65, 1, 0, 0, 0, 635, 636, 5, 124, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 6, 25, 12, 0, 638, 67, 1, 0, 0, 0, 639, 640, 7, 24, 0, 0, 640, 69, 1, 0, 0, 0, 641, 642, 7, 25, 0, 0, 642, 71, 1, 0, 0, 0, 643, 644, 5, 92, 0, 0, 644, 645, 7, 26, 0, 0, 645, 73, 1, 0, 0, 0, 646, 647, 8, 27, 0, 0, 647, 75, 1, 0, 0, 0, 648, 650, 7, 3, 0, 0, 649, 651, 7, 28, 0, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 653, 1, 0, 0, 0, 652, 654, 3, 68, 26, 0, 653, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 77, 1, 0, 0, 0, 657, 658, 5, 64, 0, 0, 658, 79, 1, 0, 0, 0, 659, 660, 5, 96, 0, 0, 660, 81, 1, 0, 0, 0, 661, 665, 8, 29, 0, 0, 662, 663, 5, 96, 0, 0, 663, 665, 5, 96, 0, 0, 664, 661, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 83, 1, 0, 0, 0, 666, 667, 5, 95, 0, 0, 667, 85, 1, 0, 0, 0, 668, 672, 3, 70, 27, 0, 669, 672, 3, 68, 26, 0, 670, 672, 3, 84, 34, 0, 671, 668, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 670, 1, 0, 0, 0, 672, 87, 1, 0, 0, 0, 673, 678, 5, 34, 0, 0, 674, 677, 3, 72, 28, 0, 675, 677, 3, 74, 29, 0, 676, 674, 1, 0, 0, 0, 676, 675, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 703, 5, 34, 0, 0, 682, 683, 5, 34, 0, 0, 683, 684, 5, 34, 0, 0, 684, 685, 5, 34, 0, 0, 685, 689, 1, 0, 0, 0, 686, 688, 8, 22, 0, 0, 687, 686, 1, 0, 0, 0, 688, 691, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 692, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 692, 693, 5, 34, 0, 0, 693, 694, 5, 34, 0, 0, 694, 695, 5, 34, 0, 0, 695, 697, 1, 0, 0, 0, 696, 698, 5, 34, 0, 0, 697, 696, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 5, 34, 0, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 703, 1, 0, 0, 0, 702, 673, 1, 0, 0, 0, 702, 682, 1, 0, 0, 0, 703, 89, 1, 0, 0, 0, 704, 706, 3, 68, 26, 0, 705, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 91, 1, 0, 0, 0, 709, 711, 3, 68, 26, 0, 710, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 718, 3, 108, 46, 0, 715, 717, 3, 68, 26, 0, 716, 715, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 752, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 723, 3, 108, 46, 0, 722, 724, 3, 68, 26, 0, 723, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 752, 1, 0, 0, 0, 727, 729, 3, 68, 26, 0, 728, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 739, 1, 0, 0, 0, 732, 736, 3, 108, 46, 0, 733, 735, 3, 68, 26, 0, 734, 733, 1, 0, 0, 0, 735, 738, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 732, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 3, 76, 30, 0, 742, 752, 1, 0, 0, 0, 743, 745, 3, 108, 46, 0, 744, 746, 3, 68, 26, 0, 745, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 3, 76, 30, 0, 750, 752, 1, 0, 0, 0, 751, 710, 1, 0, 0, 0, 751, 721, 1, 0, 0, 0, 751, 728, 1, 0, 0, 0, 751, 743, 1, 0, 0, 0, 752, 93, 1, 0, 0, 0, 753, 754, 7, 30, 0, 0, 754, 755, 7, 31, 0, 0, 755, 95, 1, 0, 0, 0, 756, 757, 7, 12, 0, 0, 757, 758, 7, 9, 0, 0, 758, 759, 7, 0, 0, 0, 759, 97, 1, 0, 0, 0, 760, 761, 7, 12, 0, 0, 761, 762, 7, 2, 0, 0, 762, 763, 7, 4, 0, 0, 763, 99, 1, 0, 0, 0, 764, 765, 5, 61, 0, 0, 765, 101, 1, 0, 0, 0, 766, 767, 5, 58, 0, 0, 767, 768, 5, 58, 0, 0, 768, 103, 1, 0, 0, 0, 769, 770, 5, 44, 0, 0, 770, 105, 1, 0, 0, 0, 771, 772, 7, 0, 0, 0, 772, 773, 7, 3, 0, 0, 773, 774, 7, 2, 0, 0, 774, 775, 7, 4, 0, 0, 775, 107, 1, 0, 0, 0, 776, 777, 5, 46, 0, 0, 777, 109, 1, 0, 0, 0, 778, 779, 7, 15, 0, 0, 779, 780, 7, 12, 0, 0, 780, 781, 7, 13, 0, 0, 781, 782, 7, 2, 0, 0, 782, 783, 7, 3, 0, 0, 783, 111, 1, 0, 0, 0, 784, 785, 7, 15, 0, 0, 785, 786, 7, 1, 0, 0, 786, 787, 7, 6, 0, 0, 787, 788, 7, 2, 0, 0, 788, 789, 7, 5, 0, 0, 789, 113, 1, 0, 0, 0, 790, 791, 7, 1, 0, 0, 791, 792, 7, 9, 0, 0, 792, 115, 1, 0, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 2, 0, 0, 795, 117, 1, 0, 0, 0, 796, 797, 7, 13, 0, 0, 797, 798, 7, 12, 0, 0, 798, 799, 7, 2, 0, 0, 799, 800, 7, 5, 0, 0, 800, 119, 1, 0, 0, 0, 801, 802, 7, 13, 0, 0, 802, 803, 7, 1, 0, 0, 803, 804, 7, 18, 0, 0, 804, 805, 7, 3, 0, 0, 805, 121, 1, 0, 0, 0, 806, 807, 5, 40, 0, 0, 807, 123, 1, 0, 0, 0, 808, 809, 7, 9, 0, 0, 809, 810, 7, 7, 0, 0, 810, 811, 7, 5, 0, 0, 811, 125, 1, 0, 0, 0, 812, 813, 7, 9, 0, 0, 813, 814, 7, 20, 0, 0, 814, 815, 7, 13, 0, 0, 815, 816, 7, 13, 0, 0, 816, 127, 1, 0, 0, 0, 817, 818, 7, 9, 0, 0, 818, 819, 7, 20, 0, 0, 819, 820, 7, 13, 0, 0, 820, 821, 7, 13, 0, 0, 821, 822, 7, 2, 0, 0, 822, 129, 1, 0, 0, 0, 823, 824, 7, 7, 0, 0, 824, 825, 7, 6, 0, 0, 825, 131, 1, 0, 0, 0, 826, 827, 5, 63, 0, 0, 827, 133, 1, 0, 0, 0, 828, 829, 7, 6, 0, 0, 829, 830, 7, 13, 0, 0, 830, 831, 7, 1, 0, 0, 831, 832, 7, 18, 0, 0, 832, 833, 7, 3, 0, 0, 833, 135, 1, 0, 0, 0, 834, 835, 5, 41, 0, 0, 835, 137, 1, 0, 0, 0, 836, 837, 7, 5, 0, 0, 837, 838, 7, 6, 0, 0, 838, 839, 7, 20, 0, 0, 839, 840, 7, 3, 0, 0, 840, 139, 1, 0, 0, 0, 841, 842, 5, 61, 0, 0, 842, 843, 5, 61, 0, 0, 843, 141, 1, 0, 0, 0, 844, 845, 5, 61, 0, 0, 845, 846, 5, 126, 0, 0, 846, 143, 1, 0, 0, 0, 847, 848, 5, 33, 0, 0, 848, 849, 5, 61, 0, 0, 849, 145, 1, 0, 0, 0, 850, 851, 5, 60, 0, 0, 851, 147, 1, 0, 0, 0, 852, 853, 5, 60, 0, 0, 853, 854, 5, 61, 0, 0, 854, 149, 1, 0, 0, 0, 855, 856, 5, 62, 0, 0, 856, 151, 1, 0, 0, 0, 857, 858, 5, 62, 0, 0, 858, 859, 5, 61, 0, 0, 859, 153, 1, 0, 0, 0, 860, 861, 5, 43, 0, 0, 861, 155, 1, 0, 0, 0, 862, 863, 5, 45, 0, 0, 863, 157, 1, 0, 0, 0, 864, 865, 5, 42, 0, 0, 865, 159, 1, 0, 0, 0, 866, 867, 5, 47, 0, 0, 867, 161, 1, 0, 0, 0, 868, 869, 5, 37, 0, 0, 869, 163, 1, 0, 0, 0, 870, 871, 4, 74, 4, 0, 871, 872, 3, 54, 19, 0, 872, 873, 1, 0, 0, 0, 873, 874, 6, 74, 13, 0, 874, 165, 1, 0, 0, 0, 875, 878, 3, 132, 58, 0, 876, 879, 3, 70, 27, 0, 877, 879, 3, 84, 34, 0, 878, 876, 1, 0, 0, 0, 878, 877, 1, 0, 0, 0, 879, 883, 1, 0, 0, 0, 880, 882, 3, 86, 35, 0, 881, 880, 1, 0, 0, 0, 882, 885, 1, 0, 0, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 893, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 888, 3, 132, 58, 0, 887, 889, 3, 68, 26, 0, 888, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 1, 0, 0, 0, 892, 875, 1, 0, 0, 0, 892, 886, 1, 0, 0, 0, 893, 167, 1, 0, 0, 0, 894, 895, 5, 91, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 6, 76, 0, 0, 897, 898, 6, 76, 0, 0, 898, 169, 1, 0, 0, 0, 899, 900, 5, 93, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 6, 77, 12, 0, 902, 903, 6, 77, 12, 0, 903, 171, 1, 0, 0, 0, 904, 908, 3, 70, 27, 0, 905, 907, 3, 86, 35, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 921, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 914, 3, 84, 34, 0, 912, 914, 3, 78, 31, 0, 913, 911, 1, 0, 0, 0, 913, 912, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 917, 3, 86, 35, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 921, 173, 1, 0, 0, 0, 922, 924, 3, 80, 32, 0, 923, 925, 3, 82, 33, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 3, 80, 32, 0, 929, 175, 1, 0, 0, 0, 930, 931, 3, 174, 79, 0, 931, 177, 1, 0, 0, 0, 932, 933, 3, 60, 22, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 81, 11, 0, 935, 179, 1, 0, 0, 0, 936, 937, 3, 62, 23, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 82, 11, 0, 939, 181, 1, 0, 0, 0, 940, 941, 3, 64, 24, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 83, 11, 0, 943, 183, 1, 0, 0, 0, 944, 945, 3, 168, 76, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 84, 14, 0, 947, 948, 6, 84, 15, 0, 948, 185, 1, 0, 0, 0, 949, 950, 3, 66, 25, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 85, 16, 0, 952, 953, 6, 85, 12, 0, 953, 187, 1, 0, 0, 0, 954, 955, 3, 64, 24, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 86, 11, 0, 957, 189, 1, 0, 0, 0, 958, 959, 3, 60, 22, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 87, 11, 0, 961, 191, 1, 0, 0, 0, 962, 963, 3, 62, 23, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 88, 11, 0, 965, 193, 1, 0, 0, 0, 966, 967, 3, 66, 25, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 89, 16, 0, 969, 970, 6, 89, 12, 0, 970, 195, 1, 0, 0, 0, 971, 972, 3, 168, 76, 0, 972, 973, 1, 0, 0, 0, 973, 974, 6, 90, 14, 0, 974, 197, 1, 0, 0, 0, 975, 976, 3, 170, 77, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 91, 17, 0, 978, 199, 1, 0, 0, 0, 979, 980, 3, 334, 159, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 92, 18, 0, 982, 201, 1, 0, 0, 0, 983, 984, 3, 104, 44, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 93, 19, 0, 986, 203, 1, 0, 0, 0, 987, 988, 3, 100, 42, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 94, 20, 0, 990, 205, 1, 0, 0, 0, 991, 992, 7, 16, 0, 0, 992, 993, 7, 3, 0, 0, 993, 994, 7, 5, 0, 0, 994, 995, 7, 12, 0, 0, 995, 996, 7, 0, 0, 0, 996, 997, 7, 12, 0, 0, 997, 998, 7, 5, 0, 0, 998, 999, 7, 12, 0, 0, 999, 207, 1, 0, 0, 0, 1000, 1004, 8, 32, 0, 0, 1001, 1002, 5, 47, 0, 0, 1002, 1004, 8, 33, 0, 0, 1003, 1000, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 209, 1, 0, 0, 0, 1005, 1007, 3, 208, 96, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 211, 1, 0, 0, 0, 1010, 1011, 3, 210, 97, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 98, 21, 0, 1013, 213, 1, 0, 0, 0, 1014, 1015, 3, 88, 36, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 99, 22, 0, 1017, 215, 1, 0, 0, 0, 1018, 1019, 3, 60, 22, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 100, 11, 0, 1021, 217, 1, 0, 0, 0, 1022, 1023, 3, 62, 23, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 101, 11, 0, 1025, 219, 1, 0, 0, 0, 1026, 1027, 3, 64, 24, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 102, 11, 0, 1029, 221, 1, 0, 0, 0, 1030, 1031, 3, 66, 25, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 103, 16, 0, 1033, 1034, 6, 103, 12, 0, 1034, 223, 1, 0, 0, 0, 1035, 1036, 3, 108, 46, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 104, 23, 0, 1038, 225, 1, 0, 0, 0, 1039, 1040, 3, 104, 44, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 105, 19, 0, 1042, 227, 1, 0, 0, 0, 1043, 1048, 3, 70, 27, 0, 1044, 1048, 3, 68, 26, 0, 1045, 1048, 3, 84, 34, 0, 1046, 1048, 3, 158, 71, 0, 1047, 1043, 1, 0, 0, 0, 1047, 1044, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1046, 1, 0, 0, 0, 1048, 229, 1, 0, 0, 0, 1049, 1052, 3, 70, 27, 0, 1050, 1052, 3, 158, 71, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 1056, 1, 0, 0, 0, 1053, 1055, 3, 228, 106, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1058, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1069, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1059, 1062, 3, 84, 34, 0, 1060, 1062, 3, 78, 31, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1065, 3, 228, 106, 0, 1064, 1063, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1069, 1, 0, 0, 0, 1068, 1051, 1, 0, 0, 0, 1068, 1061, 1, 0, 0, 0, 1069, 231, 1, 0, 0, 0, 1070, 1073, 3, 230, 107, 0, 1071, 1073, 3, 174, 79, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1071, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 233, 1, 0, 0, 0, 1076, 1077, 3, 60, 22, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 109, 11, 0, 1079, 235, 1, 0, 0, 0, 1080, 1081, 3, 62, 23, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 110, 11, 0, 1083, 237, 1, 0, 0, 0, 1084, 1085, 3, 64, 24, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 111, 11, 0, 1087, 239, 1, 0, 0, 0, 1088, 1089, 3, 66, 25, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 112, 16, 0, 1091, 1092, 6, 112, 12, 0, 1092, 241, 1, 0, 0, 0, 1093, 1094, 3, 100, 42, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 113, 20, 0, 1096, 243, 1, 0, 0, 0, 1097, 1098, 3, 104, 44, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 114, 19, 0, 1100, 245, 1, 0, 0, 0, 1101, 1102, 3, 108, 46, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 115, 23, 0, 1104, 247, 1, 0, 0, 0, 1105, 1106, 7, 12, 0, 0, 1106, 1107, 7, 2, 0, 0, 1107, 249, 1, 0, 0, 0, 1108, 1109, 3, 232, 108, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 117, 24, 0, 1111, 251, 1, 0, 0, 0, 1112, 1113, 3, 60, 22, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 6, 118, 11, 0, 1115, 253, 1, 0, 0, 0, 1116, 1117, 3, 62, 23, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 119, 11, 0, 1119, 255, 1, 0, 0, 0, 1120, 1121, 3, 64, 24, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 120, 11, 0, 1123, 257, 1, 0, 0, 0, 1124, 1125, 3, 66, 25, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 121, 16, 0, 1127, 1128, 6, 121, 12, 0, 1128, 259, 1, 0, 0, 0, 1129, 1130, 3, 168, 76, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 122, 14, 0, 1132, 1133, 6, 122, 25, 0, 1133, 261, 1, 0, 0, 0, 1134, 1135, 7, 7, 0, 0, 1135, 1136, 7, 9, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 123, 26, 0, 1138, 263, 1, 0, 0, 0, 1139, 1140, 7, 19, 0, 0, 1140, 1141, 7, 1, 0, 0, 1141, 1142, 7, 5, 0, 0, 1142, 1143, 7, 10, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 124, 26, 0, 1145, 265, 1, 0, 0, 0, 1146, 1147, 8, 34, 0, 0, 1147, 267, 1, 0, 0, 0, 1148, 1150, 3, 266, 125, 0, 1149, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 3, 334, 159, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1149, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1159, 3, 266, 125, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 269, 1, 0, 0, 0, 1162, 1163, 3, 268, 126, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 127, 27, 0, 1165, 271, 1, 0, 0, 0, 1166, 1167, 3, 60, 22, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 128, 11, 0, 1169, 273, 1, 0, 0, 0, 1170, 1171, 3, 62, 23, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 129, 11, 0, 1173, 275, 1, 0, 0, 0, 1174, 1175, 3, 64, 24, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 130, 11, 0, 1177, 277, 1, 0, 0, 0, 1178, 1179, 3, 66, 25, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 131, 16, 0, 1181, 1182, 6, 131, 12, 0, 1182, 1183, 6, 131, 12, 0, 1183, 279, 1, 0, 0, 0, 1184, 1185, 3, 100, 42, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 132, 20, 0, 1187, 281, 1, 0, 0, 0, 1188, 1189, 3, 104, 44, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 133, 19, 0, 1191, 283, 1, 0, 0, 0, 1192, 1193, 3, 108, 46, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 134, 23, 0, 1195, 285, 1, 0, 0, 0, 1196, 1197, 3, 264, 124, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 135, 28, 0, 1199, 287, 1, 0, 0, 0, 1200, 1201, 3, 232, 108, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 136, 24, 0, 1203, 289, 1, 0, 0, 0, 1204, 1205, 3, 176, 80, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 137, 29, 0, 1207, 291, 1, 0, 0, 0, 1208, 1209, 3, 60, 22, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 138, 11, 0, 1211, 293, 1, 0, 0, 0, 1212, 1213, 3, 62, 23, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 139, 11, 0, 1215, 295, 1, 0, 0, 0, 1216, 1217, 3, 64, 24, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 140, 11, 0, 1219, 297, 1, 0, 0, 0, 1220, 1221, 3, 66, 25, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 141, 16, 0, 1223, 1224, 6, 141, 12, 0, 1224, 299, 1, 0, 0, 0, 1225, 1226, 3, 108, 46, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 142, 23, 0, 1228, 301, 1, 0, 0, 0, 1229, 1230, 3, 176, 80, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 143, 29, 0, 1232, 303, 1, 0, 0, 0, 1233, 1234, 3, 172, 78, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 144, 30, 0, 1236, 305, 1, 0, 0, 0, 1237, 1238, 3, 60, 22, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 6, 145, 11, 0, 1240, 307, 1, 0, 0, 0, 1241, 1242, 3, 62, 23, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 6, 146, 11, 0, 1244, 309, 1, 0, 0, 0, 1245, 1246, 3, 64, 24, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 6, 147, 11, 0, 1248, 311, 1, 0, 0, 0, 1249, 1250, 3, 66, 25, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 6, 148, 16, 0, 1252, 1253, 6, 148, 12, 0, 1253, 313, 1, 0, 0, 0, 1254, 1255, 7, 1, 0, 0, 1255, 1256, 7, 9, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 1258, 7, 7, 0, 0, 1258, 315, 1, 0, 0, 0, 1259, 1260, 3, 60, 22, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 150, 11, 0, 1262, 317, 1, 0, 0, 0, 1263, 1264, 3, 62, 23, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 6, 151, 11, 0, 1266, 319, 1, 0, 0, 0, 1267, 1268, 3, 64, 24, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 6, 152, 11, 0, 1270, 321, 1, 0, 0, 0, 1271, 1272, 3, 66, 25, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 6, 153, 16, 0, 1274, 1275, 6, 153, 12, 0, 1275, 323, 1, 0, 0, 0, 1276, 1277, 7, 15, 0, 0, 1277, 1278, 7, 20, 0, 0, 1278, 1279, 7, 9, 0, 0, 1279, 1280, 7, 4, 0, 0, 1280, 1281, 7, 5, 0, 0, 1281, 1282, 7, 1, 0, 0, 1282, 1283, 7, 7, 0, 0, 1283, 1284, 7, 9, 0, 0, 1284, 1285, 7, 2, 0, 0, 1285, 325, 1, 0, 0, 0, 1286, 1287, 3, 60, 22, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 155, 11, 0, 1289, 327, 1, 0, 0, 0, 1290, 1291, 3, 62, 23, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1293, 6, 156, 11, 0, 1293, 329, 1, 0, 0, 0, 1294, 1295, 3, 64, 24, 0, 1295, 1296, 1, 0, 0, 0, 1296, 1297, 6, 157, 11, 0, 1297, 331, 1, 0, 0, 0, 1298, 1299, 3, 170, 77, 0, 1299, 1300, 1, 0, 0, 0, 1300, 1301, 6, 158, 17, 0, 1301, 1302, 6, 158, 12, 0, 1302, 333, 1, 0, 0, 0, 1303, 1304, 5, 58, 0, 0, 1304, 335, 1, 0, 0, 0, 1305, 1311, 3, 78, 31, 0, 1306, 1311, 3, 68, 26, 0, 1307, 1311, 3, 108, 46, 0, 1308, 1311, 3, 70, 27, 0, 1309, 1311, 3, 84, 34, 0, 1310, 1305, 1, 0, 0, 0, 1310, 1306, 1, 0, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 337, 1, 0, 0, 0, 1314, 1315, 3, 60, 22, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 6, 161, 11, 0, 1317, 339, 1, 0, 0, 0, 1318, 1319, 3, 62, 23, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 162, 11, 0, 1321, 341, 1, 0, 0, 0, 1322, 1323, 3, 64, 24, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 163, 11, 0, 1325, 343, 1, 0, 0, 0, 1326, 1327, 3, 66, 25, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 164, 16, 0, 1329, 1330, 6, 164, 12, 0, 1330, 345, 1, 0, 0, 0, 1331, 1332, 3, 334, 159, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 165, 18, 0, 1334, 347, 1, 0, 0, 0, 1335, 1336, 3, 104, 44, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, 166, 19, 0, 1338, 349, 1, 0, 0, 0, 1339, 1340, 3, 108, 46, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1342, 6, 167, 23, 0, 1342, 351, 1, 0, 0, 0, 1343, 1344, 3, 262, 123, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 6, 168, 31, 0, 1346, 1347, 6, 168, 32, 0, 1347, 353, 1, 0, 0, 0, 1348, 1349, 3, 210, 97, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1351, 6, 169, 21, 0, 1351, 355, 1, 0, 0, 0, 1352, 1353, 3, 88, 36, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 6, 170, 22, 0, 1355, 357, 1, 0, 0, 0, 1356, 1357, 3, 60, 22, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 171, 11, 0, 1359, 359, 1, 0, 0, 0, 1360, 1361, 3, 62, 23, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1363, 6, 172, 11, 0, 1363, 361, 1, 0, 0, 0, 1364, 1365, 3, 64, 24, 0, 1365, 1366, 1, 0, 0, 0, 1366, 1367, 6, 173, 11, 0, 1367, 363, 1, 0, 0, 0, 1368, 1369, 3, 66, 25, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1371, 6, 174, 16, 0, 1371, 1372, 6, 174, 12, 0, 1372, 1373, 6, 174, 12, 0, 1373, 365, 1, 0, 0, 0, 1374, 1375, 3, 104, 44, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 175, 19, 0, 1377, 367, 1, 0, 0, 0, 1378, 1379, 3, 108, 46, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 6, 176, 23, 0, 1381, 369, 1, 0, 0, 0, 1382, 1383, 3, 232, 108, 0, 1383, 1384, 1, 0, 0, 0, 1384, 1385, 6, 177, 24, 0, 1385, 371, 1, 0, 0, 0, 1386, 1387, 3, 60, 22, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 178, 11, 0, 1389, 373, 1, 0, 0, 0, 1390, 1391, 3, 62, 23, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 11, 0, 1393, 375, 1, 0, 0, 0, 1394, 1395, 3, 64, 24, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 6, 180, 11, 0, 1397, 377, 1, 0, 0, 0, 1398, 1399, 3, 66, 25, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 6, 181, 16, 0, 1401, 1402, 6, 181, 12, 0, 1402, 379, 1, 0, 0, 0, 1403, 1404, 3, 210, 97, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 182, 21, 0, 1406, 1407, 6, 182, 12, 0, 1407, 1408, 6, 182, 33, 0, 1408, 381, 1, 0, 0, 0, 1409, 1410, 3, 88, 36, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1412, 6, 183, 22, 0, 1412, 1413, 6, 183, 12, 0, 1413, 1414, 6, 183, 33, 0, 1414, 383, 1, 0, 0, 0, 1415, 1416, 3, 60, 22, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 6, 184, 11, 0, 1418, 385, 1, 0, 0, 0, 1419, 1420, 3, 62, 23, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1422, 6, 185, 11, 0, 1422, 387, 1, 0, 0, 0, 1423, 1424, 3, 64, 24, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 186, 11, 0, 1426, 389, 1, 0, 0, 0, 1427, 1428, 3, 334, 159, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 187, 18, 0, 1430, 1431, 6, 187, 12, 0, 1431, 1432, 6, 187, 10, 0, 1432, 391, 1, 0, 0, 0, 1433, 1434, 3, 104, 44, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 188, 19, 0, 1436, 1437, 6, 188, 12, 0, 1437, 1438, 6, 188, 10, 0, 1438, 393, 1, 0, 0, 0, 1439, 1440, 3, 60, 22, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 6, 189, 11, 0, 1442, 395, 1, 0, 0, 0, 1443, 1444, 3, 62, 23, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 6, 190, 11, 0, 1446, 397, 1, 0, 0, 0, 1447, 1448, 3, 64, 24, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 6, 191, 11, 0, 1450, 399, 1, 0, 0, 0, 1451, 1452, 3, 176, 80, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 192, 12, 0, 1454, 1455, 6, 192, 0, 0, 1455, 1456, 6, 192, 29, 0, 1456, 401, 1, 0, 0, 0, 1457, 1458, 3, 172, 78, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 6, 193, 12, 0, 1460, 1461, 6, 193, 0, 0, 1461, 1462, 6, 193, 30, 0, 1462, 403, 1, 0, 0, 0, 1463, 1464, 3, 94, 39, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1466, 6, 194, 12, 0, 1466, 1467, 6, 194, 0, 0, 1467, 1468, 6, 194, 34, 0, 1468, 405, 1, 0, 0, 0, 1469, 1470, 3, 66, 25, 0, 1470, 1471, 1, 0, 0, 0, 1471, 1472, 6, 195, 16, 0, 1472, 1473, 6, 195, 12, 0, 1473, 407, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 592, 602, 606, 609, 618, 620, 631, 650, 655, 664, 671, 676, 678, 689, 697, 700, 702, 707, 712, 718, 725, 730, 736, 739, 747, 751, 878, 883, 890, 892, 908, 913, 918, 920, 926, 1003, 1008, 1047, 1051, 1056, 1061, 1066, 1068, 1072, 1074, 1151, 1155, 1160, 1310, 1312, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 20, 0, 7, 66, 0, 5, 0, 0, 7, 26, 0, 7, 67, 0, 7, 109, 0, 7, 35, 0, 7, 33, 0, 7, 77, 0, 7, 27, 0, 7, 37, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 30, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index a253523bb50ab..97b21edea760a 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -274,7 +274,7 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0000}\u05c5\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000}\u05c2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ @@ -356,882 +356,881 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0004"+ - "\u0015\u0252\b\u0015\u000b\u0015\f\u0015\u0253\u0001\u0015\u0001\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u025c\b\u0016"+ - "\n\u0016\f\u0016\u025f\t\u0016\u0001\u0016\u0003\u0016\u0262\b\u0016\u0001"+ - "\u0016\u0003\u0016\u0265\b\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0005\u0017\u026e\b\u0017\n"+ - "\u0017\f\u0017\u0271\t\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0018\u0004\u0018\u0279\b\u0018\u000b\u0018\f"+ - "\u0018\u027a\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ - "\u0003\u001e\u028e\b\u001e\u0001\u001e\u0004\u001e\u0291\b\u001e\u000b"+ - "\u001e\f\u001e\u0292\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001!\u0001"+ - "!\u0001!\u0003!\u029c\b!\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0003#\u02a3"+ - "\b#\u0001$\u0001$\u0001$\u0005$\u02a8\b$\n$\f$\u02ab\t$\u0001$\u0001$"+ - "\u0001$\u0001$\u0001$\u0001$\u0005$\u02b3\b$\n$\f$\u02b6\t$\u0001$\u0001"+ - "$\u0001$\u0001$\u0001$\u0003$\u02bd\b$\u0001$\u0003$\u02c0\b$\u0003$\u02c2"+ - "\b$\u0001%\u0004%\u02c5\b%\u000b%\f%\u02c6\u0001&\u0004&\u02ca\b&\u000b"+ - "&\f&\u02cb\u0001&\u0001&\u0005&\u02d0\b&\n&\f&\u02d3\t&\u0001&\u0001&"+ - "\u0004&\u02d7\b&\u000b&\f&\u02d8\u0001&\u0004&\u02dc\b&\u000b&\f&\u02dd"+ - "\u0001&\u0001&\u0005&\u02e2\b&\n&\f&\u02e5\t&\u0003&\u02e7\b&\u0001&\u0001"+ - "&\u0001&\u0001&\u0004&\u02ed\b&\u000b&\f&\u02ee\u0001&\u0001&\u0003&\u02f3"+ - "\b&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)"+ - "\u0001)\u0001)\u0001*\u0001*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001"+ - "-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u00011\u0001"+ - "1\u00011\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ - "4\u00014\u00014\u00014\u00014\u00015\u00015\u00016\u00016\u00016\u0001"+ - "6\u00017\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0001"+ - "8\u00018\u00019\u00019\u00019\u0001:\u0001:\u0001;\u0001;\u0001;\u0001"+ - ";\u0001;\u0001;\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ - ">\u0001>\u0001>\u0001?\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001"+ - "A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001"+ - "E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001"+ - "J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001K\u0003K\u0372\bK\u0001K\u0005"+ - "K\u0375\bK\nK\fK\u0378\tK\u0001K\u0001K\u0004K\u037c\bK\u000bK\fK\u037d"+ - "\u0003K\u0380\bK\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001"+ - "M\u0001M\u0001M\u0001N\u0001N\u0005N\u038e\bN\nN\fN\u0391\tN\u0001N\u0001"+ - "N\u0003N\u0395\bN\u0001N\u0004N\u0398\bN\u000bN\fN\u0399\u0003N\u039c"+ - "\bN\u0001O\u0001O\u0004O\u03a0\bO\u000bO\fO\u03a1\u0001O\u0001O\u0001"+ - "P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001"+ - "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ - "U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001"+ - "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ - "Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001"+ - "\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001"+ - "^\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001"+ - "`\u0001`\u0001`\u0003`\u03ef\b`\u0001a\u0004a\u03f2\ba\u000ba\fa\u03f3"+ - "\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+ - "d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ - "f\u0001g\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001"+ - "i\u0001i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0003j\u041b\bj\u0001"+ - "k\u0001k\u0003k\u041f\bk\u0001k\u0005k\u0422\bk\nk\fk\u0425\tk\u0001k"+ - "\u0001k\u0003k\u0429\bk\u0001k\u0004k\u042c\bk\u000bk\fk\u042d\u0003k"+ - "\u0430\bk\u0001l\u0001l\u0004l\u0434\bl\u000bl\fl\u0435\u0001m\u0001m"+ - "\u0001m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ - "o\u0001p\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001"+ - "r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001"+ - "t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001"+ - "y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001"+ - "{\u0001{\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001"+ - "}\u0001~\u0004~\u0481\b~\u000b~\f~\u0482\u0001~\u0001~\u0003~\u0487\b"+ - "~\u0001~\u0004~\u048a\b~\u000b~\f~\u048b\u0001\u007f\u0001\u007f\u0001"+ - "\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001"+ - "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001"+ - "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001"+ - "\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001"+ - "\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ - "\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ - "\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001"+ - "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001"+ - "\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ - "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ - "\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001\u009d\u0001"+ - "\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ - "\u009e\u0001\u009f\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001"+ - "\u00a0\u0001\u00a0\u0004\u00a0\u0522\b\u00a0\u000b\u00a0\f\u00a0\u0523"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8"+ - "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae"+ - "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ - "\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3"+ - "\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8"+ - "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ - "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ - "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd"+ - "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be\u0001\u00be"+ - "\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0"+ - "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1"+ - "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2"+ - "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3"+ - "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0002\u026f\u02b4\u0000"+ - "\u00c4\u0010\u0001\u0012\u0002\u0014\u0003\u0016\u0004\u0018\u0005\u001a"+ - "\u0006\u001c\u0007\u001e\b \t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u0011"+ - "2\u00124\u00136\u00148\u0015:\u0016<\u0017>\u0018@\u0019B\u001aD\u0000"+ - "F\u0000H\u0000J\u0000L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u001b"+ - "Z\u001c\\\u001d^\u001e`\u001fb d!f\"h#j$l%n&p\'r(t)v*x+z,|-~.\u0080/\u0082"+ - "0\u00841\u00862\u00883\u008a4\u008c5\u008e6\u00907\u00928\u00949\u0096"+ - ":\u0098;\u009a<\u009c=\u009e>\u00a0?\u00a2@\u00a4\u0000\u00a6A\u00a8B"+ - "\u00aaC\u00acD\u00ae\u0000\u00b0E\u00b2F\u00b4G\u00b6H\u00b8\u0000\u00ba"+ - "\u0000\u00bcI\u00beJ\u00c0K\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8"+ - "\u0000\u00ca\u0000\u00cc\u0000\u00ceL\u00d0\u0000\u00d2M\u00d4\u0000\u00d6"+ - "\u0000\u00d8N\u00daO\u00dcP\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4"+ - "\u0000\u00e6\u0000\u00e8Q\u00eaR\u00ecS\u00eeT\u00f0\u0000\u00f2\u0000"+ - "\u00f4\u0000\u00f6\u0000\u00f8U\u00fa\u0000\u00fcV\u00feW\u0100X\u0102"+ - "\u0000\u0104\u0000\u0106Y\u0108Z\u010a\u0000\u010c[\u010e\u0000\u0110"+ - "\\\u0112]\u0114^\u0116\u0000\u0118\u0000\u011a\u0000\u011c\u0000\u011e"+ - "\u0000\u0120\u0000\u0122\u0000\u0124_\u0126`\u0128a\u012a\u0000\u012c"+ - "\u0000\u012e\u0000\u0130\u0000\u0132b\u0134c\u0136d\u0138\u0000\u013a"+ - "e\u013cf\u013eg\u0140h\u0142\u0000\u0144i\u0146j\u0148k\u014al\u014c\u0000"+ - "\u014em\u0150n\u0152o\u0154p\u0156q\u0158\u0000\u015a\u0000\u015c\u0000"+ - "\u015e\u0000\u0160\u0000\u0162\u0000\u0164\u0000\u0166r\u0168s\u016at"+ - "\u016c\u0000\u016e\u0000\u0170\u0000\u0172\u0000\u0174u\u0176v\u0178w"+ - "\u017a\u0000\u017c\u0000\u017e\u0000\u0180x\u0182y\u0184z\u0186\u0000"+ - "\u0188\u0000\u018a{\u018c|\u018e}\u0190\u0000\u0192\u0000\u0194\u0000"+ - "\u0196\u0000\u0010\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t"+ - "\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000"+ - "SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+ - "\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000"+ - "VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002"+ - "\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ - "UUuu\u0006\u0000\t\n\r\r //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r"+ - "\r \u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000"+ - "\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000"+ - "YYyy\u000b\u0000\t\n\r\r \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000"+ - "\t\n\r\r \"#,,//::<<>?\\\\||\u05e0\u0000\u0010\u0001\u0000\u0000\u0000"+ - "\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014\u0001\u0000\u0000\u0000"+ - "\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018\u0001\u0000\u0000\u0000"+ - "\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c\u0001\u0000\u0000\u0000"+ - "\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001\u0000\u0000\u0000\u0000"+ - "\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000\u0000\u0000\u0000&\u0001"+ - "\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000\u0000*\u0001\u0000\u0000"+ - "\u0000\u0000,\u0001\u0000\u0000\u0000\u0000.\u0001\u0000\u0000\u0000\u0000"+ - "0\u0001\u0000\u0000\u0000\u00002\u0001\u0000\u0000\u0000\u00004\u0001"+ - "\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000\u00008\u0001\u0000\u0000"+ - "\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<\u0001\u0000\u0000\u0000\u0000"+ - ">\u0001\u0000\u0000\u0000\u0000@\u0001\u0000\u0000\u0000\u0001B\u0001"+ - "\u0000\u0000\u0000\u0001X\u0001\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000"+ - "\u0000\u0001\\\u0001\u0000\u0000\u0000\u0001^\u0001\u0000\u0000\u0000"+ - "\u0001`\u0001\u0000\u0000\u0000\u0001b\u0001\u0000\u0000\u0000\u0001d"+ - "\u0001\u0000\u0000\u0000\u0001f\u0001\u0000\u0000\u0000\u0001h\u0001\u0000"+ - "\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001l\u0001\u0000\u0000\u0000"+ - "\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001\u0000\u0000\u0000\u0001r"+ - "\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000\u0000\u0001v\u0001\u0000"+ - "\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001z\u0001\u0000\u0000\u0000"+ - "\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001\u0000\u0000\u0000\u0001\u0080"+ - "\u0001\u0000\u0000\u0000\u0001\u0082\u0001\u0000\u0000\u0000\u0001\u0084"+ - "\u0001\u0000\u0000\u0000\u0001\u0086\u0001\u0000\u0000\u0000\u0001\u0088"+ - "\u0001\u0000\u0000\u0000\u0001\u008a\u0001\u0000\u0000\u0000\u0001\u008c"+ - "\u0001\u0000\u0000\u0000\u0001\u008e\u0001\u0000\u0000\u0000\u0001\u0090"+ - "\u0001\u0000\u0000\u0000\u0001\u0092\u0001\u0000\u0000\u0000\u0001\u0094"+ - "\u0001\u0000\u0000\u0000\u0001\u0096\u0001\u0000\u0000\u0000\u0001\u0098"+ - "\u0001\u0000\u0000\u0000\u0001\u009a\u0001\u0000\u0000\u0000\u0001\u009c"+ - "\u0001\u0000\u0000\u0000\u0001\u009e\u0001\u0000\u0000\u0000\u0001\u00a0"+ - "\u0001\u0000\u0000\u0000\u0001\u00a2\u0001\u0000\u0000\u0000\u0001\u00a4"+ - "\u0001\u0000\u0000\u0000\u0001\u00a6\u0001\u0000\u0000\u0000\u0001\u00a8"+ - "\u0001\u0000\u0000\u0000\u0001\u00aa\u0001\u0000\u0000\u0000\u0001\u00ac"+ - "\u0001\u0000\u0000\u0000\u0001\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2"+ - "\u0001\u0000\u0000\u0000\u0001\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6"+ - "\u0001\u0000\u0000\u0000\u0002\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba"+ - "\u0001\u0000\u0000\u0000\u0002\u00bc\u0001\u0000\u0000\u0000\u0002\u00be"+ - "\u0001\u0000\u0000\u0000\u0002\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2"+ - "\u0001\u0000\u0000\u0000\u0003\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6"+ - "\u0001\u0000\u0000\u0000\u0003\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca"+ - "\u0001\u0000\u0000\u0000\u0003\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce"+ - "\u0001\u0000\u0000\u0000\u0003\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4"+ - "\u0001\u0000\u0000\u0000\u0003\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8"+ - "\u0001\u0000\u0000\u0000\u0003\u00da\u0001\u0000\u0000\u0000\u0003\u00dc"+ - "\u0001\u0000\u0000\u0000\u0004\u00de\u0001\u0000\u0000\u0000\u0004\u00e0"+ - "\u0001\u0000\u0000\u0000\u0004\u00e2\u0001\u0000\u0000\u0000\u0004\u00e8"+ - "\u0001\u0000\u0000\u0000\u0004\u00ea\u0001\u0000\u0000\u0000\u0004\u00ec"+ - "\u0001\u0000\u0000\u0000\u0004\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0"+ - "\u0001\u0000\u0000\u0000\u0005\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4"+ - "\u0001\u0000\u0000\u0000\u0005\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8"+ - "\u0001\u0000\u0000\u0000\u0005\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc"+ - "\u0001\u0000\u0000\u0000\u0005\u00fe\u0001\u0000\u0000\u0000\u0005\u0100"+ - "\u0001\u0000\u0000\u0000\u0006\u0102\u0001\u0000\u0000\u0000\u0006\u0104"+ - "\u0001\u0000\u0000\u0000\u0006\u0106\u0001\u0000\u0000\u0000\u0006\u0108"+ - "\u0001\u0000\u0000\u0000\u0006\u010c\u0001\u0000\u0000\u0000\u0006\u010e"+ - "\u0001\u0000\u0000\u0000\u0006\u0110\u0001\u0000\u0000\u0000\u0006\u0112"+ - "\u0001\u0000\u0000\u0000\u0006\u0114\u0001\u0000\u0000\u0000\u0007\u0116"+ - "\u0001\u0000\u0000\u0000\u0007\u0118\u0001\u0000\u0000\u0000\u0007\u011a"+ - "\u0001\u0000\u0000\u0000\u0007\u011c\u0001\u0000\u0000\u0000\u0007\u011e"+ - "\u0001\u0000\u0000\u0000\u0007\u0120\u0001\u0000\u0000\u0000\u0007\u0122"+ - "\u0001\u0000\u0000\u0000\u0007\u0124\u0001\u0000\u0000\u0000\u0007\u0126"+ - "\u0001\u0000\u0000\u0000\u0007\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001"+ - "\u0000\u0000\u0000\b\u012c\u0001\u0000\u0000\u0000\b\u012e\u0001\u0000"+ - "\u0000\u0000\b\u0130\u0001\u0000\u0000\u0000\b\u0132\u0001\u0000\u0000"+ - "\u0000\b\u0134\u0001\u0000\u0000\u0000\b\u0136\u0001\u0000\u0000\u0000"+ - "\t\u0138\u0001\u0000\u0000\u0000\t\u013a\u0001\u0000\u0000\u0000\t\u013c"+ - "\u0001\u0000\u0000\u0000\t\u013e\u0001\u0000\u0000\u0000\t\u0140\u0001"+ - "\u0000\u0000\u0000\n\u0142\u0001\u0000\u0000\u0000\n\u0144\u0001\u0000"+ - "\u0000\u0000\n\u0146\u0001\u0000\u0000\u0000\n\u0148\u0001\u0000\u0000"+ - "\u0000\n\u014a\u0001\u0000\u0000\u0000\u000b\u014c\u0001\u0000\u0000\u0000"+ - "\u000b\u014e\u0001\u0000\u0000\u0000\u000b\u0150\u0001\u0000\u0000\u0000"+ - "\u000b\u0152\u0001\u0000\u0000\u0000\u000b\u0154\u0001\u0000\u0000\u0000"+ - "\u000b\u0156\u0001\u0000\u0000\u0000\f\u0158\u0001\u0000\u0000\u0000\f"+ - "\u015a\u0001\u0000\u0000\u0000\f\u015c\u0001\u0000\u0000\u0000\f\u015e"+ - "\u0001\u0000\u0000\u0000\f\u0160\u0001\u0000\u0000\u0000\f\u0162\u0001"+ - "\u0000\u0000\u0000\f\u0164\u0001\u0000\u0000\u0000\f\u0166\u0001\u0000"+ - "\u0000\u0000\f\u0168\u0001\u0000\u0000\u0000\f\u016a\u0001\u0000\u0000"+ - "\u0000\r\u016c\u0001\u0000\u0000\u0000\r\u016e\u0001\u0000\u0000\u0000"+ - "\r\u0170\u0001\u0000\u0000\u0000\r\u0172\u0001\u0000\u0000\u0000\r\u0174"+ - "\u0001\u0000\u0000\u0000\r\u0176\u0001\u0000\u0000\u0000\r\u0178\u0001"+ - "\u0000\u0000\u0000\u000e\u017a\u0001\u0000\u0000\u0000\u000e\u017c\u0001"+ - "\u0000\u0000\u0000\u000e\u017e\u0001\u0000\u0000\u0000\u000e\u0180\u0001"+ - "\u0000\u0000\u0000\u000e\u0182\u0001\u0000\u0000\u0000\u000e\u0184\u0001"+ - "\u0000\u0000\u0000\u000f\u0186\u0001\u0000\u0000\u0000\u000f\u0188\u0001"+ - "\u0000\u0000\u0000\u000f\u018a\u0001\u0000\u0000\u0000\u000f\u018c\u0001"+ - "\u0000\u0000\u0000\u000f\u018e\u0001\u0000\u0000\u0000\u000f\u0190\u0001"+ - "\u0000\u0000\u0000\u000f\u0192\u0001\u0000\u0000\u0000\u000f\u0194\u0001"+ - "\u0000\u0000\u0000\u000f\u0196\u0001\u0000\u0000\u0000\u0010\u0198\u0001"+ - "\u0000\u0000\u0000\u0012\u01a2\u0001\u0000\u0000\u0000\u0014\u01a9\u0001"+ - "\u0000\u0000\u0000\u0016\u01b2\u0001\u0000\u0000\u0000\u0018\u01b9\u0001"+ - "\u0000\u0000\u0000\u001a\u01c3\u0001\u0000\u0000\u0000\u001c\u01ca\u0001"+ - "\u0000\u0000\u0000\u001e\u01d1\u0001\u0000\u0000\u0000 \u01d8\u0001\u0000"+ - "\u0000\u0000\"\u01e0\u0001\u0000\u0000\u0000$\u01e7\u0001\u0000\u0000"+ - "\u0000&\u01f3\u0001\u0000\u0000\u0000(\u01fc\u0001\u0000\u0000\u0000*"+ - "\u0202\u0001\u0000\u0000\u0000,\u0209\u0001\u0000\u0000\u0000.\u0210\u0001"+ - "\u0000\u0000\u00000\u0218\u0001\u0000\u0000\u00002\u0220\u0001\u0000\u0000"+ - "\u00004\u022f\u0001\u0000\u0000\u00006\u0239\u0001\u0000\u0000\u00008"+ - "\u0245\u0001\u0000\u0000\u0000:\u0251\u0001\u0000\u0000\u0000<\u0257\u0001"+ - "\u0000\u0000\u0000>\u0268\u0001\u0000\u0000\u0000@\u0278\u0001\u0000\u0000"+ - "\u0000B\u027e\u0001\u0000\u0000\u0000D\u0282\u0001\u0000\u0000\u0000F"+ - "\u0284\u0001\u0000\u0000\u0000H\u0286\u0001\u0000\u0000\u0000J\u0289\u0001"+ - "\u0000\u0000\u0000L\u028b\u0001\u0000\u0000\u0000N\u0294\u0001\u0000\u0000"+ - "\u0000P\u0296\u0001\u0000\u0000\u0000R\u029b\u0001\u0000\u0000\u0000T"+ - "\u029d\u0001\u0000\u0000\u0000V\u02a2\u0001\u0000\u0000\u0000X\u02c1\u0001"+ - "\u0000\u0000\u0000Z\u02c4\u0001\u0000\u0000\u0000\\\u02f2\u0001\u0000"+ - "\u0000\u0000^\u02f4\u0001\u0000\u0000\u0000`\u02f7\u0001\u0000\u0000\u0000"+ - "b\u02fb\u0001\u0000\u0000\u0000d\u02ff\u0001\u0000\u0000\u0000f\u0301"+ - "\u0001\u0000\u0000\u0000h\u0304\u0001\u0000\u0000\u0000j\u0306\u0001\u0000"+ - "\u0000\u0000l\u030b\u0001\u0000\u0000\u0000n\u030d\u0001\u0000\u0000\u0000"+ - "p\u0313\u0001\u0000\u0000\u0000r\u0319\u0001\u0000\u0000\u0000t\u031c"+ - "\u0001\u0000\u0000\u0000v\u031f\u0001\u0000\u0000\u0000x\u0324\u0001\u0000"+ - "\u0000\u0000z\u0329\u0001\u0000\u0000\u0000|\u032b\u0001\u0000\u0000\u0000"+ - "~\u032f\u0001\u0000\u0000\u0000\u0080\u0334\u0001\u0000\u0000\u0000\u0082"+ - "\u033a\u0001\u0000\u0000\u0000\u0084\u033d\u0001\u0000\u0000\u0000\u0086"+ - "\u033f\u0001\u0000\u0000\u0000\u0088\u0345\u0001\u0000\u0000\u0000\u008a"+ - "\u0347\u0001\u0000\u0000\u0000\u008c\u034c\u0001\u0000\u0000\u0000\u008e"+ - "\u034f\u0001\u0000\u0000\u0000\u0090\u0352\u0001\u0000\u0000\u0000\u0092"+ - "\u0355\u0001\u0000\u0000\u0000\u0094\u0357\u0001\u0000\u0000\u0000\u0096"+ - "\u035a\u0001\u0000\u0000\u0000\u0098\u035c\u0001\u0000\u0000\u0000\u009a"+ - "\u035f\u0001\u0000\u0000\u0000\u009c\u0361\u0001\u0000\u0000\u0000\u009e"+ - "\u0363\u0001\u0000\u0000\u0000\u00a0\u0365\u0001\u0000\u0000\u0000\u00a2"+ - "\u0367\u0001\u0000\u0000\u0000\u00a4\u0369\u0001\u0000\u0000\u0000\u00a6"+ - "\u037f\u0001\u0000\u0000\u0000\u00a8\u0381\u0001\u0000\u0000\u0000\u00aa"+ - "\u0386\u0001\u0000\u0000\u0000\u00ac\u039b\u0001\u0000\u0000\u0000\u00ae"+ - "\u039d\u0001\u0000\u0000\u0000\u00b0\u03a5\u0001\u0000\u0000\u0000\u00b2"+ - "\u03a7\u0001\u0000\u0000\u0000\u00b4\u03ab\u0001\u0000\u0000\u0000\u00b6"+ - "\u03af\u0001\u0000\u0000\u0000\u00b8\u03b3\u0001\u0000\u0000\u0000\u00ba"+ - "\u03b8\u0001\u0000\u0000\u0000\u00bc\u03bd\u0001\u0000\u0000\u0000\u00be"+ - "\u03c1\u0001\u0000\u0000\u0000\u00c0\u03c5\u0001\u0000\u0000\u0000\u00c2"+ - "\u03c9\u0001\u0000\u0000\u0000\u00c4\u03ce\u0001\u0000\u0000\u0000\u00c6"+ - "\u03d2\u0001\u0000\u0000\u0000\u00c8\u03d6\u0001\u0000\u0000\u0000\u00ca"+ - "\u03da\u0001\u0000\u0000\u0000\u00cc\u03de\u0001\u0000\u0000\u0000\u00ce"+ - "\u03e2\u0001\u0000\u0000\u0000\u00d0\u03ee\u0001\u0000\u0000\u0000\u00d2"+ - "\u03f1\u0001\u0000\u0000\u0000\u00d4\u03f5\u0001\u0000\u0000\u0000\u00d6"+ - "\u03f9\u0001\u0000\u0000\u0000\u00d8\u03fd\u0001\u0000\u0000\u0000\u00da"+ - "\u0401\u0001\u0000\u0000\u0000\u00dc\u0405\u0001\u0000\u0000\u0000\u00de"+ - "\u0409\u0001\u0000\u0000\u0000\u00e0\u040e\u0001\u0000\u0000\u0000\u00e2"+ - "\u0412\u0001\u0000\u0000\u0000\u00e4\u041a\u0001\u0000\u0000\u0000\u00e6"+ - "\u042f\u0001\u0000\u0000\u0000\u00e8\u0433\u0001\u0000\u0000\u0000\u00ea"+ - "\u0437\u0001\u0000\u0000\u0000\u00ec\u043b\u0001\u0000\u0000\u0000\u00ee"+ - "\u043f\u0001\u0000\u0000\u0000\u00f0\u0443\u0001\u0000\u0000\u0000\u00f2"+ - "\u0448\u0001\u0000\u0000\u0000\u00f4\u044c\u0001\u0000\u0000\u0000\u00f6"+ - "\u0450\u0001\u0000\u0000\u0000\u00f8\u0454\u0001\u0000\u0000\u0000\u00fa"+ - "\u0457\u0001\u0000\u0000\u0000\u00fc\u045b\u0001\u0000\u0000\u0000\u00fe"+ - "\u045f\u0001\u0000\u0000\u0000\u0100\u0463\u0001\u0000\u0000\u0000\u0102"+ - "\u0467\u0001\u0000\u0000\u0000\u0104\u046c\u0001\u0000\u0000\u0000\u0106"+ - "\u0471\u0001\u0000\u0000\u0000\u0108\u0476\u0001\u0000\u0000\u0000\u010a"+ - "\u047d\u0001\u0000\u0000\u0000\u010c\u0486\u0001\u0000\u0000\u0000\u010e"+ - "\u048d\u0001\u0000\u0000\u0000\u0110\u0491\u0001\u0000\u0000\u0000\u0112"+ - "\u0495\u0001\u0000\u0000\u0000\u0114\u0499\u0001\u0000\u0000\u0000\u0116"+ - "\u049d\u0001\u0000\u0000\u0000\u0118\u04a3\u0001\u0000\u0000\u0000\u011a"+ - "\u04a7\u0001\u0000\u0000\u0000\u011c\u04ab\u0001\u0000\u0000\u0000\u011e"+ - "\u04af\u0001\u0000\u0000\u0000\u0120\u04b3\u0001\u0000\u0000\u0000\u0122"+ - "\u04b7\u0001\u0000\u0000\u0000\u0124\u04bb\u0001\u0000\u0000\u0000\u0126"+ - "\u04bf\u0001\u0000\u0000\u0000\u0128\u04c3\u0001\u0000\u0000\u0000\u012a"+ - "\u04c7\u0001\u0000\u0000\u0000\u012c\u04cc\u0001\u0000\u0000\u0000\u012e"+ - "\u04d0\u0001\u0000\u0000\u0000\u0130\u04d4\u0001\u0000\u0000\u0000\u0132"+ - "\u04d8\u0001\u0000\u0000\u0000\u0134\u04dc\u0001\u0000\u0000\u0000\u0136"+ - "\u04e0\u0001\u0000\u0000\u0000\u0138\u04e4\u0001\u0000\u0000\u0000\u013a"+ - "\u04e9\u0001\u0000\u0000\u0000\u013c\u04ee\u0001\u0000\u0000\u0000\u013e"+ - "\u04f2\u0001\u0000\u0000\u0000\u0140\u04f6\u0001\u0000\u0000\u0000\u0142"+ - "\u04fa\u0001\u0000\u0000\u0000\u0144\u04ff\u0001\u0000\u0000\u0000\u0146"+ - "\u0509\u0001\u0000\u0000\u0000\u0148\u050d\u0001\u0000\u0000\u0000\u014a"+ - "\u0511\u0001\u0000\u0000\u0000\u014c\u0515\u0001\u0000\u0000\u0000\u014e"+ - "\u051a\u0001\u0000\u0000\u0000\u0150\u0521\u0001\u0000\u0000\u0000\u0152"+ - "\u0525\u0001\u0000\u0000\u0000\u0154\u0529\u0001\u0000\u0000\u0000\u0156"+ - "\u052d\u0001\u0000\u0000\u0000\u0158\u0531\u0001\u0000\u0000\u0000\u015a"+ - "\u0536\u0001\u0000\u0000\u0000\u015c\u053a\u0001\u0000\u0000\u0000\u015e"+ - "\u053e\u0001\u0000\u0000\u0000\u0160\u0542\u0001\u0000\u0000\u0000\u0162"+ - "\u0547\u0001\u0000\u0000\u0000\u0164\u054b\u0001\u0000\u0000\u0000\u0166"+ - "\u054f\u0001\u0000\u0000\u0000\u0168\u0553\u0001\u0000\u0000\u0000\u016a"+ - "\u0557\u0001\u0000\u0000\u0000\u016c\u055b\u0001\u0000\u0000\u0000\u016e"+ - "\u0561\u0001\u0000\u0000\u0000\u0170\u0565\u0001\u0000\u0000\u0000\u0172"+ - "\u0569\u0001\u0000\u0000\u0000\u0174\u056d\u0001\u0000\u0000\u0000\u0176"+ - "\u0571\u0001\u0000\u0000\u0000\u0178\u0575\u0001\u0000\u0000\u0000\u017a"+ - "\u0579\u0001\u0000\u0000\u0000\u017c\u057e\u0001\u0000\u0000\u0000\u017e"+ - "\u0584\u0001\u0000\u0000\u0000\u0180\u058a\u0001\u0000\u0000\u0000\u0182"+ - "\u058e\u0001\u0000\u0000\u0000\u0184\u0592\u0001\u0000\u0000\u0000\u0186"+ - "\u0596\u0001\u0000\u0000\u0000\u0188\u059c\u0001\u0000\u0000\u0000\u018a"+ - "\u05a2\u0001\u0000\u0000\u0000\u018c\u05a6\u0001\u0000\u0000\u0000\u018e"+ - "\u05aa\u0001\u0000\u0000\u0000\u0190\u05ae\u0001\u0000\u0000\u0000\u0192"+ - "\u05b4\u0001\u0000\u0000\u0000\u0194\u05ba\u0001\u0000\u0000\u0000\u0196"+ - "\u05c0\u0001\u0000\u0000\u0000\u0198\u0199\u0007\u0000\u0000\u0000\u0199"+ - "\u019a\u0007\u0001\u0000\u0000\u019a\u019b\u0007\u0002\u0000\u0000\u019b"+ - "\u019c\u0007\u0002\u0000\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d"+ - "\u019e\u0007\u0004\u0000\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f"+ - "\u01a0\u0001\u0000\u0000\u0000\u01a0\u01a1\u0006\u0000\u0000\u0000\u01a1"+ - "\u0011\u0001\u0000\u0000\u0000\u01a2\u01a3\u0007\u0000\u0000\u0000\u01a3"+ - "\u01a4\u0007\u0006\u0000\u0000\u01a4\u01a5\u0007\u0007\u0000\u0000\u01a5"+ - "\u01a6\u0007\b\u0000\u0000\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a8"+ - "\u0006\u0001\u0001\u0000\u01a8\u0013\u0001\u0000\u0000\u0000\u01a9\u01aa"+ - "\u0007\u0003\u0000\u0000\u01aa\u01ab\u0007\t\u0000\u0000\u01ab\u01ac\u0007"+ - "\u0006\u0000\u0000\u01ac\u01ad\u0007\u0001\u0000\u0000\u01ad\u01ae\u0007"+ - "\u0004\u0000\u0000\u01ae\u01af\u0007\n\u0000\u0000\u01af\u01b0\u0001\u0000"+ - "\u0000\u0000\u01b0\u01b1\u0006\u0002\u0002\u0000\u01b1\u0015\u0001\u0000"+ - "\u0000\u0000\u01b2\u01b3\u0007\u0003\u0000\u0000\u01b3\u01b4\u0007\u000b"+ - "\u0000\u0000\u01b4\u01b5\u0007\f\u0000\u0000\u01b5\u01b6\u0007\r\u0000"+ - "\u0000\u01b6\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b8\u0006\u0003\u0000"+ - "\u0000\u01b8\u0017\u0001\u0000\u0000\u0000\u01b9\u01ba\u0007\u0003\u0000"+ - "\u0000\u01ba\u01bb\u0007\u000e\u0000\u0000\u01bb\u01bc\u0007\b\u0000\u0000"+ - "\u01bc\u01bd\u0007\r\u0000\u0000\u01bd\u01be\u0007\f\u0000\u0000\u01be"+ - "\u01bf\u0007\u0001\u0000\u0000\u01bf\u01c0\u0007\t\u0000\u0000\u01c0\u01c1"+ - "\u0001\u0000\u0000\u0000\u01c1\u01c2\u0006\u0004\u0003\u0000\u01c2\u0019"+ - "\u0001\u0000\u0000\u0000\u01c3\u01c4\u0007\u000f\u0000\u0000\u01c4\u01c5"+ - "\u0007\u0006\u0000\u0000\u01c5\u01c6\u0007\u0007\u0000\u0000\u01c6\u01c7"+ - "\u0007\u0010\u0000\u0000\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9"+ - "\u0006\u0005\u0004\u0000\u01c9\u001b\u0001\u0000\u0000\u0000\u01ca\u01cb"+ - "\u0007\u0011\u0000\u0000\u01cb\u01cc\u0007\u0006\u0000\u0000\u01cc\u01cd"+ - "\u0007\u0007\u0000\u0000\u01cd\u01ce\u0007\u0012\u0000\u0000\u01ce\u01cf"+ - "\u0001\u0000\u0000\u0000\u01cf\u01d0\u0006\u0006\u0000\u0000\u01d0\u001d"+ - "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0007\u0012\u0000\u0000\u01d2\u01d3"+ - "\u0007\u0003\u0000\u0000\u01d3\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5"+ - "\u0007\b\u0000\u0000\u01d5\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006"+ - "\u0007\u0001\u0000\u01d7\u001f\u0001\u0000\u0000\u0000\u01d8\u01d9\u0007"+ - "\r\u0000\u0000\u01d9\u01da\u0007\u0001\u0000\u0000\u01da\u01db\u0007\u0010"+ - "\u0000\u0000\u01db\u01dc\u0007\u0001\u0000\u0000\u01dc\u01dd\u0007\u0005"+ - "\u0000\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01df\u0006\b\u0000"+ - "\u0000\u01df!\u0001\u0000\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000"+ - "\u01e1\u01e2\u0007\u0003\u0000\u0000\u01e2\u01e3\u0007\u0005\u0000\u0000"+ - "\u01e3\u01e4\u0007\f\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5"+ - "\u01e6\u0006\t\u0005\u0000\u01e6#\u0001\u0000\u0000\u0000\u01e7\u01e8"+ - "\u0007\u0010\u0000\u0000\u01e8\u01e9\u0007\u000b\u0000\u0000\u01e9\u01ea"+ - "\u0005_\u0000\u0000\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007"+ - "\u000e\u0000\u0000\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\f"+ - "\u0000\u0000\u01ee\u01ef\u0007\t\u0000\u0000\u01ef\u01f0\u0007\u0000\u0000"+ - "\u0000\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\n\u0006\u0000"+ - "\u01f2%\u0001\u0000\u0000\u0000\u01f3\u01f4\u0007\u0006\u0000\u0000\u01f4"+ - "\u01f5\u0007\u0003\u0000\u0000\u01f5\u01f6\u0007\t\u0000\u0000\u01f6\u01f7"+ - "\u0007\f\u0000\u0000\u01f7\u01f8\u0007\u0010\u0000\u0000\u01f8\u01f9\u0007"+ - "\u0003\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006"+ - "\u000b\u0007\u0000\u01fb\'\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0006"+ - "\u0000\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007\u0013"+ - "\u0000\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\f\u0000"+ - "\u0000\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0002\u0000\u0000"+ - "\u0203\u0204\u0007\n\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205"+ - "\u0206\u0007\u0013\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207"+ - "\u0208\u0006\r\b\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0007"+ - "\u0002\u0000\u0000\u020a\u020b\u0007\u0007\u0000\u0000\u020b\u020c\u0007"+ - "\u0006\u0000\u0000\u020c\u020d\u0007\u0005\u0000\u0000\u020d\u020e\u0001"+ - "\u0000\u0000\u0000\u020e\u020f\u0006\u000e\u0000\u0000\u020f-\u0001\u0000"+ - "\u0000\u0000\u0210\u0211\u0007\u0002\u0000\u0000\u0211\u0212\u0007\u0005"+ - "\u0000\u0000\u0212\u0213\u0007\f\u0000\u0000\u0213\u0214\u0007\u0005\u0000"+ - "\u0000\u0214\u0215\u0007\u0002\u0000\u0000\u0215\u0216\u0001\u0000\u0000"+ - "\u0000\u0216\u0217\u0006\u000f\u0000\u0000\u0217/\u0001\u0000\u0000\u0000"+ - "\u0218\u0219\u0007\u0013\u0000\u0000\u0219\u021a\u0007\n\u0000\u0000\u021a"+ - "\u021b\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u0006\u0000\u0000\u021c"+ - "\u021d\u0007\u0003\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e"+ - "\u021f\u0006\u0010\u0000\u0000\u021f1\u0001\u0000\u0000\u0000\u0220\u0221"+ - "\u0004\u0011\u0000\u0000\u0221\u0222\u0007\u0001\u0000\u0000\u0222\u0223"+ - "\u0007\t\u0000\u0000\u0223\u0224\u0007\r\u0000\u0000\u0224\u0225\u0007"+ - "\u0001\u0000\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0003"+ - "\u0000\u0000\u0227\u0228\u0007\u0002\u0000\u0000\u0228\u0229\u0007\u0005"+ - "\u0000\u0000\u0229\u022a\u0007\f\u0000\u0000\u022a\u022b\u0007\u0005\u0000"+ - "\u0000\u022b\u022c\u0007\u0002\u0000\u0000\u022c\u022d\u0001\u0000\u0000"+ - "\u0000\u022d\u022e\u0006\u0011\u0000\u0000\u022e3\u0001\u0000\u0000\u0000"+ - "\u022f\u0230\u0004\u0012\u0001\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231"+ - "\u0232\u0007\u0007\u0000\u0000\u0232\u0233\u0007\u0007\u0000\u0000\u0233"+ - "\u0234\u0007\u0012\u0000\u0000\u0234\u0235\u0007\u0014\u0000\u0000\u0235"+ - "\u0236\u0007\b\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238"+ - "\u0006\u0012\t\u0000\u02385\u0001\u0000\u0000\u0000\u0239\u023a\u0004"+ - "\u0013\u0002\u0000\u023a\u023b\u0007\u0010\u0000\u0000\u023b\u023c\u0007"+ - "\f\u0000\u0000\u023c\u023d\u0007\u0005\u0000\u0000\u023d\u023e\u0007\u0004"+ - "\u0000\u0000\u023e\u023f\u0007\n\u0000\u0000\u023f\u0240\u0007\u0002\u0000"+ - "\u0000\u0240\u0241\u0007\u0005\u0000\u0000\u0241\u0242\u0007\u0006\u0000"+ - "\u0000\u0242\u0243\u0001\u0000\u0000\u0000\u0243\u0244\u0006\u0013\u0000"+ - "\u0000\u02447\u0001\u0000\u0000\u0000\u0245\u0246\u0004\u0014\u0003\u0000"+ - "\u0246\u0247\u0007\u0010\u0000\u0000\u0247\u0248\u0007\u0003\u0000\u0000"+ - "\u0248\u0249\u0007\u0005\u0000\u0000\u0249\u024a\u0007\u0006\u0000\u0000"+ - "\u024a\u024b\u0007\u0001\u0000\u0000\u024b\u024c\u0007\u0004\u0000\u0000"+ - "\u024c\u024d\u0007\u0002\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000"+ - "\u024e\u024f\u0006\u0014\n\u0000\u024f9\u0001\u0000\u0000\u0000\u0250"+ - "\u0252\b\u0015\u0000\u0000\u0251\u0250\u0001\u0000\u0000\u0000\u0252\u0253"+ - "\u0001\u0000\u0000\u0000\u0253\u0251\u0001\u0000\u0000\u0000\u0253\u0254"+ - "\u0001\u0000\u0000\u0000\u0254\u0255\u0001\u0000\u0000\u0000\u0255\u0256"+ - "\u0006\u0015\u0000\u0000\u0256;\u0001\u0000\u0000\u0000\u0257\u0258\u0005"+ - "/\u0000\u0000\u0258\u0259\u0005/\u0000\u0000\u0259\u025d\u0001\u0000\u0000"+ - "\u0000\u025a\u025c\b\u0016\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000"+ - "\u025c\u025f\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000\u0000\u0000"+ - "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u0261\u0001\u0000\u0000\u0000"+ - "\u025f\u025d\u0001\u0000\u0000\u0000\u0260\u0262\u0005\r\u0000\u0000\u0261"+ - "\u0260\u0001\u0000\u0000\u0000\u0261\u0262\u0001\u0000\u0000\u0000\u0262"+ - "\u0264\u0001\u0000\u0000\u0000\u0263\u0265\u0005\n\u0000\u0000\u0264\u0263"+ - "\u0001\u0000\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266"+ - "\u0001\u0000\u0000\u0000\u0266\u0267\u0006\u0016\u000b\u0000\u0267=\u0001"+ - "\u0000\u0000\u0000\u0268\u0269\u0005/\u0000\u0000\u0269\u026a\u0005*\u0000"+ - "\u0000\u026a\u026f\u0001\u0000\u0000\u0000\u026b\u026e\u0003>\u0017\u0000"+ - "\u026c\u026e\t\u0000\u0000\u0000\u026d\u026b\u0001\u0000\u0000\u0000\u026d"+ - "\u026c\u0001\u0000\u0000\u0000\u026e\u0271\u0001\u0000\u0000\u0000\u026f"+ - "\u0270\u0001\u0000\u0000\u0000\u026f\u026d\u0001\u0000\u0000\u0000\u0270"+ - "\u0272\u0001\u0000\u0000\u0000\u0271\u026f\u0001\u0000\u0000\u0000\u0272"+ - "\u0273\u0005*\u0000\u0000\u0273\u0274\u0005/\u0000\u0000\u0274\u0275\u0001"+ - "\u0000\u0000\u0000\u0275\u0276\u0006\u0017\u000b\u0000\u0276?\u0001\u0000"+ - "\u0000\u0000\u0277\u0279\u0007\u0017\u0000\u0000\u0278\u0277\u0001\u0000"+ - "\u0000\u0000\u0279\u027a\u0001\u0000\u0000\u0000\u027a\u0278\u0001\u0000"+ - "\u0000\u0000\u027a\u027b\u0001\u0000\u0000\u0000\u027b\u027c\u0001\u0000"+ - "\u0000\u0000\u027c\u027d\u0006\u0018\u000b\u0000\u027dA\u0001\u0000\u0000"+ - "\u0000\u027e\u027f\u0005|\u0000\u0000\u027f\u0280\u0001\u0000\u0000\u0000"+ - "\u0280\u0281\u0006\u0019\f\u0000\u0281C\u0001\u0000\u0000\u0000\u0282"+ - "\u0283\u0007\u0018\u0000\u0000\u0283E\u0001\u0000\u0000\u0000\u0284\u0285"+ - "\u0007\u0019\u0000\u0000\u0285G\u0001\u0000\u0000\u0000\u0286\u0287\u0005"+ - "\\\u0000\u0000\u0287\u0288\u0007\u001a\u0000\u0000\u0288I\u0001\u0000"+ - "\u0000\u0000\u0289\u028a\b\u001b\u0000\u0000\u028aK\u0001\u0000\u0000"+ - "\u0000\u028b\u028d\u0007\u0003\u0000\u0000\u028c\u028e\u0007\u001c\u0000"+ - "\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028d\u028e\u0001\u0000\u0000"+ - "\u0000\u028e\u0290\u0001\u0000\u0000\u0000\u028f\u0291\u0003D\u001a\u0000"+ - "\u0290\u028f\u0001\u0000\u0000\u0000\u0291\u0292\u0001\u0000\u0000\u0000"+ - "\u0292\u0290\u0001\u0000\u0000\u0000\u0292\u0293\u0001\u0000\u0000\u0000"+ - "\u0293M\u0001\u0000\u0000\u0000\u0294\u0295\u0005@\u0000\u0000\u0295O"+ - "\u0001\u0000\u0000\u0000\u0296\u0297\u0005`\u0000\u0000\u0297Q\u0001\u0000"+ - "\u0000\u0000\u0298\u029c\b\u001d\u0000\u0000\u0299\u029a\u0005`\u0000"+ - "\u0000\u029a\u029c\u0005`\u0000\u0000\u029b\u0298\u0001\u0000\u0000\u0000"+ - "\u029b\u0299\u0001\u0000\u0000\u0000\u029cS\u0001\u0000\u0000\u0000\u029d"+ - "\u029e\u0005_\u0000\u0000\u029eU\u0001\u0000\u0000\u0000\u029f\u02a3\u0003"+ - "F\u001b\u0000\u02a0\u02a3\u0003D\u001a\u0000\u02a1\u02a3\u0003T\"\u0000"+ - "\u02a2\u029f\u0001\u0000\u0000\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000"+ - "\u02a2\u02a1\u0001\u0000\u0000\u0000\u02a3W\u0001\u0000\u0000\u0000\u02a4"+ - "\u02a9\u0005\"\u0000\u0000\u02a5\u02a8\u0003H\u001c\u0000\u02a6\u02a8"+ - "\u0003J\u001d\u0000\u02a7\u02a5\u0001\u0000\u0000\u0000\u02a7\u02a6\u0001"+ - "\u0000\u0000\u0000\u02a8\u02ab\u0001\u0000\u0000\u0000\u02a9\u02a7\u0001"+ - "\u0000\u0000\u0000\u02a9\u02aa\u0001\u0000\u0000\u0000\u02aa\u02ac\u0001"+ - "\u0000\u0000\u0000\u02ab\u02a9\u0001\u0000\u0000\u0000\u02ac\u02c2\u0005"+ - "\"\u0000\u0000\u02ad\u02ae\u0005\"\u0000\u0000\u02ae\u02af\u0005\"\u0000"+ - "\u0000\u02af\u02b0\u0005\"\u0000\u0000\u02b0\u02b4\u0001\u0000\u0000\u0000"+ - "\u02b1\u02b3\b\u0016\u0000\u0000\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3"+ - "\u02b6\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001\u0000\u0000\u0000\u02b4"+ - "\u02b2\u0001\u0000\u0000\u0000\u02b5\u02b7\u0001\u0000\u0000\u0000\u02b6"+ - "\u02b4\u0001\u0000\u0000\u0000\u02b7\u02b8\u0005\"\u0000\u0000\u02b8\u02b9"+ - "\u0005\"\u0000\u0000\u02b9\u02ba\u0005\"\u0000\u0000\u02ba\u02bc\u0001"+ - "\u0000\u0000\u0000\u02bb\u02bd\u0005\"\u0000\u0000\u02bc\u02bb\u0001\u0000"+ - "\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u02bf\u0001\u0000"+ - "\u0000\u0000\u02be\u02c0\u0005\"\u0000\u0000\u02bf\u02be\u0001\u0000\u0000"+ - "\u0000\u02bf\u02c0\u0001\u0000\u0000\u0000\u02c0\u02c2\u0001\u0000\u0000"+ - "\u0000\u02c1\u02a4\u0001\u0000\u0000\u0000\u02c1\u02ad\u0001\u0000\u0000"+ - "\u0000\u02c2Y\u0001\u0000\u0000\u0000\u02c3\u02c5\u0003D\u001a\u0000\u02c4"+ - "\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000\u0000\u02c6"+ - "\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000\u02c7"+ - "[\u0001\u0000\u0000\u0000\u02c8\u02ca\u0003D\u001a\u0000\u02c9\u02c8\u0001"+ - "\u0000\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02c9\u0001"+ - "\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001"+ - "\u0000\u0000\u0000\u02cd\u02d1\u0003l.\u0000\u02ce\u02d0\u0003D\u001a"+ - "\u0000\u02cf\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d3\u0001\u0000\u0000"+ - "\u0000\u02d1\u02cf\u0001\u0000\u0000\u0000\u02d1\u02d2\u0001\u0000\u0000"+ - "\u0000\u02d2\u02f3\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000"+ - "\u0000\u02d4\u02d6\u0003l.\u0000\u02d5\u02d7\u0003D\u001a\u0000\u02d6"+ - "\u02d5\u0001\u0000\u0000\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8"+ - "\u02d6\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000\u02d9"+ - "\u02f3\u0001\u0000\u0000\u0000\u02da\u02dc\u0003D\u001a\u0000\u02db\u02da"+ - "\u0001\u0000\u0000\u0000\u02dc\u02dd\u0001\u0000\u0000\u0000\u02dd\u02db"+ - "\u0001\u0000\u0000\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02e6"+ - "\u0001\u0000\u0000\u0000\u02df\u02e3\u0003l.\u0000\u02e0\u02e2\u0003D"+ - "\u001a\u0000\u02e1\u02e0\u0001\u0000\u0000\u0000\u02e2\u02e5\u0001\u0000"+ - "\u0000\u0000\u02e3\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e4\u0001\u0000"+ - "\u0000\u0000\u02e4\u02e7\u0001\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000"+ - "\u0000\u0000\u02e6\u02df\u0001\u0000\u0000\u0000\u02e6\u02e7\u0001\u0000"+ - "\u0000\u0000\u02e7\u02e8\u0001\u0000\u0000\u0000\u02e8\u02e9\u0003L\u001e"+ - "\u0000\u02e9\u02f3\u0001\u0000\u0000\u0000\u02ea\u02ec\u0003l.\u0000\u02eb"+ - "\u02ed\u0003D\u001a\u0000\u02ec\u02eb\u0001\u0000\u0000\u0000\u02ed\u02ee"+ - "\u0001\u0000\u0000\u0000\u02ee\u02ec\u0001\u0000\u0000\u0000\u02ee\u02ef"+ - "\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000\u0000\u0000\u02f0\u02f1"+ - "\u0003L\u001e\u0000\u02f1\u02f3\u0001\u0000\u0000\u0000\u02f2\u02c9\u0001"+ - "\u0000\u0000\u0000\u02f2\u02d4\u0001\u0000\u0000\u0000\u02f2\u02db\u0001"+ - "\u0000\u0000\u0000\u02f2\u02ea\u0001\u0000\u0000\u0000\u02f3]\u0001\u0000"+ - "\u0000\u0000\u02f4\u02f5\u0007\u001e\u0000\u0000\u02f5\u02f6\u0007\u001f"+ - "\u0000\u0000\u02f6_\u0001\u0000\u0000\u0000\u02f7\u02f8\u0007\f\u0000"+ - "\u0000\u02f8\u02f9\u0007\t\u0000\u0000\u02f9\u02fa\u0007\u0000\u0000\u0000"+ - "\u02faa\u0001\u0000\u0000\u0000\u02fb\u02fc\u0007\f\u0000\u0000\u02fc"+ - "\u02fd\u0007\u0002\u0000\u0000\u02fd\u02fe\u0007\u0004\u0000\u0000\u02fe"+ - "c\u0001\u0000\u0000\u0000\u02ff\u0300\u0005=\u0000\u0000\u0300e\u0001"+ - "\u0000\u0000\u0000\u0301\u0302\u0005:\u0000\u0000\u0302\u0303\u0005:\u0000"+ - "\u0000\u0303g\u0001\u0000\u0000\u0000\u0304\u0305\u0005,\u0000\u0000\u0305"+ - "i\u0001\u0000\u0000\u0000\u0306\u0307\u0007\u0000\u0000\u0000\u0307\u0308"+ - "\u0007\u0003\u0000\u0000\u0308\u0309\u0007\u0002\u0000\u0000\u0309\u030a"+ - "\u0007\u0004\u0000\u0000\u030ak\u0001\u0000\u0000\u0000\u030b\u030c\u0005"+ - ".\u0000\u0000\u030cm\u0001\u0000\u0000\u0000\u030d\u030e\u0007\u000f\u0000"+ - "\u0000\u030e\u030f\u0007\f\u0000\u0000\u030f\u0310\u0007\r\u0000\u0000"+ - "\u0310\u0311\u0007\u0002\u0000\u0000\u0311\u0312\u0007\u0003\u0000\u0000"+ - "\u0312o\u0001\u0000\u0000\u0000\u0313\u0314\u0007\u000f\u0000\u0000\u0314"+ - "\u0315\u0007\u0001\u0000\u0000\u0315\u0316\u0007\u0006\u0000\u0000\u0316"+ - "\u0317\u0007\u0002\u0000\u0000\u0317\u0318\u0007\u0005\u0000\u0000\u0318"+ - "q\u0001\u0000\u0000\u0000\u0319\u031a\u0007\u0001\u0000\u0000\u031a\u031b"+ - "\u0007\t\u0000\u0000\u031bs\u0001\u0000\u0000\u0000\u031c\u031d\u0007"+ - "\u0001\u0000\u0000\u031d\u031e\u0007\u0002\u0000\u0000\u031eu\u0001\u0000"+ - "\u0000\u0000\u031f\u0320\u0007\r\u0000\u0000\u0320\u0321\u0007\f\u0000"+ - "\u0000\u0321\u0322\u0007\u0002\u0000\u0000\u0322\u0323\u0007\u0005\u0000"+ - "\u0000\u0323w\u0001\u0000\u0000\u0000\u0324\u0325\u0007\r\u0000\u0000"+ - "\u0325\u0326\u0007\u0001\u0000\u0000\u0326\u0327\u0007\u0012\u0000\u0000"+ - "\u0327\u0328\u0007\u0003\u0000\u0000\u0328y\u0001\u0000\u0000\u0000\u0329"+ - "\u032a\u0005(\u0000\u0000\u032a{\u0001\u0000\u0000\u0000\u032b\u032c\u0007"+ - "\t\u0000\u0000\u032c\u032d\u0007\u0007\u0000\u0000\u032d\u032e\u0007\u0005"+ - "\u0000\u0000\u032e}\u0001\u0000\u0000\u0000\u032f\u0330\u0007\t\u0000"+ - "\u0000\u0330\u0331\u0007\u0014\u0000\u0000\u0331\u0332\u0007\r\u0000\u0000"+ - "\u0332\u0333\u0007\r\u0000\u0000\u0333\u007f\u0001\u0000\u0000\u0000\u0334"+ - "\u0335\u0007\t\u0000\u0000\u0335\u0336\u0007\u0014\u0000\u0000\u0336\u0337"+ - "\u0007\r\u0000\u0000\u0337\u0338\u0007\r\u0000\u0000\u0338\u0339\u0007"+ - "\u0002\u0000\u0000\u0339\u0081\u0001\u0000\u0000\u0000\u033a\u033b\u0007"+ - "\u0007\u0000\u0000\u033b\u033c\u0007\u0006\u0000\u0000\u033c\u0083\u0001"+ - "\u0000\u0000\u0000\u033d\u033e\u0005?\u0000\u0000\u033e\u0085\u0001\u0000"+ - "\u0000\u0000\u033f\u0340\u0007\u0006\u0000\u0000\u0340\u0341\u0007\r\u0000"+ - "\u0000\u0341\u0342\u0007\u0001\u0000\u0000\u0342\u0343\u0007\u0012\u0000"+ - "\u0000\u0343\u0344\u0007\u0003\u0000\u0000\u0344\u0087\u0001\u0000\u0000"+ - "\u0000\u0345\u0346\u0005)\u0000\u0000\u0346\u0089\u0001\u0000\u0000\u0000"+ - "\u0347\u0348\u0007\u0005\u0000\u0000\u0348\u0349\u0007\u0006\u0000\u0000"+ - "\u0349\u034a\u0007\u0014\u0000\u0000\u034a\u034b\u0007\u0003\u0000\u0000"+ - "\u034b\u008b\u0001\u0000\u0000\u0000\u034c\u034d\u0005=\u0000\u0000\u034d"+ - "\u034e\u0005=\u0000\u0000\u034e\u008d\u0001\u0000\u0000\u0000\u034f\u0350"+ - "\u0005=\u0000\u0000\u0350\u0351\u0005~\u0000\u0000\u0351\u008f\u0001\u0000"+ - "\u0000\u0000\u0352\u0353\u0005!\u0000\u0000\u0353\u0354\u0005=\u0000\u0000"+ - "\u0354\u0091\u0001\u0000\u0000\u0000\u0355\u0356\u0005<\u0000\u0000\u0356"+ - "\u0093\u0001\u0000\u0000\u0000\u0357\u0358\u0005<\u0000\u0000\u0358\u0359"+ - "\u0005=\u0000\u0000\u0359\u0095\u0001\u0000\u0000\u0000\u035a\u035b\u0005"+ - ">\u0000\u0000\u035b\u0097\u0001\u0000\u0000\u0000\u035c\u035d\u0005>\u0000"+ - "\u0000\u035d\u035e\u0005=\u0000\u0000\u035e\u0099\u0001\u0000\u0000\u0000"+ - "\u035f\u0360\u0005+\u0000\u0000\u0360\u009b\u0001\u0000\u0000\u0000\u0361"+ - "\u0362\u0005-\u0000\u0000\u0362\u009d\u0001\u0000\u0000\u0000\u0363\u0364"+ - "\u0005*\u0000\u0000\u0364\u009f\u0001\u0000\u0000\u0000\u0365\u0366\u0005"+ - "/\u0000\u0000\u0366\u00a1\u0001\u0000\u0000\u0000\u0367\u0368\u0005%\u0000"+ - "\u0000\u0368\u00a3\u0001\u0000\u0000\u0000\u0369\u036a\u0004J\u0004\u0000"+ - "\u036a\u036b\u00036\u0013\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c"+ - "\u036d\u0006J\r\u0000\u036d\u00a5\u0001\u0000\u0000\u0000\u036e\u0371"+ - "\u0003\u0084:\u0000\u036f\u0372\u0003F\u001b\u0000\u0370\u0372\u0003T"+ - "\"\u0000\u0371\u036f\u0001\u0000\u0000\u0000\u0371\u0370\u0001\u0000\u0000"+ - "\u0000\u0372\u0376\u0001\u0000\u0000\u0000\u0373\u0375\u0003V#\u0000\u0374"+ - "\u0373\u0001\u0000\u0000\u0000\u0375\u0378\u0001\u0000\u0000\u0000\u0376"+ - "\u0374\u0001\u0000\u0000\u0000\u0376\u0377\u0001\u0000\u0000\u0000\u0377"+ - "\u0380\u0001\u0000\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0379"+ - "\u037b\u0003\u0084:\u0000\u037a\u037c\u0003D\u001a\u0000\u037b\u037a\u0001"+ - "\u0000\u0000\u0000\u037c\u037d\u0001\u0000\u0000\u0000\u037d\u037b\u0001"+ - "\u0000\u0000\u0000\u037d\u037e\u0001\u0000\u0000\u0000\u037e\u0380\u0001"+ - "\u0000\u0000\u0000\u037f\u036e\u0001\u0000\u0000\u0000\u037f\u0379\u0001"+ - "\u0000\u0000\u0000\u0380\u00a7\u0001\u0000\u0000\u0000\u0381\u0382\u0005"+ - "[\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383\u0384\u0006L\u0000"+ - "\u0000\u0384\u0385\u0006L\u0000\u0000\u0385\u00a9\u0001\u0000\u0000\u0000"+ - "\u0386\u0387\u0005]\u0000\u0000\u0387\u0388\u0001\u0000\u0000\u0000\u0388"+ - "\u0389\u0006M\f\u0000\u0389\u038a\u0006M\f\u0000\u038a\u00ab\u0001\u0000"+ - "\u0000\u0000\u038b\u038f\u0003F\u001b\u0000\u038c\u038e\u0003V#\u0000"+ - "\u038d\u038c\u0001\u0000\u0000\u0000\u038e\u0391\u0001\u0000\u0000\u0000"+ - "\u038f\u038d\u0001\u0000\u0000\u0000\u038f\u0390\u0001\u0000\u0000\u0000"+ - "\u0390\u039c\u0001\u0000\u0000\u0000\u0391\u038f\u0001\u0000\u0000\u0000"+ - "\u0392\u0395\u0003T\"\u0000\u0393\u0395\u0003N\u001f\u0000\u0394\u0392"+ - "\u0001\u0000\u0000\u0000\u0394\u0393\u0001\u0000\u0000\u0000\u0395\u0397"+ - "\u0001\u0000\u0000\u0000\u0396\u0398\u0003V#\u0000\u0397\u0396\u0001\u0000"+ - "\u0000\u0000\u0398\u0399\u0001\u0000\u0000\u0000\u0399\u0397\u0001\u0000"+ - "\u0000\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u039c\u0001\u0000"+ - "\u0000\u0000\u039b\u038b\u0001\u0000\u0000\u0000\u039b\u0394\u0001\u0000"+ - "\u0000\u0000\u039c\u00ad\u0001\u0000\u0000\u0000\u039d\u039f\u0003P \u0000"+ - "\u039e\u03a0\u0003R!\u0000\u039f\u039e\u0001\u0000\u0000\u0000\u03a0\u03a1"+ - "\u0001\u0000\u0000\u0000\u03a1\u039f\u0001\u0000\u0000\u0000\u03a1\u03a2"+ - "\u0001\u0000\u0000\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4"+ - "\u0003P \u0000\u03a4\u00af\u0001\u0000\u0000\u0000\u03a5\u03a6\u0003\u00ae"+ - "O\u0000\u03a6\u00b1\u0001\u0000\u0000\u0000\u03a7\u03a8\u0003<\u0016\u0000"+ - "\u03a8\u03a9\u0001\u0000\u0000\u0000\u03a9\u03aa\u0006Q\u000b\u0000\u03aa"+ - "\u00b3\u0001\u0000\u0000\u0000\u03ab\u03ac\u0003>\u0017\u0000\u03ac\u03ad"+ - "\u0001\u0000\u0000\u0000\u03ad\u03ae\u0006R\u000b\u0000\u03ae\u00b5\u0001"+ - "\u0000\u0000\u0000\u03af\u03b0\u0003@\u0018\u0000\u03b0\u03b1\u0001\u0000"+ - "\u0000\u0000\u03b1\u03b2\u0006S\u000b\u0000\u03b2\u00b7\u0001\u0000\u0000"+ - "\u0000\u03b3\u03b4\u0003\u00a8L\u0000\u03b4\u03b5\u0001\u0000\u0000\u0000"+ - "\u03b5\u03b6\u0006T\u000e\u0000\u03b6\u03b7\u0006T\u000f\u0000\u03b7\u00b9"+ - "\u0001\u0000\u0000\u0000\u03b8\u03b9\u0003B\u0019\u0000\u03b9\u03ba\u0001"+ - "\u0000\u0000\u0000\u03ba\u03bb\u0006U\u0010\u0000\u03bb\u03bc\u0006U\f"+ - "\u0000\u03bc\u00bb\u0001\u0000\u0000\u0000\u03bd\u03be\u0003@\u0018\u0000"+ - "\u03be\u03bf\u0001\u0000\u0000\u0000\u03bf\u03c0\u0006V\u000b\u0000\u03c0"+ - "\u00bd\u0001\u0000\u0000\u0000\u03c1\u03c2\u0003<\u0016\u0000\u03c2\u03c3"+ - "\u0001\u0000\u0000\u0000\u03c3\u03c4\u0006W\u000b\u0000\u03c4\u00bf\u0001"+ - "\u0000\u0000\u0000\u03c5\u03c6\u0003>\u0017\u0000\u03c6\u03c7\u0001\u0000"+ - "\u0000\u0000\u03c7\u03c8\u0006X\u000b\u0000\u03c8\u00c1\u0001\u0000\u0000"+ - "\u0000\u03c9\u03ca\u0003B\u0019\u0000\u03ca\u03cb\u0001\u0000\u0000\u0000"+ - "\u03cb\u03cc\u0006Y\u0010\u0000\u03cc\u03cd\u0006Y\f\u0000\u03cd\u00c3"+ - "\u0001\u0000\u0000\u0000\u03ce\u03cf\u0003\u00a8L\u0000\u03cf\u03d0\u0001"+ - "\u0000\u0000\u0000\u03d0\u03d1\u0006Z\u000e\u0000\u03d1\u00c5\u0001\u0000"+ - "\u0000\u0000\u03d2\u03d3\u0003\u00aaM\u0000\u03d3\u03d4\u0001\u0000\u0000"+ - "\u0000\u03d4\u03d5\u0006[\u0011\u0000\u03d5\u00c7\u0001\u0000\u0000\u0000"+ - "\u03d6\u03d7\u0003\u014e\u009f\u0000\u03d7\u03d8\u0001\u0000\u0000\u0000"+ - "\u03d8\u03d9\u0006\\\u0012\u0000\u03d9\u00c9\u0001\u0000\u0000\u0000\u03da"+ - "\u03db\u0003h,\u0000\u03db\u03dc\u0001\u0000\u0000\u0000\u03dc\u03dd\u0006"+ - "]\u0013\u0000\u03dd\u00cb\u0001\u0000\u0000\u0000\u03de\u03df\u0003d*"+ - "\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u0006^\u0014\u0000"+ - "\u03e1\u00cd\u0001\u0000\u0000\u0000\u03e2\u03e3\u0007\u0010\u0000\u0000"+ - "\u03e3\u03e4\u0007\u0003\u0000\u0000\u03e4\u03e5\u0007\u0005\u0000\u0000"+ - "\u03e5\u03e6\u0007\f\u0000\u0000\u03e6\u03e7\u0007\u0000\u0000\u0000\u03e7"+ - "\u03e8\u0007\f\u0000\u0000\u03e8\u03e9\u0007\u0005\u0000\u0000\u03e9\u03ea"+ - "\u0007\f\u0000\u0000\u03ea\u00cf\u0001\u0000\u0000\u0000\u03eb\u03ef\b"+ - " \u0000\u0000\u03ec\u03ed\u0005/\u0000\u0000\u03ed\u03ef\b!\u0000\u0000"+ - "\u03ee\u03eb\u0001\u0000\u0000\u0000\u03ee\u03ec\u0001\u0000\u0000\u0000"+ - "\u03ef\u00d1\u0001\u0000\u0000\u0000\u03f0\u03f2\u0003\u00d0`\u0000\u03f1"+ - "\u03f0\u0001\u0000\u0000\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3"+ - "\u03f1\u0001\u0000\u0000\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4"+ - "\u00d3\u0001\u0000\u0000\u0000\u03f5\u03f6\u0003\u00d2a\u0000\u03f6\u03f7"+ - "\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006b\u0015\u0000\u03f8\u00d5\u0001"+ - "\u0000\u0000\u0000\u03f9\u03fa\u0003X$\u0000\u03fa\u03fb\u0001\u0000\u0000"+ - "\u0000\u03fb\u03fc\u0006c\u0016\u0000\u03fc\u00d7\u0001\u0000\u0000\u0000"+ - "\u03fd\u03fe\u0003<\u0016\u0000\u03fe\u03ff\u0001\u0000\u0000\u0000\u03ff"+ - "\u0400\u0006d\u000b\u0000\u0400\u00d9\u0001\u0000\u0000\u0000\u0401\u0402"+ - "\u0003>\u0017\u0000\u0402\u0403\u0001\u0000\u0000\u0000\u0403\u0404\u0006"+ - "e\u000b\u0000\u0404\u00db\u0001\u0000\u0000\u0000\u0405\u0406\u0003@\u0018"+ - "\u0000\u0406\u0407\u0001\u0000\u0000\u0000\u0407\u0408\u0006f\u000b\u0000"+ - "\u0408\u00dd\u0001\u0000\u0000\u0000\u0409\u040a\u0003B\u0019\u0000\u040a"+ - "\u040b\u0001\u0000\u0000\u0000\u040b\u040c\u0006g\u0010\u0000\u040c\u040d"+ - "\u0006g\f\u0000\u040d\u00df\u0001\u0000\u0000\u0000\u040e\u040f\u0003"+ - "l.\u0000\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0411\u0006h\u0017"+ - "\u0000\u0411\u00e1\u0001\u0000\u0000\u0000\u0412\u0413\u0003h,\u0000\u0413"+ - "\u0414\u0001\u0000\u0000\u0000\u0414\u0415\u0006i\u0013\u0000\u0415\u00e3"+ - "\u0001\u0000\u0000\u0000\u0416\u041b\u0003F\u001b\u0000\u0417\u041b\u0003"+ - "D\u001a\u0000\u0418\u041b\u0003T\"\u0000\u0419\u041b\u0003\u009eG\u0000"+ - "\u041a\u0416\u0001\u0000\u0000\u0000\u041a\u0417\u0001\u0000\u0000\u0000"+ - "\u041a\u0418\u0001\u0000\u0000\u0000\u041a\u0419\u0001\u0000\u0000\u0000"+ - "\u041b\u00e5\u0001\u0000\u0000\u0000\u041c\u041f\u0003F\u001b\u0000\u041d"+ - "\u041f\u0003\u009eG\u0000\u041e\u041c\u0001\u0000\u0000\u0000\u041e\u041d"+ - "\u0001\u0000\u0000\u0000\u041f\u0423\u0001\u0000\u0000\u0000\u0420\u0422"+ - "\u0003\u00e4j\u0000\u0421\u0420\u0001\u0000\u0000\u0000\u0422\u0425\u0001"+ - "\u0000\u0000\u0000\u0423\u0421\u0001\u0000\u0000\u0000\u0423\u0424\u0001"+ - "\u0000\u0000\u0000\u0424\u0430\u0001\u0000\u0000\u0000\u0425\u0423\u0001"+ - "\u0000\u0000\u0000\u0426\u0429\u0003T\"\u0000\u0427\u0429\u0003N\u001f"+ - "\u0000\u0428\u0426\u0001\u0000\u0000\u0000\u0428\u0427\u0001\u0000\u0000"+ - "\u0000\u0429\u042b\u0001\u0000\u0000\u0000\u042a\u042c\u0003\u00e4j\u0000"+ - "\u042b\u042a\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000\u0000"+ - "\u042d\u042b\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000\u0000"+ - "\u042e\u0430\u0001\u0000\u0000\u0000\u042f\u041e\u0001\u0000\u0000\u0000"+ - "\u042f\u0428\u0001\u0000\u0000\u0000\u0430\u00e7\u0001\u0000\u0000\u0000"+ - "\u0431\u0434\u0003\u00e6k\u0000\u0432\u0434\u0003\u00aeO\u0000\u0433\u0431"+ - "\u0001\u0000\u0000\u0000\u0433\u0432\u0001\u0000\u0000\u0000\u0434\u0435"+ - "\u0001\u0000\u0000\u0000\u0435\u0433\u0001\u0000\u0000\u0000\u0435\u0436"+ - "\u0001\u0000\u0000\u0000\u0436\u00e9\u0001\u0000\u0000\u0000\u0437\u0438"+ - "\u0003<\u0016\u0000\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0006"+ - "m\u000b\u0000\u043a\u00eb\u0001\u0000\u0000\u0000\u043b\u043c\u0003>\u0017"+ - "\u0000\u043c\u043d\u0001\u0000\u0000\u0000\u043d\u043e\u0006n\u000b\u0000"+ - "\u043e\u00ed\u0001\u0000\u0000\u0000\u043f\u0440\u0003@\u0018\u0000\u0440"+ - "\u0441\u0001\u0000\u0000\u0000\u0441\u0442\u0006o\u000b\u0000\u0442\u00ef"+ - "\u0001\u0000\u0000\u0000\u0443\u0444\u0003B\u0019\u0000\u0444\u0445\u0001"+ - "\u0000\u0000\u0000\u0445\u0446\u0006p\u0010\u0000\u0446\u0447\u0006p\f"+ - "\u0000\u0447\u00f1\u0001\u0000\u0000\u0000\u0448\u0449\u0003d*\u0000\u0449"+ - "\u044a\u0001\u0000\u0000\u0000\u044a\u044b\u0006q\u0014\u0000\u044b\u00f3"+ - "\u0001\u0000\u0000\u0000\u044c\u044d\u0003h,\u0000\u044d\u044e\u0001\u0000"+ - "\u0000\u0000\u044e\u044f\u0006r\u0013\u0000\u044f\u00f5\u0001\u0000\u0000"+ - "\u0000\u0450\u0451\u0003l.\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452"+ - "\u0453\u0006s\u0017\u0000\u0453\u00f7\u0001\u0000\u0000\u0000\u0454\u0455"+ - "\u0007\f\u0000\u0000\u0455\u0456\u0007\u0002\u0000\u0000\u0456\u00f9\u0001"+ - "\u0000\u0000\u0000\u0457\u0458\u0003\u00e8l\u0000\u0458\u0459\u0001\u0000"+ - "\u0000\u0000\u0459\u045a\u0006u\u0018\u0000\u045a\u00fb\u0001\u0000\u0000"+ - "\u0000\u045b\u045c\u0003<\u0016\u0000\u045c\u045d\u0001\u0000\u0000\u0000"+ - "\u045d\u045e\u0006v\u000b\u0000\u045e\u00fd\u0001\u0000\u0000\u0000\u045f"+ - "\u0460\u0003>\u0017\u0000\u0460\u0461\u0001\u0000\u0000\u0000\u0461\u0462"+ - "\u0006w\u000b\u0000\u0462\u00ff\u0001\u0000\u0000\u0000\u0463\u0464\u0003"+ - "@\u0018\u0000\u0464\u0465\u0001\u0000\u0000\u0000\u0465\u0466\u0006x\u000b"+ - "\u0000\u0466\u0101\u0001\u0000\u0000\u0000\u0467\u0468\u0003B\u0019\u0000"+ - "\u0468\u0469\u0001\u0000\u0000\u0000\u0469\u046a\u0006y\u0010\u0000\u046a"+ - "\u046b\u0006y\f\u0000\u046b\u0103\u0001\u0000\u0000\u0000\u046c\u046d"+ - "\u0003\u00a8L\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u046f\u0006"+ - "z\u000e\u0000\u046f\u0470\u0006z\u0019\u0000\u0470\u0105\u0001\u0000\u0000"+ - "\u0000\u0471\u0472\u0007\u0007\u0000\u0000\u0472\u0473\u0007\t\u0000\u0000"+ - "\u0473\u0474\u0001\u0000\u0000\u0000\u0474\u0475\u0006{\u001a\u0000\u0475"+ - "\u0107\u0001\u0000\u0000\u0000\u0476\u0477\u0007\u0013\u0000\u0000\u0477"+ - "\u0478\u0007\u0001\u0000\u0000\u0478\u0479\u0007\u0005\u0000\u0000\u0479"+ - "\u047a\u0007\n\u0000\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047c"+ - "\u0006|\u001a\u0000\u047c\u0109\u0001\u0000\u0000\u0000\u047d\u047e\b"+ - "\"\u0000\u0000\u047e\u010b\u0001\u0000\u0000\u0000\u047f\u0481\u0003\u010a"+ - "}\u0000\u0480\u047f\u0001\u0000\u0000\u0000\u0481\u0482\u0001\u0000\u0000"+ - "\u0000\u0482\u0480\u0001\u0000\u0000\u0000\u0482\u0483\u0001\u0000\u0000"+ - "\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485\u0003\u014e\u009f"+ - "\u0000\u0485\u0487\u0001\u0000\u0000\u0000\u0486\u0480\u0001\u0000\u0000"+ - "\u0000\u0486\u0487\u0001\u0000\u0000\u0000\u0487\u0489\u0001\u0000\u0000"+ - "\u0000\u0488\u048a\u0003\u010a}\u0000\u0489\u0488\u0001\u0000\u0000\u0000"+ - "\u048a\u048b\u0001\u0000\u0000\u0000\u048b\u0489\u0001\u0000\u0000\u0000"+ - "\u048b\u048c\u0001\u0000\u0000\u0000\u048c\u010d\u0001\u0000\u0000\u0000"+ - "\u048d\u048e\u0003\u010c~\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f"+ - "\u0490\u0006\u007f\u001b\u0000\u0490\u010f\u0001\u0000\u0000\u0000\u0491"+ - "\u0492\u0003<\u0016\u0000\u0492\u0493\u0001\u0000\u0000\u0000\u0493\u0494"+ - "\u0006\u0080\u000b\u0000\u0494\u0111\u0001\u0000\u0000\u0000\u0495\u0496"+ - "\u0003>\u0017\u0000\u0496\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u0006"+ - "\u0081\u000b\u0000\u0498\u0113\u0001\u0000\u0000\u0000\u0499\u049a\u0003"+ - "@\u0018\u0000\u049a\u049b\u0001\u0000\u0000\u0000\u049b\u049c\u0006\u0082"+ - "\u000b\u0000\u049c\u0115\u0001\u0000\u0000\u0000\u049d\u049e\u0003B\u0019"+ - "\u0000\u049e\u049f\u0001\u0000\u0000\u0000\u049f\u04a0\u0006\u0083\u0010"+ - "\u0000\u04a0\u04a1\u0006\u0083\f\u0000\u04a1\u04a2\u0006\u0083\f\u0000"+ - "\u04a2\u0117\u0001\u0000\u0000\u0000\u04a3\u04a4\u0003d*\u0000\u04a4\u04a5"+ - "\u0001\u0000\u0000\u0000\u04a5\u04a6\u0006\u0084\u0014\u0000\u04a6\u0119"+ - "\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003h,\u0000\u04a8\u04a9\u0001\u0000"+ - "\u0000\u0000\u04a9\u04aa\u0006\u0085\u0013\u0000\u04aa\u011b\u0001\u0000"+ - "\u0000\u0000\u04ab\u04ac\u0003l.\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000"+ - "\u04ad\u04ae\u0006\u0086\u0017\u0000\u04ae\u011d\u0001\u0000\u0000\u0000"+ - "\u04af\u04b0\u0003\u0108|\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1"+ - "\u04b2\u0006\u0087\u001c\u0000\u04b2\u011f\u0001\u0000\u0000\u0000\u04b3"+ - "\u04b4\u0003\u00e8l\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6"+ - "\u0006\u0088\u0018\u0000\u04b6\u0121\u0001\u0000\u0000\u0000\u04b7\u04b8"+ - "\u0003\u00b0P\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006"+ - "\u0089\u001d\u0000\u04ba\u0123\u0001\u0000\u0000\u0000\u04bb\u04bc\u0003"+ - "<\u0016\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0006\u008a"+ - "\u000b\u0000\u04be\u0125\u0001\u0000\u0000\u0000\u04bf\u04c0\u0003>\u0017"+ - "\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04c2\u0006\u008b\u000b"+ - "\u0000\u04c2\u0127\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003@\u0018\u0000"+ - "\u04c4\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0006\u008c\u000b\u0000"+ - "\u04c6\u0129\u0001\u0000\u0000\u0000\u04c7\u04c8\u0003B\u0019\u0000\u04c8"+ - "\u04c9\u0001\u0000\u0000\u0000\u04c9\u04ca\u0006\u008d\u0010\u0000\u04ca"+ - "\u04cb\u0006\u008d\f\u0000\u04cb\u012b\u0001\u0000\u0000\u0000\u04cc\u04cd"+ - "\u0003l.\u0000\u04cd\u04ce\u0001\u0000\u0000\u0000\u04ce\u04cf\u0006\u008e"+ - "\u0017\u0000\u04cf\u012d\u0001\u0000\u0000\u0000\u04d0\u04d1\u0003\u00b0"+ - "P\u0000\u04d1\u04d2\u0001\u0000\u0000\u0000\u04d2\u04d3\u0006\u008f\u001d"+ - "\u0000\u04d3\u012f\u0001\u0000\u0000\u0000\u04d4\u04d5\u0003\u00acN\u0000"+ - "\u04d5\u04d6\u0001\u0000\u0000\u0000\u04d6\u04d7\u0006\u0090\u001e\u0000"+ - "\u04d7\u0131\u0001\u0000\u0000\u0000\u04d8\u04d9\u0003<\u0016\u0000\u04d9"+ - "\u04da\u0001\u0000\u0000\u0000\u04da\u04db\u0006\u0091\u000b\u0000\u04db"+ - "\u0133\u0001\u0000\u0000\u0000\u04dc\u04dd\u0003>\u0017\u0000\u04dd\u04de"+ - "\u0001\u0000\u0000\u0000\u04de\u04df\u0006\u0092\u000b\u0000\u04df\u0135"+ - "\u0001\u0000\u0000\u0000\u04e0\u04e1\u0003@\u0018\u0000\u04e1\u04e2\u0001"+ - "\u0000\u0000\u0000\u04e2\u04e3\u0006\u0093\u000b\u0000\u04e3\u0137\u0001"+ - "\u0000\u0000\u0000\u04e4\u04e5\u0003B\u0019\u0000\u04e5\u04e6\u0001\u0000"+ - "\u0000\u0000\u04e6\u04e7\u0006\u0094\u0010\u0000\u04e7\u04e8\u0006\u0094"+ - "\f\u0000\u04e8\u0139\u0001\u0000\u0000\u0000\u04e9\u04ea\u0007\u0001\u0000"+ - "\u0000\u04ea\u04eb\u0007\t\u0000\u0000\u04eb\u04ec\u0007\u000f\u0000\u0000"+ - "\u04ec\u04ed\u0007\u0007\u0000\u0000\u04ed\u013b\u0001\u0000\u0000\u0000"+ - "\u04ee\u04ef\u0003<\u0016\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0"+ - "\u04f1\u0006\u0096\u000b\u0000\u04f1\u013d\u0001\u0000\u0000\u0000\u04f2"+ - "\u04f3\u0003>\u0017\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000\u04f4\u04f5"+ - "\u0006\u0097\u000b\u0000\u04f5\u013f\u0001\u0000\u0000\u0000\u04f6\u04f7"+ - "\u0003@\u0018\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04f9\u0006"+ - "\u0098\u000b\u0000\u04f9\u0141\u0001\u0000\u0000\u0000\u04fa\u04fb\u0003"+ - "B\u0019\u0000\u04fb\u04fc\u0001\u0000\u0000\u0000\u04fc\u04fd\u0006\u0099"+ - "\u0010\u0000\u04fd\u04fe\u0006\u0099\f\u0000\u04fe\u0143\u0001\u0000\u0000"+ - "\u0000\u04ff\u0500\u0007\u000f\u0000\u0000\u0500\u0501\u0007\u0014\u0000"+ - "\u0000\u0501\u0502\u0007\t\u0000\u0000\u0502\u0503\u0007\u0004\u0000\u0000"+ - "\u0503\u0504\u0007\u0005\u0000\u0000\u0504\u0505\u0007\u0001\u0000\u0000"+ - "\u0505\u0506\u0007\u0007\u0000\u0000\u0506\u0507\u0007\t\u0000\u0000\u0507"+ - "\u0508\u0007\u0002\u0000\u0000\u0508\u0145\u0001\u0000\u0000\u0000\u0509"+ - "\u050a\u0003<\u0016\u0000\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c"+ - "\u0006\u009b\u000b\u0000\u050c\u0147\u0001\u0000\u0000\u0000\u050d\u050e"+ - "\u0003>\u0017\u0000\u050e\u050f\u0001\u0000\u0000\u0000\u050f\u0510\u0006"+ - "\u009c\u000b\u0000\u0510\u0149\u0001\u0000\u0000\u0000\u0511\u0512\u0003"+ - "@\u0018\u0000\u0512\u0513\u0001\u0000\u0000\u0000\u0513\u0514\u0006\u009d"+ - "\u000b\u0000\u0514\u014b\u0001\u0000\u0000\u0000\u0515\u0516\u0003\u00aa"+ - "M\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517\u0518\u0006\u009e\u0011"+ - "\u0000\u0518\u0519\u0006\u009e\f\u0000\u0519\u014d\u0001\u0000\u0000\u0000"+ - "\u051a\u051b\u0005:\u0000\u0000\u051b\u014f\u0001\u0000\u0000\u0000\u051c"+ - "\u0522\u0003N\u001f\u0000\u051d\u0522\u0003D\u001a\u0000\u051e\u0522\u0003"+ - "l.\u0000\u051f\u0522\u0003F\u001b\u0000\u0520\u0522\u0003T\"\u0000\u0521"+ - "\u051c\u0001\u0000\u0000\u0000\u0521\u051d\u0001\u0000\u0000\u0000\u0521"+ - "\u051e\u0001\u0000\u0000\u0000\u0521\u051f\u0001\u0000\u0000\u0000\u0521"+ - "\u0520\u0001\u0000\u0000\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ - "\u0521\u0001\u0000\u0000\u0000\u0523\u0524\u0001\u0000\u0000\u0000\u0524"+ - "\u0151\u0001\u0000\u0000\u0000\u0525\u0526\u0003<\u0016\u0000\u0526\u0527"+ - "\u0001\u0000\u0000\u0000\u0527\u0528\u0006\u00a1\u000b\u0000\u0528\u0153"+ - "\u0001\u0000\u0000\u0000\u0529\u052a\u0003>\u0017\u0000\u052a\u052b\u0001"+ - "\u0000\u0000\u0000\u052b\u052c\u0006\u00a2\u000b\u0000\u052c\u0155\u0001"+ - "\u0000\u0000\u0000\u052d\u052e\u0003@\u0018\u0000\u052e\u052f\u0001\u0000"+ - "\u0000\u0000\u052f\u0530\u0006\u00a3\u000b\u0000\u0530\u0157\u0001\u0000"+ - "\u0000\u0000\u0531\u0532\u0003B\u0019\u0000\u0532\u0533\u0001\u0000\u0000"+ - "\u0000\u0533\u0534\u0006\u00a4\u0010\u0000\u0534\u0535\u0006\u00a4\f\u0000"+ - "\u0535\u0159\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u014e\u009f\u0000"+ - "\u0537\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0006\u00a5\u0012\u0000"+ - "\u0539\u015b\u0001\u0000\u0000\u0000\u053a\u053b\u0003h,\u0000\u053b\u053c"+ - "\u0001\u0000\u0000\u0000\u053c\u053d\u0006\u00a6\u0013\u0000\u053d\u015d"+ - "\u0001\u0000\u0000\u0000\u053e\u053f\u0003l.\u0000\u053f\u0540\u0001\u0000"+ - "\u0000\u0000\u0540\u0541\u0006\u00a7\u0017\u0000\u0541\u015f\u0001\u0000"+ - "\u0000\u0000\u0542\u0543\u0003\u0106{\u0000\u0543\u0544\u0001\u0000\u0000"+ - "\u0000\u0544\u0545\u0006\u00a8\u001f\u0000\u0545\u0546\u0006\u00a8 \u0000"+ - "\u0546\u0161\u0001\u0000\u0000\u0000\u0547\u0548\u0003\u00d2a\u0000\u0548"+ - "\u0549\u0001\u0000\u0000\u0000\u0549\u054a\u0006\u00a9\u0015\u0000\u054a"+ - "\u0163\u0001\u0000\u0000\u0000\u054b\u054c\u0003X$\u0000\u054c\u054d\u0001"+ - "\u0000\u0000\u0000\u054d\u054e\u0006\u00aa\u0016\u0000\u054e\u0165\u0001"+ - "\u0000\u0000\u0000\u054f\u0550\u0003<\u0016\u0000\u0550\u0551\u0001\u0000"+ - "\u0000\u0000\u0551\u0552\u0006\u00ab\u000b\u0000\u0552\u0167\u0001\u0000"+ - "\u0000\u0000\u0553\u0554\u0003>\u0017\u0000\u0554\u0555\u0001\u0000\u0000"+ - "\u0000\u0555\u0556\u0006\u00ac\u000b\u0000\u0556\u0169\u0001\u0000\u0000"+ - "\u0000\u0557\u0558\u0003@\u0018\u0000\u0558\u0559\u0001\u0000\u0000\u0000"+ - "\u0559\u055a\u0006\u00ad\u000b\u0000\u055a\u016b\u0001\u0000\u0000\u0000"+ - "\u055b\u055c\u0003B\u0019\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d"+ - "\u055e\u0006\u00ae\u0010\u0000\u055e\u055f\u0006\u00ae\f\u0000\u055f\u0560"+ - "\u0006\u00ae\f\u0000\u0560\u016d\u0001\u0000\u0000\u0000\u0561\u0562\u0003"+ - "h,\u0000\u0562\u0563\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u00af\u0013"+ - "\u0000\u0564\u016f\u0001\u0000\u0000\u0000\u0565\u0566\u0003l.\u0000\u0566"+ - "\u0567\u0001\u0000\u0000\u0000\u0567\u0568\u0006\u00b0\u0017\u0000\u0568"+ - "\u0171\u0001\u0000\u0000\u0000\u0569\u056a\u0003\u00e8l\u0000\u056a\u056b"+ - "\u0001\u0000\u0000\u0000\u056b\u056c\u0006\u00b1\u0018\u0000\u056c\u0173"+ - "\u0001\u0000\u0000\u0000\u056d\u056e\u0003<\u0016\u0000\u056e\u056f\u0001"+ - "\u0000\u0000\u0000\u056f\u0570\u0006\u00b2\u000b\u0000\u0570\u0175\u0001"+ - "\u0000\u0000\u0000\u0571\u0572\u0003>\u0017\u0000\u0572\u0573\u0001\u0000"+ - "\u0000\u0000\u0573\u0574\u0006\u00b3\u000b\u0000\u0574\u0177\u0001\u0000"+ - "\u0000\u0000\u0575\u0576\u0003@\u0018\u0000\u0576\u0577\u0001\u0000\u0000"+ - "\u0000\u0577\u0578\u0006\u00b4\u000b\u0000\u0578\u0179\u0001\u0000\u0000"+ - "\u0000\u0579\u057a\u0003B\u0019\u0000\u057a\u057b\u0001\u0000\u0000\u0000"+ - "\u057b\u057c\u0006\u00b5\u0010\u0000\u057c\u057d\u0006\u00b5\f\u0000\u057d"+ - "\u017b\u0001\u0000\u0000\u0000\u057e\u057f\u0003\u00d2a\u0000\u057f\u0580"+ - "\u0001\u0000\u0000\u0000\u0580\u0581\u0006\u00b6\u0015\u0000\u0581\u0582"+ - "\u0006\u00b6\f\u0000\u0582\u0583\u0006\u00b6!\u0000\u0583\u017d\u0001"+ - "\u0000\u0000\u0000\u0584\u0585\u0003X$\u0000\u0585\u0586\u0001\u0000\u0000"+ - "\u0000\u0586\u0587\u0006\u00b7\u0016\u0000\u0587\u0588\u0006\u00b7\f\u0000"+ - "\u0588\u0589\u0006\u00b7!\u0000\u0589\u017f\u0001\u0000\u0000\u0000\u058a"+ - "\u058b\u0003<\u0016\u0000\u058b\u058c\u0001\u0000\u0000\u0000\u058c\u058d"+ - "\u0006\u00b8\u000b\u0000\u058d\u0181\u0001\u0000\u0000\u0000\u058e\u058f"+ - "\u0003>\u0017\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591\u0006"+ - "\u00b9\u000b\u0000\u0591\u0183\u0001\u0000\u0000\u0000\u0592\u0593\u0003"+ - "@\u0018\u0000\u0593\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u0006\u00ba"+ - "\u000b\u0000\u0595\u0185\u0001\u0000\u0000\u0000\u0596\u0597\u0003\u014e"+ - "\u009f\u0000\u0597\u0598\u0001\u0000\u0000\u0000\u0598\u0599\u0006\u00bb"+ - "\u0012\u0000\u0599\u059a\u0006\u00bb\f\u0000\u059a\u059b\u0006\u00bb\n"+ - "\u0000\u059b\u0187\u0001\u0000\u0000\u0000\u059c\u059d\u0003h,\u0000\u059d"+ - "\u059e\u0001\u0000\u0000\u0000\u059e\u059f\u0006\u00bc\u0013\u0000\u059f"+ - "\u05a0\u0006\u00bc\f\u0000\u05a0\u05a1\u0006\u00bc\n\u0000\u05a1\u0189"+ - "\u0001\u0000\u0000\u0000\u05a2\u05a3\u0003<\u0016\u0000\u05a3\u05a4\u0001"+ - "\u0000\u0000\u0000\u05a4\u05a5\u0006\u00bd\u000b\u0000\u05a5\u018b\u0001"+ - "\u0000\u0000\u0000\u05a6\u05a7\u0003>\u0017\u0000\u05a7\u05a8\u0001\u0000"+ - "\u0000\u0000\u05a8\u05a9\u0006\u00be\u000b\u0000\u05a9\u018d\u0001\u0000"+ - "\u0000\u0000\u05aa\u05ab\u0003@\u0018\u0000\u05ab\u05ac\u0001\u0000\u0000"+ - "\u0000\u05ac\u05ad\u0006\u00bf\u000b\u0000\u05ad\u018f\u0001\u0000\u0000"+ - "\u0000\u05ae\u05af\u0003\u00b0P\u0000\u05af\u05b0\u0001\u0000\u0000\u0000"+ - "\u05b0\u05b1\u0006\u00c0\f\u0000\u05b1\u05b2\u0006\u00c0\u0000\u0000\u05b2"+ - "\u05b3\u0006\u00c0\u001d\u0000\u05b3\u0191\u0001\u0000\u0000\u0000\u05b4"+ - "\u05b5\u0003\u00acN\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7"+ - "\u0006\u00c1\f\u0000\u05b7\u05b8\u0006\u00c1\u0000\u0000\u05b8\u05b9\u0006"+ - "\u00c1\u001e\u0000\u05b9\u0193\u0001\u0000\u0000\u0000\u05ba\u05bb\u0003"+ - "^\'\u0000\u05bb\u05bc\u0001\u0000\u0000\u0000\u05bc\u05bd\u0006\u00c2"+ - "\f\u0000\u05bd\u05be\u0006\u00c2\u0000\u0000\u05be\u05bf\u0006\u00c2\""+ - "\u0000\u05bf\u0195\u0001\u0000\u0000\u0000\u05c0\u05c1\u0003B\u0019\u0000"+ - "\u05c1\u05c2\u0001\u0000\u0000\u0000\u05c2\u05c3\u0006\u00c3\u0010\u0000"+ - "\u05c3\u05c4\u0006\u00c3\f\u0000\u05c4\u0197\u0001\u0000\u0000\u0000B"+ - "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+ - "\u000f\u0253\u025d\u0261\u0264\u026d\u026f\u027a\u028d\u0292\u029b\u02a2"+ - "\u02a7\u02a9\u02b4\u02bc\u02bf\u02c1\u02c6\u02cb\u02d1\u02d8\u02dd\u02e3"+ - "\u02e6\u02ee\u02f2\u0371\u0376\u037d\u037f\u038f\u0394\u0399\u039b\u03a1"+ - "\u03ee\u03f3\u041a\u041e\u0423\u0428\u042d\u042f\u0433\u0435\u0482\u0486"+ - "\u048b\u0521\u0523#\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000"+ - "\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000\u0005"+ - "\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000\u0001"+ - "\u0000\u0004\u0000\u0000\u0007\u0014\u0000\u0007B\u0000\u0005\u0000\u0000"+ - "\u0007\u001a\u0000\u0007C\u0000\u0007m\u0000\u0007#\u0000\u0007!\u0000"+ - "\u0007M\u0000\u0007\u001b\u0000\u0007%\u0000\u0007Q\u0000\u0005\u000b"+ - "\u0000\u0005\u0007\u0000\u0007[\u0000\u0007Z\u0000\u0007E\u0000\u0007"+ - "D\u0000\u0007Y\u0000\u0005\r\u0000\u0005\u000f\u0000\u0007\u001e\u0000"; + "\u0014\u0001\u0014\u0001\u0015\u0004\u0015\u024f\b\u0015\u000b\u0015\f"+ + "\u0015\u0250\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0005\u0016\u0259\b\u0016\n\u0016\f\u0016\u025c\t\u0016\u0001"+ + "\u0016\u0003\u0016\u025f\b\u0016\u0001\u0016\u0003\u0016\u0262\b\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0005\u0017\u026b\b\u0017\n\u0017\f\u0017\u026e\t\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0004"+ + "\u0018\u0276\b\u0018\u000b\u0018\f\u0018\u0277\u0001\u0018\u0001\u0018"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ + "\u0001\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u028b\b\u001e\u0001\u001e"+ + "\u0004\u001e\u028e\b\u001e\u000b\u001e\f\u001e\u028f\u0001\u001f\u0001"+ + "\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0003!\u0299\b!\u0001\"\u0001"+ + "\"\u0001#\u0001#\u0001#\u0003#\u02a0\b#\u0001$\u0001$\u0001$\u0005$\u02a5"+ + "\b$\n$\f$\u02a8\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u02b0"+ + "\b$\n$\f$\u02b3\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0003$\u02ba\b$"+ + "\u0001$\u0003$\u02bd\b$\u0003$\u02bf\b$\u0001%\u0004%\u02c2\b%\u000b%"+ + "\f%\u02c3\u0001&\u0004&\u02c7\b&\u000b&\f&\u02c8\u0001&\u0001&\u0005&"+ + "\u02cd\b&\n&\f&\u02d0\t&\u0001&\u0001&\u0004&\u02d4\b&\u000b&\f&\u02d5"+ + "\u0001&\u0004&\u02d9\b&\u000b&\f&\u02da\u0001&\u0001&\u0005&\u02df\b&"+ + "\n&\f&\u02e2\t&\u0003&\u02e4\b&\u0001&\u0001&\u0001&\u0001&\u0004&\u02ea"+ + "\b&\u000b&\f&\u02eb\u0001&\u0001&\u0003&\u02f0\b&\u0001\'\u0001\'\u0001"+ + "\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ + "*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ + "0\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u0001"+ + "2\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ + "4\u00015\u00015\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ + "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ + "9\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001"+ + "?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001"+ + "G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ + "K\u0001K\u0001K\u0003K\u036f\bK\u0001K\u0005K\u0372\bK\nK\fK\u0375\tK"+ + "\u0001K\u0001K\u0004K\u0379\bK\u000bK\fK\u037a\u0003K\u037d\bK\u0001L"+ + "\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ + "N\u0001N\u0005N\u038b\bN\nN\fN\u038e\tN\u0001N\u0001N\u0003N\u0392\bN"+ + "\u0001N\u0004N\u0395\bN\u000bN\fN\u0396\u0003N\u0399\bN\u0001O\u0001O"+ + "\u0004O\u039d\bO\u000bO\fO\u039e\u0001O\u0001O\u0001P\u0001P\u0001Q\u0001"+ + "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ + "S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ + "X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+ + "Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ + "]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001"+ + "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0003"+ + "`\u03ec\b`\u0001a\u0004a\u03ef\ba\u000ba\fa\u03f0\u0001b\u0001b\u0001"+ + "b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ + "e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+ + "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ + "i\u0001j\u0001j\u0001j\u0001j\u0003j\u0418\bj\u0001k\u0001k\u0003k\u041c"+ + "\bk\u0001k\u0005k\u041f\bk\nk\fk\u0422\tk\u0001k\u0001k\u0003k\u0426\b"+ + "k\u0001k\u0004k\u0429\bk\u000bk\fk\u042a\u0003k\u042d\bk\u0001l\u0001"+ + "l\u0004l\u0431\bl\u000bl\fl\u0432\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ + "n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001"+ + "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ + "s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+ + "u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001x\u0001"+ + "x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001"+ + "z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001"+ + "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0004~\u047e\b~\u000b"+ + "~\f~\u047f\u0001~\u0001~\u0003~\u0484\b~\u0001~\u0004~\u0487\b~\u000b"+ + "~\f~\u0488\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080"+ + "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081"+ + "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083"+ + "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084"+ + "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085"+ + "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087"+ + "\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ + "\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a"+ + "\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ + "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+ + "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ + "\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ + "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091"+ + "\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ + "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ + "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ + "\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096"+ + "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ + "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ + "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ + "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0004\u00a0"+ + "\u051f\b\u00a0\u000b\u00a0\f\u00a0\u0520\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ + "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ + "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ + "\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ + "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ + "\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+ + "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ + "\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ + "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ + "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001"+ + "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ + "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001"+ + "\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ + "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001"+ + "\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ + "\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ + "\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ + "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ + "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ + "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ + "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ + "\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ + "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ + "\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001"+ + "\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+ + "\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ + "\u00c3\u0001\u00c3\u0002\u026c\u02b1\u0000\u00c4\u0010\u0001\u0012\u0002"+ + "\u0014\u0003\u0016\u0004\u0018\u0005\u001a\u0006\u001c\u0007\u001e\b "+ + "\t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u00112\u00124\u00136\u00148"+ + "\u0015:\u0016<\u0017>\u0018@\u0019B\u001aD\u0000F\u0000H\u0000J\u0000"+ + "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u001bZ\u001c\\\u001d^\u001e"+ + "`\u001fb d!f\"h#j$l%n&p\'r(t)v*x+z,|-~.\u0080/\u00820\u00841\u00862\u0088"+ + "3\u008a4\u008c5\u008e6\u00907\u00928\u00949\u0096:\u0098;\u009a<\u009c"+ + "=\u009e>\u00a0?\u00a2@\u00a4\u0000\u00a6A\u00a8B\u00aaC\u00acD\u00ae\u0000"+ + "\u00b0E\u00b2F\u00b4G\u00b6H\u00b8\u0000\u00ba\u0000\u00bcI\u00beJ\u00c0"+ + "K\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc\u0000"+ + "\u00ceL\u00d0\u0000\u00d2M\u00d4\u0000\u00d6\u0000\u00d8N\u00daO\u00dc"+ + "P\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\u0000\u00e8Q\u00ea"+ + "R\u00ecS\u00eeT\u00f0\u0000\u00f2\u0000\u00f4\u0000\u00f6\u0000\u00f8"+ + "U\u00fa\u0000\u00fcV\u00feW\u0100X\u0102\u0000\u0104\u0000\u0106Y\u0108"+ + "Z\u010a\u0000\u010c[\u010e\u0000\u0110\\\u0112]\u0114^\u0116\u0000\u0118"+ + "\u0000\u011a\u0000\u011c\u0000\u011e\u0000\u0120\u0000\u0122\u0000\u0124"+ + "_\u0126`\u0128a\u012a\u0000\u012c\u0000\u012e\u0000\u0130\u0000\u0132"+ + "b\u0134c\u0136d\u0138\u0000\u013ae\u013cf\u013eg\u0140h\u0142\u0000\u0144"+ + "i\u0146j\u0148k\u014al\u014c\u0000\u014em\u0150n\u0152o\u0154p\u0156q"+ + "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0000\u0160\u0000\u0162\u0000"+ + "\u0164\u0000\u0166r\u0168s\u016at\u016c\u0000\u016e\u0000\u0170\u0000"+ + "\u0172\u0000\u0174u\u0176v\u0178w\u017a\u0000\u017c\u0000\u017e\u0000"+ + "\u0180x\u0182y\u0184z\u0186\u0000\u0188\u0000\u018a{\u018c|\u018e}\u0190"+ + "\u0000\u0192\u0000\u0194\u0000\u0196\u0000\u0010\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd"+ + "\u0002\u0000IIii\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ + "\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000"+ + "NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002"+ + "\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002\u0000GGgg\u0002\u0000"+ + "KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\u0002"+ + "\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002\u0000AZaz\b\u0000"+ + "\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001"+ + "\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\u000b\u0000\t\n\r\r \"\",,/"+ + "/::==[[]]||\u0002\u0000**//\u000b\u0000\t\n\r\r \"#,,//::<<>?\\\\||\u05dd"+ + "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ + "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ + "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ + "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ + "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ + "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ + "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ + "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ + "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ + "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ + "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ + "@\u0001\u0000\u0000\u0000\u0001B\u0001\u0000\u0000\u0000\u0001X\u0001"+ + "\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000\u0000\u0001\\\u0001\u0000"+ + "\u0000\u0000\u0001^\u0001\u0000\u0000\u0000\u0001`\u0001\u0000\u0000\u0000"+ + "\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001f"+ + "\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000"+ + "\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000"+ + "\u0001p\u0001\u0000\u0000\u0000\u0001r\u0001\u0000\u0000\u0000\u0001t"+ + "\u0001\u0000\u0000\u0000\u0001v\u0001\u0000\u0000\u0000\u0001x\u0001\u0000"+ + "\u0000\u0000\u0001z\u0001\u0000\u0000\u0000\u0001|\u0001\u0000\u0000\u0000"+ + "\u0001~\u0001\u0000\u0000\u0000\u0001\u0080\u0001\u0000\u0000\u0000\u0001"+ + "\u0082\u0001\u0000\u0000\u0000\u0001\u0084\u0001\u0000\u0000\u0000\u0001"+ + "\u0086\u0001\u0000\u0000\u0000\u0001\u0088\u0001\u0000\u0000\u0000\u0001"+ + "\u008a\u0001\u0000\u0000\u0000\u0001\u008c\u0001\u0000\u0000\u0000\u0001"+ + "\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001"+ + "\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0001"+ + "\u0096\u0001\u0000\u0000\u0000\u0001\u0098\u0001\u0000\u0000\u0000\u0001"+ + "\u009a\u0001\u0000\u0000\u0000\u0001\u009c\u0001\u0000\u0000\u0000\u0001"+ + "\u009e\u0001\u0000\u0000\u0000\u0001\u00a0\u0001\u0000\u0000\u0000\u0001"+ + "\u00a2\u0001\u0000\u0000\u0000\u0001\u00a4\u0001\u0000\u0000\u0000\u0001"+ + "\u00a6\u0001\u0000\u0000\u0000\u0001\u00a8\u0001\u0000\u0000\u0000\u0001"+ + "\u00aa\u0001\u0000\u0000\u0000\u0001\u00ac\u0001\u0000\u0000\u0000\u0001"+ + "\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2\u0001\u0000\u0000\u0000\u0001"+ + "\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6\u0001\u0000\u0000\u0000\u0002"+ + "\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba\u0001\u0000\u0000\u0000\u0002"+ + "\u00bc\u0001\u0000\u0000\u0000\u0002\u00be\u0001\u0000\u0000\u0000\u0002"+ + "\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2\u0001\u0000\u0000\u0000\u0003"+ + "\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6\u0001\u0000\u0000\u0000\u0003"+ + "\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca\u0001\u0000\u0000\u0000\u0003"+ + "\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce\u0001\u0000\u0000\u0000\u0003"+ + "\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4\u0001\u0000\u0000\u0000\u0003"+ + "\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8\u0001\u0000\u0000\u0000\u0003"+ + "\u00da\u0001\u0000\u0000\u0000\u0003\u00dc\u0001\u0000\u0000\u0000\u0004"+ + "\u00de\u0001\u0000\u0000\u0000\u0004\u00e0\u0001\u0000\u0000\u0000\u0004"+ + "\u00e2\u0001\u0000\u0000\u0000\u0004\u00e8\u0001\u0000\u0000\u0000\u0004"+ + "\u00ea\u0001\u0000\u0000\u0000\u0004\u00ec\u0001\u0000\u0000\u0000\u0004"+ + "\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005"+ + "\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005"+ + "\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005"+ + "\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005"+ + "\u00fe\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0006"+ + "\u0102\u0001\u0000\u0000\u0000\u0006\u0104\u0001\u0000\u0000\u0000\u0006"+ + "\u0106\u0001\u0000\u0000\u0000\u0006\u0108\u0001\u0000\u0000\u0000\u0006"+ + "\u010c\u0001\u0000\u0000\u0000\u0006\u010e\u0001\u0000\u0000\u0000\u0006"+ + "\u0110\u0001\u0000\u0000\u0000\u0006\u0112\u0001\u0000\u0000\u0000\u0006"+ + "\u0114\u0001\u0000\u0000\u0000\u0007\u0116\u0001\u0000\u0000\u0000\u0007"+ + "\u0118\u0001\u0000\u0000\u0000\u0007\u011a\u0001\u0000\u0000\u0000\u0007"+ + "\u011c\u0001\u0000\u0000\u0000\u0007\u011e\u0001\u0000\u0000\u0000\u0007"+ + "\u0120\u0001\u0000\u0000\u0000\u0007\u0122\u0001\u0000\u0000\u0000\u0007"+ + "\u0124\u0001\u0000\u0000\u0000\u0007\u0126\u0001\u0000\u0000\u0000\u0007"+ + "\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001\u0000\u0000\u0000\b\u012c"+ + "\u0001\u0000\u0000\u0000\b\u012e\u0001\u0000\u0000\u0000\b\u0130\u0001"+ + "\u0000\u0000\u0000\b\u0132\u0001\u0000\u0000\u0000\b\u0134\u0001\u0000"+ + "\u0000\u0000\b\u0136\u0001\u0000\u0000\u0000\t\u0138\u0001\u0000\u0000"+ + "\u0000\t\u013a\u0001\u0000\u0000\u0000\t\u013c\u0001\u0000\u0000\u0000"+ + "\t\u013e\u0001\u0000\u0000\u0000\t\u0140\u0001\u0000\u0000\u0000\n\u0142"+ + "\u0001\u0000\u0000\u0000\n\u0144\u0001\u0000\u0000\u0000\n\u0146\u0001"+ + "\u0000\u0000\u0000\n\u0148\u0001\u0000\u0000\u0000\n\u014a\u0001\u0000"+ + "\u0000\u0000\u000b\u014c\u0001\u0000\u0000\u0000\u000b\u014e\u0001\u0000"+ + "\u0000\u0000\u000b\u0150\u0001\u0000\u0000\u0000\u000b\u0152\u0001\u0000"+ + "\u0000\u0000\u000b\u0154\u0001\u0000\u0000\u0000\u000b\u0156\u0001\u0000"+ + "\u0000\u0000\f\u0158\u0001\u0000\u0000\u0000\f\u015a\u0001\u0000\u0000"+ + "\u0000\f\u015c\u0001\u0000\u0000\u0000\f\u015e\u0001\u0000\u0000\u0000"+ + "\f\u0160\u0001\u0000\u0000\u0000\f\u0162\u0001\u0000\u0000\u0000\f\u0164"+ + "\u0001\u0000\u0000\u0000\f\u0166\u0001\u0000\u0000\u0000\f\u0168\u0001"+ + "\u0000\u0000\u0000\f\u016a\u0001\u0000\u0000\u0000\r\u016c\u0001\u0000"+ + "\u0000\u0000\r\u016e\u0001\u0000\u0000\u0000\r\u0170\u0001\u0000\u0000"+ + "\u0000\r\u0172\u0001\u0000\u0000\u0000\r\u0174\u0001\u0000\u0000\u0000"+ + "\r\u0176\u0001\u0000\u0000\u0000\r\u0178\u0001\u0000\u0000\u0000\u000e"+ + "\u017a\u0001\u0000\u0000\u0000\u000e\u017c\u0001\u0000\u0000\u0000\u000e"+ + "\u017e\u0001\u0000\u0000\u0000\u000e\u0180\u0001\u0000\u0000\u0000\u000e"+ + "\u0182\u0001\u0000\u0000\u0000\u000e\u0184\u0001\u0000\u0000\u0000\u000f"+ + "\u0186\u0001\u0000\u0000\u0000\u000f\u0188\u0001\u0000\u0000\u0000\u000f"+ + "\u018a\u0001\u0000\u0000\u0000\u000f\u018c\u0001\u0000\u0000\u0000\u000f"+ + "\u018e\u0001\u0000\u0000\u0000\u000f\u0190\u0001\u0000\u0000\u0000\u000f"+ + "\u0192\u0001\u0000\u0000\u0000\u000f\u0194\u0001\u0000\u0000\u0000\u000f"+ + "\u0196\u0001\u0000\u0000\u0000\u0010\u0198\u0001\u0000\u0000\u0000\u0012"+ + "\u01a2\u0001\u0000\u0000\u0000\u0014\u01a9\u0001\u0000\u0000\u0000\u0016"+ + "\u01b2\u0001\u0000\u0000\u0000\u0018\u01b9\u0001\u0000\u0000\u0000\u001a"+ + "\u01c3\u0001\u0000\u0000\u0000\u001c\u01ca\u0001\u0000\u0000\u0000\u001e"+ + "\u01d1\u0001\u0000\u0000\u0000 \u01d8\u0001\u0000\u0000\u0000\"\u01e0"+ + "\u0001\u0000\u0000\u0000$\u01e7\u0001\u0000\u0000\u0000&\u01f3\u0001\u0000"+ + "\u0000\u0000(\u01fc\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000"+ + ",\u0209\u0001\u0000\u0000\u0000.\u0210\u0001\u0000\u0000\u00000\u0218"+ + "\u0001\u0000\u0000\u00002\u0220\u0001\u0000\u0000\u00004\u022f\u0001\u0000"+ + "\u0000\u00006\u0239\u0001\u0000\u0000\u00008\u0242\u0001\u0000\u0000\u0000"+ + ":\u024e\u0001\u0000\u0000\u0000<\u0254\u0001\u0000\u0000\u0000>\u0265"+ + "\u0001\u0000\u0000\u0000@\u0275\u0001\u0000\u0000\u0000B\u027b\u0001\u0000"+ + "\u0000\u0000D\u027f\u0001\u0000\u0000\u0000F\u0281\u0001\u0000\u0000\u0000"+ + "H\u0283\u0001\u0000\u0000\u0000J\u0286\u0001\u0000\u0000\u0000L\u0288"+ + "\u0001\u0000\u0000\u0000N\u0291\u0001\u0000\u0000\u0000P\u0293\u0001\u0000"+ + "\u0000\u0000R\u0298\u0001\u0000\u0000\u0000T\u029a\u0001\u0000\u0000\u0000"+ + "V\u029f\u0001\u0000\u0000\u0000X\u02be\u0001\u0000\u0000\u0000Z\u02c1"+ + "\u0001\u0000\u0000\u0000\\\u02ef\u0001\u0000\u0000\u0000^\u02f1\u0001"+ + "\u0000\u0000\u0000`\u02f4\u0001\u0000\u0000\u0000b\u02f8\u0001\u0000\u0000"+ + "\u0000d\u02fc\u0001\u0000\u0000\u0000f\u02fe\u0001\u0000\u0000\u0000h"+ + "\u0301\u0001\u0000\u0000\u0000j\u0303\u0001\u0000\u0000\u0000l\u0308\u0001"+ + "\u0000\u0000\u0000n\u030a\u0001\u0000\u0000\u0000p\u0310\u0001\u0000\u0000"+ + "\u0000r\u0316\u0001\u0000\u0000\u0000t\u0319\u0001\u0000\u0000\u0000v"+ + "\u031c\u0001\u0000\u0000\u0000x\u0321\u0001\u0000\u0000\u0000z\u0326\u0001"+ + "\u0000\u0000\u0000|\u0328\u0001\u0000\u0000\u0000~\u032c\u0001\u0000\u0000"+ + "\u0000\u0080\u0331\u0001\u0000\u0000\u0000\u0082\u0337\u0001\u0000\u0000"+ + "\u0000\u0084\u033a\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000"+ + "\u0000\u0088\u0342\u0001\u0000\u0000\u0000\u008a\u0344\u0001\u0000\u0000"+ + "\u0000\u008c\u0349\u0001\u0000\u0000\u0000\u008e\u034c\u0001\u0000\u0000"+ + "\u0000\u0090\u034f\u0001\u0000\u0000\u0000\u0092\u0352\u0001\u0000\u0000"+ + "\u0000\u0094\u0354\u0001\u0000\u0000\u0000\u0096\u0357\u0001\u0000\u0000"+ + "\u0000\u0098\u0359\u0001\u0000\u0000\u0000\u009a\u035c\u0001\u0000\u0000"+ + "\u0000\u009c\u035e\u0001\u0000\u0000\u0000\u009e\u0360\u0001\u0000\u0000"+ + "\u0000\u00a0\u0362\u0001\u0000\u0000\u0000\u00a2\u0364\u0001\u0000\u0000"+ + "\u0000\u00a4\u0366\u0001\u0000\u0000\u0000\u00a6\u037c\u0001\u0000\u0000"+ + "\u0000\u00a8\u037e\u0001\u0000\u0000\u0000\u00aa\u0383\u0001\u0000\u0000"+ + "\u0000\u00ac\u0398\u0001\u0000\u0000\u0000\u00ae\u039a\u0001\u0000\u0000"+ + "\u0000\u00b0\u03a2\u0001\u0000\u0000\u0000\u00b2\u03a4\u0001\u0000\u0000"+ + "\u0000\u00b4\u03a8\u0001\u0000\u0000\u0000\u00b6\u03ac\u0001\u0000\u0000"+ + "\u0000\u00b8\u03b0\u0001\u0000\u0000\u0000\u00ba\u03b5\u0001\u0000\u0000"+ + "\u0000\u00bc\u03ba\u0001\u0000\u0000\u0000\u00be\u03be\u0001\u0000\u0000"+ + "\u0000\u00c0\u03c2\u0001\u0000\u0000\u0000\u00c2\u03c6\u0001\u0000\u0000"+ + "\u0000\u00c4\u03cb\u0001\u0000\u0000\u0000\u00c6\u03cf\u0001\u0000\u0000"+ + "\u0000\u00c8\u03d3\u0001\u0000\u0000\u0000\u00ca\u03d7\u0001\u0000\u0000"+ + "\u0000\u00cc\u03db\u0001\u0000\u0000\u0000\u00ce\u03df\u0001\u0000\u0000"+ + "\u0000\u00d0\u03eb\u0001\u0000\u0000\u0000\u00d2\u03ee\u0001\u0000\u0000"+ + "\u0000\u00d4\u03f2\u0001\u0000\u0000\u0000\u00d6\u03f6\u0001\u0000\u0000"+ + "\u0000\u00d8\u03fa\u0001\u0000\u0000\u0000\u00da\u03fe\u0001\u0000\u0000"+ + "\u0000\u00dc\u0402\u0001\u0000\u0000\u0000\u00de\u0406\u0001\u0000\u0000"+ + "\u0000\u00e0\u040b\u0001\u0000\u0000\u0000\u00e2\u040f\u0001\u0000\u0000"+ + "\u0000\u00e4\u0417\u0001\u0000\u0000\u0000\u00e6\u042c\u0001\u0000\u0000"+ + "\u0000\u00e8\u0430\u0001\u0000\u0000\u0000\u00ea\u0434\u0001\u0000\u0000"+ + "\u0000\u00ec\u0438\u0001\u0000\u0000\u0000\u00ee\u043c\u0001\u0000\u0000"+ + "\u0000\u00f0\u0440\u0001\u0000\u0000\u0000\u00f2\u0445\u0001\u0000\u0000"+ + "\u0000\u00f4\u0449\u0001\u0000\u0000\u0000\u00f6\u044d\u0001\u0000\u0000"+ + "\u0000\u00f8\u0451\u0001\u0000\u0000\u0000\u00fa\u0454\u0001\u0000\u0000"+ + "\u0000\u00fc\u0458\u0001\u0000\u0000\u0000\u00fe\u045c\u0001\u0000\u0000"+ + "\u0000\u0100\u0460\u0001\u0000\u0000\u0000\u0102\u0464\u0001\u0000\u0000"+ + "\u0000\u0104\u0469\u0001\u0000\u0000\u0000\u0106\u046e\u0001\u0000\u0000"+ + "\u0000\u0108\u0473\u0001\u0000\u0000\u0000\u010a\u047a\u0001\u0000\u0000"+ + "\u0000\u010c\u0483\u0001\u0000\u0000\u0000\u010e\u048a\u0001\u0000\u0000"+ + "\u0000\u0110\u048e\u0001\u0000\u0000\u0000\u0112\u0492\u0001\u0000\u0000"+ + "\u0000\u0114\u0496\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000"+ + "\u0000\u0118\u04a0\u0001\u0000\u0000\u0000\u011a\u04a4\u0001\u0000\u0000"+ + "\u0000\u011c\u04a8\u0001\u0000\u0000\u0000\u011e\u04ac\u0001\u0000\u0000"+ + "\u0000\u0120\u04b0\u0001\u0000\u0000\u0000\u0122\u04b4\u0001\u0000\u0000"+ + "\u0000\u0124\u04b8\u0001\u0000\u0000\u0000\u0126\u04bc\u0001\u0000\u0000"+ + "\u0000\u0128\u04c0\u0001\u0000\u0000\u0000\u012a\u04c4\u0001\u0000\u0000"+ + "\u0000\u012c\u04c9\u0001\u0000\u0000\u0000\u012e\u04cd\u0001\u0000\u0000"+ + "\u0000\u0130\u04d1\u0001\u0000\u0000\u0000\u0132\u04d5\u0001\u0000\u0000"+ + "\u0000\u0134\u04d9\u0001\u0000\u0000\u0000\u0136\u04dd\u0001\u0000\u0000"+ + "\u0000\u0138\u04e1\u0001\u0000\u0000\u0000\u013a\u04e6\u0001\u0000\u0000"+ + "\u0000\u013c\u04eb\u0001\u0000\u0000\u0000\u013e\u04ef\u0001\u0000\u0000"+ + "\u0000\u0140\u04f3\u0001\u0000\u0000\u0000\u0142\u04f7\u0001\u0000\u0000"+ + "\u0000\u0144\u04fc\u0001\u0000\u0000\u0000\u0146\u0506\u0001\u0000\u0000"+ + "\u0000\u0148\u050a\u0001\u0000\u0000\u0000\u014a\u050e\u0001\u0000\u0000"+ + "\u0000\u014c\u0512\u0001\u0000\u0000\u0000\u014e\u0517\u0001\u0000\u0000"+ + "\u0000\u0150\u051e\u0001\u0000\u0000\u0000\u0152\u0522\u0001\u0000\u0000"+ + "\u0000\u0154\u0526\u0001\u0000\u0000\u0000\u0156\u052a\u0001\u0000\u0000"+ + "\u0000\u0158\u052e\u0001\u0000\u0000\u0000\u015a\u0533\u0001\u0000\u0000"+ + "\u0000\u015c\u0537\u0001\u0000\u0000\u0000\u015e\u053b\u0001\u0000\u0000"+ + "\u0000\u0160\u053f\u0001\u0000\u0000\u0000\u0162\u0544\u0001\u0000\u0000"+ + "\u0000\u0164\u0548\u0001\u0000\u0000\u0000\u0166\u054c\u0001\u0000\u0000"+ + "\u0000\u0168\u0550\u0001\u0000\u0000\u0000\u016a\u0554\u0001\u0000\u0000"+ + "\u0000\u016c\u0558\u0001\u0000\u0000\u0000\u016e\u055e\u0001\u0000\u0000"+ + "\u0000\u0170\u0562\u0001\u0000\u0000\u0000\u0172\u0566\u0001\u0000\u0000"+ + "\u0000\u0174\u056a\u0001\u0000\u0000\u0000\u0176\u056e\u0001\u0000\u0000"+ + "\u0000\u0178\u0572\u0001\u0000\u0000\u0000\u017a\u0576\u0001\u0000\u0000"+ + "\u0000\u017c\u057b\u0001\u0000\u0000\u0000\u017e\u0581\u0001\u0000\u0000"+ + "\u0000\u0180\u0587\u0001\u0000\u0000\u0000\u0182\u058b\u0001\u0000\u0000"+ + "\u0000\u0184\u058f\u0001\u0000\u0000\u0000\u0186\u0593\u0001\u0000\u0000"+ + "\u0000\u0188\u0599\u0001\u0000\u0000\u0000\u018a\u059f\u0001\u0000\u0000"+ + "\u0000\u018c\u05a3\u0001\u0000\u0000\u0000\u018e\u05a7\u0001\u0000\u0000"+ + "\u0000\u0190\u05ab\u0001\u0000\u0000\u0000\u0192\u05b1\u0001\u0000\u0000"+ + "\u0000\u0194\u05b7\u0001\u0000\u0000\u0000\u0196\u05bd\u0001\u0000\u0000"+ + "\u0000\u0198\u0199\u0007\u0000\u0000\u0000\u0199\u019a\u0007\u0001\u0000"+ + "\u0000\u019a\u019b\u0007\u0002\u0000\u0000\u019b\u019c\u0007\u0002\u0000"+ + "\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e\u0007\u0004\u0000"+ + "\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ + "\u0000\u01a0\u01a1\u0006\u0000\u0000\u0000\u01a1\u0011\u0001\u0000\u0000"+ + "\u0000\u01a2\u01a3\u0007\u0000\u0000\u0000\u01a3\u01a4\u0007\u0006\u0000"+ + "\u0000\u01a4\u01a5\u0007\u0007\u0000\u0000\u01a5\u01a6\u0007\b\u0000\u0000"+ + "\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a8\u0006\u0001\u0001\u0000"+ + "\u01a8\u0013\u0001\u0000\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000\u0000"+ + "\u01aa\u01ab\u0007\t\u0000\u0000\u01ab\u01ac\u0007\u0006\u0000\u0000\u01ac"+ + "\u01ad\u0007\u0001\u0000\u0000\u01ad\u01ae\u0007\u0004\u0000\u0000\u01ae"+ + "\u01af\u0007\n\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0\u01b1"+ + "\u0006\u0002\u0002\u0000\u01b1\u0015\u0001\u0000\u0000\u0000\u01b2\u01b3"+ + "\u0007\u0003\u0000\u0000\u01b3\u01b4\u0007\u000b\u0000\u0000\u01b4\u01b5"+ + "\u0007\f\u0000\u0000\u01b5\u01b6\u0007\r\u0000\u0000\u01b6\u01b7\u0001"+ + "\u0000\u0000\u0000\u01b7\u01b8\u0006\u0003\u0000\u0000\u01b8\u0017\u0001"+ + "\u0000\u0000\u0000\u01b9\u01ba\u0007\u0003\u0000\u0000\u01ba\u01bb\u0007"+ + "\u000e\u0000\u0000\u01bb\u01bc\u0007\b\u0000\u0000\u01bc\u01bd\u0007\r"+ + "\u0000\u0000\u01bd\u01be\u0007\f\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ + "\u0000\u01bf\u01c0\u0007\t\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000"+ + "\u01c1\u01c2\u0006\u0004\u0003\u0000\u01c2\u0019\u0001\u0000\u0000\u0000"+ + "\u01c3\u01c4\u0007\u000f\u0000\u0000\u01c4\u01c5\u0007\u0006\u0000\u0000"+ + "\u01c5\u01c6\u0007\u0007\u0000\u0000\u01c6\u01c7\u0007\u0010\u0000\u0000"+ + "\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0006\u0005\u0004\u0000"+ + "\u01c9\u001b\u0001\u0000\u0000\u0000\u01ca\u01cb\u0007\u0011\u0000\u0000"+ + "\u01cb\u01cc\u0007\u0006\u0000\u0000\u01cc\u01cd\u0007\u0007\u0000\u0000"+ + "\u01cd\u01ce\u0007\u0012\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000"+ + "\u01cf\u01d0\u0006\u0006\u0000\u0000\u01d0\u001d\u0001\u0000\u0000\u0000"+ + "\u01d1\u01d2\u0007\u0012\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000"+ + "\u01d3\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5\u0007\b\u0000\u0000\u01d5"+ + "\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006\u0007\u0001\u0000\u01d7"+ + "\u001f\u0001\u0000\u0000\u0000\u01d8\u01d9\u0007\r\u0000\u0000\u01d9\u01da"+ + "\u0007\u0001\u0000\u0000\u01da\u01db\u0007\u0010\u0000\u0000\u01db\u01dc"+ + "\u0007\u0001\u0000\u0000\u01dc\u01dd\u0007\u0005\u0000\u0000\u01dd\u01de"+ + "\u0001\u0000\u0000\u0000\u01de\u01df\u0006\b\u0000\u0000\u01df!\u0001"+ + "\u0000\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ + "\u0003\u0000\u0000\u01e2\u01e3\u0007\u0005\u0000\u0000\u01e3\u01e4\u0007"+ + "\f\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5\u01e6\u0006\t"+ + "\u0005\u0000\u01e6#\u0001\u0000\u0000\u0000\u01e7\u01e8\u0007\u0010\u0000"+ + "\u0000\u01e8\u01e9\u0007\u000b\u0000\u0000\u01e9\u01ea\u0005_\u0000\u0000"+ + "\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007\u000e\u0000\u0000"+ + "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\f\u0000\u0000\u01ee"+ + "\u01ef\u0007\t\u0000\u0000\u01ef\u01f0\u0007\u0000\u0000\u0000\u01f0\u01f1"+ + "\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\n\u0006\u0000\u01f2%\u0001"+ + "\u0000\u0000\u0000\u01f3\u01f4\u0007\u0006\u0000\u0000\u01f4\u01f5\u0007"+ + "\u0003\u0000\u0000\u01f5\u01f6\u0007\t\u0000\u0000\u01f6\u01f7\u0007\f"+ + "\u0000\u0000\u01f7\u01f8\u0007\u0010\u0000\u0000\u01f8\u01f9\u0007\u0003"+ + "\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u000b"+ + "\u0007\u0000\u01fb\'\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0006\u0000"+ + "\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007\u0013\u0000"+ + "\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\f\u0000\u0000"+ + "\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0002\u0000\u0000\u0203"+ + "\u0204\u0007\n\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205\u0206"+ + "\u0007\u0013\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207\u0208"+ + "\u0006\r\b\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0007\u0002"+ + "\u0000\u0000\u020a\u020b\u0007\u0007\u0000\u0000\u020b\u020c\u0007\u0006"+ + "\u0000\u0000\u020c\u020d\u0007\u0005\u0000\u0000\u020d\u020e\u0001\u0000"+ + "\u0000\u0000\u020e\u020f\u0006\u000e\u0000\u0000\u020f-\u0001\u0000\u0000"+ + "\u0000\u0210\u0211\u0007\u0002\u0000\u0000\u0211\u0212\u0007\u0005\u0000"+ + "\u0000\u0212\u0213\u0007\f\u0000\u0000\u0213\u0214\u0007\u0005\u0000\u0000"+ + "\u0214\u0215\u0007\u0002\u0000\u0000\u0215\u0216\u0001\u0000\u0000\u0000"+ + "\u0216\u0217\u0006\u000f\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ + "\u0219\u0007\u0013\u0000\u0000\u0219\u021a\u0007\n\u0000\u0000\u021a\u021b"+ + "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u0006\u0000\u0000\u021c\u021d"+ + "\u0007\u0003\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e\u021f"+ + "\u0006\u0010\u0000\u0000\u021f1\u0001\u0000\u0000\u0000\u0220\u0221\u0004"+ + "\u0011\u0000\u0000\u0221\u0222\u0007\u0001\u0000\u0000\u0222\u0223\u0007"+ + "\t\u0000\u0000\u0223\u0224\u0007\r\u0000\u0000\u0224\u0225\u0007\u0001"+ + "\u0000\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0003\u0000"+ + "\u0000\u0227\u0228\u0007\u0002\u0000\u0000\u0228\u0229\u0007\u0005\u0000"+ + "\u0000\u0229\u022a\u0007\f\u0000\u0000\u022a\u022b\u0007\u0005\u0000\u0000"+ + "\u022b\u022c\u0007\u0002\u0000\u0000\u022c\u022d\u0001\u0000\u0000\u0000"+ + "\u022d\u022e\u0006\u0011\u0000\u0000\u022e3\u0001\u0000\u0000\u0000\u022f"+ + "\u0230\u0004\u0012\u0001\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232"+ + "\u0007\u0007\u0000\u0000\u0232\u0233\u0007\u0007\u0000\u0000\u0233\u0234"+ + "\u0007\u0012\u0000\u0000\u0234\u0235\u0007\u0014\u0000\u0000\u0235\u0236"+ + "\u0007\b\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238\u0006"+ + "\u0012\t\u0000\u02385\u0001\u0000\u0000\u0000\u0239\u023a\u0004\u0013"+ + "\u0002\u0000\u023a\u023b\u0007\u0010\u0000\u0000\u023b\u023c\u0007\f\u0000"+ + "\u0000\u023c\u023d\u0007\u0005\u0000\u0000\u023d\u023e\u0007\u0004\u0000"+ + "\u0000\u023e\u023f\u0007\n\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000"+ + "\u0240\u0241\u0006\u0013\u0000\u0000\u02417\u0001\u0000\u0000\u0000\u0242"+ + "\u0243\u0004\u0014\u0003\u0000\u0243\u0244\u0007\u0010\u0000\u0000\u0244"+ + "\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007\u0005\u0000\u0000\u0246"+ + "\u0247\u0007\u0006\u0000\u0000\u0247\u0248\u0007\u0001\u0000\u0000\u0248"+ + "\u0249\u0007\u0004\u0000\u0000\u0249\u024a\u0007\u0002\u0000\u0000\u024a"+ + "\u024b\u0001\u0000\u0000\u0000\u024b\u024c\u0006\u0014\n\u0000\u024c9"+ + "\u0001\u0000\u0000\u0000\u024d\u024f\b\u0015\u0000\u0000\u024e\u024d\u0001"+ + "\u0000\u0000\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u024e\u0001"+ + "\u0000\u0000\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0252\u0001"+ + "\u0000\u0000\u0000\u0252\u0253\u0006\u0015\u0000\u0000\u0253;\u0001\u0000"+ + "\u0000\u0000\u0254\u0255\u0005/\u0000\u0000\u0255\u0256\u0005/\u0000\u0000"+ + "\u0256\u025a\u0001\u0000\u0000\u0000\u0257\u0259\b\u0016\u0000\u0000\u0258"+ + "\u0257\u0001\u0000\u0000\u0000\u0259\u025c\u0001\u0000\u0000\u0000\u025a"+ + "\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b"+ + "\u025e\u0001\u0000\u0000\u0000\u025c\u025a\u0001\u0000\u0000\u0000\u025d"+ + "\u025f\u0005\r\u0000\u0000\u025e\u025d\u0001\u0000\u0000\u0000\u025e\u025f"+ + "\u0001\u0000\u0000\u0000\u025f\u0261\u0001\u0000\u0000\u0000\u0260\u0262"+ + "\u0005\n\u0000\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0261\u0262\u0001"+ + "\u0000\u0000\u0000\u0262\u0263\u0001\u0000\u0000\u0000\u0263\u0264\u0006"+ + "\u0016\u000b\u0000\u0264=\u0001\u0000\u0000\u0000\u0265\u0266\u0005/\u0000"+ + "\u0000\u0266\u0267\u0005*\u0000\u0000\u0267\u026c\u0001\u0000\u0000\u0000"+ + "\u0268\u026b\u0003>\u0017\u0000\u0269\u026b\t\u0000\u0000\u0000\u026a"+ + "\u0268\u0001\u0000\u0000\u0000\u026a\u0269\u0001\u0000\u0000\u0000\u026b"+ + "\u026e\u0001\u0000\u0000\u0000\u026c\u026d\u0001\u0000\u0000\u0000\u026c"+ + "\u026a\u0001\u0000\u0000\u0000\u026d\u026f\u0001\u0000\u0000\u0000\u026e"+ + "\u026c\u0001\u0000\u0000\u0000\u026f\u0270\u0005*\u0000\u0000\u0270\u0271"+ + "\u0005/\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0006"+ + "\u0017\u000b\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0276\u0007\u0017"+ + "\u0000\u0000\u0275\u0274\u0001\u0000\u0000\u0000\u0276\u0277\u0001\u0000"+ + "\u0000\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000"+ + "\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0006\u0018"+ + "\u000b\u0000\u027aA\u0001\u0000\u0000\u0000\u027b\u027c\u0005|\u0000\u0000"+ + "\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027e\u0006\u0019\f\u0000\u027e"+ + "C\u0001\u0000\u0000\u0000\u027f\u0280\u0007\u0018\u0000\u0000\u0280E\u0001"+ + "\u0000\u0000\u0000\u0281\u0282\u0007\u0019\u0000\u0000\u0282G\u0001\u0000"+ + "\u0000\u0000\u0283\u0284\u0005\\\u0000\u0000\u0284\u0285\u0007\u001a\u0000"+ + "\u0000\u0285I\u0001\u0000\u0000\u0000\u0286\u0287\b\u001b\u0000\u0000"+ + "\u0287K\u0001\u0000\u0000\u0000\u0288\u028a\u0007\u0003\u0000\u0000\u0289"+ + "\u028b\u0007\u001c\u0000\u0000\u028a\u0289\u0001\u0000\u0000\u0000\u028a"+ + "\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c"+ + "\u028e\u0003D\u001a\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028e\u028f"+ + "\u0001\u0000\u0000\u0000\u028f\u028d\u0001\u0000\u0000\u0000\u028f\u0290"+ + "\u0001\u0000\u0000\u0000\u0290M\u0001\u0000\u0000\u0000\u0291\u0292\u0005"+ + "@\u0000\u0000\u0292O\u0001\u0000\u0000\u0000\u0293\u0294\u0005`\u0000"+ + "\u0000\u0294Q\u0001\u0000\u0000\u0000\u0295\u0299\b\u001d\u0000\u0000"+ + "\u0296\u0297\u0005`\u0000\u0000\u0297\u0299\u0005`\u0000\u0000\u0298\u0295"+ + "\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299S\u0001"+ + "\u0000\u0000\u0000\u029a\u029b\u0005_\u0000\u0000\u029bU\u0001\u0000\u0000"+ + "\u0000\u029c\u02a0\u0003F\u001b\u0000\u029d\u02a0\u0003D\u001a\u0000\u029e"+ + "\u02a0\u0003T\"\u0000\u029f\u029c\u0001\u0000\u0000\u0000\u029f\u029d"+ + "\u0001\u0000\u0000\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u02a0W\u0001"+ + "\u0000\u0000\u0000\u02a1\u02a6\u0005\"\u0000\u0000\u02a2\u02a5\u0003H"+ + "\u001c\u0000\u02a3\u02a5\u0003J\u001d\u0000\u02a4\u02a2\u0001\u0000\u0000"+ + "\u0000\u02a4\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a8\u0001\u0000\u0000"+ + "\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000"+ + "\u0000\u02a7\u02a9\u0001\u0000\u0000\u0000\u02a8\u02a6\u0001\u0000\u0000"+ + "\u0000\u02a9\u02bf\u0005\"\u0000\u0000\u02aa\u02ab\u0005\"\u0000\u0000"+ + "\u02ab\u02ac\u0005\"\u0000\u0000\u02ac\u02ad\u0005\"\u0000\u0000\u02ad"+ + "\u02b1\u0001\u0000\u0000\u0000\u02ae\u02b0\b\u0016\u0000\u0000\u02af\u02ae"+ + "\u0001\u0000\u0000\u0000\u02b0\u02b3\u0001\u0000\u0000\u0000\u02b1\u02b2"+ + "\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b4"+ + "\u0001\u0000\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b4\u02b5"+ + "\u0005\"\u0000\u0000\u02b5\u02b6\u0005\"\u0000\u0000\u02b6\u02b7\u0005"+ + "\"\u0000\u0000\u02b7\u02b9\u0001\u0000\u0000\u0000\u02b8\u02ba\u0005\""+ + "\u0000\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000"+ + "\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02bd\u0005\"\u0000"+ + "\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000"+ + "\u0000\u02bd\u02bf\u0001\u0000\u0000\u0000\u02be\u02a1\u0001\u0000\u0000"+ + "\u0000\u02be\u02aa\u0001\u0000\u0000\u0000\u02bfY\u0001\u0000\u0000\u0000"+ + "\u02c0\u02c2\u0003D\u001a\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2"+ + "\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3"+ + "\u02c4\u0001\u0000\u0000\u0000\u02c4[\u0001\u0000\u0000\u0000\u02c5\u02c7"+ + "\u0003D\u001a\u0000\u02c6\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001"+ + "\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001"+ + "\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca\u02ce\u0003"+ + "l.\u0000\u02cb\u02cd\u0003D\u001a\u0000\u02cc\u02cb\u0001\u0000\u0000"+ + "\u0000\u02cd\u02d0\u0001\u0000\u0000\u0000\u02ce\u02cc\u0001\u0000\u0000"+ + "\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02f0\u0001\u0000\u0000"+ + "\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d1\u02d3\u0003l.\u0000\u02d2"+ + "\u02d4\u0003D\u001a\u0000\u02d3\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d5"+ + "\u0001\u0000\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d6"+ + "\u0001\u0000\u0000\u0000\u02d6\u02f0\u0001\u0000\u0000\u0000\u02d7\u02d9"+ + "\u0003D\u001a\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d9\u02da\u0001"+ + "\u0000\u0000\u0000\u02da\u02d8\u0001\u0000\u0000\u0000\u02da\u02db\u0001"+ + "\u0000\u0000\u0000\u02db\u02e3\u0001\u0000\u0000\u0000\u02dc\u02e0\u0003"+ + "l.\u0000\u02dd\u02df\u0003D\u001a\u0000\u02de\u02dd\u0001\u0000\u0000"+ + "\u0000\u02df\u02e2\u0001\u0000\u0000\u0000\u02e0\u02de\u0001\u0000\u0000"+ + "\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000\u02e1\u02e4\u0001\u0000\u0000"+ + "\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u02dc\u0001\u0000\u0000"+ + "\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0003L\u001e\u0000\u02e6\u02f0\u0001\u0000\u0000\u0000"+ + "\u02e7\u02e9\u0003l.\u0000\u02e8\u02ea\u0003D\u001a\u0000\u02e9\u02e8"+ + "\u0001\u0000\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000\u02eb\u02e9"+ + "\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000\u02ec\u02ed"+ + "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0003L\u001e\u0000\u02ee\u02f0\u0001"+ + "\u0000\u0000\u0000\u02ef\u02c6\u0001\u0000\u0000\u0000\u02ef\u02d1\u0001"+ + "\u0000\u0000\u0000\u02ef\u02d8\u0001\u0000\u0000\u0000\u02ef\u02e7\u0001"+ + "\u0000\u0000\u0000\u02f0]\u0001\u0000\u0000\u0000\u02f1\u02f2\u0007\u001e"+ + "\u0000\u0000\u02f2\u02f3\u0007\u001f\u0000\u0000\u02f3_\u0001\u0000\u0000"+ + "\u0000\u02f4\u02f5\u0007\f\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000"+ + "\u02f6\u02f7\u0007\u0000\u0000\u0000\u02f7a\u0001\u0000\u0000\u0000\u02f8"+ + "\u02f9\u0007\f\u0000\u0000\u02f9\u02fa\u0007\u0002\u0000\u0000\u02fa\u02fb"+ + "\u0007\u0004\u0000\u0000\u02fbc\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005"+ + "=\u0000\u0000\u02fde\u0001\u0000\u0000\u0000\u02fe\u02ff\u0005:\u0000"+ + "\u0000\u02ff\u0300\u0005:\u0000\u0000\u0300g\u0001\u0000\u0000\u0000\u0301"+ + "\u0302\u0005,\u0000\u0000\u0302i\u0001\u0000\u0000\u0000\u0303\u0304\u0007"+ + "\u0000\u0000\u0000\u0304\u0305\u0007\u0003\u0000\u0000\u0305\u0306\u0007"+ + "\u0002\u0000\u0000\u0306\u0307\u0007\u0004\u0000\u0000\u0307k\u0001\u0000"+ + "\u0000\u0000\u0308\u0309\u0005.\u0000\u0000\u0309m\u0001\u0000\u0000\u0000"+ + "\u030a\u030b\u0007\u000f\u0000\u0000\u030b\u030c\u0007\f\u0000\u0000\u030c"+ + "\u030d\u0007\r\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f"+ + "\u0007\u0003\u0000\u0000\u030fo\u0001\u0000\u0000\u0000\u0310\u0311\u0007"+ + "\u000f\u0000\u0000\u0311\u0312\u0007\u0001\u0000\u0000\u0312\u0313\u0007"+ + "\u0006\u0000\u0000\u0313\u0314\u0007\u0002\u0000\u0000\u0314\u0315\u0007"+ + "\u0005\u0000\u0000\u0315q\u0001\u0000\u0000\u0000\u0316\u0317\u0007\u0001"+ + "\u0000\u0000\u0317\u0318\u0007\t\u0000\u0000\u0318s\u0001\u0000\u0000"+ + "\u0000\u0319\u031a\u0007\u0001\u0000\u0000\u031a\u031b\u0007\u0002\u0000"+ + "\u0000\u031bu\u0001\u0000\u0000\u0000\u031c\u031d\u0007\r\u0000\u0000"+ + "\u031d\u031e\u0007\f\u0000\u0000\u031e\u031f\u0007\u0002\u0000\u0000\u031f"+ + "\u0320\u0007\u0005\u0000\u0000\u0320w\u0001\u0000\u0000\u0000\u0321\u0322"+ + "\u0007\r\u0000\u0000\u0322\u0323\u0007\u0001\u0000\u0000\u0323\u0324\u0007"+ + "\u0012\u0000\u0000\u0324\u0325\u0007\u0003\u0000\u0000\u0325y\u0001\u0000"+ + "\u0000\u0000\u0326\u0327\u0005(\u0000\u0000\u0327{\u0001\u0000\u0000\u0000"+ + "\u0328\u0329\u0007\t\u0000\u0000\u0329\u032a\u0007\u0007\u0000\u0000\u032a"+ + "\u032b\u0007\u0005\u0000\u0000\u032b}\u0001\u0000\u0000\u0000\u032c\u032d"+ + "\u0007\t\u0000\u0000\u032d\u032e\u0007\u0014\u0000\u0000\u032e\u032f\u0007"+ + "\r\u0000\u0000\u032f\u0330\u0007\r\u0000\u0000\u0330\u007f\u0001\u0000"+ + "\u0000\u0000\u0331\u0332\u0007\t\u0000\u0000\u0332\u0333\u0007\u0014\u0000"+ + "\u0000\u0333\u0334\u0007\r\u0000\u0000\u0334\u0335\u0007\r\u0000\u0000"+ + "\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0081\u0001\u0000\u0000\u0000"+ + "\u0337\u0338\u0007\u0007\u0000\u0000\u0338\u0339\u0007\u0006\u0000\u0000"+ + "\u0339\u0083\u0001\u0000\u0000\u0000\u033a\u033b\u0005?\u0000\u0000\u033b"+ + "\u0085\u0001\u0000\u0000\u0000\u033c\u033d\u0007\u0006\u0000\u0000\u033d"+ + "\u033e\u0007\r\u0000\u0000\u033e\u033f\u0007\u0001\u0000\u0000\u033f\u0340"+ + "\u0007\u0012\u0000\u0000\u0340\u0341\u0007\u0003\u0000\u0000\u0341\u0087"+ + "\u0001\u0000\u0000\u0000\u0342\u0343\u0005)\u0000\u0000\u0343\u0089\u0001"+ + "\u0000\u0000\u0000\u0344\u0345\u0007\u0005\u0000\u0000\u0345\u0346\u0007"+ + "\u0006\u0000\u0000\u0346\u0347\u0007\u0014\u0000\u0000\u0347\u0348\u0007"+ + "\u0003\u0000\u0000\u0348\u008b\u0001\u0000\u0000\u0000\u0349\u034a\u0005"+ + "=\u0000\u0000\u034a\u034b\u0005=\u0000\u0000\u034b\u008d\u0001\u0000\u0000"+ + "\u0000\u034c\u034d\u0005=\u0000\u0000\u034d\u034e\u0005~\u0000\u0000\u034e"+ + "\u008f\u0001\u0000\u0000\u0000\u034f\u0350\u0005!\u0000\u0000\u0350\u0351"+ + "\u0005=\u0000\u0000\u0351\u0091\u0001\u0000\u0000\u0000\u0352\u0353\u0005"+ + "<\u0000\u0000\u0353\u0093\u0001\u0000\u0000\u0000\u0354\u0355\u0005<\u0000"+ + "\u0000\u0355\u0356\u0005=\u0000\u0000\u0356\u0095\u0001\u0000\u0000\u0000"+ + "\u0357\u0358\u0005>\u0000\u0000\u0358\u0097\u0001\u0000\u0000\u0000\u0359"+ + "\u035a\u0005>\u0000\u0000\u035a\u035b\u0005=\u0000\u0000\u035b\u0099\u0001"+ + "\u0000\u0000\u0000\u035c\u035d\u0005+\u0000\u0000\u035d\u009b\u0001\u0000"+ + "\u0000\u0000\u035e\u035f\u0005-\u0000\u0000\u035f\u009d\u0001\u0000\u0000"+ + "\u0000\u0360\u0361\u0005*\u0000\u0000\u0361\u009f\u0001\u0000\u0000\u0000"+ + "\u0362\u0363\u0005/\u0000\u0000\u0363\u00a1\u0001\u0000\u0000\u0000\u0364"+ + "\u0365\u0005%\u0000\u0000\u0365\u00a3\u0001\u0000\u0000\u0000\u0366\u0367"+ + "\u0004J\u0004\u0000\u0367\u0368\u00036\u0013\u0000\u0368\u0369\u0001\u0000"+ + "\u0000\u0000\u0369\u036a\u0006J\r\u0000\u036a\u00a5\u0001\u0000\u0000"+ + "\u0000\u036b\u036e\u0003\u0084:\u0000\u036c\u036f\u0003F\u001b\u0000\u036d"+ + "\u036f\u0003T\"\u0000\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036d"+ + "\u0001\u0000\u0000\u0000\u036f\u0373\u0001\u0000\u0000\u0000\u0370\u0372"+ + "\u0003V#\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372\u0375\u0001\u0000"+ + "\u0000\u0000\u0373\u0371\u0001\u0000\u0000\u0000\u0373\u0374\u0001\u0000"+ + "\u0000\u0000\u0374\u037d\u0001\u0000\u0000\u0000\u0375\u0373\u0001\u0000"+ + "\u0000\u0000\u0376\u0378\u0003\u0084:\u0000\u0377\u0379\u0003D\u001a\u0000"+ + "\u0378\u0377\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000"+ + "\u037a\u0378\u0001\u0000\u0000\u0000\u037a\u037b\u0001\u0000\u0000\u0000"+ + "\u037b\u037d\u0001\u0000\u0000\u0000\u037c\u036b\u0001\u0000\u0000\u0000"+ + "\u037c\u0376\u0001\u0000\u0000\u0000\u037d\u00a7\u0001\u0000\u0000\u0000"+ + "\u037e\u037f\u0005[\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380"+ + "\u0381\u0006L\u0000\u0000\u0381\u0382\u0006L\u0000\u0000\u0382\u00a9\u0001"+ + "\u0000\u0000\u0000\u0383\u0384\u0005]\u0000\u0000\u0384\u0385\u0001\u0000"+ + "\u0000\u0000\u0385\u0386\u0006M\f\u0000\u0386\u0387\u0006M\f\u0000\u0387"+ + "\u00ab\u0001\u0000\u0000\u0000\u0388\u038c\u0003F\u001b\u0000\u0389\u038b"+ + "\u0003V#\u0000\u038a\u0389\u0001\u0000\u0000\u0000\u038b\u038e\u0001\u0000"+ + "\u0000\u0000\u038c\u038a\u0001\u0000\u0000\u0000\u038c\u038d\u0001\u0000"+ + "\u0000\u0000\u038d\u0399\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000"+ + "\u0000\u0000\u038f\u0392\u0003T\"\u0000\u0390\u0392\u0003N\u001f\u0000"+ + "\u0391\u038f\u0001\u0000\u0000\u0000\u0391\u0390\u0001\u0000\u0000\u0000"+ + "\u0392\u0394\u0001\u0000\u0000\u0000\u0393\u0395\u0003V#\u0000\u0394\u0393"+ + "\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u0394"+ + "\u0001\u0000\u0000\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0399"+ + "\u0001\u0000\u0000\u0000\u0398\u0388\u0001\u0000\u0000\u0000\u0398\u0391"+ + "\u0001\u0000\u0000\u0000\u0399\u00ad\u0001\u0000\u0000\u0000\u039a\u039c"+ + "\u0003P \u0000\u039b\u039d\u0003R!\u0000\u039c\u039b\u0001\u0000\u0000"+ + "\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ + "\u0000\u03a0\u03a1\u0003P \u0000\u03a1\u00af\u0001\u0000\u0000\u0000\u03a2"+ + "\u03a3\u0003\u00aeO\u0000\u03a3\u00b1\u0001\u0000\u0000\u0000\u03a4\u03a5"+ + "\u0003<\u0016\u0000\u03a5\u03a6\u0001\u0000\u0000\u0000\u03a6\u03a7\u0006"+ + "Q\u000b\u0000\u03a7\u00b3\u0001\u0000\u0000\u0000\u03a8\u03a9\u0003>\u0017"+ + "\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u03ab\u0006R\u000b\u0000"+ + "\u03ab\u00b5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0003@\u0018\u0000\u03ad"+ + "\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0006S\u000b\u0000\u03af\u00b7"+ + "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0003\u00a8L\u0000\u03b1\u03b2\u0001"+ + "\u0000\u0000\u0000\u03b2\u03b3\u0006T\u000e\u0000\u03b3\u03b4\u0006T\u000f"+ + "\u0000\u03b4\u00b9\u0001\u0000\u0000\u0000\u03b5\u03b6\u0003B\u0019\u0000"+ + "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0006U\u0010\u0000\u03b8"+ + "\u03b9\u0006U\f\u0000\u03b9\u00bb\u0001\u0000\u0000\u0000\u03ba\u03bb"+ + "\u0003@\u0018\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03bd\u0006"+ + "V\u000b\u0000\u03bd\u00bd\u0001\u0000\u0000\u0000\u03be\u03bf\u0003<\u0016"+ + "\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006W\u000b\u0000"+ + "\u03c1\u00bf\u0001\u0000\u0000\u0000\u03c2\u03c3\u0003>\u0017\u0000\u03c3"+ + "\u03c4\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006X\u000b\u0000\u03c5\u00c1"+ + "\u0001\u0000\u0000\u0000\u03c6\u03c7\u0003B\u0019\u0000\u03c7\u03c8\u0001"+ + "\u0000\u0000\u0000\u03c8\u03c9\u0006Y\u0010\u0000\u03c9\u03ca\u0006Y\f"+ + "\u0000\u03ca\u00c3\u0001\u0000\u0000\u0000\u03cb\u03cc\u0003\u00a8L\u0000"+ + "\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03ce\u0006Z\u000e\u0000\u03ce"+ + "\u00c5\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u00aaM\u0000\u03d0\u03d1"+ + "\u0001\u0000\u0000\u0000\u03d1\u03d2\u0006[\u0011\u0000\u03d2\u00c7\u0001"+ + "\u0000\u0000\u0000\u03d3\u03d4\u0003\u014e\u009f\u0000\u03d4\u03d5\u0001"+ + "\u0000\u0000\u0000\u03d5\u03d6\u0006\\\u0012\u0000\u03d6\u00c9\u0001\u0000"+ + "\u0000\u0000\u03d7\u03d8\u0003h,\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000"+ + "\u03d9\u03da\u0006]\u0013\u0000\u03da\u00cb\u0001\u0000\u0000\u0000\u03db"+ + "\u03dc\u0003d*\u0000\u03dc\u03dd\u0001\u0000\u0000\u0000\u03dd\u03de\u0006"+ + "^\u0014\u0000\u03de\u00cd\u0001\u0000\u0000\u0000\u03df\u03e0\u0007\u0010"+ + "\u0000\u0000\u03e0\u03e1\u0007\u0003\u0000\u0000\u03e1\u03e2\u0007\u0005"+ + "\u0000\u0000\u03e2\u03e3\u0007\f\u0000\u0000\u03e3\u03e4\u0007\u0000\u0000"+ + "\u0000\u03e4\u03e5\u0007\f\u0000\u0000\u03e5\u03e6\u0007\u0005\u0000\u0000"+ + "\u03e6\u03e7\u0007\f\u0000\u0000\u03e7\u00cf\u0001\u0000\u0000\u0000\u03e8"+ + "\u03ec\b \u0000\u0000\u03e9\u03ea\u0005/\u0000\u0000\u03ea\u03ec\b!\u0000"+ + "\u0000\u03eb\u03e8\u0001\u0000\u0000\u0000\u03eb\u03e9\u0001\u0000\u0000"+ + "\u0000\u03ec\u00d1\u0001\u0000\u0000\u0000\u03ed\u03ef\u0003\u00d0`\u0000"+ + "\u03ee\u03ed\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000"+ + "\u03f0\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000"+ + "\u03f1\u00d3\u0001\u0000\u0000\u0000\u03f2\u03f3\u0003\u00d2a\u0000\u03f3"+ + "\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006b\u0015\u0000\u03f5\u00d5"+ + "\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003X$\u0000\u03f7\u03f8\u0001\u0000"+ + "\u0000\u0000\u03f8\u03f9\u0006c\u0016\u0000\u03f9\u00d7\u0001\u0000\u0000"+ + "\u0000\u03fa\u03fb\u0003<\u0016\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000"+ + "\u03fc\u03fd\u0006d\u000b\u0000\u03fd\u00d9\u0001\u0000\u0000\u0000\u03fe"+ + "\u03ff\u0003>\u0017\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401"+ + "\u0006e\u000b\u0000\u0401\u00db\u0001\u0000\u0000\u0000\u0402\u0403\u0003"+ + "@\u0018\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0006f\u000b"+ + "\u0000\u0405\u00dd\u0001\u0000\u0000\u0000\u0406\u0407\u0003B\u0019\u0000"+ + "\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0006g\u0010\u0000\u0409"+ + "\u040a\u0006g\f\u0000\u040a\u00df\u0001\u0000\u0000\u0000\u040b\u040c"+ + "\u0003l.\u0000\u040c\u040d\u0001\u0000\u0000\u0000\u040d\u040e\u0006h"+ + "\u0017\u0000\u040e\u00e1\u0001\u0000\u0000\u0000\u040f\u0410\u0003h,\u0000"+ + "\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u0412\u0006i\u0013\u0000\u0412"+ + "\u00e3\u0001\u0000\u0000\u0000\u0413\u0418\u0003F\u001b\u0000\u0414\u0418"+ + "\u0003D\u001a\u0000\u0415\u0418\u0003T\"\u0000\u0416\u0418\u0003\u009e"+ + "G\u0000\u0417\u0413\u0001\u0000\u0000\u0000\u0417\u0414\u0001\u0000\u0000"+ + "\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0416\u0001\u0000\u0000"+ + "\u0000\u0418\u00e5\u0001\u0000\u0000\u0000\u0419\u041c\u0003F\u001b\u0000"+ + "\u041a\u041c\u0003\u009eG\u0000\u041b\u0419\u0001\u0000\u0000\u0000\u041b"+ + "\u041a\u0001\u0000\u0000\u0000\u041c\u0420\u0001\u0000\u0000\u0000\u041d"+ + "\u041f\u0003\u00e4j\u0000\u041e\u041d\u0001\u0000\u0000\u0000\u041f\u0422"+ + "\u0001\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u0421"+ + "\u0001\u0000\u0000\u0000\u0421\u042d\u0001\u0000\u0000\u0000\u0422\u0420"+ + "\u0001\u0000\u0000\u0000\u0423\u0426\u0003T\"\u0000\u0424\u0426\u0003"+ + "N\u001f\u0000\u0425\u0423\u0001\u0000\u0000\u0000\u0425\u0424\u0001\u0000"+ + "\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000\u0427\u0429\u0003\u00e4"+ + "j\u0000\u0428\u0427\u0001\u0000\u0000\u0000\u0429\u042a\u0001\u0000\u0000"+ + "\u0000\u042a\u0428\u0001\u0000\u0000\u0000\u042a\u042b\u0001\u0000\u0000"+ + "\u0000\u042b\u042d\u0001\u0000\u0000\u0000\u042c\u041b\u0001\u0000\u0000"+ + "\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042d\u00e7\u0001\u0000\u0000"+ + "\u0000\u042e\u0431\u0003\u00e6k\u0000\u042f\u0431\u0003\u00aeO\u0000\u0430"+ + "\u042e\u0001\u0000\u0000\u0000\u0430\u042f\u0001\u0000\u0000\u0000\u0431"+ + "\u0432\u0001\u0000\u0000\u0000\u0432\u0430\u0001\u0000\u0000\u0000\u0432"+ + "\u0433\u0001\u0000\u0000\u0000\u0433\u00e9\u0001\u0000\u0000\u0000\u0434"+ + "\u0435\u0003<\u0016\u0000\u0435\u0436\u0001\u0000\u0000\u0000\u0436\u0437"+ + "\u0006m\u000b\u0000\u0437\u00eb\u0001\u0000\u0000\u0000\u0438\u0439\u0003"+ + ">\u0017\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006n\u000b"+ + "\u0000\u043b\u00ed\u0001\u0000\u0000\u0000\u043c\u043d\u0003@\u0018\u0000"+ + "\u043d\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0006o\u000b\u0000\u043f"+ + "\u00ef\u0001\u0000\u0000\u0000\u0440\u0441\u0003B\u0019\u0000\u0441\u0442"+ + "\u0001\u0000\u0000\u0000\u0442\u0443\u0006p\u0010\u0000\u0443\u0444\u0006"+ + "p\f\u0000\u0444\u00f1\u0001\u0000\u0000\u0000\u0445\u0446\u0003d*\u0000"+ + "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006q\u0014\u0000\u0448"+ + "\u00f3\u0001\u0000\u0000\u0000\u0449\u044a\u0003h,\u0000\u044a\u044b\u0001"+ + "\u0000\u0000\u0000\u044b\u044c\u0006r\u0013\u0000\u044c\u00f5\u0001\u0000"+ + "\u0000\u0000\u044d\u044e\u0003l.\u0000\u044e\u044f\u0001\u0000\u0000\u0000"+ + "\u044f\u0450\u0006s\u0017\u0000\u0450\u00f7\u0001\u0000\u0000\u0000\u0451"+ + "\u0452\u0007\f\u0000\u0000\u0452\u0453\u0007\u0002\u0000\u0000\u0453\u00f9"+ + "\u0001\u0000\u0000\u0000\u0454\u0455\u0003\u00e8l\u0000\u0455\u0456\u0001"+ + "\u0000\u0000\u0000\u0456\u0457\u0006u\u0018\u0000\u0457\u00fb\u0001\u0000"+ + "\u0000\u0000\u0458\u0459\u0003<\u0016\u0000\u0459\u045a\u0001\u0000\u0000"+ + "\u0000\u045a\u045b\u0006v\u000b\u0000\u045b\u00fd\u0001\u0000\u0000\u0000"+ + "\u045c\u045d\u0003>\u0017\u0000\u045d\u045e\u0001\u0000\u0000\u0000\u045e"+ + "\u045f\u0006w\u000b\u0000\u045f\u00ff\u0001\u0000\u0000\u0000\u0460\u0461"+ + "\u0003@\u0018\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463\u0006"+ + "x\u000b\u0000\u0463\u0101\u0001\u0000\u0000\u0000\u0464\u0465\u0003B\u0019"+ + "\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466\u0467\u0006y\u0010\u0000"+ + "\u0467\u0468\u0006y\f\u0000\u0468\u0103\u0001\u0000\u0000\u0000\u0469"+ + "\u046a\u0003\u00a8L\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c"+ + "\u0006z\u000e\u0000\u046c\u046d\u0006z\u0019\u0000\u046d\u0105\u0001\u0000"+ + "\u0000\u0000\u046e\u046f\u0007\u0007\u0000\u0000\u046f\u0470\u0007\t\u0000"+ + "\u0000\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0472\u0006{\u001a\u0000"+ + "\u0472\u0107\u0001\u0000\u0000\u0000\u0473\u0474\u0007\u0013\u0000\u0000"+ + "\u0474\u0475\u0007\u0001\u0000\u0000\u0475\u0476\u0007\u0005\u0000\u0000"+ + "\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0001\u0000\u0000\u0000\u0478"+ + "\u0479\u0006|\u001a\u0000\u0479\u0109\u0001\u0000\u0000\u0000\u047a\u047b"+ + "\b\"\u0000\u0000\u047b\u010b\u0001\u0000\u0000\u0000\u047c\u047e\u0003"+ + "\u010a}\u0000\u047d\u047c\u0001\u0000\u0000\u0000\u047e\u047f\u0001\u0000"+ + "\u0000\u0000\u047f\u047d\u0001\u0000\u0000\u0000\u047f\u0480\u0001\u0000"+ + "\u0000\u0000\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0482\u0003\u014e"+ + "\u009f\u0000\u0482\u0484\u0001\u0000\u0000\u0000\u0483\u047d\u0001\u0000"+ + "\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0486\u0001\u0000"+ + "\u0000\u0000\u0485\u0487\u0003\u010a}\u0000\u0486\u0485\u0001\u0000\u0000"+ + "\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0486\u0001\u0000\u0000"+ + "\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u010d\u0001\u0000\u0000"+ + "\u0000\u048a\u048b\u0003\u010c~\u0000\u048b\u048c\u0001\u0000\u0000\u0000"+ + "\u048c\u048d\u0006\u007f\u001b\u0000\u048d\u010f\u0001\u0000\u0000\u0000"+ + "\u048e\u048f\u0003<\u0016\u0000\u048f\u0490\u0001\u0000\u0000\u0000\u0490"+ + "\u0491\u0006\u0080\u000b\u0000\u0491\u0111\u0001\u0000\u0000\u0000\u0492"+ + "\u0493\u0003>\u0017\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0495"+ + "\u0006\u0081\u000b\u0000\u0495\u0113\u0001\u0000\u0000\u0000\u0496\u0497"+ + "\u0003@\u0018\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499\u0006"+ + "\u0082\u000b\u0000\u0499\u0115\u0001\u0000\u0000\u0000\u049a\u049b\u0003"+ + "B\u0019\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006\u0083"+ + "\u0010\u0000\u049d\u049e\u0006\u0083\f\u0000\u049e\u049f\u0006\u0083\f"+ + "\u0000\u049f\u0117\u0001\u0000\u0000\u0000\u04a0\u04a1\u0003d*\u0000\u04a1"+ + "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0006\u0084\u0014\u0000\u04a3"+ + "\u0119\u0001\u0000\u0000\u0000\u04a4\u04a5\u0003h,\u0000\u04a5\u04a6\u0001"+ + "\u0000\u0000\u0000\u04a6\u04a7\u0006\u0085\u0013\u0000\u04a7\u011b\u0001"+ + "\u0000\u0000\u0000\u04a8\u04a9\u0003l.\u0000\u04a9\u04aa\u0001\u0000\u0000"+ + "\u0000\u04aa\u04ab\u0006\u0086\u0017\u0000\u04ab\u011d\u0001\u0000\u0000"+ + "\u0000\u04ac\u04ad\u0003\u0108|\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000"+ + "\u04ae\u04af\u0006\u0087\u001c\u0000\u04af\u011f\u0001\u0000\u0000\u0000"+ + "\u04b0\u04b1\u0003\u00e8l\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2"+ + "\u04b3\u0006\u0088\u0018\u0000\u04b3\u0121\u0001\u0000\u0000\u0000\u04b4"+ + "\u04b5\u0003\u00b0P\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7"+ + "\u0006\u0089\u001d\u0000\u04b7\u0123\u0001\u0000\u0000\u0000\u04b8\u04b9"+ + "\u0003<\u0016\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006"+ + "\u008a\u000b\u0000\u04bb\u0125\u0001\u0000\u0000\u0000\u04bc\u04bd\u0003"+ + ">\u0017\u0000\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u04bf\u0006\u008b"+ + "\u000b\u0000\u04bf\u0127\u0001\u0000\u0000\u0000\u04c0\u04c1\u0003@\u0018"+ + "\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006\u008c\u000b"+ + "\u0000\u04c3\u0129\u0001\u0000\u0000\u0000\u04c4\u04c5\u0003B\u0019\u0000"+ + "\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0010\u0000"+ + "\u04c7\u04c8\u0006\u008d\f\u0000\u04c8\u012b\u0001\u0000\u0000\u0000\u04c9"+ + "\u04ca\u0003l.\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb\u04cc\u0006"+ + "\u008e\u0017\u0000\u04cc\u012d\u0001\u0000\u0000\u0000\u04cd\u04ce\u0003"+ + "\u00b0P\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf\u04d0\u0006\u008f"+ + "\u001d\u0000\u04d0\u012f\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003\u00ac"+ + "N\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0006\u0090\u001e"+ + "\u0000\u04d4\u0131\u0001\u0000\u0000\u0000\u04d5\u04d6\u0003<\u0016\u0000"+ + "\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0006\u0091\u000b\u0000"+ + "\u04d8\u0133\u0001\u0000\u0000\u0000\u04d9\u04da\u0003>\u0017\u0000\u04da"+ + "\u04db\u0001\u0000\u0000\u0000\u04db\u04dc\u0006\u0092\u000b\u0000\u04dc"+ + "\u0135\u0001\u0000\u0000\u0000\u04dd\u04de\u0003@\u0018\u0000\u04de\u04df"+ + "\u0001\u0000\u0000\u0000\u04df\u04e0\u0006\u0093\u000b\u0000\u04e0\u0137"+ + "\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003B\u0019\u0000\u04e2\u04e3\u0001"+ + "\u0000\u0000\u0000\u04e3\u04e4\u0006\u0094\u0010\u0000\u04e4\u04e5\u0006"+ + "\u0094\f\u0000\u04e5\u0139\u0001\u0000\u0000\u0000\u04e6\u04e7\u0007\u0001"+ + "\u0000\u0000\u04e7\u04e8\u0007\t\u0000\u0000\u04e8\u04e9\u0007\u000f\u0000"+ + "\u0000\u04e9\u04ea\u0007\u0007\u0000\u0000\u04ea\u013b\u0001\u0000\u0000"+ + "\u0000\u04eb\u04ec\u0003<\u0016\u0000\u04ec\u04ed\u0001\u0000\u0000\u0000"+ + "\u04ed\u04ee\u0006\u0096\u000b\u0000\u04ee\u013d\u0001\u0000\u0000\u0000"+ + "\u04ef\u04f0\u0003>\u0017\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1"+ + "\u04f2\u0006\u0097\u000b\u0000\u04f2\u013f\u0001\u0000\u0000\u0000\u04f3"+ + "\u04f4\u0003@\u0018\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6"+ + "\u0006\u0098\u000b\u0000\u04f6\u0141\u0001\u0000\u0000\u0000\u04f7\u04f8"+ + "\u0003B\u0019\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u04fa\u0006"+ + "\u0099\u0010\u0000\u04fa\u04fb\u0006\u0099\f\u0000\u04fb\u0143\u0001\u0000"+ + "\u0000\u0000\u04fc\u04fd\u0007\u000f\u0000\u0000\u04fd\u04fe\u0007\u0014"+ + "\u0000\u0000\u04fe\u04ff\u0007\t\u0000\u0000\u04ff\u0500\u0007\u0004\u0000"+ + "\u0000\u0500\u0501\u0007\u0005\u0000\u0000\u0501\u0502\u0007\u0001\u0000"+ + "\u0000\u0502\u0503\u0007\u0007\u0000\u0000\u0503\u0504\u0007\t\u0000\u0000"+ + "\u0504\u0505\u0007\u0002\u0000\u0000\u0505\u0145\u0001\u0000\u0000\u0000"+ + "\u0506\u0507\u0003<\u0016\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508"+ + "\u0509\u0006\u009b\u000b\u0000\u0509\u0147\u0001\u0000\u0000\u0000\u050a"+ + "\u050b\u0003>\u0017\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c\u050d"+ + "\u0006\u009c\u000b\u0000\u050d\u0149\u0001\u0000\u0000\u0000\u050e\u050f"+ + "\u0003@\u0018\u0000\u050f\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0006"+ + "\u009d\u000b\u0000\u0511\u014b\u0001\u0000\u0000\u0000\u0512\u0513\u0003"+ + "\u00aaM\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u009e"+ + "\u0011\u0000\u0515\u0516\u0006\u009e\f\u0000\u0516\u014d\u0001\u0000\u0000"+ + "\u0000\u0517\u0518\u0005:\u0000\u0000\u0518\u014f\u0001\u0000\u0000\u0000"+ + "\u0519\u051f\u0003N\u001f\u0000\u051a\u051f\u0003D\u001a\u0000\u051b\u051f"+ + "\u0003l.\u0000\u051c\u051f\u0003F\u001b\u0000\u051d\u051f\u0003T\"\u0000"+ + "\u051e\u0519\u0001\u0000\u0000\u0000\u051e\u051a\u0001\u0000\u0000\u0000"+ + "\u051e\u051b\u0001\u0000\u0000\u0000\u051e\u051c\u0001\u0000\u0000\u0000"+ + "\u051e\u051d\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000"+ + "\u0520\u051e\u0001\u0000\u0000\u0000\u0520\u0521\u0001\u0000\u0000\u0000"+ + "\u0521\u0151\u0001\u0000\u0000\u0000\u0522\u0523\u0003<\u0016\u0000\u0523"+ + "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0006\u00a1\u000b\u0000\u0525"+ + "\u0153\u0001\u0000\u0000\u0000\u0526\u0527\u0003>\u0017\u0000\u0527\u0528"+ + "\u0001\u0000\u0000\u0000\u0528\u0529\u0006\u00a2\u000b\u0000\u0529\u0155"+ + "\u0001\u0000\u0000\u0000\u052a\u052b\u0003@\u0018\u0000\u052b\u052c\u0001"+ + "\u0000\u0000\u0000\u052c\u052d\u0006\u00a3\u000b\u0000\u052d\u0157\u0001"+ + "\u0000\u0000\u0000\u052e\u052f\u0003B\u0019\u0000\u052f\u0530\u0001\u0000"+ + "\u0000\u0000\u0530\u0531\u0006\u00a4\u0010\u0000\u0531\u0532\u0006\u00a4"+ + "\f\u0000\u0532\u0159\u0001\u0000\u0000\u0000\u0533\u0534\u0003\u014e\u009f"+ + "\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0536\u0006\u00a5\u0012"+ + "\u0000\u0536\u015b\u0001\u0000\u0000\u0000\u0537\u0538\u0003h,\u0000\u0538"+ + "\u0539\u0001\u0000\u0000\u0000\u0539\u053a\u0006\u00a6\u0013\u0000\u053a"+ + "\u015d\u0001\u0000\u0000\u0000\u053b\u053c\u0003l.\u0000\u053c\u053d\u0001"+ + "\u0000\u0000\u0000\u053d\u053e\u0006\u00a7\u0017\u0000\u053e\u015f\u0001"+ + "\u0000\u0000\u0000\u053f\u0540\u0003\u0106{\u0000\u0540\u0541\u0001\u0000"+ + "\u0000\u0000\u0541\u0542\u0006\u00a8\u001f\u0000\u0542\u0543\u0006\u00a8"+ + " \u0000\u0543\u0161\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u00d2a\u0000"+ + "\u0545\u0546\u0001\u0000\u0000\u0000\u0546\u0547\u0006\u00a9\u0015\u0000"+ + "\u0547\u0163\u0001\u0000\u0000\u0000\u0548\u0549\u0003X$\u0000\u0549\u054a"+ + "\u0001\u0000\u0000\u0000\u054a\u054b\u0006\u00aa\u0016\u0000\u054b\u0165"+ + "\u0001\u0000\u0000\u0000\u054c\u054d\u0003<\u0016\u0000\u054d\u054e\u0001"+ + "\u0000\u0000\u0000\u054e\u054f\u0006\u00ab\u000b\u0000\u054f\u0167\u0001"+ + "\u0000\u0000\u0000\u0550\u0551\u0003>\u0017\u0000\u0551\u0552\u0001\u0000"+ + "\u0000\u0000\u0552\u0553\u0006\u00ac\u000b\u0000\u0553\u0169\u0001\u0000"+ + "\u0000\u0000\u0554\u0555\u0003@\u0018\u0000\u0555\u0556\u0001\u0000\u0000"+ + "\u0000\u0556\u0557\u0006\u00ad\u000b\u0000\u0557\u016b\u0001\u0000\u0000"+ + "\u0000\u0558\u0559\u0003B\u0019\u0000\u0559\u055a\u0001\u0000\u0000\u0000"+ + "\u055a\u055b\u0006\u00ae\u0010\u0000\u055b\u055c\u0006\u00ae\f\u0000\u055c"+ + "\u055d\u0006\u00ae\f\u0000\u055d\u016d\u0001\u0000\u0000\u0000\u055e\u055f"+ + "\u0003h,\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560\u0561\u0006\u00af"+ + "\u0013\u0000\u0561\u016f\u0001\u0000\u0000\u0000\u0562\u0563\u0003l.\u0000"+ + "\u0563\u0564\u0001\u0000\u0000\u0000\u0564\u0565\u0006\u00b0\u0017\u0000"+ + "\u0565\u0171\u0001\u0000\u0000\u0000\u0566\u0567\u0003\u00e8l\u0000\u0567"+ + "\u0568\u0001\u0000\u0000\u0000\u0568\u0569\u0006\u00b1\u0018\u0000\u0569"+ + "\u0173\u0001\u0000\u0000\u0000\u056a\u056b\u0003<\u0016\u0000\u056b\u056c"+ + "\u0001\u0000\u0000\u0000\u056c\u056d\u0006\u00b2\u000b\u0000\u056d\u0175"+ + "\u0001\u0000\u0000\u0000\u056e\u056f\u0003>\u0017\u0000\u056f\u0570\u0001"+ + "\u0000\u0000\u0000\u0570\u0571\u0006\u00b3\u000b\u0000\u0571\u0177\u0001"+ + "\u0000\u0000\u0000\u0572\u0573\u0003@\u0018\u0000\u0573\u0574\u0001\u0000"+ + "\u0000\u0000\u0574\u0575\u0006\u00b4\u000b\u0000\u0575\u0179\u0001\u0000"+ + "\u0000\u0000\u0576\u0577\u0003B\u0019\u0000\u0577\u0578\u0001\u0000\u0000"+ + "\u0000\u0578\u0579\u0006\u00b5\u0010\u0000\u0579\u057a\u0006\u00b5\f\u0000"+ + "\u057a\u017b\u0001\u0000\u0000\u0000\u057b\u057c\u0003\u00d2a\u0000\u057c"+ + "\u057d\u0001\u0000\u0000\u0000\u057d\u057e\u0006\u00b6\u0015\u0000\u057e"+ + "\u057f\u0006\u00b6\f\u0000\u057f\u0580\u0006\u00b6!\u0000\u0580\u017d"+ + "\u0001\u0000\u0000\u0000\u0581\u0582\u0003X$\u0000\u0582\u0583\u0001\u0000"+ + "\u0000\u0000\u0583\u0584\u0006\u00b7\u0016\u0000\u0584\u0585\u0006\u00b7"+ + "\f\u0000\u0585\u0586\u0006\u00b7!\u0000\u0586\u017f\u0001\u0000\u0000"+ + "\u0000\u0587\u0588\u0003<\u0016\u0000\u0588\u0589\u0001\u0000\u0000\u0000"+ + "\u0589\u058a\u0006\u00b8\u000b\u0000\u058a\u0181\u0001\u0000\u0000\u0000"+ + "\u058b\u058c\u0003>\u0017\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d"+ + "\u058e\u0006\u00b9\u000b\u0000\u058e\u0183\u0001\u0000\u0000\u0000\u058f"+ + "\u0590\u0003@\u0018\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0592"+ + "\u0006\u00ba\u000b\u0000\u0592\u0185\u0001\u0000\u0000\u0000\u0593\u0594"+ + "\u0003\u014e\u009f\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596"+ + "\u0006\u00bb\u0012\u0000\u0596\u0597\u0006\u00bb\f\u0000\u0597\u0598\u0006"+ + "\u00bb\n\u0000\u0598\u0187\u0001\u0000\u0000\u0000\u0599\u059a\u0003h"+ + ",\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u0006\u00bc\u0013"+ + "\u0000\u059c\u059d\u0006\u00bc\f\u0000\u059d\u059e\u0006\u00bc\n\u0000"+ + "\u059e\u0189\u0001\u0000\u0000\u0000\u059f\u05a0\u0003<\u0016\u0000\u05a0"+ + "\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2\u0006\u00bd\u000b\u0000\u05a2"+ + "\u018b\u0001\u0000\u0000\u0000\u05a3\u05a4\u0003>\u0017\u0000\u05a4\u05a5"+ + "\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00be\u000b\u0000\u05a6\u018d"+ + "\u0001\u0000\u0000\u0000\u05a7\u05a8\u0003@\u0018\u0000\u05a8\u05a9\u0001"+ + "\u0000\u0000\u0000\u05a9\u05aa\u0006\u00bf\u000b\u0000\u05aa\u018f\u0001"+ + "\u0000\u0000\u0000\u05ab\u05ac\u0003\u00b0P\u0000\u05ac\u05ad\u0001\u0000"+ + "\u0000\u0000\u05ad\u05ae\u0006\u00c0\f\u0000\u05ae\u05af\u0006\u00c0\u0000"+ + "\u0000\u05af\u05b0\u0006\u00c0\u001d\u0000\u05b0\u0191\u0001\u0000\u0000"+ + "\u0000\u05b1\u05b2\u0003\u00acN\u0000\u05b2\u05b3\u0001\u0000\u0000\u0000"+ + "\u05b3\u05b4\u0006\u00c1\f\u0000\u05b4\u05b5\u0006\u00c1\u0000\u0000\u05b5"+ + "\u05b6\u0006\u00c1\u001e\u0000\u05b6\u0193\u0001\u0000\u0000\u0000\u05b7"+ + "\u05b8\u0003^\'\u0000\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba"+ + "\u0006\u00c2\f\u0000\u05ba\u05bb\u0006\u00c2\u0000\u0000\u05bb\u05bc\u0006"+ + "\u00c2\"\u0000\u05bc\u0195\u0001\u0000\u0000\u0000\u05bd\u05be\u0003B"+ + "\u0019\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u0006\u00c3"+ + "\u0010\u0000\u05c0\u05c1\u0006\u00c3\f\u0000\u05c1\u0197\u0001\u0000\u0000"+ + "\u0000B\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ + "\r\u000e\u000f\u0250\u025a\u025e\u0261\u026a\u026c\u0277\u028a\u028f\u0298"+ + "\u029f\u02a4\u02a6\u02b1\u02b9\u02bc\u02be\u02c3\u02c8\u02ce\u02d5\u02da"+ + "\u02e0\u02e3\u02eb\u02ef\u036e\u0373\u037a\u037c\u038c\u0391\u0396\u0398"+ + "\u039e\u03eb\u03f0\u0417\u041b\u0420\u0425\u042a\u042c\u0430\u0432\u047f"+ + "\u0483\u0488\u051e\u0520#\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006"+ + "\u0000\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000"+ + "\u0005\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000"+ + "\u0001\u0000\u0004\u0000\u0000\u0007\u0014\u0000\u0007B\u0000\u0005\u0000"+ + "\u0000\u0007\u001a\u0000\u0007C\u0000\u0007m\u0000\u0007#\u0000\u0007"+ + "!\u0000\u0007M\u0000\u0007\u001b\u0000\u0007%\u0000\u0007Q\u0000\u0005"+ + "\u000b\u0000\u0005\u0007\u0000\u0007[\u0000\u0007Z\u0000\u0007E\u0000"+ + "\u0007D\u0000\u0007Y\u0000\u0005\r\u0000\u0005\u000f\u0000\u0007\u001e"+ + "\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 71e6a591b73dd..d72887a1597b9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1045,10 +1045,7 @@ public void testWeightedAvg() { public void testMatchInsideEval() throws Exception { assumeTrue("Match operator is available just for snapshots", Build.current().isSnapshot()); - assertEquals( - "1:36: EVAL does not support MATCH expressions", - error("row title = \"brown fox\" | eval x = title matchstr \"fox\" ") - ); + assertEquals("1:36: EVAL does not support MATCH expressions", error("row title = \"brown fox\" | eval x = title match \"fox\" ")); } public void testMatchFilter() throws Exception { @@ -1056,27 +1053,27 @@ public void testMatchFilter() throws Exception { assertEquals( "1:63: MATCH requires a mapped index field, found [name]", - error("from test | eval name = concat(first_name, last_name) | where name matchstr \"Anna\"") + error("from test | eval name = concat(first_name, last_name) | where name match \"Anna\"") ); assertEquals( "1:19: MATCH requires a text or keyword field, but [salary] has type [integer]", - error("from test | where salary matchstr \"100\"") + error("from test | where salary match \"100\"") ); assertEquals( "1:19: Invalid condition using MATCH", - error("from test | where first_name matchstr \"Anna\" or starts_with(first_name, \"Anne\")") + error("from test | where first_name match \"Anna\" or starts_with(first_name, \"Anne\")") ); assertEquals( "1:51: Invalid condition using MATCH", - error("from test | eval new_salary = salary + 10 | where first_name matchstr \"Anna\" OR new_salary > 100") + error("from test | eval new_salary = salary + 10 | where first_name match \"Anna\" OR new_salary > 100") ); assertEquals( "1:45: MATCH requires a mapped index field, found [fn]", - error("from test | rename first_name as fn | where fn matchstr \"Anna\"") + error("from test | rename first_name as fn | where fn match \"Anna\"") ); } From 9e32c8eb77bafcd9e2aa78dcbc9df0d53d96729c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 26 Sep 2024 09:09:54 +0200 Subject: [PATCH 25/93] Adds MATCH as a valid function identifier to make it compatible with match operator --- .../esql/src/main/antlr/EsqlBaseParser.g4 | 8 +- .../xpack/esql/parser/EsqlBaseParser.interp | 3 +- .../xpack/esql/parser/EsqlBaseParser.java | 1836 +++++++++-------- .../parser/EsqlBaseParserBaseListener.java | 12 + .../parser/EsqlBaseParserBaseVisitor.java | 7 + .../esql/parser/EsqlBaseParserListener.java | 10 + .../esql/parser/EsqlBaseParserVisitor.java | 6 + .../xpack/esql/parser/EsqlParser.java | 2 +- .../xpack/esql/parser/ExpressionBuilder.java | 2 +- .../xpack/esql/parser/IdentifierBuilder.java | 8 + 10 files changed, 1006 insertions(+), 888 deletions(-) diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 index a5691a16ca50b..e374552fe3a41 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 @@ -102,7 +102,13 @@ primaryExpression ; functionExpression - : identifier LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP + : functionIdentifier LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP + ; + +functionIdentifier + : identifier + // Additional function identifiers that are already a reserved word in the language + | DEV_MATCH ; dataType diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index f7eed3e9be796..1ccbe44f24510 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -267,6 +267,7 @@ valueExpression operatorExpression primaryExpression functionExpression +functionIdentifier dataType rowCommand fields @@ -317,4 +318,4 @@ inlinestatsCommand atn: -[4, 1, 125, 578, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 128, 8, 1, 10, 1, 12, 1, 131, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 140, 8, 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, 3, 3, 158, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 170, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 177, 8, 5, 10, 5, 12, 5, 180, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 187, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 193, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 201, 8, 5, 10, 5, 12, 5, 204, 9, 5, 1, 6, 1, 6, 3, 6, 208, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 215, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 220, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 231, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 237, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 245, 8, 9, 10, 9, 12, 9, 248, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 258, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 263, 8, 10, 10, 10, 12, 10, 266, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 274, 8, 11, 10, 11, 12, 11, 277, 9, 11, 3, 11, 279, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 291, 8, 14, 10, 14, 12, 14, 294, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 301, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 307, 8, 16, 10, 16, 12, 16, 310, 9, 16, 1, 16, 3, 16, 313, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 320, 8, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 328, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 334, 8, 21, 10, 21, 12, 21, 337, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 347, 8, 23, 10, 23, 12, 23, 350, 9, 23, 1, 23, 3, 23, 353, 8, 23, 1, 23, 1, 23, 3, 23, 357, 8, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 364, 8, 25, 1, 25, 1, 25, 3, 25, 368, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 373, 8, 26, 10, 26, 12, 26, 376, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 381, 8, 27, 10, 27, 12, 27, 384, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 389, 8, 28, 10, 28, 12, 28, 392, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 411, 8, 31, 10, 31, 12, 31, 414, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 422, 8, 31, 10, 31, 12, 31, 425, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 433, 8, 31, 10, 31, 12, 31, 436, 9, 31, 1, 31, 1, 31, 3, 31, 440, 8, 31, 1, 32, 1, 32, 3, 32, 444, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 453, 8, 34, 10, 34, 12, 34, 456, 9, 34, 1, 35, 1, 35, 3, 35, 460, 8, 35, 1, 35, 1, 35, 3, 35, 464, 8, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 476, 8, 38, 10, 38, 12, 38, 479, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 489, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 5, 43, 501, 8, 43, 10, 43, 12, 43, 504, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 514, 8, 46, 1, 47, 3, 47, 517, 8, 47, 1, 47, 1, 47, 1, 48, 3, 48, 522, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 547, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 553, 8, 55, 10, 55, 12, 55, 556, 9, 55, 3, 55, 558, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 563, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 576, 8, 58, 1, 58, 0, 4, 2, 10, 18, 20, 59, 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, 0, 8, 1, 0, 60, 61, 1, 0, 62, 64, 2, 0, 27, 27, 77, 77, 1, 0, 68, 69, 2, 0, 32, 32, 36, 36, 2, 0, 39, 39, 42, 42, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 603, 0, 118, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 4, 139, 1, 0, 0, 0, 6, 157, 1, 0, 0, 0, 8, 159, 1, 0, 0, 0, 10, 192, 1, 0, 0, 0, 12, 219, 1, 0, 0, 0, 14, 221, 1, 0, 0, 0, 16, 230, 1, 0, 0, 0, 18, 236, 1, 0, 0, 0, 20, 257, 1, 0, 0, 0, 22, 267, 1, 0, 0, 0, 24, 282, 1, 0, 0, 0, 26, 284, 1, 0, 0, 0, 28, 287, 1, 0, 0, 0, 30, 300, 1, 0, 0, 0, 32, 302, 1, 0, 0, 0, 34, 319, 1, 0, 0, 0, 36, 321, 1, 0, 0, 0, 38, 323, 1, 0, 0, 0, 40, 327, 1, 0, 0, 0, 42, 329, 1, 0, 0, 0, 44, 338, 1, 0, 0, 0, 46, 342, 1, 0, 0, 0, 48, 358, 1, 0, 0, 0, 50, 361, 1, 0, 0, 0, 52, 369, 1, 0, 0, 0, 54, 377, 1, 0, 0, 0, 56, 385, 1, 0, 0, 0, 58, 393, 1, 0, 0, 0, 60, 395, 1, 0, 0, 0, 62, 439, 1, 0, 0, 0, 64, 443, 1, 0, 0, 0, 66, 445, 1, 0, 0, 0, 68, 448, 1, 0, 0, 0, 70, 457, 1, 0, 0, 0, 72, 465, 1, 0, 0, 0, 74, 468, 1, 0, 0, 0, 76, 471, 1, 0, 0, 0, 78, 480, 1, 0, 0, 0, 80, 484, 1, 0, 0, 0, 82, 490, 1, 0, 0, 0, 84, 494, 1, 0, 0, 0, 86, 497, 1, 0, 0, 0, 88, 505, 1, 0, 0, 0, 90, 509, 1, 0, 0, 0, 92, 513, 1, 0, 0, 0, 94, 516, 1, 0, 0, 0, 96, 521, 1, 0, 0, 0, 98, 525, 1, 0, 0, 0, 100, 527, 1, 0, 0, 0, 102, 529, 1, 0, 0, 0, 104, 532, 1, 0, 0, 0, 106, 536, 1, 0, 0, 0, 108, 539, 1, 0, 0, 0, 110, 542, 1, 0, 0, 0, 112, 562, 1, 0, 0, 0, 114, 566, 1, 0, 0, 0, 116, 571, 1, 0, 0, 0, 118, 119, 3, 2, 1, 0, 119, 120, 5, 0, 0, 1, 120, 1, 1, 0, 0, 0, 121, 122, 6, 1, -1, 0, 122, 123, 3, 4, 2, 0, 123, 129, 1, 0, 0, 0, 124, 125, 10, 1, 0, 0, 125, 126, 5, 26, 0, 0, 126, 128, 3, 6, 3, 0, 127, 124, 1, 0, 0, 0, 128, 131, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 3, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 140, 3, 102, 51, 0, 133, 140, 3, 32, 16, 0, 134, 140, 3, 108, 54, 0, 135, 140, 3, 26, 13, 0, 136, 140, 3, 106, 53, 0, 137, 138, 4, 2, 1, 0, 138, 140, 3, 46, 23, 0, 139, 132, 1, 0, 0, 0, 139, 133, 1, 0, 0, 0, 139, 134, 1, 0, 0, 0, 139, 135, 1, 0, 0, 0, 139, 136, 1, 0, 0, 0, 139, 137, 1, 0, 0, 0, 140, 5, 1, 0, 0, 0, 141, 158, 3, 48, 24, 0, 142, 158, 3, 8, 4, 0, 143, 158, 3, 72, 36, 0, 144, 158, 3, 66, 33, 0, 145, 158, 3, 50, 25, 0, 146, 158, 3, 68, 34, 0, 147, 158, 3, 74, 37, 0, 148, 158, 3, 76, 38, 0, 149, 158, 3, 80, 40, 0, 150, 158, 3, 82, 41, 0, 151, 158, 3, 110, 55, 0, 152, 158, 3, 84, 42, 0, 153, 154, 4, 3, 2, 0, 154, 158, 3, 116, 58, 0, 155, 156, 4, 3, 3, 0, 156, 158, 3, 114, 57, 0, 157, 141, 1, 0, 0, 0, 157, 142, 1, 0, 0, 0, 157, 143, 1, 0, 0, 0, 157, 144, 1, 0, 0, 0, 157, 145, 1, 0, 0, 0, 157, 146, 1, 0, 0, 0, 157, 147, 1, 0, 0, 0, 157, 148, 1, 0, 0, 0, 157, 149, 1, 0, 0, 0, 157, 150, 1, 0, 0, 0, 157, 151, 1, 0, 0, 0, 157, 152, 1, 0, 0, 0, 157, 153, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 158, 7, 1, 0, 0, 0, 159, 160, 5, 17, 0, 0, 160, 161, 3, 10, 5, 0, 161, 9, 1, 0, 0, 0, 162, 163, 6, 5, -1, 0, 163, 164, 5, 45, 0, 0, 164, 193, 3, 10, 5, 8, 165, 193, 3, 16, 8, 0, 166, 193, 3, 12, 6, 0, 167, 169, 3, 16, 8, 0, 168, 170, 5, 45, 0, 0, 169, 168, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 172, 5, 40, 0, 0, 172, 173, 5, 44, 0, 0, 173, 178, 3, 16, 8, 0, 174, 175, 5, 35, 0, 0, 175, 177, 3, 16, 8, 0, 176, 174, 1, 0, 0, 0, 177, 180, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 181, 182, 5, 51, 0, 0, 182, 193, 1, 0, 0, 0, 183, 184, 3, 16, 8, 0, 184, 186, 5, 41, 0, 0, 185, 187, 5, 45, 0, 0, 186, 185, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 5, 46, 0, 0, 189, 193, 1, 0, 0, 0, 190, 191, 4, 5, 4, 0, 191, 193, 3, 14, 7, 0, 192, 162, 1, 0, 0, 0, 192, 165, 1, 0, 0, 0, 192, 166, 1, 0, 0, 0, 192, 167, 1, 0, 0, 0, 192, 183, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 202, 1, 0, 0, 0, 194, 195, 10, 5, 0, 0, 195, 196, 5, 31, 0, 0, 196, 201, 3, 10, 5, 6, 197, 198, 10, 4, 0, 0, 198, 199, 5, 48, 0, 0, 199, 201, 3, 10, 5, 5, 200, 194, 1, 0, 0, 0, 200, 197, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 11, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 207, 3, 16, 8, 0, 206, 208, 5, 45, 0, 0, 207, 206, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 210, 5, 43, 0, 0, 210, 211, 3, 98, 49, 0, 211, 220, 1, 0, 0, 0, 212, 214, 3, 16, 8, 0, 213, 215, 5, 45, 0, 0, 214, 213, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 217, 5, 50, 0, 0, 217, 218, 3, 98, 49, 0, 218, 220, 1, 0, 0, 0, 219, 205, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 220, 13, 1, 0, 0, 0, 221, 222, 3, 16, 8, 0, 222, 223, 5, 20, 0, 0, 223, 224, 3, 98, 49, 0, 224, 15, 1, 0, 0, 0, 225, 231, 3, 18, 9, 0, 226, 227, 3, 18, 9, 0, 227, 228, 3, 100, 50, 0, 228, 229, 3, 18, 9, 0, 229, 231, 1, 0, 0, 0, 230, 225, 1, 0, 0, 0, 230, 226, 1, 0, 0, 0, 231, 17, 1, 0, 0, 0, 232, 233, 6, 9, -1, 0, 233, 237, 3, 20, 10, 0, 234, 235, 7, 0, 0, 0, 235, 237, 3, 18, 9, 3, 236, 232, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 246, 1, 0, 0, 0, 238, 239, 10, 2, 0, 0, 239, 240, 7, 1, 0, 0, 240, 245, 3, 18, 9, 3, 241, 242, 10, 1, 0, 0, 242, 243, 7, 0, 0, 0, 243, 245, 3, 18, 9, 2, 244, 238, 1, 0, 0, 0, 244, 241, 1, 0, 0, 0, 245, 248, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 19, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 249, 250, 6, 10, -1, 0, 250, 258, 3, 62, 31, 0, 251, 258, 3, 52, 26, 0, 252, 258, 3, 22, 11, 0, 253, 254, 5, 44, 0, 0, 254, 255, 3, 10, 5, 0, 255, 256, 5, 51, 0, 0, 256, 258, 1, 0, 0, 0, 257, 249, 1, 0, 0, 0, 257, 251, 1, 0, 0, 0, 257, 252, 1, 0, 0, 0, 257, 253, 1, 0, 0, 0, 258, 264, 1, 0, 0, 0, 259, 260, 10, 1, 0, 0, 260, 261, 5, 34, 0, 0, 261, 263, 3, 24, 12, 0, 262, 259, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 21, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 268, 3, 58, 29, 0, 268, 278, 5, 44, 0, 0, 269, 279, 5, 62, 0, 0, 270, 275, 3, 10, 5, 0, 271, 272, 5, 35, 0, 0, 272, 274, 3, 10, 5, 0, 273, 271, 1, 0, 0, 0, 274, 277, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 278, 269, 1, 0, 0, 0, 278, 270, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 5, 51, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 3, 58, 29, 0, 283, 25, 1, 0, 0, 0, 284, 285, 5, 13, 0, 0, 285, 286, 3, 28, 14, 0, 286, 27, 1, 0, 0, 0, 287, 292, 3, 30, 15, 0, 288, 289, 5, 35, 0, 0, 289, 291, 3, 30, 15, 0, 290, 288, 1, 0, 0, 0, 291, 294, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 29, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 295, 301, 3, 10, 5, 0, 296, 297, 3, 52, 26, 0, 297, 298, 5, 33, 0, 0, 298, 299, 3, 10, 5, 0, 299, 301, 1, 0, 0, 0, 300, 295, 1, 0, 0, 0, 300, 296, 1, 0, 0, 0, 301, 31, 1, 0, 0, 0, 302, 303, 5, 6, 0, 0, 303, 308, 3, 34, 17, 0, 304, 305, 5, 35, 0, 0, 305, 307, 3, 34, 17, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 313, 3, 40, 20, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 33, 1, 0, 0, 0, 314, 315, 3, 36, 18, 0, 315, 316, 5, 109, 0, 0, 316, 317, 3, 38, 19, 0, 317, 320, 1, 0, 0, 0, 318, 320, 3, 38, 19, 0, 319, 314, 1, 0, 0, 0, 319, 318, 1, 0, 0, 0, 320, 35, 1, 0, 0, 0, 321, 322, 5, 77, 0, 0, 322, 37, 1, 0, 0, 0, 323, 324, 7, 2, 0, 0, 324, 39, 1, 0, 0, 0, 325, 328, 3, 42, 21, 0, 326, 328, 3, 44, 22, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 41, 1, 0, 0, 0, 329, 330, 5, 76, 0, 0, 330, 335, 5, 77, 0, 0, 331, 332, 5, 35, 0, 0, 332, 334, 5, 77, 0, 0, 333, 331, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 43, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 66, 0, 0, 339, 340, 3, 42, 21, 0, 340, 341, 5, 67, 0, 0, 341, 45, 1, 0, 0, 0, 342, 343, 5, 21, 0, 0, 343, 348, 3, 34, 17, 0, 344, 345, 5, 35, 0, 0, 345, 347, 3, 34, 17, 0, 346, 344, 1, 0, 0, 0, 347, 350, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 352, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 351, 353, 3, 28, 14, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 355, 5, 30, 0, 0, 355, 357, 3, 28, 14, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 47, 1, 0, 0, 0, 358, 359, 5, 4, 0, 0, 359, 360, 3, 28, 14, 0, 360, 49, 1, 0, 0, 0, 361, 363, 5, 16, 0, 0, 362, 364, 3, 28, 14, 0, 363, 362, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 366, 5, 30, 0, 0, 366, 368, 3, 28, 14, 0, 367, 365, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 51, 1, 0, 0, 0, 369, 374, 3, 58, 29, 0, 370, 371, 5, 37, 0, 0, 371, 373, 3, 58, 29, 0, 372, 370, 1, 0, 0, 0, 373, 376, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 374, 1, 0, 0, 0, 377, 382, 3, 60, 30, 0, 378, 379, 5, 37, 0, 0, 379, 381, 3, 60, 30, 0, 380, 378, 1, 0, 0, 0, 381, 384, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 55, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 385, 390, 3, 54, 27, 0, 386, 387, 5, 35, 0, 0, 387, 389, 3, 54, 27, 0, 388, 386, 1, 0, 0, 0, 389, 392, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 57, 1, 0, 0, 0, 392, 390, 1, 0, 0, 0, 393, 394, 7, 3, 0, 0, 394, 59, 1, 0, 0, 0, 395, 396, 5, 81, 0, 0, 396, 61, 1, 0, 0, 0, 397, 440, 5, 46, 0, 0, 398, 399, 3, 96, 48, 0, 399, 400, 5, 68, 0, 0, 400, 440, 1, 0, 0, 0, 401, 440, 3, 94, 47, 0, 402, 440, 3, 96, 48, 0, 403, 440, 3, 90, 45, 0, 404, 440, 3, 64, 32, 0, 405, 440, 3, 98, 49, 0, 406, 407, 5, 66, 0, 0, 407, 412, 3, 92, 46, 0, 408, 409, 5, 35, 0, 0, 409, 411, 3, 92, 46, 0, 410, 408, 1, 0, 0, 0, 411, 414, 1, 0, 0, 0, 412, 410, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 415, 1, 0, 0, 0, 414, 412, 1, 0, 0, 0, 415, 416, 5, 67, 0, 0, 416, 440, 1, 0, 0, 0, 417, 418, 5, 66, 0, 0, 418, 423, 3, 90, 45, 0, 419, 420, 5, 35, 0, 0, 420, 422, 3, 90, 45, 0, 421, 419, 1, 0, 0, 0, 422, 425, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 426, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 426, 427, 5, 67, 0, 0, 427, 440, 1, 0, 0, 0, 428, 429, 5, 66, 0, 0, 429, 434, 3, 98, 49, 0, 430, 431, 5, 35, 0, 0, 431, 433, 3, 98, 49, 0, 432, 430, 1, 0, 0, 0, 433, 436, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 437, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 437, 438, 5, 67, 0, 0, 438, 440, 1, 0, 0, 0, 439, 397, 1, 0, 0, 0, 439, 398, 1, 0, 0, 0, 439, 401, 1, 0, 0, 0, 439, 402, 1, 0, 0, 0, 439, 403, 1, 0, 0, 0, 439, 404, 1, 0, 0, 0, 439, 405, 1, 0, 0, 0, 439, 406, 1, 0, 0, 0, 439, 417, 1, 0, 0, 0, 439, 428, 1, 0, 0, 0, 440, 63, 1, 0, 0, 0, 441, 444, 5, 49, 0, 0, 442, 444, 5, 65, 0, 0, 443, 441, 1, 0, 0, 0, 443, 442, 1, 0, 0, 0, 444, 65, 1, 0, 0, 0, 445, 446, 5, 9, 0, 0, 446, 447, 5, 28, 0, 0, 447, 67, 1, 0, 0, 0, 448, 449, 5, 15, 0, 0, 449, 454, 3, 70, 35, 0, 450, 451, 5, 35, 0, 0, 451, 453, 3, 70, 35, 0, 452, 450, 1, 0, 0, 0, 453, 456, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 69, 1, 0, 0, 0, 456, 454, 1, 0, 0, 0, 457, 459, 3, 10, 5, 0, 458, 460, 7, 4, 0, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 463, 1, 0, 0, 0, 461, 462, 5, 47, 0, 0, 462, 464, 7, 5, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 71, 1, 0, 0, 0, 465, 466, 5, 8, 0, 0, 466, 467, 3, 56, 28, 0, 467, 73, 1, 0, 0, 0, 468, 469, 5, 2, 0, 0, 469, 470, 3, 56, 28, 0, 470, 75, 1, 0, 0, 0, 471, 472, 5, 12, 0, 0, 472, 477, 3, 78, 39, 0, 473, 474, 5, 35, 0, 0, 474, 476, 3, 78, 39, 0, 475, 473, 1, 0, 0, 0, 476, 479, 1, 0, 0, 0, 477, 475, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 77, 1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 480, 481, 3, 54, 27, 0, 481, 482, 5, 85, 0, 0, 482, 483, 3, 54, 27, 0, 483, 79, 1, 0, 0, 0, 484, 485, 5, 1, 0, 0, 485, 486, 3, 20, 10, 0, 486, 488, 3, 98, 49, 0, 487, 489, 3, 86, 43, 0, 488, 487, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 81, 1, 0, 0, 0, 490, 491, 5, 7, 0, 0, 491, 492, 3, 20, 10, 0, 492, 493, 3, 98, 49, 0, 493, 83, 1, 0, 0, 0, 494, 495, 5, 11, 0, 0, 495, 496, 3, 52, 26, 0, 496, 85, 1, 0, 0, 0, 497, 502, 3, 88, 44, 0, 498, 499, 5, 35, 0, 0, 499, 501, 3, 88, 44, 0, 500, 498, 1, 0, 0, 0, 501, 504, 1, 0, 0, 0, 502, 500, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 87, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 505, 506, 3, 58, 29, 0, 506, 507, 5, 33, 0, 0, 507, 508, 3, 62, 31, 0, 508, 89, 1, 0, 0, 0, 509, 510, 7, 6, 0, 0, 510, 91, 1, 0, 0, 0, 511, 514, 3, 94, 47, 0, 512, 514, 3, 96, 48, 0, 513, 511, 1, 0, 0, 0, 513, 512, 1, 0, 0, 0, 514, 93, 1, 0, 0, 0, 515, 517, 7, 0, 0, 0, 516, 515, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 5, 29, 0, 0, 519, 95, 1, 0, 0, 0, 520, 522, 7, 0, 0, 0, 521, 520, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 5, 28, 0, 0, 524, 97, 1, 0, 0, 0, 525, 526, 5, 27, 0, 0, 526, 99, 1, 0, 0, 0, 527, 528, 7, 7, 0, 0, 528, 101, 1, 0, 0, 0, 529, 530, 5, 5, 0, 0, 530, 531, 3, 104, 52, 0, 531, 103, 1, 0, 0, 0, 532, 533, 5, 66, 0, 0, 533, 534, 3, 2, 1, 0, 534, 535, 5, 67, 0, 0, 535, 105, 1, 0, 0, 0, 536, 537, 5, 14, 0, 0, 537, 538, 5, 101, 0, 0, 538, 107, 1, 0, 0, 0, 539, 540, 5, 10, 0, 0, 540, 541, 5, 105, 0, 0, 541, 109, 1, 0, 0, 0, 542, 543, 5, 3, 0, 0, 543, 546, 5, 91, 0, 0, 544, 545, 5, 89, 0, 0, 545, 547, 3, 54, 27, 0, 546, 544, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 557, 1, 0, 0, 0, 548, 549, 5, 90, 0, 0, 549, 554, 3, 112, 56, 0, 550, 551, 5, 35, 0, 0, 551, 553, 3, 112, 56, 0, 552, 550, 1, 0, 0, 0, 553, 556, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 558, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 557, 548, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 111, 1, 0, 0, 0, 559, 560, 3, 54, 27, 0, 560, 561, 5, 33, 0, 0, 561, 563, 1, 0, 0, 0, 562, 559, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 3, 54, 27, 0, 565, 113, 1, 0, 0, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 34, 17, 0, 568, 569, 5, 89, 0, 0, 569, 570, 3, 56, 28, 0, 570, 115, 1, 0, 0, 0, 571, 572, 5, 18, 0, 0, 572, 575, 3, 28, 14, 0, 573, 574, 5, 30, 0, 0, 574, 576, 3, 28, 14, 0, 575, 573, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 117, 1, 0, 0, 0, 54, 129, 139, 157, 169, 178, 186, 192, 200, 202, 207, 214, 219, 230, 236, 244, 246, 257, 264, 275, 278, 292, 300, 308, 312, 319, 327, 335, 348, 352, 356, 363, 367, 374, 382, 390, 412, 423, 434, 439, 443, 454, 459, 463, 477, 488, 502, 513, 516, 521, 546, 554, 557, 562, 575] \ No newline at end of file +[4, 1, 125, 584, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 142, 8, 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, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 179, 8, 5, 10, 5, 12, 5, 182, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 203, 8, 5, 10, 5, 12, 5, 206, 9, 5, 1, 6, 1, 6, 3, 6, 210, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 222, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 233, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 239, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 247, 8, 9, 10, 9, 12, 9, 250, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 3, 11, 281, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 297, 8, 15, 10, 15, 12, 15, 300, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 307, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 313, 8, 17, 10, 17, 12, 17, 316, 9, 17, 1, 17, 3, 17, 319, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 326, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 334, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 340, 8, 22, 10, 22, 12, 22, 343, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 353, 8, 24, 10, 24, 12, 24, 356, 9, 24, 1, 24, 3, 24, 359, 8, 24, 1, 24, 1, 24, 3, 24, 363, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 370, 8, 26, 1, 26, 1, 26, 3, 26, 374, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 379, 8, 27, 10, 27, 12, 27, 382, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 387, 8, 28, 10, 28, 12, 28, 390, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 395, 8, 29, 10, 29, 12, 29, 398, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 417, 8, 32, 10, 32, 12, 32, 420, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 428, 8, 32, 10, 32, 12, 32, 431, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 439, 8, 32, 10, 32, 12, 32, 442, 9, 32, 1, 32, 1, 32, 3, 32, 446, 8, 32, 1, 33, 1, 33, 3, 33, 450, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 459, 8, 35, 10, 35, 12, 35, 462, 9, 35, 1, 36, 1, 36, 3, 36, 466, 8, 36, 1, 36, 1, 36, 3, 36, 470, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 482, 8, 39, 10, 39, 12, 39, 485, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 495, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 507, 8, 44, 10, 44, 12, 44, 510, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 520, 8, 47, 1, 48, 3, 48, 523, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 528, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 553, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 559, 8, 56, 10, 56, 12, 56, 562, 9, 56, 3, 56, 564, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 569, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 582, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 60, 61, 1, 0, 62, 64, 2, 0, 27, 27, 77, 77, 1, 0, 68, 69, 2, 0, 32, 32, 36, 36, 2, 0, 39, 39, 42, 42, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 609, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 141, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 221, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 286, 1, 0, 0, 0, 26, 288, 1, 0, 0, 0, 28, 290, 1, 0, 0, 0, 30, 293, 1, 0, 0, 0, 32, 306, 1, 0, 0, 0, 34, 308, 1, 0, 0, 0, 36, 325, 1, 0, 0, 0, 38, 327, 1, 0, 0, 0, 40, 329, 1, 0, 0, 0, 42, 333, 1, 0, 0, 0, 44, 335, 1, 0, 0, 0, 46, 344, 1, 0, 0, 0, 48, 348, 1, 0, 0, 0, 50, 364, 1, 0, 0, 0, 52, 367, 1, 0, 0, 0, 54, 375, 1, 0, 0, 0, 56, 383, 1, 0, 0, 0, 58, 391, 1, 0, 0, 0, 60, 399, 1, 0, 0, 0, 62, 401, 1, 0, 0, 0, 64, 445, 1, 0, 0, 0, 66, 449, 1, 0, 0, 0, 68, 451, 1, 0, 0, 0, 70, 454, 1, 0, 0, 0, 72, 463, 1, 0, 0, 0, 74, 471, 1, 0, 0, 0, 76, 474, 1, 0, 0, 0, 78, 477, 1, 0, 0, 0, 80, 486, 1, 0, 0, 0, 82, 490, 1, 0, 0, 0, 84, 496, 1, 0, 0, 0, 86, 500, 1, 0, 0, 0, 88, 503, 1, 0, 0, 0, 90, 511, 1, 0, 0, 0, 92, 515, 1, 0, 0, 0, 94, 519, 1, 0, 0, 0, 96, 522, 1, 0, 0, 0, 98, 527, 1, 0, 0, 0, 100, 531, 1, 0, 0, 0, 102, 533, 1, 0, 0, 0, 104, 535, 1, 0, 0, 0, 106, 538, 1, 0, 0, 0, 108, 542, 1, 0, 0, 0, 110, 545, 1, 0, 0, 0, 112, 548, 1, 0, 0, 0, 114, 568, 1, 0, 0, 0, 116, 572, 1, 0, 0, 0, 118, 577, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 26, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 142, 3, 104, 52, 0, 135, 142, 3, 34, 17, 0, 136, 142, 3, 110, 55, 0, 137, 142, 3, 28, 14, 0, 138, 142, 3, 108, 54, 0, 139, 140, 4, 2, 1, 0, 140, 142, 3, 48, 24, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 5, 1, 0, 0, 0, 143, 160, 3, 50, 25, 0, 144, 160, 3, 8, 4, 0, 145, 160, 3, 74, 37, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 52, 26, 0, 148, 160, 3, 70, 35, 0, 149, 160, 3, 76, 38, 0, 150, 160, 3, 78, 39, 0, 151, 160, 3, 82, 41, 0, 152, 160, 3, 84, 42, 0, 153, 160, 3, 112, 56, 0, 154, 160, 3, 86, 43, 0, 155, 156, 4, 3, 2, 0, 156, 160, 3, 118, 59, 0, 157, 158, 4, 3, 3, 0, 158, 160, 3, 116, 58, 0, 159, 143, 1, 0, 0, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 17, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 45, 0, 0, 166, 195, 3, 10, 5, 8, 167, 195, 3, 16, 8, 0, 168, 195, 3, 12, 6, 0, 169, 171, 3, 16, 8, 0, 170, 172, 5, 45, 0, 0, 171, 170, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 5, 40, 0, 0, 174, 175, 5, 44, 0, 0, 175, 180, 3, 16, 8, 0, 176, 177, 5, 35, 0, 0, 177, 179, 3, 16, 8, 0, 178, 176, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 51, 0, 0, 184, 195, 1, 0, 0, 0, 185, 186, 3, 16, 8, 0, 186, 188, 5, 41, 0, 0, 187, 189, 5, 45, 0, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 5, 46, 0, 0, 191, 195, 1, 0, 0, 0, 192, 193, 4, 5, 4, 0, 193, 195, 3, 14, 7, 0, 194, 164, 1, 0, 0, 0, 194, 167, 1, 0, 0, 0, 194, 168, 1, 0, 0, 0, 194, 169, 1, 0, 0, 0, 194, 185, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 204, 1, 0, 0, 0, 196, 197, 10, 5, 0, 0, 197, 198, 5, 31, 0, 0, 198, 203, 3, 10, 5, 6, 199, 200, 10, 4, 0, 0, 200, 201, 5, 48, 0, 0, 201, 203, 3, 10, 5, 5, 202, 196, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 209, 3, 16, 8, 0, 208, 210, 5, 45, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 5, 43, 0, 0, 212, 213, 3, 100, 50, 0, 213, 222, 1, 0, 0, 0, 214, 216, 3, 16, 8, 0, 215, 217, 5, 45, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 50, 0, 0, 219, 220, 3, 100, 50, 0, 220, 222, 1, 0, 0, 0, 221, 207, 1, 0, 0, 0, 221, 214, 1, 0, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 3, 16, 8, 0, 224, 225, 5, 20, 0, 0, 225, 226, 3, 100, 50, 0, 226, 15, 1, 0, 0, 0, 227, 233, 3, 18, 9, 0, 228, 229, 3, 18, 9, 0, 229, 230, 3, 102, 51, 0, 230, 231, 3, 18, 9, 0, 231, 233, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 17, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 239, 3, 20, 10, 0, 236, 237, 7, 0, 0, 0, 237, 239, 3, 18, 9, 3, 238, 234, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 1, 0, 0, 0, 240, 241, 10, 2, 0, 0, 241, 242, 7, 1, 0, 0, 242, 247, 3, 18, 9, 3, 243, 244, 10, 1, 0, 0, 244, 245, 7, 0, 0, 0, 245, 247, 3, 18, 9, 2, 246, 240, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 19, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 6, 10, -1, 0, 252, 260, 3, 64, 32, 0, 253, 260, 3, 54, 27, 0, 254, 260, 3, 22, 11, 0, 255, 256, 5, 44, 0, 0, 256, 257, 3, 10, 5, 0, 257, 258, 5, 51, 0, 0, 258, 260, 1, 0, 0, 0, 259, 251, 1, 0, 0, 0, 259, 253, 1, 0, 0, 0, 259, 254, 1, 0, 0, 0, 259, 255, 1, 0, 0, 0, 260, 266, 1, 0, 0, 0, 261, 262, 10, 1, 0, 0, 262, 263, 5, 34, 0, 0, 263, 265, 3, 26, 13, 0, 264, 261, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 3, 24, 12, 0, 270, 280, 5, 44, 0, 0, 271, 281, 5, 62, 0, 0, 272, 277, 3, 10, 5, 0, 273, 274, 5, 35, 0, 0, 274, 276, 3, 10, 5, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 271, 1, 0, 0, 0, 280, 272, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 5, 51, 0, 0, 283, 23, 1, 0, 0, 0, 284, 287, 3, 60, 30, 0, 285, 287, 5, 20, 0, 0, 286, 284, 1, 0, 0, 0, 286, 285, 1, 0, 0, 0, 287, 25, 1, 0, 0, 0, 288, 289, 3, 60, 30, 0, 289, 27, 1, 0, 0, 0, 290, 291, 5, 13, 0, 0, 291, 292, 3, 30, 15, 0, 292, 29, 1, 0, 0, 0, 293, 298, 3, 32, 16, 0, 294, 295, 5, 35, 0, 0, 295, 297, 3, 32, 16, 0, 296, 294, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 31, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 307, 3, 10, 5, 0, 302, 303, 3, 54, 27, 0, 303, 304, 5, 33, 0, 0, 304, 305, 3, 10, 5, 0, 305, 307, 1, 0, 0, 0, 306, 301, 1, 0, 0, 0, 306, 302, 1, 0, 0, 0, 307, 33, 1, 0, 0, 0, 308, 309, 5, 6, 0, 0, 309, 314, 3, 36, 18, 0, 310, 311, 5, 35, 0, 0, 311, 313, 3, 36, 18, 0, 312, 310, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 318, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 317, 319, 3, 42, 21, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 35, 1, 0, 0, 0, 320, 321, 3, 38, 19, 0, 321, 322, 5, 109, 0, 0, 322, 323, 3, 40, 20, 0, 323, 326, 1, 0, 0, 0, 324, 326, 3, 40, 20, 0, 325, 320, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 37, 1, 0, 0, 0, 327, 328, 5, 77, 0, 0, 328, 39, 1, 0, 0, 0, 329, 330, 7, 2, 0, 0, 330, 41, 1, 0, 0, 0, 331, 334, 3, 44, 22, 0, 332, 334, 3, 46, 23, 0, 333, 331, 1, 0, 0, 0, 333, 332, 1, 0, 0, 0, 334, 43, 1, 0, 0, 0, 335, 336, 5, 76, 0, 0, 336, 341, 5, 77, 0, 0, 337, 338, 5, 35, 0, 0, 338, 340, 5, 77, 0, 0, 339, 337, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 45, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 66, 0, 0, 345, 346, 3, 44, 22, 0, 346, 347, 5, 67, 0, 0, 347, 47, 1, 0, 0, 0, 348, 349, 5, 21, 0, 0, 349, 354, 3, 36, 18, 0, 350, 351, 5, 35, 0, 0, 351, 353, 3, 36, 18, 0, 352, 350, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 359, 3, 30, 15, 0, 358, 357, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 361, 5, 30, 0, 0, 361, 363, 3, 30, 15, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 49, 1, 0, 0, 0, 364, 365, 5, 4, 0, 0, 365, 366, 3, 30, 15, 0, 366, 51, 1, 0, 0, 0, 367, 369, 5, 16, 0, 0, 368, 370, 3, 30, 15, 0, 369, 368, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 372, 5, 30, 0, 0, 372, 374, 3, 30, 15, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 53, 1, 0, 0, 0, 375, 380, 3, 60, 30, 0, 376, 377, 5, 37, 0, 0, 377, 379, 3, 60, 30, 0, 378, 376, 1, 0, 0, 0, 379, 382, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 55, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 383, 388, 3, 62, 31, 0, 384, 385, 5, 37, 0, 0, 385, 387, 3, 62, 31, 0, 386, 384, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 57, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 391, 396, 3, 56, 28, 0, 392, 393, 5, 35, 0, 0, 393, 395, 3, 56, 28, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 59, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 400, 7, 3, 0, 0, 400, 61, 1, 0, 0, 0, 401, 402, 5, 81, 0, 0, 402, 63, 1, 0, 0, 0, 403, 446, 5, 46, 0, 0, 404, 405, 3, 98, 49, 0, 405, 406, 5, 68, 0, 0, 406, 446, 1, 0, 0, 0, 407, 446, 3, 96, 48, 0, 408, 446, 3, 98, 49, 0, 409, 446, 3, 92, 46, 0, 410, 446, 3, 66, 33, 0, 411, 446, 3, 100, 50, 0, 412, 413, 5, 66, 0, 0, 413, 418, 3, 94, 47, 0, 414, 415, 5, 35, 0, 0, 415, 417, 3, 94, 47, 0, 416, 414, 1, 0, 0, 0, 417, 420, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 421, 422, 5, 67, 0, 0, 422, 446, 1, 0, 0, 0, 423, 424, 5, 66, 0, 0, 424, 429, 3, 92, 46, 0, 425, 426, 5, 35, 0, 0, 426, 428, 3, 92, 46, 0, 427, 425, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 432, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 433, 5, 67, 0, 0, 433, 446, 1, 0, 0, 0, 434, 435, 5, 66, 0, 0, 435, 440, 3, 100, 50, 0, 436, 437, 5, 35, 0, 0, 437, 439, 3, 100, 50, 0, 438, 436, 1, 0, 0, 0, 439, 442, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 443, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 443, 444, 5, 67, 0, 0, 444, 446, 1, 0, 0, 0, 445, 403, 1, 0, 0, 0, 445, 404, 1, 0, 0, 0, 445, 407, 1, 0, 0, 0, 445, 408, 1, 0, 0, 0, 445, 409, 1, 0, 0, 0, 445, 410, 1, 0, 0, 0, 445, 411, 1, 0, 0, 0, 445, 412, 1, 0, 0, 0, 445, 423, 1, 0, 0, 0, 445, 434, 1, 0, 0, 0, 446, 65, 1, 0, 0, 0, 447, 450, 5, 49, 0, 0, 448, 450, 5, 65, 0, 0, 449, 447, 1, 0, 0, 0, 449, 448, 1, 0, 0, 0, 450, 67, 1, 0, 0, 0, 451, 452, 5, 9, 0, 0, 452, 453, 5, 28, 0, 0, 453, 69, 1, 0, 0, 0, 454, 455, 5, 15, 0, 0, 455, 460, 3, 72, 36, 0, 456, 457, 5, 35, 0, 0, 457, 459, 3, 72, 36, 0, 458, 456, 1, 0, 0, 0, 459, 462, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 71, 1, 0, 0, 0, 462, 460, 1, 0, 0, 0, 463, 465, 3, 10, 5, 0, 464, 466, 7, 4, 0, 0, 465, 464, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 469, 1, 0, 0, 0, 467, 468, 5, 47, 0, 0, 468, 470, 7, 5, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 73, 1, 0, 0, 0, 471, 472, 5, 8, 0, 0, 472, 473, 3, 58, 29, 0, 473, 75, 1, 0, 0, 0, 474, 475, 5, 2, 0, 0, 475, 476, 3, 58, 29, 0, 476, 77, 1, 0, 0, 0, 477, 478, 5, 12, 0, 0, 478, 483, 3, 80, 40, 0, 479, 480, 5, 35, 0, 0, 480, 482, 3, 80, 40, 0, 481, 479, 1, 0, 0, 0, 482, 485, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 79, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 486, 487, 3, 56, 28, 0, 487, 488, 5, 85, 0, 0, 488, 489, 3, 56, 28, 0, 489, 81, 1, 0, 0, 0, 490, 491, 5, 1, 0, 0, 491, 492, 3, 20, 10, 0, 492, 494, 3, 100, 50, 0, 493, 495, 3, 88, 44, 0, 494, 493, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 83, 1, 0, 0, 0, 496, 497, 5, 7, 0, 0, 497, 498, 3, 20, 10, 0, 498, 499, 3, 100, 50, 0, 499, 85, 1, 0, 0, 0, 500, 501, 5, 11, 0, 0, 501, 502, 3, 54, 27, 0, 502, 87, 1, 0, 0, 0, 503, 508, 3, 90, 45, 0, 504, 505, 5, 35, 0, 0, 505, 507, 3, 90, 45, 0, 506, 504, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 89, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 3, 60, 30, 0, 512, 513, 5, 33, 0, 0, 513, 514, 3, 64, 32, 0, 514, 91, 1, 0, 0, 0, 515, 516, 7, 6, 0, 0, 516, 93, 1, 0, 0, 0, 517, 520, 3, 96, 48, 0, 518, 520, 3, 98, 49, 0, 519, 517, 1, 0, 0, 0, 519, 518, 1, 0, 0, 0, 520, 95, 1, 0, 0, 0, 521, 523, 7, 0, 0, 0, 522, 521, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 5, 29, 0, 0, 525, 97, 1, 0, 0, 0, 526, 528, 7, 0, 0, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 5, 28, 0, 0, 530, 99, 1, 0, 0, 0, 531, 532, 5, 27, 0, 0, 532, 101, 1, 0, 0, 0, 533, 534, 7, 7, 0, 0, 534, 103, 1, 0, 0, 0, 535, 536, 5, 5, 0, 0, 536, 537, 3, 106, 53, 0, 537, 105, 1, 0, 0, 0, 538, 539, 5, 66, 0, 0, 539, 540, 3, 2, 1, 0, 540, 541, 5, 67, 0, 0, 541, 107, 1, 0, 0, 0, 542, 543, 5, 14, 0, 0, 543, 544, 5, 101, 0, 0, 544, 109, 1, 0, 0, 0, 545, 546, 5, 10, 0, 0, 546, 547, 5, 105, 0, 0, 547, 111, 1, 0, 0, 0, 548, 549, 5, 3, 0, 0, 549, 552, 5, 91, 0, 0, 550, 551, 5, 89, 0, 0, 551, 553, 3, 56, 28, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 563, 1, 0, 0, 0, 554, 555, 5, 90, 0, 0, 555, 560, 3, 114, 57, 0, 556, 557, 5, 35, 0, 0, 557, 559, 3, 114, 57, 0, 558, 556, 1, 0, 0, 0, 559, 562, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 554, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 113, 1, 0, 0, 0, 565, 566, 3, 56, 28, 0, 566, 567, 5, 33, 0, 0, 567, 569, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 3, 56, 28, 0, 571, 115, 1, 0, 0, 0, 572, 573, 5, 19, 0, 0, 573, 574, 3, 36, 18, 0, 574, 575, 5, 89, 0, 0, 575, 576, 3, 58, 29, 0, 576, 117, 1, 0, 0, 0, 577, 578, 5, 18, 0, 0, 578, 581, 3, 30, 15, 0, 579, 580, 5, 30, 0, 0, 580, 582, 3, 30, 15, 0, 581, 579, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 119, 1, 0, 0, 0, 55, 131, 141, 159, 171, 180, 188, 194, 202, 204, 209, 216, 221, 232, 238, 246, 248, 259, 266, 277, 280, 286, 298, 306, 314, 318, 325, 333, 341, 354, 358, 362, 369, 373, 380, 388, 396, 418, 429, 440, 445, 449, 460, 465, 469, 483, 494, 508, 519, 522, 527, 552, 560, 563, 568, 581] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index 578da6fe786ac..b6236cbdf6acc 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -8,14 +8,17 @@ * 2.0. */ -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.atn.ATNDeserializer; +import org.antlr.v4.runtime.atn.ParserATNSimulator; +import org.antlr.v4.runtime.atn.PredictionContextCache; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; +import org.antlr.v4.runtime.tree.TerminalNode; + import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class EsqlBaseParser extends ParserConfig { @@ -25,114 +28,115 @@ public class EsqlBaseParser extends ParserConfig { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, - LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, - WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, - UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, - QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, - ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, - IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, - PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, - GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, - OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, - EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, - EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, - FROM_LINE_COMMENT=78, FROM_MULTILINE_COMMENT=79, FROM_WS=80, ID_PATTERN=81, - PROJECT_LINE_COMMENT=82, PROJECT_MULTILINE_COMMENT=83, PROJECT_WS=84, - AS=85, RENAME_LINE_COMMENT=86, RENAME_MULTILINE_COMMENT=87, RENAME_WS=88, - ON=89, WITH=90, ENRICH_POLICY_NAME=91, ENRICH_LINE_COMMENT=92, ENRICH_MULTILINE_COMMENT=93, - ENRICH_WS=94, ENRICH_FIELD_LINE_COMMENT=95, ENRICH_FIELD_MULTILINE_COMMENT=96, - ENRICH_FIELD_WS=97, MVEXPAND_LINE_COMMENT=98, MVEXPAND_MULTILINE_COMMENT=99, - MVEXPAND_WS=100, INFO=101, SHOW_LINE_COMMENT=102, SHOW_MULTILINE_COMMENT=103, - SHOW_WS=104, FUNCTIONS=105, META_LINE_COMMENT=106, META_MULTILINE_COMMENT=107, - META_WS=108, COLON=109, SETTING=110, SETTING_LINE_COMMENT=111, SETTTING_MULTILINE_COMMENT=112, - SETTING_WS=113, LOOKUP_LINE_COMMENT=114, LOOKUP_MULTILINE_COMMENT=115, - LOOKUP_WS=116, LOOKUP_FIELD_LINE_COMMENT=117, LOOKUP_FIELD_MULTILINE_COMMENT=118, - LOOKUP_FIELD_WS=119, METRICS_LINE_COMMENT=120, METRICS_MULTILINE_COMMENT=121, - METRICS_WS=122, CLOSING_METRICS_LINE_COMMENT=123, CLOSING_METRICS_MULTILINE_COMMENT=124, + DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, + LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, + WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, + UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, + QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, + ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, + IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, + PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, + GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, + OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, + EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, + EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, + FROM_LINE_COMMENT=78, FROM_MULTILINE_COMMENT=79, FROM_WS=80, ID_PATTERN=81, + PROJECT_LINE_COMMENT=82, PROJECT_MULTILINE_COMMENT=83, PROJECT_WS=84, + AS=85, RENAME_LINE_COMMENT=86, RENAME_MULTILINE_COMMENT=87, RENAME_WS=88, + ON=89, WITH=90, ENRICH_POLICY_NAME=91, ENRICH_LINE_COMMENT=92, ENRICH_MULTILINE_COMMENT=93, + ENRICH_WS=94, ENRICH_FIELD_LINE_COMMENT=95, ENRICH_FIELD_MULTILINE_COMMENT=96, + ENRICH_FIELD_WS=97, MVEXPAND_LINE_COMMENT=98, MVEXPAND_MULTILINE_COMMENT=99, + MVEXPAND_WS=100, INFO=101, SHOW_LINE_COMMENT=102, SHOW_MULTILINE_COMMENT=103, + SHOW_WS=104, FUNCTIONS=105, META_LINE_COMMENT=106, META_MULTILINE_COMMENT=107, + META_WS=108, COLON=109, SETTING=110, SETTING_LINE_COMMENT=111, SETTTING_MULTILINE_COMMENT=112, + SETTING_WS=113, LOOKUP_LINE_COMMENT=114, LOOKUP_MULTILINE_COMMENT=115, + LOOKUP_WS=116, LOOKUP_FIELD_LINE_COMMENT=117, LOOKUP_FIELD_MULTILINE_COMMENT=118, + LOOKUP_FIELD_WS=119, METRICS_LINE_COMMENT=120, METRICS_MULTILINE_COMMENT=121, + METRICS_WS=122, CLOSING_METRICS_LINE_COMMENT=123, CLOSING_METRICS_MULTILINE_COMMENT=124, CLOSING_METRICS_WS=125; public static final int - RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, - RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, - RULE_matchBooleanExpression = 7, RULE_valueExpression = 8, RULE_operatorExpression = 9, - RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_dataType = 12, - RULE_rowCommand = 13, RULE_fields = 14, RULE_field = 15, RULE_fromCommand = 16, - RULE_indexPattern = 17, RULE_clusterString = 18, RULE_indexString = 19, - RULE_metadata = 20, RULE_metadataOption = 21, RULE_deprecated_metadata = 22, - RULE_metricsCommand = 23, RULE_evalCommand = 24, RULE_statsCommand = 25, - RULE_qualifiedName = 26, RULE_qualifiedNamePattern = 27, RULE_qualifiedNamePatterns = 28, - RULE_identifier = 29, RULE_identifierPattern = 30, RULE_constant = 31, - RULE_params = 32, RULE_limitCommand = 33, RULE_sortCommand = 34, RULE_orderExpression = 35, - RULE_keepCommand = 36, RULE_dropCommand = 37, RULE_renameCommand = 38, - RULE_renameClause = 39, RULE_dissectCommand = 40, RULE_grokCommand = 41, - RULE_mvExpandCommand = 42, RULE_commandOptions = 43, RULE_commandOption = 44, - RULE_booleanValue = 45, RULE_numericValue = 46, RULE_decimalValue = 47, - RULE_integerValue = 48, RULE_string = 49, RULE_comparisonOperator = 50, - RULE_explainCommand = 51, RULE_subqueryExpression = 52, RULE_showCommand = 53, - RULE_metaCommand = 54, RULE_enrichCommand = 55, RULE_enrichWithClause = 56, - RULE_lookupCommand = 57, RULE_inlinestatsCommand = 58; + RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, + RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, + RULE_matchBooleanExpression = 7, RULE_valueExpression = 8, RULE_operatorExpression = 9, + RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_functionIdentifier = 12, + RULE_dataType = 13, RULE_rowCommand = 14, RULE_fields = 15, RULE_field = 16, + RULE_fromCommand = 17, RULE_indexPattern = 18, RULE_clusterString = 19, + RULE_indexString = 20, RULE_metadata = 21, RULE_metadataOption = 22, RULE_deprecated_metadata = 23, + RULE_metricsCommand = 24, RULE_evalCommand = 25, RULE_statsCommand = 26, + RULE_qualifiedName = 27, RULE_qualifiedNamePattern = 28, RULE_qualifiedNamePatterns = 29, + RULE_identifier = 30, RULE_identifierPattern = 31, RULE_constant = 32, + RULE_params = 33, RULE_limitCommand = 34, RULE_sortCommand = 35, RULE_orderExpression = 36, + RULE_keepCommand = 37, RULE_dropCommand = 38, RULE_renameCommand = 39, + RULE_renameClause = 40, RULE_dissectCommand = 41, RULE_grokCommand = 42, + RULE_mvExpandCommand = 43, RULE_commandOptions = 44, RULE_commandOption = 45, + RULE_booleanValue = 46, RULE_numericValue = 47, RULE_decimalValue = 48, + RULE_integerValue = 49, RULE_string = 50, RULE_comparisonOperator = 51, + RULE_explainCommand = 52, RULE_subqueryExpression = 53, RULE_showCommand = 54, + RULE_metaCommand = 55, RULE_enrichCommand = 56, RULE_enrichWithClause = 57, + RULE_lookupCommand = 58, RULE_inlinestatsCommand = 59; private static String[] makeRuleNames() { return new String[] { - "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", - "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", - "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", - "dataType", "rowCommand", "fields", "field", "fromCommand", "indexPattern", - "clusterString", "indexString", "metadata", "metadataOption", "deprecated_metadata", - "metricsCommand", "evalCommand", "statsCommand", "qualifiedName", "qualifiedNamePattern", - "qualifiedNamePatterns", "identifier", "identifierPattern", "constant", - "params", "limitCommand", "sortCommand", "orderExpression", "keepCommand", - "dropCommand", "renameCommand", "renameClause", "dissectCommand", "grokCommand", - "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", "metaCommand", - "enrichCommand", "enrichWithClause", "lookupCommand", "inlinestatsCommand" + "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", + "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", + "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", + "functionIdentifier", "dataType", "rowCommand", "fields", "field", "fromCommand", + "indexPattern", "clusterString", "indexString", "metadata", "metadataOption", + "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", + "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", "identifier", + "identifierPattern", "constant", "params", "limitCommand", "sortCommand", + "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", + "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", + "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", "lookupCommand", + "inlinestatsCommand" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", - "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", - "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, - null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", - "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", - "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", - "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", - null, null, null, null, null, null, null, null, "'metadata'", null, null, - null, null, null, null, null, null, "'as'", null, null, null, "'on'", - "'with'", null, null, null, null, null, null, null, null, null, null, + null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", + "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", + "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, + null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", + "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", + "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", + "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", + "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", + null, null, null, null, null, null, null, null, "'metadata'", null, null, + null, null, null, null, null, null, "'as'", null, null, null, "'on'", + "'with'", null, null, null, null, null, null, null, null, null, null, "'info'", null, null, null, "'functions'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", - "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", - "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", - "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", - "META_MULTILINE_COMMENT", "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", - "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", + "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", + "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", + "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", + "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", + "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", + "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", + "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", + "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", + "META_MULTILINE_COMMENT", "META_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", + "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS" }; } @@ -220,9 +224,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(118); + setState(120); query(0); - setState(119); + setState(121); match(EOF); } } @@ -244,7 +248,7 @@ public QueryContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_query; } - + @SuppressWarnings("this-escape") public QueryContext() { } public void copyFrom(QueryContext ctx) { @@ -318,11 +322,11 @@ private QueryContext query(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(122); + setState(124); sourceCommand(); } _ctx.stop = _input.LT(-1); - setState(129); + setState(131); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -333,16 +337,16 @@ private QueryContext query(int _p) throws RecognitionException { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(124); + setState(126); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(125); + setState(127); match(PIPE); - setState(126); + setState(128); processingCommand(); } - } + } } - setState(131); + setState(133); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } @@ -403,50 +407,50 @@ public final SourceCommandContext sourceCommand() throws RecognitionException { SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); enterRule(_localctx, 4, RULE_sourceCommand); try { - setState(139); + setState(141); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(132); + setState(134); explainCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(133); + setState(135); fromCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(134); + setState(136); metaCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(135); + setState(137); rowCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(136); + setState(138); showCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(137); + setState(139); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(138); + setState(140); metricsCommand(); } break; @@ -531,108 +535,108 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); enterRule(_localctx, 6, RULE_processingCommand); try { - setState(157); + setState(159); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(141); + setState(143); evalCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(142); + setState(144); whereCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(143); + setState(145); keepCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(144); + setState(146); limitCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(145); + setState(147); statsCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(146); + setState(148); sortCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(147); + setState(149); dropCommand(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(148); + setState(150); renameCommand(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(149); + setState(151); dissectCommand(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(150); + setState(152); grokCommand(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(151); + setState(153); enrichCommand(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(152); + setState(154); mvExpandCommand(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(153); + setState(155); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(154); + setState(156); inlinestatsCommand(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(155); + setState(157); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(156); + setState(158); lookupCommand(); } break; @@ -681,9 +685,9 @@ public final WhereCommandContext whereCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(159); + setState(161); match(WHERE); - setState(160); + setState(162); booleanExpression(0); } } @@ -705,7 +709,7 @@ public BooleanExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_booleanExpression; } - + @SuppressWarnings("this-escape") public BooleanExpressionContext() { } public void copyFrom(BooleanExpressionContext ctx) { @@ -899,7 +903,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(192); + setState(194); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: @@ -908,9 +912,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(163); + setState(165); match(NOT); - setState(164); + setState(166); booleanExpression(8); } break; @@ -919,7 +923,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(165); + setState(167); valueExpression(); } break; @@ -928,7 +932,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(166); + setState(168); regexBooleanExpression(); } break; @@ -937,41 +941,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(167); - valueExpression(); setState(169); + valueExpression(); + setState(171); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(168); + setState(170); match(NOT); } } - setState(171); + setState(173); match(IN); - setState(172); + setState(174); match(LP); - setState(173); + setState(175); valueExpression(); - setState(178); + setState(180); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(174); + setState(176); match(COMMA); - setState(175); + setState(177); valueExpression(); } } - setState(180); + setState(182); _errHandler.sync(this); _la = _input.LA(1); } - setState(181); + setState(183); match(RP); } break; @@ -980,21 +984,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(183); + setState(185); valueExpression(); - setState(184); - match(IS); setState(186); + match(IS); + setState(188); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(185); + setState(187); match(NOT); } } - setState(188); + setState(190); match(NULL); } break; @@ -1003,15 +1007,15 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(190); + setState(192); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(191); + setState(193); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(202); + setState(204); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1019,7 +1023,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(200); + setState(202); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: @@ -1027,11 +1031,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(194); + setState(196); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(195); + setState(197); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(196); + setState(198); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -1040,18 +1044,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(197); + setState(199); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(198); + setState(200); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(199); + setState(201); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } - } + } } - setState(204); + setState(206); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } @@ -1106,48 +1110,48 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog enterRule(_localctx, 12, RULE_regexBooleanExpression); int _la; try { - setState(219); + setState(221); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(205); - valueExpression(); setState(207); + valueExpression(); + setState(209); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(206); + setState(208); match(NOT); } } - setState(209); + setState(211); ((RegexBooleanExpressionContext)_localctx).kind = match(LIKE); - setState(210); + setState(212); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(212); - valueExpression(); setState(214); + valueExpression(); + setState(216); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(213); + setState(215); match(NOT); } } - setState(216); + setState(218); ((RegexBooleanExpressionContext)_localctx).kind = match(RLIKE); - setState(217); + setState(219); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; @@ -1200,11 +1204,11 @@ public final MatchBooleanExpressionContext matchBooleanExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(221); + setState(223); valueExpression(); - setState(222); + setState(224); match(DEV_MATCH); - setState(223); + setState(225); ((MatchBooleanExpressionContext)_localctx).queryString = string(); } } @@ -1226,7 +1230,7 @@ public ValueExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_valueExpression; } - + @SuppressWarnings("this-escape") public ValueExpressionContext() { } public void copyFrom(ValueExpressionContext ctx) { @@ -1288,14 +1292,14 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); enterRule(_localctx, 16, RULE_valueExpression); try { - setState(230); + setState(232); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(225); + setState(227); operatorExpression(0); } break; @@ -1303,11 +1307,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(226); + setState(228); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(227); + setState(229); comparisonOperator(); - setState(228); + setState(230); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -1331,7 +1335,7 @@ public OperatorExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_operatorExpression; } - + @SuppressWarnings("this-escape") public OperatorExpressionContext() { } public void copyFrom(OperatorExpressionContext ctx) { @@ -1432,7 +1436,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _alt; enterOuterAlt(_localctx, 1); { - setState(236); + setState(238); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: @@ -1441,7 +1445,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _ctx = _localctx; _prevctx = _localctx; - setState(233); + setState(235); primaryExpression(0); } break; @@ -1450,7 +1454,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(234); + setState(236); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1461,13 +1465,13 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(235); + setState(237); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(246); + setState(248); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1475,7 +1479,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(244); + setState(246); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: @@ -1483,9 +1487,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(238); + setState(240); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(239); + setState(241); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & 7L) != 0)) ) { @@ -1496,7 +1500,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(240); + setState(242); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -1505,9 +1509,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(241); + setState(243); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(242); + setState(244); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1518,14 +1522,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(243); + setState(245); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } - } + } } - setState(248); + setState(250); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } @@ -1549,7 +1553,7 @@ public PrimaryExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_primaryExpression; } - + @SuppressWarnings("this-escape") public PrimaryExpressionContext() { } public void copyFrom(PrimaryExpressionContext ctx) { @@ -1683,7 +1687,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(257); + setState(259); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1692,7 +1696,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(250); + setState(252); constant(); } break; @@ -1701,7 +1705,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(251); + setState(253); qualifiedName(); } break; @@ -1710,7 +1714,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(252); + setState(254); functionExpression(); } break; @@ -1719,17 +1723,17 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(253); + setState(255); match(LP); - setState(254); + setState(256); booleanExpression(0); - setState(255); + setState(257); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(264); + setState(266); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1740,16 +1744,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(259); + setState(261); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(260); + setState(262); match(CAST_OP); - setState(261); + setState(263); dataType(); } - } + } } - setState(266); + setState(268); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1768,8 +1772,8 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc @SuppressWarnings("CheckReturnValue") public static class FunctionExpressionContext extends ParserRuleContext { - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); + public FunctionIdentifierContext functionIdentifier() { + return getRuleContext(FunctionIdentifierContext.class,0); } public TerminalNode LP() { return getToken(EsqlBaseParser.LP, 0); } public TerminalNode RP() { return getToken(EsqlBaseParser.RP, 0); } @@ -1811,37 +1815,37 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(267); - identifier(); - setState(268); + setState(269); + functionIdentifier(); + setState(270); match(LP); - setState(278); + setState(280); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: { - setState(269); + setState(271); match(ASTERISK); } break; case 2: { { - setState(270); + setState(272); booleanExpression(0); - setState(275); + setState(277); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(271); + setState(273); match(COMMA); - setState(272); + setState(274); booleanExpression(0); } } - setState(277); + setState(279); _errHandler.sync(this); _la = _input.LA(1); } @@ -1849,7 +1853,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(280); + setState(282); match(RP); } } @@ -1864,6 +1868,69 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class FunctionIdentifierContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode DEV_MATCH() { return getToken(EsqlBaseParser.DEV_MATCH, 0); } + @SuppressWarnings("this-escape") + public FunctionIdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionIdentifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterFunctionIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitFunctionIdentifier(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitFunctionIdentifier(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionIdentifierContext functionIdentifier() throws RecognitionException { + FunctionIdentifierContext _localctx = new FunctionIdentifierContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_functionIdentifier); + try { + setState(286); + _errHandler.sync(this); + switch (_input.LA(1)) { + case UNQUOTED_IDENTIFIER: + case QUOTED_IDENTIFIER: + enterOuterAlt(_localctx, 1); + { + setState(284); + identifier(); + } + break; + case DEV_MATCH: + enterOuterAlt(_localctx, 2); + { + setState(285); + match(DEV_MATCH); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class DataTypeContext extends ParserRuleContext { @SuppressWarnings("this-escape") @@ -1871,7 +1938,7 @@ public DataTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_dataType; } - + @SuppressWarnings("this-escape") public DataTypeContext() { } public void copyFrom(DataTypeContext ctx) { @@ -1902,12 +1969,12 @@ public T accept(ParseTreeVisitor visitor) { public final DataTypeContext dataType() throws RecognitionException { DataTypeContext _localctx = new DataTypeContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_dataType); + enterRule(_localctx, 26, RULE_dataType); try { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(282); + setState(288); identifier(); } } @@ -1950,13 +2017,13 @@ public T accept(ParseTreeVisitor visitor) { public final RowCommandContext rowCommand() throws RecognitionException { RowCommandContext _localctx = new RowCommandContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_rowCommand); + enterRule(_localctx, 28, RULE_rowCommand); try { enterOuterAlt(_localctx, 1); { - setState(284); + setState(290); match(ROW); - setState(285); + setState(291); fields(); } } @@ -2005,30 +2072,30 @@ public T accept(ParseTreeVisitor visitor) { public final FieldsContext fields() throws RecognitionException { FieldsContext _localctx = new FieldsContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_fields); + enterRule(_localctx, 30, RULE_fields); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(287); + setState(293); field(); - setState(292); + setState(298); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(288); + setState(294); match(COMMA); - setState(289); + setState(295); field(); } - } + } } - setState(294); + setState(300); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); } } } @@ -2074,26 +2141,26 @@ public T accept(ParseTreeVisitor visitor) { public final FieldContext field() throws RecognitionException { FieldContext _localctx = new FieldContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_field); + enterRule(_localctx, 32, RULE_field); try { - setState(300); + setState(306); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(295); + setState(301); booleanExpression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(296); + setState(302); qualifiedName(); - setState(297); + setState(303); match(ASSIGN); - setState(298); + setState(304); booleanExpression(0); } break; @@ -2148,39 +2215,39 @@ public T accept(ParseTreeVisitor visitor) { public final FromCommandContext fromCommand() throws RecognitionException { FromCommandContext _localctx = new FromCommandContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_fromCommand); + enterRule(_localctx, 34, RULE_fromCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(302); + setState(308); match(FROM); - setState(303); + setState(309); indexPattern(); - setState(308); + setState(314); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,22,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(304); + setState(310); match(COMMA); - setState(305); + setState(311); indexPattern(); } - } + } } - setState(310); + setState(316); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,22,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(312); + setState(318); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - setState(311); + setState(317); metadata(); } break; @@ -2229,26 +2296,26 @@ public T accept(ParseTreeVisitor visitor) { public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_indexPattern); + enterRule(_localctx, 36, RULE_indexPattern); try { - setState(319); + setState(325); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(314); + setState(320); clusterString(); - setState(315); + setState(321); match(COLON); - setState(316); + setState(322); indexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(318); + setState(324); indexString(); } break; @@ -2290,11 +2357,11 @@ public T accept(ParseTreeVisitor visitor) { public final ClusterStringContext clusterString() throws RecognitionException { ClusterStringContext _localctx = new ClusterStringContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_clusterString); + enterRule(_localctx, 38, RULE_clusterString); try { enterOuterAlt(_localctx, 1); { - setState(321); + setState(327); match(UNQUOTED_SOURCE); } } @@ -2335,12 +2402,12 @@ public T accept(ParseTreeVisitor visitor) { public final IndexStringContext indexString() throws RecognitionException { IndexStringContext _localctx = new IndexStringContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_indexString); + enterRule(_localctx, 40, RULE_indexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(323); + setState(329); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -2393,22 +2460,22 @@ public T accept(ParseTreeVisitor visitor) { public final MetadataContext metadata() throws RecognitionException { MetadataContext _localctx = new MetadataContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_metadata); + enterRule(_localctx, 42, RULE_metadata); try { - setState(327); + setState(333); _errHandler.sync(this); switch (_input.LA(1)) { case METADATA: enterOuterAlt(_localctx, 1); { - setState(325); + setState(331); metadataOption(); } break; case OPENING_BRACKET: enterOuterAlt(_localctx, 2); { - setState(326); + setState(332); deprecated_metadata(); } break; @@ -2460,32 +2527,32 @@ public T accept(ParseTreeVisitor visitor) { public final MetadataOptionContext metadataOption() throws RecognitionException { MetadataOptionContext _localctx = new MetadataOptionContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_metadataOption); + enterRule(_localctx, 44, RULE_metadataOption); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(329); + setState(335); match(METADATA); - setState(330); + setState(336); match(UNQUOTED_SOURCE); - setState(335); + setState(341); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(331); + setState(337); match(COMMA); - setState(332); + setState(338); match(UNQUOTED_SOURCE); } - } + } } - setState(337); + setState(343); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); } } } @@ -2528,15 +2595,15 @@ public T accept(ParseTreeVisitor visitor) { public final Deprecated_metadataContext deprecated_metadata() throws RecognitionException { Deprecated_metadataContext _localctx = new Deprecated_metadataContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_deprecated_metadata); + enterRule(_localctx, 46, RULE_deprecated_metadata); try { enterOuterAlt(_localctx, 1); { - setState(338); + setState(344); match(OPENING_BRACKET); - setState(339); + setState(345); metadataOption(); - setState(340); + setState(346); match(CLOSING_BRACKET); } } @@ -2595,51 +2662,51 @@ public T accept(ParseTreeVisitor visitor) { public final MetricsCommandContext metricsCommand() throws RecognitionException { MetricsCommandContext _localctx = new MetricsCommandContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_metricsCommand); + enterRule(_localctx, 48, RULE_metricsCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(342); + setState(348); match(DEV_METRICS); - setState(343); + setState(349); indexPattern(); - setState(348); + setState(354); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(344); + setState(350); match(COMMA); - setState(345); + setState(351); indexPattern(); } - } + } } - setState(350); + setState(356); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } - setState(352); + setState(358); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: { - setState(351); + setState(357); ((MetricsCommandContext)_localctx).aggregates = fields(); } break; } - setState(356); + setState(362); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { - setState(354); + setState(360); match(BY); - setState(355); + setState(361); ((MetricsCommandContext)_localctx).grouping = fields(); } break; @@ -2685,13 +2752,13 @@ public T accept(ParseTreeVisitor visitor) { public final EvalCommandContext evalCommand() throws RecognitionException { EvalCommandContext _localctx = new EvalCommandContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_evalCommand); + enterRule(_localctx, 50, RULE_evalCommand); try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(364); match(EVAL); - setState(359); + setState(365); fields(); } } @@ -2740,30 +2807,30 @@ public T accept(ParseTreeVisitor visitor) { public final StatsCommandContext statsCommand() throws RecognitionException { StatsCommandContext _localctx = new StatsCommandContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_statsCommand); + enterRule(_localctx, 52, RULE_statsCommand); try { enterOuterAlt(_localctx, 1); { - setState(361); + setState(367); match(STATS); - setState(363); + setState(369); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(362); + setState(368); ((StatsCommandContext)_localctx).stats = fields(); } break; } - setState(367); + setState(373); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(365); + setState(371); match(BY); - setState(366); + setState(372); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2815,30 +2882,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_qualifiedName); + enterRule(_localctx, 54, RULE_qualifiedName); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(369); + setState(375); identifier(); - setState(374); + setState(380); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(370); + setState(376); match(DOT); - setState(371); + setState(377); identifier(); } - } + } } - setState(376); + setState(382); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } } } @@ -2887,30 +2954,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNamePatternContext qualifiedNamePattern() throws RecognitionException { QualifiedNamePatternContext _localctx = new QualifiedNamePatternContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_qualifiedNamePattern); + enterRule(_localctx, 56, RULE_qualifiedNamePattern); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(377); + setState(383); identifierPattern(); - setState(382); + setState(388); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(378); + setState(384); match(DOT); - setState(379); + setState(385); identifierPattern(); } - } + } } - setState(384); + setState(390); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } } } @@ -2959,30 +3026,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNamePatternsContext qualifiedNamePatterns() throws RecognitionException { QualifiedNamePatternsContext _localctx = new QualifiedNamePatternsContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_qualifiedNamePatterns); + enterRule(_localctx, 58, RULE_qualifiedNamePatterns); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(385); + setState(391); qualifiedNamePattern(); - setState(390); + setState(396); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(386); + setState(392); match(COMMA); - setState(387); + setState(393); qualifiedNamePattern(); } - } + } } - setState(392); + setState(398); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } } } @@ -3023,12 +3090,12 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierContext identifier() throws RecognitionException { IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_identifier); + enterRule(_localctx, 60, RULE_identifier); int _la; try { enterOuterAlt(_localctx, 1); { - setState(393); + setState(399); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -3076,11 +3143,11 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierPatternContext identifierPattern() throws RecognitionException { IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_identifierPattern); + enterRule(_localctx, 62, RULE_identifierPattern); try { enterOuterAlt(_localctx, 1); { - setState(395); + setState(401); match(ID_PATTERN); } } @@ -3102,7 +3169,7 @@ public ConstantContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_constant; } - + @SuppressWarnings("this-escape") public ConstantContext() { } public void copyFrom(ConstantContext ctx) { @@ -3348,17 +3415,17 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_constant); + enterRule(_localctx, 64, RULE_constant); int _la; try { - setState(439); + setState(445); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(397); + setState(403); match(NULL); } break; @@ -3366,9 +3433,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(398); + setState(404); integerValue(); - setState(399); + setState(405); match(UNQUOTED_IDENTIFIER); } break; @@ -3376,7 +3443,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(401); + setState(407); decimalValue(); } break; @@ -3384,7 +3451,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(402); + setState(408); integerValue(); } break; @@ -3392,7 +3459,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(403); + setState(409); booleanValue(); } break; @@ -3400,7 +3467,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParamsContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(404); + setState(410); params(); } break; @@ -3408,7 +3475,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(405); + setState(411); string(); } break; @@ -3416,27 +3483,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(406); + setState(412); match(OPENING_BRACKET); - setState(407); + setState(413); numericValue(); - setState(412); + setState(418); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(408); + setState(414); match(COMMA); - setState(409); + setState(415); numericValue(); } } - setState(414); + setState(420); _errHandler.sync(this); _la = _input.LA(1); } - setState(415); + setState(421); match(CLOSING_BRACKET); } break; @@ -3444,27 +3511,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(417); + setState(423); match(OPENING_BRACKET); - setState(418); + setState(424); booleanValue(); - setState(423); + setState(429); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(419); + setState(425); match(COMMA); - setState(420); + setState(426); booleanValue(); } } - setState(425); + setState(431); _errHandler.sync(this); _la = _input.LA(1); } - setState(426); + setState(432); match(CLOSING_BRACKET); } break; @@ -3472,27 +3539,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(428); + setState(434); match(OPENING_BRACKET); - setState(429); + setState(435); string(); - setState(434); + setState(440); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(430); + setState(436); match(COMMA); - setState(431); + setState(437); string(); } } - setState(436); + setState(442); _errHandler.sync(this); _la = _input.LA(1); } - setState(437); + setState(443); match(CLOSING_BRACKET); } break; @@ -3516,7 +3583,7 @@ public ParamsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_params; } - + @SuppressWarnings("this-escape") public ParamsContext() { } public void copyFrom(ParamsContext ctx) { @@ -3564,16 +3631,16 @@ public T accept(ParseTreeVisitor visitor) { public final ParamsContext params() throws RecognitionException { ParamsContext _localctx = new ParamsContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_params); + enterRule(_localctx, 66, RULE_params); try { - setState(443); + setState(449); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(441); + setState(447); match(PARAM); } break; @@ -3581,7 +3648,7 @@ public final ParamsContext params() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(442); + setState(448); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -3626,13 +3693,13 @@ public T accept(ParseTreeVisitor visitor) { public final LimitCommandContext limitCommand() throws RecognitionException { LimitCommandContext _localctx = new LimitCommandContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_limitCommand); + enterRule(_localctx, 68, RULE_limitCommand); try { enterOuterAlt(_localctx, 1); { - setState(445); + setState(451); match(LIMIT); - setState(446); + setState(452); match(INTEGER_LITERAL); } } @@ -3682,32 +3749,32 @@ public T accept(ParseTreeVisitor visitor) { public final SortCommandContext sortCommand() throws RecognitionException { SortCommandContext _localctx = new SortCommandContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_sortCommand); + enterRule(_localctx, 70, RULE_sortCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(448); + setState(454); match(SORT); - setState(449); + setState(455); orderExpression(); - setState(454); + setState(460); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(450); + setState(456); match(COMMA); - setState(451); + setState(457); orderExpression(); } - } + } } - setState(456); + setState(462); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); } } } @@ -3756,19 +3823,19 @@ public T accept(ParseTreeVisitor visitor) { public final OrderExpressionContext orderExpression() throws RecognitionException { OrderExpressionContext _localctx = new OrderExpressionContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_orderExpression); + enterRule(_localctx, 72, RULE_orderExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(457); + setState(463); booleanExpression(0); - setState(459); + setState(465); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(458); + setState(464); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3782,14 +3849,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(463); + setState(469); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(461); + setState(467); match(NULLS); - setState(462); + setState(468); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3844,13 +3911,13 @@ public T accept(ParseTreeVisitor visitor) { public final KeepCommandContext keepCommand() throws RecognitionException { KeepCommandContext _localctx = new KeepCommandContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_keepCommand); + enterRule(_localctx, 74, RULE_keepCommand); try { enterOuterAlt(_localctx, 1); { - setState(465); + setState(471); match(KEEP); - setState(466); + setState(472); qualifiedNamePatterns(); } } @@ -3893,13 +3960,13 @@ public T accept(ParseTreeVisitor visitor) { public final DropCommandContext dropCommand() throws RecognitionException { DropCommandContext _localctx = new DropCommandContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_dropCommand); + enterRule(_localctx, 76, RULE_dropCommand); try { enterOuterAlt(_localctx, 1); { - setState(468); + setState(474); match(DROP); - setState(469); + setState(475); qualifiedNamePatterns(); } } @@ -3949,32 +4016,32 @@ public T accept(ParseTreeVisitor visitor) { public final RenameCommandContext renameCommand() throws RecognitionException { RenameCommandContext _localctx = new RenameCommandContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_renameCommand); + enterRule(_localctx, 78, RULE_renameCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(471); + setState(477); match(RENAME); - setState(472); + setState(478); renameClause(); - setState(477); + setState(483); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(473); + setState(479); match(COMMA); - setState(474); + setState(480); renameClause(); } - } + } } - setState(479); + setState(485); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } } } @@ -4022,15 +4089,15 @@ public T accept(ParseTreeVisitor visitor) { public final RenameClauseContext renameClause() throws RecognitionException { RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_renameClause); + enterRule(_localctx, 80, RULE_renameClause); try { enterOuterAlt(_localctx, 1); { - setState(480); + setState(486); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(481); + setState(487); match(AS); - setState(482); + setState(488); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } } @@ -4079,22 +4146,22 @@ public T accept(ParseTreeVisitor visitor) { public final DissectCommandContext dissectCommand() throws RecognitionException { DissectCommandContext _localctx = new DissectCommandContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_dissectCommand); + enterRule(_localctx, 82, RULE_dissectCommand); try { enterOuterAlt(_localctx, 1); { - setState(484); + setState(490); match(DISSECT); - setState(485); + setState(491); primaryExpression(0); - setState(486); + setState(492); string(); - setState(488); + setState(494); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(487); + setState(493); commandOptions(); } break; @@ -4143,15 +4210,15 @@ public T accept(ParseTreeVisitor visitor) { public final GrokCommandContext grokCommand() throws RecognitionException { GrokCommandContext _localctx = new GrokCommandContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_grokCommand); + enterRule(_localctx, 84, RULE_grokCommand); try { enterOuterAlt(_localctx, 1); { - setState(490); + setState(496); match(GROK); - setState(491); + setState(497); primaryExpression(0); - setState(492); + setState(498); string(); } } @@ -4194,13 +4261,13 @@ public T accept(ParseTreeVisitor visitor) { public final MvExpandCommandContext mvExpandCommand() throws RecognitionException { MvExpandCommandContext _localctx = new MvExpandCommandContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_mvExpandCommand); + enterRule(_localctx, 86, RULE_mvExpandCommand); try { enterOuterAlt(_localctx, 1); { - setState(494); + setState(500); match(MV_EXPAND); - setState(495); + setState(501); qualifiedName(); } } @@ -4249,30 +4316,30 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionsContext commandOptions() throws RecognitionException { CommandOptionsContext _localctx = new CommandOptionsContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_commandOptions); + enterRule(_localctx, 88, RULE_commandOptions); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(497); + setState(503); commandOption(); - setState(502); + setState(508); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(498); + setState(504); match(COMMA); - setState(499); + setState(505); commandOption(); } - } + } } - setState(504); + setState(510); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } } } @@ -4318,15 +4385,15 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionContext commandOption() throws RecognitionException { CommandOptionContext _localctx = new CommandOptionContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_commandOption); + enterRule(_localctx, 90, RULE_commandOption); try { enterOuterAlt(_localctx, 1); { - setState(505); + setState(511); identifier(); - setState(506); + setState(512); match(ASSIGN); - setState(507); + setState(513); constant(); } } @@ -4367,12 +4434,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_booleanValue); + enterRule(_localctx, 92, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(509); + setState(515); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -4425,22 +4492,22 @@ public T accept(ParseTreeVisitor visitor) { public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_numericValue); + enterRule(_localctx, 94, RULE_numericValue); try { - setState(513); + setState(519); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(511); + setState(517); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(512); + setState(518); integerValue(); } break; @@ -4484,17 +4551,17 @@ public T accept(ParseTreeVisitor visitor) { public final DecimalValueContext decimalValue() throws RecognitionException { DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_decimalValue); + enterRule(_localctx, 96, RULE_decimalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(516); + setState(522); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(515); + setState(521); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4507,7 +4574,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(518); + setState(524); match(DECIMAL_LITERAL); } } @@ -4549,17 +4616,17 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerValueContext integerValue() throws RecognitionException { IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_integerValue); + enterRule(_localctx, 98, RULE_integerValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(521); + setState(527); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(520); + setState(526); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4572,7 +4639,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(523); + setState(529); match(INTEGER_LITERAL); } } @@ -4612,11 +4679,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_string); + enterRule(_localctx, 100, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(525); + setState(531); match(QUOTED_STRING); } } @@ -4661,12 +4728,12 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_comparisonOperator); + enterRule(_localctx, 102, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(533); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125899906842624000L) != 0)) ) { _errHandler.recoverInline(this); @@ -4717,13 +4784,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplainCommandContext explainCommand() throws RecognitionException { ExplainCommandContext _localctx = new ExplainCommandContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_explainCommand); + enterRule(_localctx, 104, RULE_explainCommand); try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(535); match(EXPLAIN); - setState(530); + setState(536); subqueryExpression(); } } @@ -4767,15 +4834,15 @@ public T accept(ParseTreeVisitor visitor) { public final SubqueryExpressionContext subqueryExpression() throws RecognitionException { SubqueryExpressionContext _localctx = new SubqueryExpressionContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_subqueryExpression); + enterRule(_localctx, 106, RULE_subqueryExpression); try { enterOuterAlt(_localctx, 1); { - setState(532); + setState(538); match(OPENING_BRACKET); - setState(533); + setState(539); query(0); - setState(534); + setState(540); match(CLOSING_BRACKET); } } @@ -4797,7 +4864,7 @@ public ShowCommandContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_showCommand; } - + @SuppressWarnings("this-escape") public ShowCommandContext() { } public void copyFrom(ShowCommandContext ctx) { @@ -4827,14 +4894,14 @@ public T accept(ParseTreeVisitor visitor) { public final ShowCommandContext showCommand() throws RecognitionException { ShowCommandContext _localctx = new ShowCommandContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_showCommand); + enterRule(_localctx, 108, RULE_showCommand); try { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(536); + setState(542); match(SHOW); - setState(537); + setState(543); match(INFO); } } @@ -4856,7 +4923,7 @@ public MetaCommandContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_metaCommand; } - + @SuppressWarnings("this-escape") public MetaCommandContext() { } public void copyFrom(MetaCommandContext ctx) { @@ -4886,14 +4953,14 @@ public T accept(ParseTreeVisitor visitor) { public final MetaCommandContext metaCommand() throws RecognitionException { MetaCommandContext _localctx = new MetaCommandContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_metaCommand); + enterRule(_localctx, 110, RULE_metaCommand); try { _localctx = new MetaFunctionsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(539); + setState(545); match(META); - setState(540); + setState(546); match(FUNCTIONS); } } @@ -4951,53 +5018,53 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichCommandContext enrichCommand() throws RecognitionException { EnrichCommandContext _localctx = new EnrichCommandContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_enrichCommand); + enterRule(_localctx, 112, RULE_enrichCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(542); + setState(548); match(ENRICH); - setState(543); + setState(549); ((EnrichCommandContext)_localctx).policyName = match(ENRICH_POLICY_NAME); - setState(546); + setState(552); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(544); + setState(550); match(ON); - setState(545); + setState(551); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(557); + setState(563); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(548); + setState(554); match(WITH); - setState(549); + setState(555); enrichWithClause(); - setState(554); + setState(560); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(550); + setState(556); match(COMMA); - setState(551); + setState(557); enrichWithClause(); } - } + } } - setState(556); + setState(562); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } } break; @@ -5048,23 +5115,23 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichWithClauseContext enrichWithClause() throws RecognitionException { EnrichWithClauseContext _localctx = new EnrichWithClauseContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_enrichWithClause); + enterRule(_localctx, 114, RULE_enrichWithClause); try { enterOuterAlt(_localctx, 1); { - setState(562); + setState(568); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(559); + setState(565); ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(560); + setState(566); match(ASSIGN); } break; } - setState(564); + setState(570); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -5113,17 +5180,17 @@ public T accept(ParseTreeVisitor visitor) { public final LookupCommandContext lookupCommand() throws RecognitionException { LookupCommandContext _localctx = new LookupCommandContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_lookupCommand); + enterRule(_localctx, 116, RULE_lookupCommand); try { enterOuterAlt(_localctx, 1); { - setState(566); + setState(572); match(DEV_LOOKUP); - setState(567); + setState(573); ((LookupCommandContext)_localctx).tableName = indexPattern(); - setState(568); + setState(574); match(ON); - setState(569); + setState(575); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5172,22 +5239,22 @@ public T accept(ParseTreeVisitor visitor) { public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_inlinestatsCommand); + enterRule(_localctx, 118, RULE_inlinestatsCommand); try { enterOuterAlt(_localctx, 1); { - setState(571); + setState(577); match(DEV_INLINESTATS); - setState(572); + setState(578); ((InlinestatsCommandContext)_localctx).stats = fields(); - setState(575); + setState(581); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(573); + setState(579); match(BY); - setState(574); + setState(580); ((InlinestatsCommandContext)_localctx).grouping = fields(); } break; @@ -5274,7 +5341,7 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in } public static final String _serializedATN = - "\u0004\u0001}\u0242\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001}\u0248\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -5289,359 +5356,360 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ - "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001\u0080\b\u0001\n\u0001\f\u0001\u0083\t\u0001\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0003\u0002\u008c\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0003\u0003\u009e\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0003\u0005\u00aa\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0005\u0005\u00b1\b\u0005\n\u0005\f\u0005\u00b4\t\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005"+ - "\u00bb\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005"+ - "\u00c1\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0005\u0005\u00c9\b\u0005\n\u0005\f\u0005\u00cc\t\u0005\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u00d0\b\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00d7\b\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u00dc\b\u0006\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e7"+ - "\b\b\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u00ed\b\t\u0001\t\u0001\t"+ - "\u0001\t\u0001\t\u0001\t\u0001\t\u0005\t\u00f5\b\t\n\t\f\t\u00f8\t\t\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0102"+ - "\b\n\u0001\n\u0001\n\u0001\n\u0005\n\u0107\b\n\n\n\f\n\u010a\t\n\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0005"+ - "\u000b\u0112\b\u000b\n\u000b\f\u000b\u0115\t\u000b\u0003\u000b\u0117\b"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0005\u000e\u0123\b\u000e\n\u000e"+ - "\f\u000e\u0126\t\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0003\u000f\u012d\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0005\u0010\u0133\b\u0010\n\u0010\f\u0010\u0136\t\u0010\u0001"+ - "\u0010\u0003\u0010\u0139\b\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0003\u0011\u0140\b\u0011\u0001\u0012\u0001\u0012\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0003\u0014\u0148\b\u0014\u0001"+ - "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u014e\b\u0015\n"+ - "\u0015\f\u0015\u0151\t\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0005\u0017\u015b"+ - "\b\u0017\n\u0017\f\u0017\u015e\t\u0017\u0001\u0017\u0003\u0017\u0161\b"+ - "\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0165\b\u0017\u0001\u0018\u0001"+ - "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0003\u0019\u016c\b\u0019\u0001"+ - "\u0019\u0001\u0019\u0003\u0019\u0170\b\u0019\u0001\u001a\u0001\u001a\u0001"+ - "\u001a\u0005\u001a\u0175\b\u001a\n\u001a\f\u001a\u0178\t\u001a\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0005\u001b\u017d\b\u001b\n\u001b\f\u001b\u0180"+ - "\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c\u0185\b\u001c"+ - "\n\u001c\f\u001c\u0188\t\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+ - "\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0005\u001f\u019b\b\u001f\n\u001f\f\u001f\u019e\t\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0005\u001f\u01a6\b\u001f\n\u001f\f\u001f\u01a9\t\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u01b1"+ - "\b\u001f\n\u001f\f\u001f\u01b4\t\u001f\u0001\u001f\u0001\u001f\u0003\u001f"+ - "\u01b8\b\u001f\u0001 \u0001 \u0003 \u01bc\b \u0001!\u0001!\u0001!\u0001"+ - "\"\u0001\"\u0001\"\u0001\"\u0005\"\u01c5\b\"\n\"\f\"\u01c8\t\"\u0001#"+ - "\u0001#\u0003#\u01cc\b#\u0001#\u0001#\u0003#\u01d0\b#\u0001$\u0001$\u0001"+ - "$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0005&\u01dc\b&\n&"+ - "\f&\u01df\t&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001"+ - "(\u0003(\u01e9\b(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001"+ - "+\u0001+\u0001+\u0005+\u01f5\b+\n+\f+\u01f8\t+\u0001,\u0001,\u0001,\u0001"+ - ",\u0001-\u0001-\u0001.\u0001.\u0003.\u0202\b.\u0001/\u0003/\u0205\b/\u0001"+ - "/\u0001/\u00010\u00030\u020a\b0\u00010\u00010\u00011\u00011\u00012\u0001"+ - "2\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00015\u00015\u0001"+ - "5\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00037\u0223\b7\u0001"+ - "7\u00017\u00017\u00017\u00057\u0229\b7\n7\f7\u022c\t7\u00037\u022e\b7"+ - "\u00018\u00018\u00018\u00038\u0233\b8\u00018\u00018\u00019\u00019\u0001"+ - "9\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0003:\u0240\b:\u0001:\u0000"+ - "\u0004\u0002\n\u0012\u0014;\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0005\u0001\u0082\b\u0001\n\u0001\f\u0001"+ + "\u0085\t\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0003\u0002\u008e\b\u0002\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0003\u0003\u00a0\b\u0003\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0003\u0005\u00ac\b\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u00b3\b\u0005\n\u0005"+ + "\f\u0005\u00b6\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0003\u0005\u00bd\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0003\u0005\u00c3\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005\u00cb\b\u0005\n\u0005"+ + "\f\u0005\u00ce\t\u0005\u0001\u0006\u0001\u0006\u0003\u0006\u00d2\b\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006"+ + "\u00d9\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00de\b"+ + "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0001\b\u0003\b\u00e9\b\b\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0003\t\u00ef\b\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0005"+ + "\t\u00f7\b\t\n\t\f\t\u00fa\t\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ + "\u0001\n\u0001\n\u0001\n\u0003\n\u0104\b\n\u0001\n\u0001\n\u0001\n\u0005"+ + "\n\u0109\b\n\n\n\f\n\u010c\t\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0114\b\u000b\n\u000b\f\u000b"+ + "\u0117\t\u000b\u0003\u000b\u0119\b\u000b\u0001\u000b\u0001\u000b\u0001"+ + "\f\u0001\f\u0003\f\u011f\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u0129\b\u000f\n"+ + "\u000f\f\u000f\u012c\t\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0003\u0010\u0133\b\u0010\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0005\u0011\u0139\b\u0011\n\u0011\f\u0011\u013c\t\u0011"+ + "\u0001\u0011\u0003\u0011\u013f\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0003\u0012\u0146\b\u0012\u0001\u0013\u0001\u0013"+ + "\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0003\u0015\u014e\b\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0154\b\u0016"+ + "\n\u0016\f\u0016\u0157\t\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0161"+ + "\b\u0018\n\u0018\f\u0018\u0164\t\u0018\u0001\u0018\u0003\u0018\u0167\b"+ + "\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u016b\b\u0018\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u0172\b\u001a\u0001"+ + "\u001a\u0001\u001a\u0003\u001a\u0176\b\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0005\u001b\u017b\b\u001b\n\u001b\f\u001b\u017e\t\u001b\u0001\u001c"+ + "\u0001\u001c\u0001\u001c\u0005\u001c\u0183\b\u001c\n\u001c\f\u001c\u0186"+ + "\t\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u018b\b\u001d"+ + "\n\u001d\f\u001d\u018e\t\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ + "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 "+ + "\u0001 \u0001 \u0001 \u0001 \u0005 \u01a1\b \n \f \u01a4\t \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0005 \u01ac\b \n \f \u01af\t \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0005 \u01b7\b \n \f \u01ba\t \u0001 \u0001"+ + " \u0003 \u01be\b \u0001!\u0001!\u0003!\u01c2\b!\u0001\"\u0001\"\u0001"+ + "\"\u0001#\u0001#\u0001#\u0001#\u0005#\u01cb\b#\n#\f#\u01ce\t#\u0001$\u0001"+ + "$\u0003$\u01d2\b$\u0001$\u0001$\u0003$\u01d6\b$\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0005\'\u01e2\b\'\n\'"+ + "\f\'\u01e5\t\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ + ")\u0003)\u01ef\b)\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0005,\u01fb\b,\n,\f,\u01fe\t,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001.\u0001.\u0001/\u0001/\u0003/\u0208\b/\u00010\u00030\u020b\b0\u0001"+ + "0\u00010\u00011\u00031\u0210\b1\u00011\u00011\u00012\u00012\u00013\u0001"+ + "3\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00038\u0229\b8\u0001"+ + "8\u00018\u00018\u00018\u00058\u022f\b8\n8\f8\u0232\t8\u00038\u0234\b8"+ + "\u00019\u00019\u00019\u00039\u0239\b9\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0003;\u0246\b;\u0001;\u0000"+ + "\u0004\u0002\n\u0012\u0014<\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ - "TVXZ\\^`bdfhjlnprt\u0000\b\u0001\u0000<=\u0001\u0000>@\u0002\u0000\u001b"+ + "TVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000<=\u0001\u0000>@\u0002\u0000\u001b"+ "\u001bMM\u0001\u0000DE\u0002\u0000 $$\u0002\u0000\'\'**\u0002\u0000&"+ - "&44\u0002\u0000557;\u025b\u0000v\u0001\u0000\u0000\u0000\u0002y\u0001"+ - "\u0000\u0000\u0000\u0004\u008b\u0001\u0000\u0000\u0000\u0006\u009d\u0001"+ - "\u0000\u0000\u0000\b\u009f\u0001\u0000\u0000\u0000\n\u00c0\u0001\u0000"+ - "\u0000\u0000\f\u00db\u0001\u0000\u0000\u0000\u000e\u00dd\u0001\u0000\u0000"+ - "\u0000\u0010\u00e6\u0001\u0000\u0000\u0000\u0012\u00ec\u0001\u0000\u0000"+ - "\u0000\u0014\u0101\u0001\u0000\u0000\u0000\u0016\u010b\u0001\u0000\u0000"+ - "\u0000\u0018\u011a\u0001\u0000\u0000\u0000\u001a\u011c\u0001\u0000\u0000"+ - "\u0000\u001c\u011f\u0001\u0000\u0000\u0000\u001e\u012c\u0001\u0000\u0000"+ - "\u0000 \u012e\u0001\u0000\u0000\u0000\"\u013f\u0001\u0000\u0000\u0000"+ - "$\u0141\u0001\u0000\u0000\u0000&\u0143\u0001\u0000\u0000\u0000(\u0147"+ - "\u0001\u0000\u0000\u0000*\u0149\u0001\u0000\u0000\u0000,\u0152\u0001\u0000"+ - "\u0000\u0000.\u0156\u0001\u0000\u0000\u00000\u0166\u0001\u0000\u0000\u0000"+ - "2\u0169\u0001\u0000\u0000\u00004\u0171\u0001\u0000\u0000\u00006\u0179"+ - "\u0001\u0000\u0000\u00008\u0181\u0001\u0000\u0000\u0000:\u0189\u0001\u0000"+ - "\u0000\u0000<\u018b\u0001\u0000\u0000\u0000>\u01b7\u0001\u0000\u0000\u0000"+ - "@\u01bb\u0001\u0000\u0000\u0000B\u01bd\u0001\u0000\u0000\u0000D\u01c0"+ - "\u0001\u0000\u0000\u0000F\u01c9\u0001\u0000\u0000\u0000H\u01d1\u0001\u0000"+ - "\u0000\u0000J\u01d4\u0001\u0000\u0000\u0000L\u01d7\u0001\u0000\u0000\u0000"+ - "N\u01e0\u0001\u0000\u0000\u0000P\u01e4\u0001\u0000\u0000\u0000R\u01ea"+ - "\u0001\u0000\u0000\u0000T\u01ee\u0001\u0000\u0000\u0000V\u01f1\u0001\u0000"+ - "\u0000\u0000X\u01f9\u0001\u0000\u0000\u0000Z\u01fd\u0001\u0000\u0000\u0000"+ - "\\\u0201\u0001\u0000\u0000\u0000^\u0204\u0001\u0000\u0000\u0000`\u0209"+ - "\u0001\u0000\u0000\u0000b\u020d\u0001\u0000\u0000\u0000d\u020f\u0001\u0000"+ - "\u0000\u0000f\u0211\u0001\u0000\u0000\u0000h\u0214\u0001\u0000\u0000\u0000"+ - "j\u0218\u0001\u0000\u0000\u0000l\u021b\u0001\u0000\u0000\u0000n\u021e"+ - "\u0001\u0000\u0000\u0000p\u0232\u0001\u0000\u0000\u0000r\u0236\u0001\u0000"+ - "\u0000\u0000t\u023b\u0001\u0000\u0000\u0000vw\u0003\u0002\u0001\u0000"+ - "wx\u0005\u0000\u0000\u0001x\u0001\u0001\u0000\u0000\u0000yz\u0006\u0001"+ - "\uffff\uffff\u0000z{\u0003\u0004\u0002\u0000{\u0081\u0001\u0000\u0000"+ - "\u0000|}\n\u0001\u0000\u0000}~\u0005\u001a\u0000\u0000~\u0080\u0003\u0006"+ - "\u0003\u0000\u007f|\u0001\u0000\u0000\u0000\u0080\u0083\u0001\u0000\u0000"+ - "\u0000\u0081\u007f\u0001\u0000\u0000\u0000\u0081\u0082\u0001\u0000\u0000"+ - "\u0000\u0082\u0003\u0001\u0000\u0000\u0000\u0083\u0081\u0001\u0000\u0000"+ - "\u0000\u0084\u008c\u0003f3\u0000\u0085\u008c\u0003 \u0010\u0000\u0086"+ - "\u008c\u0003l6\u0000\u0087\u008c\u0003\u001a\r\u0000\u0088\u008c\u0003"+ - "j5\u0000\u0089\u008a\u0004\u0002\u0001\u0000\u008a\u008c\u0003.\u0017"+ - "\u0000\u008b\u0084\u0001\u0000\u0000\u0000\u008b\u0085\u0001\u0000\u0000"+ - "\u0000\u008b\u0086\u0001\u0000\u0000\u0000\u008b\u0087\u0001\u0000\u0000"+ - "\u0000\u008b\u0088\u0001\u0000\u0000\u0000\u008b\u0089\u0001\u0000\u0000"+ - "\u0000\u008c\u0005\u0001\u0000\u0000\u0000\u008d\u009e\u00030\u0018\u0000"+ - "\u008e\u009e\u0003\b\u0004\u0000\u008f\u009e\u0003H$\u0000\u0090\u009e"+ - "\u0003B!\u0000\u0091\u009e\u00032\u0019\u0000\u0092\u009e\u0003D\"\u0000"+ - "\u0093\u009e\u0003J%\u0000\u0094\u009e\u0003L&\u0000\u0095\u009e\u0003"+ - "P(\u0000\u0096\u009e\u0003R)\u0000\u0097\u009e\u0003n7\u0000\u0098\u009e"+ - "\u0003T*\u0000\u0099\u009a\u0004\u0003\u0002\u0000\u009a\u009e\u0003t"+ - ":\u0000\u009b\u009c\u0004\u0003\u0003\u0000\u009c\u009e\u0003r9\u0000"+ - "\u009d\u008d\u0001\u0000\u0000\u0000\u009d\u008e\u0001\u0000\u0000\u0000"+ - "\u009d\u008f\u0001\u0000\u0000\u0000\u009d\u0090\u0001\u0000\u0000\u0000"+ - "\u009d\u0091\u0001\u0000\u0000\u0000\u009d\u0092\u0001\u0000\u0000\u0000"+ - "\u009d\u0093\u0001\u0000\u0000\u0000\u009d\u0094\u0001\u0000\u0000\u0000"+ - "\u009d\u0095\u0001\u0000\u0000\u0000\u009d\u0096\u0001\u0000\u0000\u0000"+ - "\u009d\u0097\u0001\u0000\u0000\u0000\u009d\u0098\u0001\u0000\u0000\u0000"+ - "\u009d\u0099\u0001\u0000\u0000\u0000\u009d\u009b\u0001\u0000\u0000\u0000"+ - "\u009e\u0007\u0001\u0000\u0000\u0000\u009f\u00a0\u0005\u0011\u0000\u0000"+ - "\u00a0\u00a1\u0003\n\u0005\u0000\u00a1\t\u0001\u0000\u0000\u0000\u00a2"+ - "\u00a3\u0006\u0005\uffff\uffff\u0000\u00a3\u00a4\u0005-\u0000\u0000\u00a4"+ - "\u00c1\u0003\n\u0005\b\u00a5\u00c1\u0003\u0010\b\u0000\u00a6\u00c1\u0003"+ - "\f\u0006\u0000\u00a7\u00a9\u0003\u0010\b\u0000\u00a8\u00aa\u0005-\u0000"+ - "\u0000\u00a9\u00a8\u0001\u0000\u0000\u0000\u00a9\u00aa\u0001\u0000\u0000"+ - "\u0000\u00aa\u00ab\u0001\u0000\u0000\u0000\u00ab\u00ac\u0005(\u0000\u0000"+ - "\u00ac\u00ad\u0005,\u0000\u0000\u00ad\u00b2\u0003\u0010\b\u0000\u00ae"+ - "\u00af\u0005#\u0000\u0000\u00af\u00b1\u0003\u0010\b\u0000\u00b0\u00ae"+ - "\u0001\u0000\u0000\u0000\u00b1\u00b4\u0001\u0000\u0000\u0000\u00b2\u00b0"+ - "\u0001\u0000\u0000\u0000\u00b2\u00b3\u0001\u0000\u0000\u0000\u00b3\u00b5"+ - "\u0001\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b5\u00b6"+ - "\u00053\u0000\u0000\u00b6\u00c1\u0001\u0000\u0000\u0000\u00b7\u00b8\u0003"+ - "\u0010\b\u0000\u00b8\u00ba\u0005)\u0000\u0000\u00b9\u00bb\u0005-\u0000"+ - "\u0000\u00ba\u00b9\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000\u0000"+ - "\u0000\u00bb\u00bc\u0001\u0000\u0000\u0000\u00bc\u00bd\u0005.\u0000\u0000"+ - "\u00bd\u00c1\u0001\u0000\u0000\u0000\u00be\u00bf\u0004\u0005\u0004\u0000"+ - "\u00bf\u00c1\u0003\u000e\u0007\u0000\u00c0\u00a2\u0001\u0000\u0000\u0000"+ - "\u00c0\u00a5\u0001\u0000\u0000\u0000\u00c0\u00a6\u0001\u0000\u0000\u0000"+ - "\u00c0\u00a7\u0001\u0000\u0000\u0000\u00c0\u00b7\u0001\u0000\u0000\u0000"+ - "\u00c0\u00be\u0001\u0000\u0000\u0000\u00c1\u00ca\u0001\u0000\u0000\u0000"+ - "\u00c2\u00c3\n\u0005\u0000\u0000\u00c3\u00c4\u0005\u001f\u0000\u0000\u00c4"+ - "\u00c9\u0003\n\u0005\u0006\u00c5\u00c6\n\u0004\u0000\u0000\u00c6\u00c7"+ - "\u00050\u0000\u0000\u00c7\u00c9\u0003\n\u0005\u0005\u00c8\u00c2\u0001"+ - "\u0000\u0000\u0000\u00c8\u00c5\u0001\u0000\u0000\u0000\u00c9\u00cc\u0001"+ - "\u0000\u0000\u0000\u00ca\u00c8\u0001\u0000\u0000\u0000\u00ca\u00cb\u0001"+ - "\u0000\u0000\u0000\u00cb\u000b\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001"+ - "\u0000\u0000\u0000\u00cd\u00cf\u0003\u0010\b\u0000\u00ce\u00d0\u0005-"+ - "\u0000\u0000\u00cf\u00ce\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001\u0000"+ - "\u0000\u0000\u00d0\u00d1\u0001\u0000\u0000\u0000\u00d1\u00d2\u0005+\u0000"+ - "\u0000\u00d2\u00d3\u0003b1\u0000\u00d3\u00dc\u0001\u0000\u0000\u0000\u00d4"+ - "\u00d6\u0003\u0010\b\u0000\u00d5\u00d7\u0005-\u0000\u0000\u00d6\u00d5"+ - "\u0001\u0000\u0000\u0000\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u00d8"+ - "\u0001\u0000\u0000\u0000\u00d8\u00d9\u00052\u0000\u0000\u00d9\u00da\u0003"+ - "b1\u0000\u00da\u00dc\u0001\u0000\u0000\u0000\u00db\u00cd\u0001\u0000\u0000"+ - "\u0000\u00db\u00d4\u0001\u0000\u0000\u0000\u00dc\r\u0001\u0000\u0000\u0000"+ - "\u00dd\u00de\u0003\u0010\b\u0000\u00de\u00df\u0005\u0014\u0000\u0000\u00df"+ - "\u00e0\u0003b1\u0000\u00e0\u000f\u0001\u0000\u0000\u0000\u00e1\u00e7\u0003"+ - "\u0012\t\u0000\u00e2\u00e3\u0003\u0012\t\u0000\u00e3\u00e4\u0003d2\u0000"+ - "\u00e4\u00e5\u0003\u0012\t\u0000\u00e5\u00e7\u0001\u0000\u0000\u0000\u00e6"+ - "\u00e1\u0001\u0000\u0000\u0000\u00e6\u00e2\u0001\u0000\u0000\u0000\u00e7"+ - "\u0011\u0001\u0000\u0000\u0000\u00e8\u00e9\u0006\t\uffff\uffff\u0000\u00e9"+ - "\u00ed\u0003\u0014\n\u0000\u00ea\u00eb\u0007\u0000\u0000\u0000\u00eb\u00ed"+ - "\u0003\u0012\t\u0003\u00ec\u00e8\u0001\u0000\u0000\u0000\u00ec\u00ea\u0001"+ - "\u0000\u0000\u0000\u00ed\u00f6\u0001\u0000\u0000\u0000\u00ee\u00ef\n\u0002"+ - "\u0000\u0000\u00ef\u00f0\u0007\u0001\u0000\u0000\u00f0\u00f5\u0003\u0012"+ - "\t\u0003\u00f1\u00f2\n\u0001\u0000\u0000\u00f2\u00f3\u0007\u0000\u0000"+ - "\u0000\u00f3\u00f5\u0003\u0012\t\u0002\u00f4\u00ee\u0001\u0000\u0000\u0000"+ - "\u00f4\u00f1\u0001\u0000\u0000\u0000\u00f5\u00f8\u0001\u0000\u0000\u0000"+ - "\u00f6\u00f4\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000\u0000\u0000"+ - "\u00f7\u0013\u0001\u0000\u0000\u0000\u00f8\u00f6\u0001\u0000\u0000\u0000"+ - "\u00f9\u00fa\u0006\n\uffff\uffff\u0000\u00fa\u0102\u0003>\u001f\u0000"+ - "\u00fb\u0102\u00034\u001a\u0000\u00fc\u0102\u0003\u0016\u000b\u0000\u00fd"+ - "\u00fe\u0005,\u0000\u0000\u00fe\u00ff\u0003\n\u0005\u0000\u00ff\u0100"+ - "\u00053\u0000\u0000\u0100\u0102\u0001\u0000\u0000\u0000\u0101\u00f9\u0001"+ - "\u0000\u0000\u0000\u0101\u00fb\u0001\u0000\u0000\u0000\u0101\u00fc\u0001"+ - "\u0000\u0000\u0000\u0101\u00fd\u0001\u0000\u0000\u0000\u0102\u0108\u0001"+ - "\u0000\u0000\u0000\u0103\u0104\n\u0001\u0000\u0000\u0104\u0105\u0005\""+ - "\u0000\u0000\u0105\u0107\u0003\u0018\f\u0000\u0106\u0103\u0001\u0000\u0000"+ - "\u0000\u0107\u010a\u0001\u0000\u0000\u0000\u0108\u0106\u0001\u0000\u0000"+ - "\u0000\u0108\u0109\u0001\u0000\u0000\u0000\u0109\u0015\u0001\u0000\u0000"+ - "\u0000\u010a\u0108\u0001\u0000\u0000\u0000\u010b\u010c\u0003:\u001d\u0000"+ - "\u010c\u0116\u0005,\u0000\u0000\u010d\u0117\u0005>\u0000\u0000\u010e\u0113"+ - "\u0003\n\u0005\u0000\u010f\u0110\u0005#\u0000\u0000\u0110\u0112\u0003"+ - "\n\u0005\u0000\u0111\u010f\u0001\u0000\u0000\u0000\u0112\u0115\u0001\u0000"+ - "\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0113\u0114\u0001\u0000"+ - "\u0000\u0000\u0114\u0117\u0001\u0000\u0000\u0000\u0115\u0113\u0001\u0000"+ - "\u0000\u0000\u0116\u010d\u0001\u0000\u0000\u0000\u0116\u010e\u0001\u0000"+ - "\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117\u0118\u0001\u0000"+ - "\u0000\u0000\u0118\u0119\u00053\u0000\u0000\u0119\u0017\u0001\u0000\u0000"+ - "\u0000\u011a\u011b\u0003:\u001d\u0000\u011b\u0019\u0001\u0000\u0000\u0000"+ - "\u011c\u011d\u0005\r\u0000\u0000\u011d\u011e\u0003\u001c\u000e\u0000\u011e"+ - "\u001b\u0001\u0000\u0000\u0000\u011f\u0124\u0003\u001e\u000f\u0000\u0120"+ - "\u0121\u0005#\u0000\u0000\u0121\u0123\u0003\u001e\u000f\u0000\u0122\u0120"+ - "\u0001\u0000\u0000\u0000\u0123\u0126\u0001\u0000\u0000\u0000\u0124\u0122"+ - "\u0001\u0000\u0000\u0000\u0124\u0125\u0001\u0000\u0000\u0000\u0125\u001d"+ - "\u0001\u0000\u0000\u0000\u0126\u0124\u0001\u0000\u0000\u0000\u0127\u012d"+ - "\u0003\n\u0005\u0000\u0128\u0129\u00034\u001a\u0000\u0129\u012a\u0005"+ - "!\u0000\u0000\u012a\u012b\u0003\n\u0005\u0000\u012b\u012d\u0001\u0000"+ - "\u0000\u0000\u012c\u0127\u0001\u0000\u0000\u0000\u012c\u0128\u0001\u0000"+ - "\u0000\u0000\u012d\u001f\u0001\u0000\u0000\u0000\u012e\u012f\u0005\u0006"+ - "\u0000\u0000\u012f\u0134\u0003\"\u0011\u0000\u0130\u0131\u0005#\u0000"+ - "\u0000\u0131\u0133\u0003\"\u0011\u0000\u0132\u0130\u0001\u0000\u0000\u0000"+ - "\u0133\u0136\u0001\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000"+ - "\u0134\u0135\u0001\u0000\u0000\u0000\u0135\u0138\u0001\u0000\u0000\u0000"+ - "\u0136\u0134\u0001\u0000\u0000\u0000\u0137\u0139\u0003(\u0014\u0000\u0138"+ - "\u0137\u0001\u0000\u0000\u0000\u0138\u0139\u0001\u0000\u0000\u0000\u0139"+ - "!\u0001\u0000\u0000\u0000\u013a\u013b\u0003$\u0012\u0000\u013b\u013c\u0005"+ - "m\u0000\u0000\u013c\u013d\u0003&\u0013\u0000\u013d\u0140\u0001\u0000\u0000"+ - "\u0000\u013e\u0140\u0003&\u0013\u0000\u013f\u013a\u0001\u0000\u0000\u0000"+ - "\u013f\u013e\u0001\u0000\u0000\u0000\u0140#\u0001\u0000\u0000\u0000\u0141"+ - "\u0142\u0005M\u0000\u0000\u0142%\u0001\u0000\u0000\u0000\u0143\u0144\u0007"+ - "\u0002\u0000\u0000\u0144\'\u0001\u0000\u0000\u0000\u0145\u0148\u0003*"+ - "\u0015\u0000\u0146\u0148\u0003,\u0016\u0000\u0147\u0145\u0001\u0000\u0000"+ - "\u0000\u0147\u0146\u0001\u0000\u0000\u0000\u0148)\u0001\u0000\u0000\u0000"+ - "\u0149\u014a\u0005L\u0000\u0000\u014a\u014f\u0005M\u0000\u0000\u014b\u014c"+ - "\u0005#\u0000\u0000\u014c\u014e\u0005M\u0000\u0000\u014d\u014b\u0001\u0000"+ - "\u0000\u0000\u014e\u0151\u0001\u0000\u0000\u0000\u014f\u014d\u0001\u0000"+ - "\u0000\u0000\u014f\u0150\u0001\u0000\u0000\u0000\u0150+\u0001\u0000\u0000"+ - "\u0000\u0151\u014f\u0001\u0000\u0000\u0000\u0152\u0153\u0005B\u0000\u0000"+ - "\u0153\u0154\u0003*\u0015\u0000\u0154\u0155\u0005C\u0000\u0000\u0155-"+ - "\u0001\u0000\u0000\u0000\u0156\u0157\u0005\u0015\u0000\u0000\u0157\u015c"+ - "\u0003\"\u0011\u0000\u0158\u0159\u0005#\u0000\u0000\u0159\u015b\u0003"+ - "\"\u0011\u0000\u015a\u0158\u0001\u0000\u0000\u0000\u015b\u015e\u0001\u0000"+ - "\u0000\u0000\u015c\u015a\u0001\u0000\u0000\u0000\u015c\u015d\u0001\u0000"+ - "\u0000\u0000\u015d\u0160\u0001\u0000\u0000\u0000\u015e\u015c\u0001\u0000"+ - "\u0000\u0000\u015f\u0161\u0003\u001c\u000e\u0000\u0160\u015f\u0001\u0000"+ - "\u0000\u0000\u0160\u0161\u0001\u0000\u0000\u0000\u0161\u0164\u0001\u0000"+ - "\u0000\u0000\u0162\u0163\u0005\u001e\u0000\u0000\u0163\u0165\u0003\u001c"+ - "\u000e\u0000\u0164\u0162\u0001\u0000\u0000\u0000\u0164\u0165\u0001\u0000"+ - "\u0000\u0000\u0165/\u0001\u0000\u0000\u0000\u0166\u0167\u0005\u0004\u0000"+ - "\u0000\u0167\u0168\u0003\u001c\u000e\u0000\u01681\u0001\u0000\u0000\u0000"+ - "\u0169\u016b\u0005\u0010\u0000\u0000\u016a\u016c\u0003\u001c\u000e\u0000"+ - "\u016b\u016a\u0001\u0000\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000"+ - "\u016c\u016f\u0001\u0000\u0000\u0000\u016d\u016e\u0005\u001e\u0000\u0000"+ - "\u016e\u0170\u0003\u001c\u000e\u0000\u016f\u016d\u0001\u0000\u0000\u0000"+ - "\u016f\u0170\u0001\u0000\u0000\u0000\u01703\u0001\u0000\u0000\u0000\u0171"+ - "\u0176\u0003:\u001d\u0000\u0172\u0173\u0005%\u0000\u0000\u0173\u0175\u0003"+ - ":\u001d\u0000\u0174\u0172\u0001\u0000\u0000\u0000\u0175\u0178\u0001\u0000"+ - "\u0000\u0000\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000"+ - "\u0000\u0000\u01775\u0001\u0000\u0000\u0000\u0178\u0176\u0001\u0000\u0000"+ - "\u0000\u0179\u017e\u0003<\u001e\u0000\u017a\u017b\u0005%\u0000\u0000\u017b"+ - "\u017d\u0003<\u001e\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017d\u0180"+ - "\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000\u0000\u0000\u017e\u017f"+ - "\u0001\u0000\u0000\u0000\u017f7\u0001\u0000\u0000\u0000\u0180\u017e\u0001"+ - "\u0000\u0000\u0000\u0181\u0186\u00036\u001b\u0000\u0182\u0183\u0005#\u0000"+ - "\u0000\u0183\u0185\u00036\u001b\u0000\u0184\u0182\u0001\u0000\u0000\u0000"+ - "\u0185\u0188\u0001\u0000\u0000\u0000\u0186\u0184\u0001\u0000\u0000\u0000"+ - "\u0186\u0187\u0001\u0000\u0000\u0000\u01879\u0001\u0000\u0000\u0000\u0188"+ - "\u0186\u0001\u0000\u0000\u0000\u0189\u018a\u0007\u0003\u0000\u0000\u018a"+ - ";\u0001\u0000\u0000\u0000\u018b\u018c\u0005Q\u0000\u0000\u018c=\u0001"+ - "\u0000\u0000\u0000\u018d\u01b8\u0005.\u0000\u0000\u018e\u018f\u0003`0"+ - "\u0000\u018f\u0190\u0005D\u0000\u0000\u0190\u01b8\u0001\u0000\u0000\u0000"+ - "\u0191\u01b8\u0003^/\u0000\u0192\u01b8\u0003`0\u0000\u0193\u01b8\u0003"+ - "Z-\u0000\u0194\u01b8\u0003@ \u0000\u0195\u01b8\u0003b1\u0000\u0196\u0197"+ - "\u0005B\u0000\u0000\u0197\u019c\u0003\\.\u0000\u0198\u0199\u0005#\u0000"+ - "\u0000\u0199\u019b\u0003\\.\u0000\u019a\u0198\u0001\u0000\u0000\u0000"+ - "\u019b\u019e\u0001\u0000\u0000\u0000\u019c\u019a\u0001\u0000\u0000\u0000"+ - "\u019c\u019d\u0001\u0000\u0000\u0000\u019d\u019f\u0001\u0000\u0000\u0000"+ - "\u019e\u019c\u0001\u0000\u0000\u0000\u019f\u01a0\u0005C\u0000\u0000\u01a0"+ - "\u01b8\u0001\u0000\u0000\u0000\u01a1\u01a2\u0005B\u0000\u0000\u01a2\u01a7"+ - "\u0003Z-\u0000\u01a3\u01a4\u0005#\u0000\u0000\u01a4\u01a6\u0003Z-\u0000"+ - "\u01a5\u01a3\u0001\u0000\u0000\u0000\u01a6\u01a9\u0001\u0000\u0000\u0000"+ - "\u01a7\u01a5\u0001\u0000\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+ - "\u01a8\u01aa\u0001\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000"+ - "\u01aa\u01ab\u0005C\u0000\u0000\u01ab\u01b8\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ad\u0005B\u0000\u0000\u01ad\u01b2\u0003b1\u0000\u01ae\u01af\u0005"+ - "#\u0000\u0000\u01af\u01b1\u0003b1\u0000\u01b0\u01ae\u0001\u0000\u0000"+ - "\u0000\u01b1\u01b4\u0001\u0000\u0000\u0000\u01b2\u01b0\u0001\u0000\u0000"+ - "\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b5\u0001\u0000\u0000"+ - "\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005C\u0000\u0000"+ - "\u01b6\u01b8\u0001\u0000\u0000\u0000\u01b7\u018d\u0001\u0000\u0000\u0000"+ - "\u01b7\u018e\u0001\u0000\u0000\u0000\u01b7\u0191\u0001\u0000\u0000\u0000"+ - "\u01b7\u0192\u0001\u0000\u0000\u0000\u01b7\u0193\u0001\u0000\u0000\u0000"+ - "\u01b7\u0194\u0001\u0000\u0000\u0000\u01b7\u0195\u0001\u0000\u0000\u0000"+ - "\u01b7\u0196\u0001\u0000\u0000\u0000\u01b7\u01a1\u0001\u0000\u0000\u0000"+ - "\u01b7\u01ac\u0001\u0000\u0000\u0000\u01b8?\u0001\u0000\u0000\u0000\u01b9"+ - "\u01bc\u00051\u0000\u0000\u01ba\u01bc\u0005A\u0000\u0000\u01bb\u01b9\u0001"+ - "\u0000\u0000\u0000\u01bb\u01ba\u0001\u0000\u0000\u0000\u01bcA\u0001\u0000"+ - "\u0000\u0000\u01bd\u01be\u0005\t\u0000\u0000\u01be\u01bf\u0005\u001c\u0000"+ - "\u0000\u01bfC\u0001\u0000\u0000\u0000\u01c0\u01c1\u0005\u000f\u0000\u0000"+ - "\u01c1\u01c6\u0003F#\u0000\u01c2\u01c3\u0005#\u0000\u0000\u01c3\u01c5"+ - "\u0003F#\u0000\u01c4\u01c2\u0001\u0000\u0000\u0000\u01c5\u01c8\u0001\u0000"+ - "\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000\u01c6\u01c7\u0001\u0000"+ - "\u0000\u0000\u01c7E\u0001\u0000\u0000\u0000\u01c8\u01c6\u0001\u0000\u0000"+ - "\u0000\u01c9\u01cb\u0003\n\u0005\u0000\u01ca\u01cc\u0007\u0004\u0000\u0000"+ - "\u01cb\u01ca\u0001\u0000\u0000\u0000\u01cb\u01cc\u0001\u0000\u0000\u0000"+ - "\u01cc\u01cf\u0001\u0000\u0000\u0000\u01cd\u01ce\u0005/\u0000\u0000\u01ce"+ - "\u01d0\u0007\u0005\u0000\u0000\u01cf\u01cd\u0001\u0000\u0000\u0000\u01cf"+ - "\u01d0\u0001\u0000\u0000\u0000\u01d0G\u0001\u0000\u0000\u0000\u01d1\u01d2"+ - "\u0005\b\u0000\u0000\u01d2\u01d3\u00038\u001c\u0000\u01d3I\u0001\u0000"+ - "\u0000\u0000\u01d4\u01d5\u0005\u0002\u0000\u0000\u01d5\u01d6\u00038\u001c"+ - "\u0000\u01d6K\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005\f\u0000\u0000"+ - "\u01d8\u01dd\u0003N\'\u0000\u01d9\u01da\u0005#\u0000\u0000\u01da\u01dc"+ - "\u0003N\'\u0000\u01db\u01d9\u0001\u0000\u0000\u0000\u01dc\u01df\u0001"+ - "\u0000\u0000\u0000\u01dd\u01db\u0001\u0000\u0000\u0000\u01dd\u01de\u0001"+ - "\u0000\u0000\u0000\u01deM\u0001\u0000\u0000\u0000\u01df\u01dd\u0001\u0000"+ - "\u0000\u0000\u01e0\u01e1\u00036\u001b\u0000\u01e1\u01e2\u0005U\u0000\u0000"+ - "\u01e2\u01e3\u00036\u001b\u0000\u01e3O\u0001\u0000\u0000\u0000\u01e4\u01e5"+ - "\u0005\u0001\u0000\u0000\u01e5\u01e6\u0003\u0014\n\u0000\u01e6\u01e8\u0003"+ - "b1\u0000\u01e7\u01e9\u0003V+\u0000\u01e8\u01e7\u0001\u0000\u0000\u0000"+ - "\u01e8\u01e9\u0001\u0000\u0000\u0000\u01e9Q\u0001\u0000\u0000\u0000\u01ea"+ - "\u01eb\u0005\u0007\u0000\u0000\u01eb\u01ec\u0003\u0014\n\u0000\u01ec\u01ed"+ - "\u0003b1\u0000\u01edS\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005\u000b"+ - "\u0000\u0000\u01ef\u01f0\u00034\u001a\u0000\u01f0U\u0001\u0000\u0000\u0000"+ - "\u01f1\u01f6\u0003X,\u0000\u01f2\u01f3\u0005#\u0000\u0000\u01f3\u01f5"+ - "\u0003X,\u0000\u01f4\u01f2\u0001\u0000\u0000\u0000\u01f5\u01f8\u0001\u0000"+ - "\u0000\u0000\u01f6\u01f4\u0001\u0000\u0000\u0000\u01f6\u01f7\u0001\u0000"+ - "\u0000\u0000\u01f7W\u0001\u0000\u0000\u0000\u01f8\u01f6\u0001\u0000\u0000"+ - "\u0000\u01f9\u01fa\u0003:\u001d\u0000\u01fa\u01fb\u0005!\u0000\u0000\u01fb"+ - "\u01fc\u0003>\u001f\u0000\u01fcY\u0001\u0000\u0000\u0000\u01fd\u01fe\u0007"+ - "\u0006\u0000\u0000\u01fe[\u0001\u0000\u0000\u0000\u01ff\u0202\u0003^/"+ - "\u0000\u0200\u0202\u0003`0\u0000\u0201\u01ff\u0001\u0000\u0000\u0000\u0201"+ - "\u0200\u0001\u0000\u0000\u0000\u0202]\u0001\u0000\u0000\u0000\u0203\u0205"+ - "\u0007\u0000\u0000\u0000\u0204\u0203\u0001\u0000\u0000\u0000\u0204\u0205"+ - "\u0001\u0000\u0000\u0000\u0205\u0206\u0001\u0000\u0000\u0000\u0206\u0207"+ - "\u0005\u001d\u0000\u0000\u0207_\u0001\u0000\u0000\u0000\u0208\u020a\u0007"+ - "\u0000\u0000\u0000\u0209\u0208\u0001\u0000\u0000\u0000\u0209\u020a\u0001"+ - "\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000\u0000\u020b\u020c\u0005"+ - "\u001c\u0000\u0000\u020ca\u0001\u0000\u0000\u0000\u020d\u020e\u0005\u001b"+ - "\u0000\u0000\u020ec\u0001\u0000\u0000\u0000\u020f\u0210\u0007\u0007\u0000"+ - "\u0000\u0210e\u0001\u0000\u0000\u0000\u0211\u0212\u0005\u0005\u0000\u0000"+ - "\u0212\u0213\u0003h4\u0000\u0213g\u0001\u0000\u0000\u0000\u0214\u0215"+ - "\u0005B\u0000\u0000\u0215\u0216\u0003\u0002\u0001\u0000\u0216\u0217\u0005"+ - "C\u0000\u0000\u0217i\u0001\u0000\u0000\u0000\u0218\u0219\u0005\u000e\u0000"+ - "\u0000\u0219\u021a\u0005e\u0000\u0000\u021ak\u0001\u0000\u0000\u0000\u021b"+ - "\u021c\u0005\n\u0000\u0000\u021c\u021d\u0005i\u0000\u0000\u021dm\u0001"+ - "\u0000\u0000\u0000\u021e\u021f\u0005\u0003\u0000\u0000\u021f\u0222\u0005"+ - "[\u0000\u0000\u0220\u0221\u0005Y\u0000\u0000\u0221\u0223\u00036\u001b"+ - "\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223\u0001\u0000\u0000"+ - "\u0000\u0223\u022d\u0001\u0000\u0000\u0000\u0224\u0225\u0005Z\u0000\u0000"+ - "\u0225\u022a\u0003p8\u0000\u0226\u0227\u0005#\u0000\u0000\u0227\u0229"+ - "\u0003p8\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229\u022c\u0001\u0000"+ - "\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022a\u022b\u0001\u0000"+ - "\u0000\u0000\u022b\u022e\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000"+ - "\u0000\u0000\u022d\u0224\u0001\u0000\u0000\u0000\u022d\u022e\u0001\u0000"+ - "\u0000\u0000\u022eo\u0001\u0000\u0000\u0000\u022f\u0230\u00036\u001b\u0000"+ - "\u0230\u0231\u0005!\u0000\u0000\u0231\u0233\u0001\u0000\u0000\u0000\u0232"+ - "\u022f\u0001\u0000\u0000\u0000\u0232\u0233\u0001\u0000\u0000\u0000\u0233"+ - "\u0234\u0001\u0000\u0000\u0000\u0234\u0235\u00036\u001b\u0000\u0235q\u0001"+ - "\u0000\u0000\u0000\u0236\u0237\u0005\u0013\u0000\u0000\u0237\u0238\u0003"+ - "\"\u0011\u0000\u0238\u0239\u0005Y\u0000\u0000\u0239\u023a\u00038\u001c"+ - "\u0000\u023as\u0001\u0000\u0000\u0000\u023b\u023c\u0005\u0012\u0000\u0000"+ - "\u023c\u023f\u0003\u001c\u000e\u0000\u023d\u023e\u0005\u001e\u0000\u0000"+ - "\u023e\u0240\u0003\u001c\u000e\u0000\u023f\u023d\u0001\u0000\u0000\u0000"+ - "\u023f\u0240\u0001\u0000\u0000\u0000\u0240u\u0001\u0000\u0000\u00006\u0081"+ - "\u008b\u009d\u00a9\u00b2\u00ba\u00c0\u00c8\u00ca\u00cf\u00d6\u00db\u00e6"+ - "\u00ec\u00f4\u00f6\u0101\u0108\u0113\u0116\u0124\u012c\u0134\u0138\u013f"+ - "\u0147\u014f\u015c\u0160\u0164\u016b\u016f\u0176\u017e\u0186\u019c\u01a7"+ - "\u01b2\u01b7\u01bb\u01c6\u01cb\u01cf\u01dd\u01e8\u01f6\u0201\u0204\u0209"+ - "\u0222\u022a\u022d\u0232\u023f"; + "&44\u0002\u0000557;\u0261\u0000x\u0001\u0000\u0000\u0000\u0002{\u0001"+ + "\u0000\u0000\u0000\u0004\u008d\u0001\u0000\u0000\u0000\u0006\u009f\u0001"+ + "\u0000\u0000\u0000\b\u00a1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000"+ + "\u0000\u0000\f\u00dd\u0001\u0000\u0000\u0000\u000e\u00df\u0001\u0000\u0000"+ + "\u0000\u0010\u00e8\u0001\u0000\u0000\u0000\u0012\u00ee\u0001\u0000\u0000"+ + "\u0000\u0014\u0103\u0001\u0000\u0000\u0000\u0016\u010d\u0001\u0000\u0000"+ + "\u0000\u0018\u011e\u0001\u0000\u0000\u0000\u001a\u0120\u0001\u0000\u0000"+ + "\u0000\u001c\u0122\u0001\u0000\u0000\u0000\u001e\u0125\u0001\u0000\u0000"+ + "\u0000 \u0132\u0001\u0000\u0000\u0000\"\u0134\u0001\u0000\u0000\u0000"+ + "$\u0145\u0001\u0000\u0000\u0000&\u0147\u0001\u0000\u0000\u0000(\u0149"+ + "\u0001\u0000\u0000\u0000*\u014d\u0001\u0000\u0000\u0000,\u014f\u0001\u0000"+ + "\u0000\u0000.\u0158\u0001\u0000\u0000\u00000\u015c\u0001\u0000\u0000\u0000"+ + "2\u016c\u0001\u0000\u0000\u00004\u016f\u0001\u0000\u0000\u00006\u0177"+ + "\u0001\u0000\u0000\u00008\u017f\u0001\u0000\u0000\u0000:\u0187\u0001\u0000"+ + "\u0000\u0000<\u018f\u0001\u0000\u0000\u0000>\u0191\u0001\u0000\u0000\u0000"+ + "@\u01bd\u0001\u0000\u0000\u0000B\u01c1\u0001\u0000\u0000\u0000D\u01c3"+ + "\u0001\u0000\u0000\u0000F\u01c6\u0001\u0000\u0000\u0000H\u01cf\u0001\u0000"+ + "\u0000\u0000J\u01d7\u0001\u0000\u0000\u0000L\u01da\u0001\u0000\u0000\u0000"+ + "N\u01dd\u0001\u0000\u0000\u0000P\u01e6\u0001\u0000\u0000\u0000R\u01ea"+ + "\u0001\u0000\u0000\u0000T\u01f0\u0001\u0000\u0000\u0000V\u01f4\u0001\u0000"+ + "\u0000\u0000X\u01f7\u0001\u0000\u0000\u0000Z\u01ff\u0001\u0000\u0000\u0000"+ + "\\\u0203\u0001\u0000\u0000\u0000^\u0207\u0001\u0000\u0000\u0000`\u020a"+ + "\u0001\u0000\u0000\u0000b\u020f\u0001\u0000\u0000\u0000d\u0213\u0001\u0000"+ + "\u0000\u0000f\u0215\u0001\u0000\u0000\u0000h\u0217\u0001\u0000\u0000\u0000"+ + "j\u021a\u0001\u0000\u0000\u0000l\u021e\u0001\u0000\u0000\u0000n\u0221"+ + "\u0001\u0000\u0000\u0000p\u0224\u0001\u0000\u0000\u0000r\u0238\u0001\u0000"+ + "\u0000\u0000t\u023c\u0001\u0000\u0000\u0000v\u0241\u0001\u0000\u0000\u0000"+ + "xy\u0003\u0002\u0001\u0000yz\u0005\u0000\u0000\u0001z\u0001\u0001\u0000"+ + "\u0000\u0000{|\u0006\u0001\uffff\uffff\u0000|}\u0003\u0004\u0002\u0000"+ + "}\u0083\u0001\u0000\u0000\u0000~\u007f\n\u0001\u0000\u0000\u007f\u0080"+ + "\u0005\u001a\u0000\u0000\u0080\u0082\u0003\u0006\u0003\u0000\u0081~\u0001"+ + "\u0000\u0000\u0000\u0082\u0085\u0001\u0000\u0000\u0000\u0083\u0081\u0001"+ + "\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000\u0000\u0084\u0003\u0001"+ + "\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000\u0000\u0086\u008e\u0003"+ + "h4\u0000\u0087\u008e\u0003\"\u0011\u0000\u0088\u008e\u0003n7\u0000\u0089"+ + "\u008e\u0003\u001c\u000e\u0000\u008a\u008e\u0003l6\u0000\u008b\u008c\u0004"+ + "\u0002\u0001\u0000\u008c\u008e\u00030\u0018\u0000\u008d\u0086\u0001\u0000"+ + "\u0000\u0000\u008d\u0087\u0001\u0000\u0000\u0000\u008d\u0088\u0001\u0000"+ + "\u0000\u0000\u008d\u0089\u0001\u0000\u0000\u0000\u008d\u008a\u0001\u0000"+ + "\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008e\u0005\u0001\u0000"+ + "\u0000\u0000\u008f\u00a0\u00032\u0019\u0000\u0090\u00a0\u0003\b\u0004"+ + "\u0000\u0091\u00a0\u0003J%\u0000\u0092\u00a0\u0003D\"\u0000\u0093\u00a0"+ + "\u00034\u001a\u0000\u0094\u00a0\u0003F#\u0000\u0095\u00a0\u0003L&\u0000"+ + "\u0096\u00a0\u0003N\'\u0000\u0097\u00a0\u0003R)\u0000\u0098\u00a0\u0003"+ + "T*\u0000\u0099\u00a0\u0003p8\u0000\u009a\u00a0\u0003V+\u0000\u009b\u009c"+ + "\u0004\u0003\u0002\u0000\u009c\u00a0\u0003v;\u0000\u009d\u009e\u0004\u0003"+ + "\u0003\u0000\u009e\u00a0\u0003t:\u0000\u009f\u008f\u0001\u0000\u0000\u0000"+ + "\u009f\u0090\u0001\u0000\u0000\u0000\u009f\u0091\u0001\u0000\u0000\u0000"+ + "\u009f\u0092\u0001\u0000\u0000\u0000\u009f\u0093\u0001\u0000\u0000\u0000"+ + "\u009f\u0094\u0001\u0000\u0000\u0000\u009f\u0095\u0001\u0000\u0000\u0000"+ + "\u009f\u0096\u0001\u0000\u0000\u0000\u009f\u0097\u0001\u0000\u0000\u0000"+ + "\u009f\u0098\u0001\u0000\u0000\u0000\u009f\u0099\u0001\u0000\u0000\u0000"+ + "\u009f\u009a\u0001\u0000\u0000\u0000\u009f\u009b\u0001\u0000\u0000\u0000"+ + "\u009f\u009d\u0001\u0000\u0000\u0000\u00a0\u0007\u0001\u0000\u0000\u0000"+ + "\u00a1\u00a2\u0005\u0011\u0000\u0000\u00a2\u00a3\u0003\n\u0005\u0000\u00a3"+ + "\t\u0001\u0000\u0000\u0000\u00a4\u00a5\u0006\u0005\uffff\uffff\u0000\u00a5"+ + "\u00a6\u0005-\u0000\u0000\u00a6\u00c3\u0003\n\u0005\b\u00a7\u00c3\u0003"+ + "\u0010\b\u0000\u00a8\u00c3\u0003\f\u0006\u0000\u00a9\u00ab\u0003\u0010"+ + "\b\u0000\u00aa\u00ac\u0005-\u0000\u0000\u00ab\u00aa\u0001\u0000\u0000"+ + "\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000"+ + "\u0000\u00ad\u00ae\u0005(\u0000\u0000\u00ae\u00af\u0005,\u0000\u0000\u00af"+ + "\u00b4\u0003\u0010\b\u0000\u00b0\u00b1\u0005#\u0000\u0000\u00b1\u00b3"+ + "\u0003\u0010\b\u0000\u00b2\u00b0\u0001\u0000\u0000\u0000\u00b3\u00b6\u0001"+ + "\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b4\u00b5\u0001"+ + "\u0000\u0000\u0000\u00b5\u00b7\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001"+ + "\u0000\u0000\u0000\u00b7\u00b8\u00053\u0000\u0000\u00b8\u00c3\u0001\u0000"+ + "\u0000\u0000\u00b9\u00ba\u0003\u0010\b\u0000\u00ba\u00bc\u0005)\u0000"+ + "\u0000\u00bb\u00bd\u0005-\u0000\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000"+ + "\u00bc\u00bd\u0001\u0000\u0000\u0000\u00bd\u00be\u0001\u0000\u0000\u0000"+ + "\u00be\u00bf\u0005.\u0000\u0000\u00bf\u00c3\u0001\u0000\u0000\u0000\u00c0"+ + "\u00c1\u0004\u0005\u0004\u0000\u00c1\u00c3\u0003\u000e\u0007\u0000\u00c2"+ + "\u00a4\u0001\u0000\u0000\u0000\u00c2\u00a7\u0001\u0000\u0000\u0000\u00c2"+ + "\u00a8\u0001\u0000\u0000\u0000\u00c2\u00a9\u0001\u0000\u0000\u0000\u00c2"+ + "\u00b9\u0001\u0000\u0000\u0000\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c3"+ + "\u00cc\u0001\u0000\u0000\u0000\u00c4\u00c5\n\u0005\u0000\u0000\u00c5\u00c6"+ + "\u0005\u001f\u0000\u0000\u00c6\u00cb\u0003\n\u0005\u0006\u00c7\u00c8\n"+ + "\u0004\u0000\u0000\u00c8\u00c9\u00050\u0000\u0000\u00c9\u00cb\u0003\n"+ + "\u0005\u0005\u00ca\u00c4\u0001\u0000\u0000\u0000\u00ca\u00c7\u0001\u0000"+ + "\u0000\u0000\u00cb\u00ce\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000"+ + "\u0000\u0000\u00cc\u00cd\u0001\u0000\u0000\u0000\u00cd\u000b\u0001\u0000"+ + "\u0000\u0000\u00ce\u00cc\u0001\u0000\u0000\u0000\u00cf\u00d1\u0003\u0010"+ + "\b\u0000\u00d0\u00d2\u0005-\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000"+ + "\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000"+ + "\u0000\u00d3\u00d4\u0005+\u0000\u0000\u00d4\u00d5\u0003d2\u0000\u00d5"+ + "\u00de\u0001\u0000\u0000\u0000\u00d6\u00d8\u0003\u0010\b\u0000\u00d7\u00d9"+ + "\u0005-\u0000\u0000\u00d8\u00d7\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001"+ + "\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db\u0005"+ + "2\u0000\u0000\u00db\u00dc\u0003d2\u0000\u00dc\u00de\u0001\u0000\u0000"+ + "\u0000\u00dd\u00cf\u0001\u0000\u0000\u0000\u00dd\u00d6\u0001\u0000\u0000"+ + "\u0000\u00de\r\u0001\u0000\u0000\u0000\u00df\u00e0\u0003\u0010\b\u0000"+ + "\u00e0\u00e1\u0005\u0014\u0000\u0000\u00e1\u00e2\u0003d2\u0000\u00e2\u000f"+ + "\u0001\u0000\u0000\u0000\u00e3\u00e9\u0003\u0012\t\u0000\u00e4\u00e5\u0003"+ + "\u0012\t\u0000\u00e5\u00e6\u0003f3\u0000\u00e6\u00e7\u0003\u0012\t\u0000"+ + "\u00e7\u00e9\u0001\u0000\u0000\u0000\u00e8\u00e3\u0001\u0000\u0000\u0000"+ + "\u00e8\u00e4\u0001\u0000\u0000\u0000\u00e9\u0011\u0001\u0000\u0000\u0000"+ + "\u00ea\u00eb\u0006\t\uffff\uffff\u0000\u00eb\u00ef\u0003\u0014\n\u0000"+ + "\u00ec\u00ed\u0007\u0000\u0000\u0000\u00ed\u00ef\u0003\u0012\t\u0003\u00ee"+ + "\u00ea\u0001\u0000\u0000\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ef"+ + "\u00f8\u0001\u0000\u0000\u0000\u00f0\u00f1\n\u0002\u0000\u0000\u00f1\u00f2"+ + "\u0007\u0001\u0000\u0000\u00f2\u00f7\u0003\u0012\t\u0003\u00f3\u00f4\n"+ + "\u0001\u0000\u0000\u00f4\u00f5\u0007\u0000\u0000\u0000\u00f5\u00f7\u0003"+ + "\u0012\t\u0002\u00f6\u00f0\u0001\u0000\u0000\u0000\u00f6\u00f3\u0001\u0000"+ + "\u0000\u0000\u00f7\u00fa\u0001\u0000\u0000\u0000\u00f8\u00f6\u0001\u0000"+ + "\u0000\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9\u0013\u0001\u0000"+ + "\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fb\u00fc\u0006\n\uffff"+ + "\uffff\u0000\u00fc\u0104\u0003@ \u0000\u00fd\u0104\u00036\u001b\u0000"+ + "\u00fe\u0104\u0003\u0016\u000b\u0000\u00ff\u0100\u0005,\u0000\u0000\u0100"+ + "\u0101\u0003\n\u0005\u0000\u0101\u0102\u00053\u0000\u0000\u0102\u0104"+ + "\u0001\u0000\u0000\u0000\u0103\u00fb\u0001\u0000\u0000\u0000\u0103\u00fd"+ + "\u0001\u0000\u0000\u0000\u0103\u00fe\u0001\u0000\u0000\u0000\u0103\u00ff"+ + "\u0001\u0000\u0000\u0000\u0104\u010a\u0001\u0000\u0000\u0000\u0105\u0106"+ + "\n\u0001\u0000\u0000\u0106\u0107\u0005\"\u0000\u0000\u0107\u0109\u0003"+ + "\u001a\r\u0000\u0108\u0105\u0001\u0000\u0000\u0000\u0109\u010c\u0001\u0000"+ + "\u0000\u0000\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000"+ + "\u0000\u0000\u010b\u0015\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000"+ + "\u0000\u0000\u010d\u010e\u0003\u0018\f\u0000\u010e\u0118\u0005,\u0000"+ + "\u0000\u010f\u0119\u0005>\u0000\u0000\u0110\u0115\u0003\n\u0005\u0000"+ + "\u0111\u0112\u0005#\u0000\u0000\u0112\u0114\u0003\n\u0005\u0000\u0113"+ + "\u0111\u0001\u0000\u0000\u0000\u0114\u0117\u0001\u0000\u0000\u0000\u0115"+ + "\u0113\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000\u0000\u0000\u0116"+ + "\u0119\u0001\u0000\u0000\u0000\u0117\u0115\u0001\u0000\u0000\u0000\u0118"+ + "\u010f\u0001\u0000\u0000\u0000\u0118\u0110\u0001\u0000\u0000\u0000\u0118"+ + "\u0119\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a"+ + "\u011b\u00053\u0000\u0000\u011b\u0017\u0001\u0000\u0000\u0000\u011c\u011f"+ + "\u0003<\u001e\u0000\u011d\u011f\u0005\u0014\u0000\u0000\u011e\u011c\u0001"+ + "\u0000\u0000\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011f\u0019\u0001"+ + "\u0000\u0000\u0000\u0120\u0121\u0003<\u001e\u0000\u0121\u001b\u0001\u0000"+ + "\u0000\u0000\u0122\u0123\u0005\r\u0000\u0000\u0123\u0124\u0003\u001e\u000f"+ + "\u0000\u0124\u001d\u0001\u0000\u0000\u0000\u0125\u012a\u0003 \u0010\u0000"+ + "\u0126\u0127\u0005#\u0000\u0000\u0127\u0129\u0003 \u0010\u0000\u0128\u0126"+ + "\u0001\u0000\u0000\u0000\u0129\u012c\u0001\u0000\u0000\u0000\u012a\u0128"+ + "\u0001\u0000\u0000\u0000\u012a\u012b\u0001\u0000\u0000\u0000\u012b\u001f"+ + "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012d\u0133"+ + "\u0003\n\u0005\u0000\u012e\u012f\u00036\u001b\u0000\u012f\u0130\u0005"+ + "!\u0000\u0000\u0130\u0131\u0003\n\u0005\u0000\u0131\u0133\u0001\u0000"+ + "\u0000\u0000\u0132\u012d\u0001\u0000\u0000\u0000\u0132\u012e\u0001\u0000"+ + "\u0000\u0000\u0133!\u0001\u0000\u0000\u0000\u0134\u0135\u0005\u0006\u0000"+ + "\u0000\u0135\u013a\u0003$\u0012\u0000\u0136\u0137\u0005#\u0000\u0000\u0137"+ + "\u0139\u0003$\u0012\u0000\u0138\u0136\u0001\u0000\u0000\u0000\u0139\u013c"+ + "\u0001\u0000\u0000\u0000\u013a\u0138\u0001\u0000\u0000\u0000\u013a\u013b"+ + "\u0001\u0000\u0000\u0000\u013b\u013e\u0001\u0000\u0000\u0000\u013c\u013a"+ + "\u0001\u0000\u0000\u0000\u013d\u013f\u0003*\u0015\u0000\u013e\u013d\u0001"+ + "\u0000\u0000\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f#\u0001\u0000"+ + "\u0000\u0000\u0140\u0141\u0003&\u0013\u0000\u0141\u0142\u0005m\u0000\u0000"+ + "\u0142\u0143\u0003(\u0014\u0000\u0143\u0146\u0001\u0000\u0000\u0000\u0144"+ + "\u0146\u0003(\u0014\u0000\u0145\u0140\u0001\u0000\u0000\u0000\u0145\u0144"+ + "\u0001\u0000\u0000\u0000\u0146%\u0001\u0000\u0000\u0000\u0147\u0148\u0005"+ + "M\u0000\u0000\u0148\'\u0001\u0000\u0000\u0000\u0149\u014a\u0007\u0002"+ + "\u0000\u0000\u014a)\u0001\u0000\u0000\u0000\u014b\u014e\u0003,\u0016\u0000"+ + "\u014c\u014e\u0003.\u0017\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014d"+ + "\u014c\u0001\u0000\u0000\u0000\u014e+\u0001\u0000\u0000\u0000\u014f\u0150"+ + "\u0005L\u0000\u0000\u0150\u0155\u0005M\u0000\u0000\u0151\u0152\u0005#"+ + "\u0000\u0000\u0152\u0154\u0005M\u0000\u0000\u0153\u0151\u0001\u0000\u0000"+ + "\u0000\u0154\u0157\u0001\u0000\u0000\u0000\u0155\u0153\u0001\u0000\u0000"+ + "\u0000\u0155\u0156\u0001\u0000\u0000\u0000\u0156-\u0001\u0000\u0000\u0000"+ + "\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u0159\u0005B\u0000\u0000\u0159"+ + "\u015a\u0003,\u0016\u0000\u015a\u015b\u0005C\u0000\u0000\u015b/\u0001"+ + "\u0000\u0000\u0000\u015c\u015d\u0005\u0015\u0000\u0000\u015d\u0162\u0003"+ + "$\u0012\u0000\u015e\u015f\u0005#\u0000\u0000\u015f\u0161\u0003$\u0012"+ + "\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0161\u0164\u0001\u0000\u0000"+ + "\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163\u0001\u0000\u0000"+ + "\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164\u0162\u0001\u0000\u0000"+ + "\u0000\u0165\u0167\u0003\u001e\u000f\u0000\u0166\u0165\u0001\u0000\u0000"+ + "\u0000\u0166\u0167\u0001\u0000\u0000\u0000\u0167\u016a\u0001\u0000\u0000"+ + "\u0000\u0168\u0169\u0005\u001e\u0000\u0000\u0169\u016b\u0003\u001e\u000f"+ + "\u0000\u016a\u0168\u0001\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ + "\u0000\u016b1\u0001\u0000\u0000\u0000\u016c\u016d\u0005\u0004\u0000\u0000"+ + "\u016d\u016e\u0003\u001e\u000f\u0000\u016e3\u0001\u0000\u0000\u0000\u016f"+ + "\u0171\u0005\u0010\u0000\u0000\u0170\u0172\u0003\u001e\u000f\u0000\u0171"+ + "\u0170\u0001\u0000\u0000\u0000\u0171\u0172\u0001\u0000\u0000\u0000\u0172"+ + "\u0175\u0001\u0000\u0000\u0000\u0173\u0174\u0005\u001e\u0000\u0000\u0174"+ + "\u0176\u0003\u001e\u000f\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0175"+ + "\u0176\u0001\u0000\u0000\u0000\u01765\u0001\u0000\u0000\u0000\u0177\u017c"+ + "\u0003<\u001e\u0000\u0178\u0179\u0005%\u0000\u0000\u0179\u017b\u0003<"+ + "\u001e\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017b\u017e\u0001\u0000"+ + "\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000"+ + "\u0000\u0000\u017d7\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000\u0000"+ + "\u0000\u017f\u0184\u0003>\u001f\u0000\u0180\u0181\u0005%\u0000\u0000\u0181"+ + "\u0183\u0003>\u001f\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0186"+ + "\u0001\u0000\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0184\u0185"+ + "\u0001\u0000\u0000\u0000\u01859\u0001\u0000\u0000\u0000\u0186\u0184\u0001"+ + "\u0000\u0000\u0000\u0187\u018c\u00038\u001c\u0000\u0188\u0189\u0005#\u0000"+ + "\u0000\u0189\u018b\u00038\u001c\u0000\u018a\u0188\u0001\u0000\u0000\u0000"+ + "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ + "\u018c\u018d\u0001\u0000\u0000\u0000\u018d;\u0001\u0000\u0000\u0000\u018e"+ + "\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0007\u0003\u0000\u0000\u0190"+ + "=\u0001\u0000\u0000\u0000\u0191\u0192\u0005Q\u0000\u0000\u0192?\u0001"+ + "\u0000\u0000\u0000\u0193\u01be\u0005.\u0000\u0000\u0194\u0195\u0003b1"+ + "\u0000\u0195\u0196\u0005D\u0000\u0000\u0196\u01be\u0001\u0000\u0000\u0000"+ + "\u0197\u01be\u0003`0\u0000\u0198\u01be\u0003b1\u0000\u0199\u01be\u0003"+ + "\\.\u0000\u019a\u01be\u0003B!\u0000\u019b\u01be\u0003d2\u0000\u019c\u019d"+ + "\u0005B\u0000\u0000\u019d\u01a2\u0003^/\u0000\u019e\u019f\u0005#\u0000"+ + "\u0000\u019f\u01a1\u0003^/\u0000\u01a0\u019e\u0001\u0000\u0000\u0000\u01a1"+ + "\u01a4\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2"+ + "\u01a3\u0001\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4"+ + "\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005C\u0000\u0000\u01a6\u01be"+ + "\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005B\u0000\u0000\u01a8\u01ad\u0003"+ + "\\.\u0000\u01a9\u01aa\u0005#\u0000\u0000\u01aa\u01ac\u0003\\.\u0000\u01ab"+ + "\u01a9\u0001\u0000\u0000\u0000\u01ac\u01af\u0001\u0000\u0000\u0000\u01ad"+ + "\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae"+ + "\u01b0\u0001\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01b0"+ + "\u01b1\u0005C\u0000\u0000\u01b1\u01be\u0001\u0000\u0000\u0000\u01b2\u01b3"+ + "\u0005B\u0000\u0000\u01b3\u01b8\u0003d2\u0000\u01b4\u01b5\u0005#\u0000"+ + "\u0000\u01b5\u01b7\u0003d2\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7"+ + "\u01ba\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8"+ + "\u01b9\u0001\u0000\u0000\u0000\u01b9\u01bb\u0001\u0000\u0000\u0000\u01ba"+ + "\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005C\u0000\u0000\u01bc\u01be"+ + "\u0001\u0000\u0000\u0000\u01bd\u0193\u0001\u0000\u0000\u0000\u01bd\u0194"+ + "\u0001\u0000\u0000\u0000\u01bd\u0197\u0001\u0000\u0000\u0000\u01bd\u0198"+ + "\u0001\u0000\u0000\u0000\u01bd\u0199\u0001\u0000\u0000\u0000\u01bd\u019a"+ + "\u0001\u0000\u0000\u0000\u01bd\u019b\u0001\u0000\u0000\u0000\u01bd\u019c"+ + "\u0001\u0000\u0000\u0000\u01bd\u01a7\u0001\u0000\u0000\u0000\u01bd\u01b2"+ + "\u0001\u0000\u0000\u0000\u01beA\u0001\u0000\u0000\u0000\u01bf\u01c2\u0005"+ + "1\u0000\u0000\u01c0\u01c2\u0005A\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000"+ + "\u0000\u01c1\u01c0\u0001\u0000\u0000\u0000\u01c2C\u0001\u0000\u0000\u0000"+ + "\u01c3\u01c4\u0005\t\u0000\u0000\u01c4\u01c5\u0005\u001c\u0000\u0000\u01c5"+ + "E\u0001\u0000\u0000\u0000\u01c6\u01c7\u0005\u000f\u0000\u0000\u01c7\u01cc"+ + "\u0003H$\u0000\u01c8\u01c9\u0005#\u0000\u0000\u01c9\u01cb\u0003H$\u0000"+ + "\u01ca\u01c8\u0001\u0000\u0000\u0000\u01cb\u01ce\u0001\u0000\u0000\u0000"+ + "\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cc\u01cd\u0001\u0000\u0000\u0000"+ + "\u01cdG\u0001\u0000\u0000\u0000\u01ce\u01cc\u0001\u0000\u0000\u0000\u01cf"+ + "\u01d1\u0003\n\u0005\u0000\u01d0\u01d2\u0007\u0004\u0000\u0000\u01d1\u01d0"+ + "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000\u01d2\u01d5"+ + "\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005/\u0000\u0000\u01d4\u01d6\u0007"+ + "\u0005\u0000\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001"+ + "\u0000\u0000\u0000\u01d6I\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005\b"+ + "\u0000\u0000\u01d8\u01d9\u0003:\u001d\u0000\u01d9K\u0001\u0000\u0000\u0000"+ + "\u01da\u01db\u0005\u0002\u0000\u0000\u01db\u01dc\u0003:\u001d\u0000\u01dc"+ + "M\u0001\u0000\u0000\u0000\u01dd\u01de\u0005\f\u0000\u0000\u01de\u01e3"+ + "\u0003P(\u0000\u01df\u01e0\u0005#\u0000\u0000\u01e0\u01e2\u0003P(\u0000"+ + "\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e5\u0001\u0000\u0000\u0000"+ + "\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000"+ + "\u01e4O\u0001\u0000\u0000\u0000\u01e5\u01e3\u0001\u0000\u0000\u0000\u01e6"+ + "\u01e7\u00038\u001c\u0000\u01e7\u01e8\u0005U\u0000\u0000\u01e8\u01e9\u0003"+ + "8\u001c\u0000\u01e9Q\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005\u0001\u0000"+ + "\u0000\u01eb\u01ec\u0003\u0014\n\u0000\u01ec\u01ee\u0003d2\u0000\u01ed"+ + "\u01ef\u0003X,\u0000\u01ee\u01ed\u0001\u0000\u0000\u0000\u01ee\u01ef\u0001"+ + "\u0000\u0000\u0000\u01efS\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0007"+ + "\u0000\u0000\u01f1\u01f2\u0003\u0014\n\u0000\u01f2\u01f3\u0003d2\u0000"+ + "\u01f3U\u0001\u0000\u0000\u0000\u01f4\u01f5\u0005\u000b\u0000\u0000\u01f5"+ + "\u01f6\u00036\u001b\u0000\u01f6W\u0001\u0000\u0000\u0000\u01f7\u01fc\u0003"+ + "Z-\u0000\u01f8\u01f9\u0005#\u0000\u0000\u01f9\u01fb\u0003Z-\u0000\u01fa"+ + "\u01f8\u0001\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000\u0000\u01fc"+ + "\u01fa\u0001\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd"+ + "Y\u0001\u0000\u0000\u0000\u01fe\u01fc\u0001\u0000\u0000\u0000\u01ff\u0200"+ + "\u0003<\u001e\u0000\u0200\u0201\u0005!\u0000\u0000\u0201\u0202\u0003@"+ + " \u0000\u0202[\u0001\u0000\u0000\u0000\u0203\u0204\u0007\u0006\u0000\u0000"+ + "\u0204]\u0001\u0000\u0000\u0000\u0205\u0208\u0003`0\u0000\u0206\u0208"+ + "\u0003b1\u0000\u0207\u0205\u0001\u0000\u0000\u0000\u0207\u0206\u0001\u0000"+ + "\u0000\u0000\u0208_\u0001\u0000\u0000\u0000\u0209\u020b\u0007\u0000\u0000"+ + "\u0000\u020a\u0209\u0001\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000"+ + "\u0000\u020b\u020c\u0001\u0000\u0000\u0000\u020c\u020d\u0005\u001d\u0000"+ + "\u0000\u020da\u0001\u0000\u0000\u0000\u020e\u0210\u0007\u0000\u0000\u0000"+ + "\u020f\u020e\u0001\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000"+ + "\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212\u0005\u001c\u0000\u0000"+ + "\u0212c\u0001\u0000\u0000\u0000\u0213\u0214\u0005\u001b\u0000\u0000\u0214"+ + "e\u0001\u0000\u0000\u0000\u0215\u0216\u0007\u0007\u0000\u0000\u0216g\u0001"+ + "\u0000\u0000\u0000\u0217\u0218\u0005\u0005\u0000\u0000\u0218\u0219\u0003"+ + "j5\u0000\u0219i\u0001\u0000\u0000\u0000\u021a\u021b\u0005B\u0000\u0000"+ + "\u021b\u021c\u0003\u0002\u0001\u0000\u021c\u021d\u0005C\u0000\u0000\u021d"+ + "k\u0001\u0000\u0000\u0000\u021e\u021f\u0005\u000e\u0000\u0000\u021f\u0220"+ + "\u0005e\u0000\u0000\u0220m\u0001\u0000\u0000\u0000\u0221\u0222\u0005\n"+ + "\u0000\u0000\u0222\u0223\u0005i\u0000\u0000\u0223o\u0001\u0000\u0000\u0000"+ + "\u0224\u0225\u0005\u0003\u0000\u0000\u0225\u0228\u0005[\u0000\u0000\u0226"+ + "\u0227\u0005Y\u0000\u0000\u0227\u0229\u00038\u001c\u0000\u0228\u0226\u0001"+ + "\u0000\u0000\u0000\u0228\u0229\u0001\u0000\u0000\u0000\u0229\u0233\u0001"+ + "\u0000\u0000\u0000\u022a\u022b\u0005Z\u0000\u0000\u022b\u0230\u0003r9"+ + "\u0000\u022c\u022d\u0005#\u0000\u0000\u022d\u022f\u0003r9\u0000\u022e"+ + "\u022c\u0001\u0000\u0000\u0000\u022f\u0232\u0001\u0000\u0000\u0000\u0230"+ + "\u022e\u0001\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231"+ + "\u0234\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0233"+ + "\u022a\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000\u0000\u0234"+ + "q\u0001\u0000\u0000\u0000\u0235\u0236\u00038\u001c\u0000\u0236\u0237\u0005"+ + "!\u0000\u0000\u0237\u0239\u0001\u0000\u0000\u0000\u0238\u0235\u0001\u0000"+ + "\u0000\u0000\u0238\u0239\u0001\u0000\u0000\u0000\u0239\u023a\u0001\u0000"+ + "\u0000\u0000\u023a\u023b\u00038\u001c\u0000\u023bs\u0001\u0000\u0000\u0000"+ + "\u023c\u023d\u0005\u0013\u0000\u0000\u023d\u023e\u0003$\u0012\u0000\u023e"+ + "\u023f\u0005Y\u0000\u0000\u023f\u0240\u0003:\u001d\u0000\u0240u\u0001"+ + "\u0000\u0000\u0000\u0241\u0242\u0005\u0012\u0000\u0000\u0242\u0245\u0003"+ + "\u001e\u000f\u0000\u0243\u0244\u0005\u001e\u0000\u0000\u0244\u0246\u0003"+ + "\u001e\u000f\u0000\u0245\u0243\u0001\u0000\u0000\u0000\u0245\u0246\u0001"+ + "\u0000\u0000\u0000\u0246w\u0001\u0000\u0000\u00007\u0083\u008d\u009f\u00ab"+ + "\u00b4\u00bc\u00c2\u00ca\u00cc\u00d1\u00d8\u00dd\u00e8\u00ee\u00f6\u00f8"+ + "\u0103\u010a\u0115\u0118\u011e\u012a\u0132\u013a\u013e\u0145\u014d\u0155"+ + "\u0162\u0166\u016a\u0171\u0175\u017c\u0184\u018c\u01a2\u01ad\u01b8\u01bd"+ + "\u01c1\u01cc\u01d1\u01d5\u01e3\u01ee\u01fc\u0207\u020a\u020f\u0228\u0230"+ + "\u0233\u0238\u0245"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java index 192b169cc9587..4b035f2478444 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java @@ -332,6 +332,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener { *

The default implementation does nothing.

*/ @Override public void exitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java index de98d4333c1d4..dce6c14559001 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java @@ -202,6 +202,13 @@ public class EsqlBaseParserBaseVisitor extends AbstractParseTreeVisitor im * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

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

+ */ + @Override public T visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java index 4348c641d9f69..676ace9e56d7b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java @@ -313,6 +313,16 @@ public interface EsqlBaseParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx); + /** + * Enter a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * @param ctx the parse tree + */ + void enterFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); + /** + * Exit a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * @param ctx the parse tree + */ + void exitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); /** * Enter a parse tree produced by the {@code toDataType} * labeled alternative in {@link EsqlBaseParser#dataType}. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java index c334526abfe39..6eaa544f046ed 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java @@ -193,6 +193,12 @@ public interface EsqlBaseParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx); + /** + * Visit a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); /** * Visit a parse tree produced by the {@code toDataType} * labeled alternative in {@link EsqlBaseParser#dataType}. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java index 4be80af958e36..156fca3cbb19b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java @@ -98,7 +98,7 @@ private class PostProcessor extends EsqlBaseParserBaseListener { @Override public void exitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { // TODO remove this at some point - EsqlBaseParser.IdentifierContext identifier = ctx.identifier(); + EsqlBaseParser.FunctionIdentifierContext identifier = ctx.functionIdentifier(); if (identifier.getText().equalsIgnoreCase("is_null")) { throw new ParsingException( source(ctx), diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java index cae0f3e084d54..1d63741dc8c57 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java @@ -537,7 +537,7 @@ public UnresolvedAttribute visitDereference(EsqlBaseParser.DereferenceContext ct @Override public Expression visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { - String name = visitIdentifier(ctx.identifier()); + String name = visitFunctionIdentifier(ctx.functionIdentifier()); List args = expressions(ctx.booleanExpression()); if ("count".equals(EsqlFunctionRegistry.normalizeName(name))) { // to simplify the registration, handle in the parser the special count cases diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java index 9ccbb00ea4b5b..7a1e345a059ff 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java @@ -24,6 +24,14 @@ public String visitIdentifier(IdentifierContext ctx) { return ctx == null ? null : unquoteIdentifier(ctx.QUOTED_IDENTIFIER(), ctx.UNQUOTED_IDENTIFIER()); } + @Override + public String visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { + if (ctx.DEV_MATCH() != null) { + return ctx.DEV_MATCH().getText(); + } + return visitIdentifier(ctx.identifier()); + } + protected static String unquoteIdentifier(TerminalNode quotedNode, TerminalNode unquotedNode) { String result; if (quotedNode != null) { From 953b27639f25487ca6ffc09cf5323f7749fd797c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 26 Sep 2024 12:53:58 +0200 Subject: [PATCH 26/93] Removed unnecessary code --- .../expression/function/fulltext/MatchFunctionTests.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index be5baef39335b..fdfc3a31de777 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -24,7 +24,6 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import java.util.Set; import java.util.function.Supplier; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.MATCH_FUNCTION; @@ -44,11 +43,7 @@ public MatchFunctionTests(@Name("TestCase") Supplier @ParametersFactory public static Iterable parameters() { - final Set validTypes = Set.of(DataType.KEYWORD, DataType.TEXT); - final List> validPerPosition = List.of(validTypes, validTypes); List suppliers = new LinkedList<>(); - // Don't test null, as it is not allowed but the expected message is not a type error - so we check it separately in VerifierTests - for (DataType fieldType : validStringDataTypes()) { for (DataType queryType : validStringDataTypes()) { suppliers.add( From 287768828cc203987e05bbb13dcaee20cb7ea465 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 26 Sep 2024 12:55:54 +0200 Subject: [PATCH 27/93] Final removal of previous renames --- .../expression/function/fulltext/MatchFunction.java | 6 +++--- .../xpack/esql/analysis/VerifierTests.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index a333b511162d2..e46368647cf8d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -81,17 +81,17 @@ public void writeTo(StreamOutput out) throws IOException { @Override public String functionName() { - return "MATCHSTR"; + return "MATCH"; } @Override public Query asQuery() { Object queryAsObject = query().fold(); if (queryAsObject instanceof BytesRef == false) { - throw new IllegalArgumentException("Query in MATCHSTR function needs to be resolved to a string"); + throw new IllegalArgumentException("Query in MATCH function needs to be resolved to a string"); } if (field instanceof FieldAttribute == false) { - throw new IllegalArgumentException("Field in MATCHSTR function needs to be a field"); + throw new IllegalArgumentException("Field in MATCH function needs to be a field"); } return new MatchQuery(source(), ((FieldAttribute) field).name(), ((BytesRef) queryAsObject).utf8ToString()); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index d72887a1597b9..c3aad26205d02 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1086,10 +1086,10 @@ public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { } public void testMatchFunctionNotAllowedAfterCommands() throws Exception { - assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - assertEquals("1:13: [MATCHSTR] function cannot be used after SHOW", error("show info | where match(version, \"8.*\")")); - checkFullTextFunctionNotAllowedAfterCommands("MATCHSTR", "match(first_name, \"Anna\")"); + assertEquals("1:13: [MATCH] function cannot be used after SHOW", error("show info | where match(version, \"8.*\")")); + checkFullTextFunctionNotAllowedAfterCommands("MATCH", "match(first_name, \"Anna\")"); } private void checkFullTextFunctionNotAllowedAfterCommands(String functionName, String functionInvocation) throws Exception { @@ -1170,9 +1170,9 @@ public void testQueryStringFunctionOnlyAllowedInWhere() throws Exception { } public void testMatchFunctionOnlyAllowedInWhere() throws Exception { - assumeTrue("skipping because MATCHSTR is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - checkFullTextFunctionsOnlyAllowedInWhere("MATCHSTR", "match(first_name, \"Anna\")"); + checkFullTextFunctionsOnlyAllowedInWhere("MATCH", "match(first_name, \"Anna\")"); } private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, String functionInvocation) throws Exception { From 274c94f2a99556cdeea024d4130b512fed7eecbf Mon Sep 17 00:00:00 2001 From: Carlos Delgado <6339205+carlosdelest@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:34:44 +0200 Subject: [PATCH 28/93] Update docs/changelog/113374.yaml --- docs/changelog/113374.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/changelog/113374.yaml diff --git a/docs/changelog/113374.yaml b/docs/changelog/113374.yaml new file mode 100644 index 0000000000000..f1d5750de0f60 --- /dev/null +++ b/docs/changelog/113374.yaml @@ -0,0 +1,5 @@ +pr: 113374 +summary: Add ESQL match function +area: ES|QL +type: feature +issues: [] From a468d46bee7243f17d66cd7a9beddd694fba668d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 27 Sep 2024 12:54:40 +0200 Subject: [PATCH 29/93] Match function needs to take into account field information instead of failing after commands --- .../esql/core/expression/TypeResolutions.java | 18 ++++++++++++++++++ .../xpack/esql/analysis/Verifier.java | 5 ++++- .../function/fulltext/FullTextFunction.java | 2 ++ .../function/fulltext/MatchFunction.java | 13 +++++++++---- .../function/fulltext/QueryStringFunction.java | 6 ++++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index b817ec17c7bda..18b6e8464d25a 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -63,6 +63,24 @@ public static TypeResolution isString(Expression e, String operationName, ParamO return isType(e, DataType::isString, operationName, paramOrd, "string"); } + public static TypeResolution isField(Expression e, String operationName, ParamOrdinal paramOrd) { + if (e instanceof FieldAttribute fa) { + if (fa.resolved()) { + return TypeResolution.TYPE_RESOLVED; + } + } + + return new TypeResolution( + format( + null, + "[{}] cannot operate on [{}] which is not an Elasticsearch field", + operationName, + e.sourceText() + ) + ); + + } + public static TypeResolution isIP(Expression e, String operationName, ParamOrdinal paramOrd) { return isType(e, dt -> dt == IP, operationName, paramOrd, "ip"); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index a29e16139dde7..479cf3661c279 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -650,7 +650,10 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f // we can't check if it can be pushed down as we don't have yet information about the fields present in the // StringQueryPredicate plan.forEachDown(LogicalPlan.class, lp -> { - if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { + if ((lp instanceof Filter + || lp instanceof OrderBy + || lp instanceof EsRelation + || ftf.hasFieldsInformation()) == false) { failures.add( fail( plan, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 40beeb8dc463d..251bb35cd6906 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -92,4 +92,6 @@ public Expression query() { protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return DEFAULT; } + + public abstract boolean hasFieldsInformation(); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index e46368647cf8d..8ffad83b81263 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -29,6 +29,7 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; +import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isField; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; @@ -90,16 +91,15 @@ public Query asQuery() { if (queryAsObject instanceof BytesRef == false) { throw new IllegalArgumentException("Query in MATCH function needs to be resolved to a string"); } - if (field instanceof FieldAttribute == false) { - throw new IllegalArgumentException("Field in MATCH function needs to be a field"); - } return new MatchQuery(source(), ((FieldAttribute) field).name(), ((BytesRef) queryAsObject).utf8ToString()); } @Override protected TypeResolution resolveNonQueryParamTypes() { - return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes()); + return isNotNull(field, sourceText(), FIRST).and(isField(field, sourceText(), FIRST)) + .and(isString(field, sourceText(), FIRST)) + .and(super.resolveNonQueryParamTypes()); } @Override @@ -121,4 +121,9 @@ public String getWriteableName() { protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return SECOND; } + + @Override + public boolean hasFieldsInformation() { + return true; + } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 0a81448b68e0e..41a319f666f7e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -92,4 +92,10 @@ protected NodeInfo info() { public String getWriteableName() { return ENTRY.name; } + + @Override + public boolean hasFieldsInformation() { + return false; + } + } From a0f2c7d2d61f73b6234fbc512ef82ccdf640e3d4 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 27 Sep 2024 12:58:47 +0200 Subject: [PATCH 30/93] Add verifier tests - remove tests for executing after commands for match() --- .../xpack/esql/analysis/VerifierTests.java | 114 +++++++++--------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index c3aad26205d02..30f5cbaed8a15 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1080,85 +1080,60 @@ public void testMatchFilter() throws Exception { public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - assertEquals("1:13: [QSTR] function cannot be used after SHOW", error("show info | where qstr(\"Anna\")")); - assertEquals("1:17: [QSTR] function cannot be used after ROW", error("row a= \"Anna\" | where qstr(\"Anna\")")); - checkFullTextFunctionNotAllowedAfterCommands("QSTR", "qstr(\"Anna\")"); - } - - public void testMatchFunctionNotAllowedAfterCommands() throws Exception { - assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - - assertEquals("1:13: [MATCH] function cannot be used after SHOW", error("show info | where match(version, \"8.*\")")); - checkFullTextFunctionNotAllowedAfterCommands("MATCH", "match(first_name, \"Anna\")"); - } - - private void checkFullTextFunctionNotAllowedAfterCommands(String functionName, String functionInvocation) throws Exception { - // Source commands - String function = functionName.toLowerCase(Locale.ROOT); + assertEquals("1:13: [QSTR] function cannot be used after SHOW", error("show info | where qstr(\"8.16.0\")")); + assertEquals("1:17: [QSTR] function cannot be used after ROW", error("row a= \"Anna\" | where qstr(\"Anna\")")); // Processing commands assertEquals( - "1:43: [" + functionName + "] function cannot be used after DISSECT", - error("from test | dissect first_name \"%{foo}\" | where " + functionInvocation) + "1:43: [QSTR] function cannot be used after DISSECT", + error("from test | dissect first_name \"%{foo}\" | where qstr(\"Connection\")") ); + assertEquals("1:27: [QSTR] function cannot be used after DROP", error("from test | drop emp_no | where qstr(\"Anna\")")); assertEquals( - "1:27: [" + functionName + "] function cannot be used after DROP", - error("from test | drop emp_no | where " + functionInvocation) + "1:71: [QSTR] function cannot be used after ENRICH", + error("from test | enrich languages on languages with lang = language_name | where qstr(\"Anna\")") ); + assertEquals("1:26: [QSTR] function cannot be used after EVAL", error("from test | eval z = 2 | where qstr(\"Anna\")")); assertEquals( - "1:71: [" + functionName + "] function cannot be used after ENRICH", - error("from test | enrich languages on languages with lang = language_name | where " + functionInvocation) + "1:44: [QSTR] function cannot be used after GROK", + error("from test | grok last_name \"%{WORD:foo}\" | where qstr(\"Anna\")") ); + assertEquals("1:27: [QSTR] function cannot be used after KEEP", error("from test | keep emp_no | where qstr(\"Anna\")")); + assertEquals("1:24: [QSTR] function cannot be used after LIMIT", error("from test | limit 10 | where qstr(\"Anna\")")); assertEquals( - "1:26: [" + functionName + "] function cannot be used after EVAL", - error("from test | eval z = 2 | where " + functionInvocation) + "1:35: [QSTR] function cannot be used after MV_EXPAND", + error("from test | mv_expand last_name | where qstr(\"Anna\")") ); assertEquals( - "1:44: [" + functionName + "] function cannot be used after GROK", - error("from test | grok last_name \"%{WORD:foo}\" | where " + functionInvocation) + "1:45: [QSTR] function cannot be used after RENAME", + error("from test | rename last_name as full_name | where qstr(\"Anna\")") ); assertEquals( - "1:31: [" + functionName + "] function cannot be used after KEEP", - error("from test | keep first_name | where " + functionInvocation) - ); - assertEquals( - "1:24: [" + functionName + "] function cannot be used after LIMIT", - error("from test | limit 10 | where " + functionInvocation) - ); - assertEquals( - "1:35: [" + functionName + "] function cannot be used after MV_EXPAND", - error("from test | mv_expand last_name | where " + functionInvocation) - ); - assertEquals( - "1:45: [" + functionName + "] function cannot be used after RENAME", - error("from test | rename last_name as full_name | where " + functionInvocation) - ); - assertEquals( - "1:53: [" + functionName + "] function cannot be used after STATS", - error("from test | STATS c = COUNT(emp_no) BY first_name | where " + functionInvocation) + "1:52: [QSTR] function cannot be used after STATS", + error("from test | STATS c = COUNT(emp_no) BY languages | where qstr(\"Anna\")") ); // Some combination of processing commands assertEquals( - "1:42: [" + functionName + "] function cannot be used after LIMIT", - error("from test | keep first_name | limit 10 | where " + functionInvocation) + "1:38: [QSTR] function cannot be used after LIMIT", + error("from test | keep emp_no | limit 10 | where qstr(\"Anna\")") ); assertEquals( - "1:46: [" + functionName + "] function cannot be used after MV_EXPAND", - error("from test | limit 10 | mv_expand last_name | where " + functionInvocation) + "1:46: [QSTR] function cannot be used after MV_EXPAND", + error("from test | limit 10 | mv_expand last_name | where qstr(\"Anna\")") ); assertEquals( - "1:53: [" + functionName + "] function cannot be used after KEEP", - error("from test | mv_expand last_name | keep first_name | where " + functionInvocation) + "1:52: [QSTR] function cannot be used after KEEP", + error("from test | mv_expand last_name | keep last_name | where qstr(\"Anna\")") ); assertEquals( - "1:78: [" + functionName + "] function cannot be used after RENAME", - error("from test | STATS c = COUNT(emp_no) BY first_name | rename c as total_emps | where " + functionInvocation) + "1:77: [QSTR] function cannot be used after RENAME", + error("from test | STATS c = COUNT(emp_no) BY languages | rename c as total_emps | where qstr(\"Anna\")") ); assertEquals( - "1:58: [" + functionName + "] function cannot be used after KEEP", - error("from test | rename last_name as name | keep first_name | where " + functionInvocation) + "1:54: [QSTR] function cannot be used after KEEP", + error("from test | rename last_name as name | keep emp_no | where qstr(\"Anna\")") ); } @@ -1217,16 +1192,43 @@ public void testMatchFunctionArgNotNullOrConstant() throws Exception { "1:19: second argument of [match(first_name, first_name)] must be a constant, received [first_name]", error("from test | where match(first_name, first_name)") ); + assertEquals( + "1:59: second argument of [match(first_name, query)] must be a constant, received [query]", + error("from test | eval query = concat(\"first\", \" name\") | where match(first_name, query)") + ); // Other value types are tested in QueryStringFunctionTests } - public void testMatchFunctionNoField() throws Exception { + public void testMatchFunctionNullArgs() throws Exception { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals( + "1:19: first argument of [match(null, \"query\")] cannot be null, received [null]", + error("from test | where match(null, \"query\")") + ); + assertEquals( + "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", + error("from test | where match(first_name, null)") + ); + + assertEquals( + "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", + error("from test | where match(first_name, null)") + ); + } + + public void testMatchFunctionTargetsExistingField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:19: second argument of [match(\"first_name\", null)] cannot be null, received [null]", - error("from test | where match(\"first_name\", null)") + "1:47: [match(y, \"Anna\")] cannot operate on [y] which is not an Elasticsearch field", + error("from test | eval y = concat(\"a\", \"b\") | where match(y, \"Anna\"" + ")") + ); + assertEquals( + "1:47: [match(name, \"Anna\")] cannot operate on [name] which is not an Elasticsearch field", + error("from test | rename first_name as name | where match(name, \"Anna\"" + ")") ); + assertEquals("1:39: Unknown column [first_name]", error("from test | keep emp_no | where match(first_name, \"Anna\"" + ")")); } public void testCoalesceWithMixedNumericTypes() { From d1c0978c0ab5ab79cf1bebc98cadfc8cf077056e Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 27 Sep 2024 13:09:51 +0200 Subject: [PATCH 31/93] Add tests for using match() after commands --- .../main/resources/match-function.csv-spec | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 201e6b70ac650..0f3b48fd88ed9 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -49,6 +49,59 @@ book_no:keyword | title:text 7350 | Return of the Shadow ; +matchAfterKeep +required_capability: match_function + +from books +| keep book_no, author +| where match(author, "Faulkner") +| sort book_no +| limit 5; + +book_no:keyword | author:text +2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] +2713 | William Faulkner +2847 | Colleen Faulkner +2883 | William Faulkner +3293 | Danny Faulkner +; + +matchAfterDrop +required_capability: match_function + +from books +| drop ratings, description, year, publisher, title, author.keyword +| where match(author, "Faulkner") +| keep book_no, author +| sort book_no +| limit 5; + +book_no:keyword | author:text +2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] +2713 | William Faulkner +2847 | Colleen Faulkner +2883 | William Faulkner +3293 | Danny Faulkner +; + +matchAfterEval +required_capability: match_function + +from books +| eval stars = to_long(ratings / 2.0) +| where match(author, "Faulkner") +| sort book_no +| keep book_no, author, stars +| limit 5; + +book_no:keyword | author:text | stars:long +2378 | [Carol Faulkner, Holly Byers Ochoa, Lucretia Mott] | 3 +2713 | William Faulkner | 2 +2847 | Colleen Faulkner | 3 +2883 | William Faulkner | 2 +3293 | Danny Faulkner | 2 +; + matchWithDisjunction required_capability: match_function From cde34115adcd94b16d5d490d5ed339753ab1c2b9 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 27 Sep 2024 13:36:57 +0200 Subject: [PATCH 32/93] Spotless --- .../xpack/esql/core/expression/TypeResolutions.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index 18b6e8464d25a..2b5107cf9d2af 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -71,14 +71,8 @@ public static TypeResolution isField(Expression e, String operationName, ParamOr } return new TypeResolution( - format( - null, - "[{}] cannot operate on [{}] which is not an Elasticsearch field", - operationName, - e.sourceText() - ) + format(null, "[{}] cannot operate on [{}] which is not an Elasticsearch field", operationName, e.sourceText()) ); - } public static TypeResolution isIP(Expression e, String operationName, ParamOrdinal paramOrd) { From c1bc3bed2f3045246a6341d2486a82a0cd087676 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 09:56:32 +0200 Subject: [PATCH 33/93] Fix tests --- .../expression/function/fulltext/MatchFunctionTests.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index fdfc3a31de777..30e4eab102ff3 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.Set; import java.util.function.Supplier; import static org.elasticsearch.xpack.esql.action.EsqlCapabilities.Cap.MATCH_FUNCTION; @@ -55,11 +56,15 @@ public static Iterable parameters() { ); } } - List errorsSuppliers = errorsForCasesWithoutExamples(suppliers, (v, p) -> "string"); + List errorsSuppliers = errorsForCasesWithoutExamples(suppliers, MatchFunctionTests::matchTypeErrorSupplier); // Don't test null, as it is not allowed but the expected message is not a type error - so we check it separately in VerifierTests return parameterSuppliersFromTypedData(errorsSuppliers.stream().filter(s -> s.types().contains(DataType.NULL) == false).toList()); } + private static String matchTypeErrorSupplier(boolean includeOrdinal, List> validPerPosition, List types) { + return "[] cannot operate on [" + types.getFirst().typeName() + "] which is not an Elasticsearch field"; + } + private static List validStringDataTypes() { return Arrays.stream(DataType.values()).filter(DataType::isString).toList(); } From 3027f2cde2ab5c09a6b5dc8738c5f2a8cd48fa90 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 10:44:12 +0200 Subject: [PATCH 34/93] Check that conditions in full text functions are all pushable to Lucene --- .../main/resources/match-function.csv-spec | 13 ---------- .../src/main/resources/qstr-function.csv-spec | 13 ---------- .../xpack/esql/analysis/Verifier.java | 25 ++++++++++++++++--- .../xpack/esql/analysis/VerifierTests.java | 20 +++++++++++++++ 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 0f3b48fd88ed9..f110b71c665ed 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -141,19 +141,6 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; -matchWithFunctionNotPushedToLucene -required_capability: match_function - -from books -| where match(title, "rings") and length(description) > 600 -| keep book_no, title; -ignoreOrder:true - -book_no:keyword | title:text -2675 | The Lord of the Rings - Boxed Set -2714 | Return of the King Being the Third Part of The Lord of the Rings -; - matchWithMultipleWhereClauses required_capability: match_function diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec index 2f6313925032e..cd4ccdb5b3e87 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec @@ -88,19 +88,6 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; -qstrWithFunctionNotPushedToLucene -required_capability: qstr_function - -from books -| where qstr("title: rings") and length(description) > 600 -| keep book_no, title; -ignoreOrder:true - -book_no:keyword | title:text -2675 | The Lord of the Rings - Boxed Set -2714 | Return of the King Being the Third Part of The Lord of the Rings -; - qstrWithMultipleWhereClauses required_capability: qstr_function diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index 479cf3661c279..5af8ebb744939 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -645,10 +645,13 @@ private static void checkFilterMatchConditions(LogicalPlan plan, Set fa private static void checkFullTextQueryFunctions(LogicalPlan plan, Set failures) { if (plan instanceof Filter f) { Expression condition = f.condition(); - if (condition instanceof FullTextFunction ftf) { + // Need to check the condition - in case it has a FullTextFunction, all conditions present on it need to be pushed down to + // source + Holder hasFullTextFunction = new Holder<>(false); + condition.forEachDown(FullTextFunction.class, ftf -> { // Similar to cases present in org.elasticsearch.xpack.esql.optimizer.rules.PushDownAndCombineFilters - - // we can't check if it can be pushed down as we don't have yet information about the fields present in the - // StringQueryPredicate + // we can't check if it can be pushed down if we don't have information about the fields present in the query. + hasFullTextFunction.set(true); plan.forEachDown(LogicalPlan.class, lp -> { if ((lp instanceof Filter || lp instanceof OrderBy @@ -664,7 +667,21 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f ); } }); - } + + if ((canPushToSource(condition, x -> false) == false) && hasFullTextFunction.get()) { + // We couldn't push everything to Lucene, and there is a FullTextFunction in the condition. + // Fail this early as we can't push down the FullTextFunction query in this case + failures.add( + fail( + condition, + "Invalid condition [{}]. Use a separate WHERE clause for the {} function instead", + condition.sourceText(), + ftf.functionName(), + ftf.functionName() + ) + ); + } + }); } else { plan.forEachExpression(FullTextFunction.class, ftf -> { failures.add(fail(ftf, "[{}] function is only supported in WHERE commands", ftf.functionName())); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 50eda7a3097f7..16d25f58b1ec9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1148,6 +1148,26 @@ public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { ); } + public void testMatchFunctionNotAllowedWithNonPushableExpressions() { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals( + "1:19: Invalid condition [match(first_name, \"Anna\") or length(first_name) > 5]. " + + "Use a separate WHERE clause for the MATCH function instead", + error("from test | where match(first_name, \"Anna\") or length(first_name) > 5") + ); + } + + public void testQueryStringFunctionNotAllowedWithNonPushableExpressions() { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals( + "1:19: Invalid condition [qstr(\"first_name:Anna\") or length(first_name) > 5]. " + + "Use a separate WHERE clause for the QSTR function instead", + error("from test | where qstr(\"first_name:Anna\") or length(first_name) > 5") + ); + } + public void testQueryStringFunctionOnlyAllowedInWhere() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); From 9fcb0aca00c4b9fcc79b8fd8d7fcb56c35df8092 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 12:32:47 +0200 Subject: [PATCH 35/93] Add LocalPhysicalPlanOptimizerTests for match function --- .../LocalPhysicalPlanOptimizerTests.java | 198 ++++++++++++++++++ 1 file changed, 198 insertions(+) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index c2779b7dbc46d..ddb212ee1ee13 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -609,6 +609,204 @@ public void testQueryStringFunctionMultipleQstrClauses() { assertThat(query.query().toString(), is(expected.toString())); } + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gender{f}#4, job{f}#9, job.raw{f}#10, languages{f}#5, last_na + * me{f}#6, long_noidx{f}#11, salary{f}#7],false] + * \_ProjectExec[[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gender{f}#4, job{f}#9, job.raw{f}#10, languages{f}#5, last_na + * me{f}#6, long_noidx{f}#11, salary{f}#7]] + * \_FieldExtractExec[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gen] + * \_EsQueryExec[test], indexMode[standard], query[{"match":{"last_name":{"query":"Smith"}}}] + */ + public void testMatchFunction() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + var plan = plannerOptimizer.plan(""" + from test + | where match(last_name, "Smith") + """, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + var expected = QueryBuilders.matchQuery("last_name", "Smith"); + assertThat(query.query().toString(), is(expected.toString())); + } + + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#1419, emp_no{f}#1413, first_name{f}#1414, gender{f}#1415, job{f}#1420, job.raw{f}#1421, langua + * ges{f}#1416, last_name{f}#1417, long_noidx{f}#1422, salary{f}#1418],false] + * \_ProjectExec[[_meta_field{f}#1419, emp_no{f}#1413, first_name{f}#1414, gender{f}#1415, job{f}#1420, job.raw{f}#1421, langua + * ges{f}#1416, last_name{f}#1417, long_noidx{f}#1422, salary{f}#1418]] + * \_FieldExtractExec[_meta_field{f}#1419, emp_no{f}#1413, first_name{f}#] + * \EsQueryExec[test], indexMode[standard], query[{"bool":{"must":[{"match":{"last_name":{"query":"Smith"}}}, + * {"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"gt":10010,"boost":1.0}}}, + * "source":"emp_no > 10010@2:39"}}],"boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] + */ + public void testMatchFunctionConjunctionWhereOperands() { + assumeTrue("skipping because QSTR_FUNCTION is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(last_name, "Smith") and emp_no > 10010 + """; + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + Source filterSource = new Source(2, 38, "emp_no > 10000"); + var range = wrapWithSingleQuery(queryText, QueryBuilders.rangeQuery("emp_no").gt(10010), "emp_no", filterSource); + var queryString = QueryBuilders.matchQuery("last_name", "Smith"); + var expected = QueryBuilders.boolQuery().must(queryString).must(range); + assertThat(query.query().toString(), is(expected.toString())); + } + + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n + * ame{f}#7, long_noidx{f}#12, salary{f}#8],false] + * \_ProjectExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n + * ame{f}#7, long_noidx{f}#12, salary{f}#8]] + * \_FieldExtractExec[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gen] + * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"should":[{"match":{"last_name":{"query":"Smith"}}}, + * {"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"gt":10010,"boost":1.0}}},"source":"emp_no > 10010@2:38"}}], + * "boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] + */ + public void testMatchFunctionDisjunctionWhereClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(last_name, "Smith") or emp_no > 10010 + """; + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + Source filterSource = new Source(2, 37, "emp_no > 10000"); + var range = wrapWithSingleQuery(queryText, QueryBuilders.rangeQuery("emp_no").gt(10010), "emp_no", filterSource); + var queryString = QueryBuilders.matchQuery("last_name", "Smith"); + var expected = QueryBuilders.boolQuery().should(queryString).should(range); + assertThat(query.query().toString(), is(expected.toString())); + } + + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[!alias_integer, boolean{f}#4, byte{f}#5, constant_keyword-foo{f}#6, date{f}#7, double{f}#8, float{f}#9, half_ + * float{f}#10, integer{f}#12, ip{f}#13, keyword{f}#14, long{f}#15, scaled_float{f}#11, short{f}#17, text{f}#18, unsigned_long{f}#16], + * false] + * \_ProjectExec[[!alias_integer, boolean{f}#4, byte{f}#5, constant_keyword-foo{f}#6, date{f}#7, double{f}#8, float{f}#9, half_ + * float{f}#10, integer{f}#12, ip{f}#13, keyword{f}#14, long{f}#15, scaled_float{f}#11, short{f}#17, text{f}#18, unsigned_long{f}#16] + * \_FieldExtractExec[!alias_integer, boolean{f}#4, byte{f}#5, constant_k..] + * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"must":[{"match":{"text":{"query":"beta"}}}, + * {"esql_single_value":{"field":"ip","next":{"terms":{"ip":["127.0.0.1/32"],"boost":1.0}}, + * "source":"cidr_match(ip, \"127.0.0.1/32\")@2:33"}}],"boost":1.0}}][_doc{f}#22], limit[1000], sort[] estimatedRowSize[354] + */ + public void testMatchFunctionWithFunctionsPushedToLucene() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(text, "beta") and cidr_match(ip, "127.0.0.1/32") + """; + var analyzer = makeAnalyzer("mapping-all-types.json", new EnrichResolution()); + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS, analyzer); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + Source filterSource = new Source(2, 32, "cidr_match(ip, \"127.0.0.1/32\")"); + var terms = wrapWithSingleQuery(queryText, QueryBuilders.termsQuery("ip", "127.0.0.1/32"), "ip", filterSource); + var queryString = QueryBuilders.matchQuery("text", "beta"); + var expected = QueryBuilders.boolQuery().must(queryString).must(terms); + assertThat(query.query().toString(), is(expected.toString())); + } + + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#1163, emp_no{f}#1157, first_name{f}#1158, gender{f}#1159, job{f}#1164, job.raw{f}#1165, langua + * ges{f}#1160, last_name{f}#1161, long_noidx{f}#1166, salary{f}#1162],false] + * \_ProjectExec[[_meta_field{f}#1163, emp_no{f}#1157, first_name{f}#1158, gender{f}#1159, job{f}#1164, job.raw{f}#1165, langua + * ges{f}#1160, last_name{f}#1161, long_noidx{f}#1166, salary{f}#1162]] + * \_FieldExtractExec[_meta_field{f}#1163, emp_no{f}#1157, first_name{f}#] + * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"must":[{"match":{"last_name":{"query":"Smith"}}}, + * {"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"gt":10010,"boost":1.0}}}, + * "source":"emp_no > 10010@3:9"}}],"boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] + */ + public void testMatchFunctionMultipleWhereClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(last_name, "Smith") + | where emp_no > 10010 + """; + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + Source filterSource = new Source(3, 8, "emp_no > 10000"); + var range = wrapWithSingleQuery(queryText, QueryBuilders.rangeQuery("emp_no").gt(10010), "emp_no", filterSource); + var queryString = QueryBuilders.matchQuery("last_name", "Smith"); + var expected = QueryBuilders.boolQuery().must(queryString).must(range); + assertThat(query.query().toString(), is(expected.toString())); + } + + /** + * Expecting + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gender{f}#4, job{f}#9, job.raw{f}#10, languages{f}#5, last_na + * me{f}#6, long_noidx{f}#11, salary{f}#7],false] + * \_ProjectExec[[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gender{f}#4, job{f}#9, job.raw{f}#10, languages{f}#5, last_na + * me{f}#6, long_noidx{f}#11, salary{f}#7]] + * \_FieldExtractExec[_meta_field{f}#8, emp_no{f}#2, first_name{f}#3, gen] + * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"must":[{"match":{"last_name":{"query":"Smith"}}}, + * {"match":{"first_name":{"query":"John"}}}],"boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] + */ + public void testMatchFunctionMultipleQstrClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(last_name, "Smith") and match(first_name, "John") + """; + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + var queryStringLeft = QueryBuilders.matchQuery("last_name", "Smith"); + var queryStringRight = QueryBuilders.matchQuery("first_name", "John"); + var expected = QueryBuilders.boolQuery().must(queryStringLeft).must(queryStringRight); + assertThat(query.query().toString(), is(expected.toString())); + } + // optimizer doesn't know yet how to break down different multi count public void testCountFieldsAndAllWithFilter() { var plan = plannerOptimizer.plan(""" From 1358ef715170ac8ca57f5e46dd1c3aebc3933d0f Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 14:00:35 +0200 Subject: [PATCH 36/93] Remove test with non-pushed down function --- .../LocalPhysicalPlanOptimizerTests.java | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index ddb212ee1ee13..b4f5f540a43c0 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -50,7 +50,6 @@ import org.elasticsearch.xpack.esql.plan.physical.EvalExec; import org.elasticsearch.xpack.esql.plan.physical.ExchangeExec; import org.elasticsearch.xpack.esql.plan.physical.FieldExtractExec; -import org.elasticsearch.xpack.esql.plan.physical.FilterExec; import org.elasticsearch.xpack.esql.plan.physical.LimitExec; import org.elasticsearch.xpack.esql.plan.physical.LocalSourceExec; import org.elasticsearch.xpack.esql.plan.physical.PhysicalPlan; @@ -505,41 +504,6 @@ public void testQueryStringFunctionWithFunctionsPushedToLucene() { assertThat(query.query().toString(), is(expected.toString())); } - /** - * Expecting - *LimitExec[1000[INTEGER]] - * \_ExchangeExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8],false] - * \_ProjectExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8]] - * \_FieldExtractExec[_meta_field{f}#9, emp_no{f}#3, gender{f}#5, job{f}#] - * \_LimitExec[1000[INTEGER]] - * \_FilterExec[LENGTH(first_name{f}#4) > 10[INTEGER]] - * \_FieldExtractExec[first_name{f}#4] - * \_EsQueryExec[test], indexMode[standard], - * query[{"query_string":{"query":"last_name: Smith","fields":[]}}][_doc{f}#13], limit[], sort[] estimatedRowSize[324] - */ - public void testQueryStringFunctionWithFunctionNotPushedDown() { - assumeTrue("skipping because QSTR_FUNCTION is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - String queryText = """ - from test - | where qstr("last_name: Smith") and length(first_name) > 10 - """; - var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); - - var firstLimit = as(plan, LimitExec.class); - var exchange = as(firstLimit.child(), ExchangeExec.class); - var project = as(exchange.child(), ProjectExec.class); - var field = as(project.child(), FieldExtractExec.class); - var secondLimit = as(field.child(), LimitExec.class); - var filter = as(secondLimit.child(), FilterExec.class); - var fieldExtract = as(filter.child(), FieldExtractExec.class); - var query = as(fieldExtract.child(), EsQueryExec.class); - - var expected = QueryBuilders.queryStringQuery("last_name: Smith"); - assertThat(query.query().toString(), is(expected.toString())); - } - /** * Expecting * LimitExec[1000[INTEGER]] From b19751e4cc668666938b77abfd1be077ecbba30d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 14:28:20 +0200 Subject: [PATCH 37/93] Change function description --- .../esql/functions/kibana/definition/match.json | 16 ++++++++-------- .../esql/functions/parameters/match.asciidoc | 4 ++-- .../function/fulltext/MatchFunction.java | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/reference/esql/functions/kibana/definition/match.json b/docs/reference/esql/functions/kibana/definition/match.json index 0d3839903eebf..867507bfcc408 100644 --- a/docs/reference/esql/functions/kibana/definition/match.json +++ b/docs/reference/esql/functions/kibana/definition/match.json @@ -10,13 +10,13 @@ "name" : "field", "type" : "keyword", "optional" : false, - "description" : "Field or field pattern that the query will target." + "description" : "Field that the query will target." }, { "name" : "query", "type" : "keyword", "optional" : false, - "description" : "Query string in Lucene query string format." + "description" : "Text you wish to find in the provided field." } ], "variadic" : false, @@ -28,13 +28,13 @@ "name" : "field", "type" : "keyword", "optional" : false, - "description" : "Field or field pattern that the query will target." + "description" : "Field that the query will target." }, { "name" : "query", "type" : "text", "optional" : false, - "description" : "Query string in Lucene query string format." + "description" : "Text you wish to find in the provided field." } ], "variadic" : false, @@ -46,13 +46,13 @@ "name" : "field", "type" : "text", "optional" : false, - "description" : "Field or field pattern that the query will target." + "description" : "Field that the query will target." }, { "name" : "query", "type" : "keyword", "optional" : false, - "description" : "Query string in Lucene query string format." + "description" : "Text you wish to find in the provided field." } ], "variadic" : false, @@ -64,13 +64,13 @@ "name" : "field", "type" : "text", "optional" : false, - "description" : "Field or field pattern that the query will target." + "description" : "Field that the query will target." }, { "name" : "query", "type" : "text", "optional" : false, - "description" : "Query string in Lucene query string format." + "description" : "Text you wish to find in the provided field." } ], "variadic" : false, diff --git a/docs/reference/esql/functions/parameters/match.asciidoc b/docs/reference/esql/functions/parameters/match.asciidoc index ef6e2d58822dc..f18adb28cd20c 100644 --- a/docs/reference/esql/functions/parameters/match.asciidoc +++ b/docs/reference/esql/functions/parameters/match.asciidoc @@ -3,7 +3,7 @@ *Parameters* `field`:: -Field or field pattern that the query will target. +Field that the query will target. `query`:: -Query string in Lucene query string format. +Text you wish to find in the provided field. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 8ffad83b81263..b56193f44f6bf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -57,12 +57,12 @@ public MatchFunction( @Param( name = "field", type = { "keyword", "text" }, - description = "Field or field pattern that the query will target." + description = "Field that the query will target." ) Expression field, @Param( name = "query", type = { "keyword", "text" }, - description = "Query string in Lucene query string format." + description = "Text you wish to find in the provided field." ) Expression matchQuery ) { super(source, matchQuery, field); From 9762245617837bba6a2f3512a71d3221071c2f83 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 30 Sep 2024 15:22:21 +0200 Subject: [PATCH 38/93] Right, Spotless --- .../esql/expression/function/fulltext/MatchFunction.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index b56193f44f6bf..69e4972c8d64d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -54,11 +54,7 @@ public class MatchFunction extends FullTextFunction { ) public MatchFunction( Source source, - @Param( - name = "field", - type = { "keyword", "text" }, - description = "Field that the query will target." - ) Expression field, + @Param(name = "field", type = { "keyword", "text" }, description = "Field that the query will target.") Expression field, @Param( name = "query", type = { "keyword", "text" }, From 0cf99be63600aefe91bdf0318c27ea4374d18627 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 1 Oct 2024 15:36:16 +0200 Subject: [PATCH 39/93] Reword error message --- .../xpack/esql/core/expression/TypeResolutions.java | 2 +- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 4 ++-- .../esql/expression/function/fulltext/MatchFunctionTests.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index 2b5107cf9d2af..5c8576ae7e02e 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -71,7 +71,7 @@ public static TypeResolution isField(Expression e, String operationName, ParamOr } return new TypeResolution( - format(null, "[{}] cannot operate on [{}] which is not an Elasticsearch field", operationName, e.sourceText()) + format(null, "[{}] cannot operate on [{}], which is not a field from an index mapping", operationName, e.sourceText()) ); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 16d25f58b1ec9..ecb60ed08b6d1 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1252,11 +1252,11 @@ public void testMatchFunctionTargetsExistingField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); assertEquals( - "1:47: [match(y, \"Anna\")] cannot operate on [y] which is not an Elasticsearch field", + "1:47: [match(y, \"Anna\")] cannot operate on [y], which is not a field from an index mapping", error("from test | eval y = concat(\"a\", \"b\") | where match(y, \"Anna\"" + ")") ); assertEquals( - "1:47: [match(name, \"Anna\")] cannot operate on [name] which is not an Elasticsearch field", + "1:47: [match(name, \"Anna\")] cannot operate on [name], which is not a field from an index mapping", error("from test | rename first_name as name | where match(name, \"Anna\"" + ")") ); assertEquals("1:39: Unknown column [first_name]", error("from test | keep emp_no | where match(first_name, \"Anna\"" + ")")); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index 30e4eab102ff3..4295e9cc2fe32 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -62,7 +62,7 @@ public static Iterable parameters() { } private static String matchTypeErrorSupplier(boolean includeOrdinal, List> validPerPosition, List types) { - return "[] cannot operate on [" + types.getFirst().typeName() + "] which is not an Elasticsearch field"; + return "[] cannot operate on [" + types.getFirst().typeName() + "], which is not a field from an index mapping"; } private static List validStringDataTypes() { From 87609922d8863afbfc006d34d15689e6cd0566aa Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 1 Oct 2024 15:37:31 +0200 Subject: [PATCH 40/93] Improve condition performance --- .../java/org/elasticsearch/xpack/esql/analysis/Verifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index 5af8ebb744939..dfc82a72210d7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -668,7 +668,7 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f } }); - if ((canPushToSource(condition, x -> false) == false) && hasFullTextFunction.get()) { + if (hasFullTextFunction.get() && (canPushToSource(condition, x -> false) == false)) { // We couldn't push everything to Lucene, and there is a FullTextFunction in the condition. // Fail this early as we can't push down the FullTextFunction query in this case failures.add( From 67a9fb05d79b7eb73c02409460b7ecfeed697e3d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 1 Oct 2024 15:49:22 +0200 Subject: [PATCH 41/93] Refactor checks for asQuery() method --- .../function/fulltext/FullTextFunction.java | 23 +++++++++++++++++-- .../function/fulltext/MatchFunction.java | 12 +++------- .../fulltext/QueryStringFunction.java | 10 ++------ 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 251bb35cd6906..3a961feaff07b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -7,6 +7,7 @@ package org.elasticsearch.xpack.esql.expression.function.fulltext; +import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; @@ -20,6 +21,7 @@ import java.util.List; import java.util.stream.Stream; +import static org.elasticsearch.common.logging.LoggerMessageFormat.format; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNullAndFoldable; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; @@ -80,9 +82,26 @@ public Expression query() { /** * Returns the resulting Query for the function parameters so it can be pushed down to Lucene - * @return + * + * @return Lucene query + */ + public final Query asQuery() { + Object queryAsObject = query().fold(); + if (queryAsObject instanceof BytesRef bytesRef) { + return asQuery(bytesRef.utf8ToString()); + } + + throw new IllegalArgumentException( + format(null, "{} argument in {} function needs to be resolved to a string", queryParamOrdinal(), functionName()) + ); + } + + /** + * Overriden by subclasses to return the corresponding Lucene query from a query text + * + * @return corresponding query for the query text */ - public abstract Query asQuery(); + protected abstract Query asQuery(String queryText); /** * Returns the param ordinal for the query parameter so it can be used in error messages diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 69e4972c8d64d..f4c43fd2ec246 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.esql.expression.function.fulltext; -import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -49,7 +48,7 @@ public class MatchFunction extends FullTextFunction { @FunctionInfo( returnType = "boolean", preview = true, - description = "Performs a match query on the specified fields. Returns true if the provided query matches the row.", + description = "Performs a match query on the specified field. Returns true if the provided query matches the row.", examples = { @Example(file = "match-function", tag = "match-with-field") } ) public MatchFunction( @@ -82,13 +81,8 @@ public String functionName() { } @Override - public Query asQuery() { - Object queryAsObject = query().fold(); - if (queryAsObject instanceof BytesRef == false) { - throw new IllegalArgumentException("Query in MATCH function needs to be resolved to a string"); - } - - return new MatchQuery(source(), ((FieldAttribute) field).name(), ((BytesRef) queryAsObject).utf8ToString()); + public Query asQuery(String queryText) { + return new MatchQuery(source(), ((FieldAttribute) field).name(), queryText); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 41a319f666f7e..3f723a662e808 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -7,7 +7,6 @@ package org.elasticsearch.xpack.esql.expression.function.fulltext; -import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -69,13 +68,8 @@ public String functionName() { } @Override - public Query asQuery() { - Object queryAsObject = query().fold(); - if (queryAsObject instanceof BytesRef queryAsBytesRef) { - return new QueryStringQuery(source(), queryAsBytesRef.utf8ToString(), Map.of(), null); - } else { - throw new IllegalArgumentException("Query in QSTR function needs to be resolved to a string"); - } + public Query asQuery(String queryText) { + return new QueryStringQuery(source(), queryText, Map.of(), null); } @Override From a976d2c1c0556722ee98fe1dae854ee99df141e1 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 1 Oct 2024 15:51:20 +0200 Subject: [PATCH 42/93] Fix docs --- docs/reference/esql/functions/description/match.asciidoc | 2 +- docs/reference/esql/functions/kibana/definition/match.json | 2 +- docs/reference/esql/functions/kibana/docs/match.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/esql/functions/description/match.asciidoc b/docs/reference/esql/functions/description/match.asciidoc index b90a63230a689..2a27fe4814395 100644 --- a/docs/reference/esql/functions/description/match.asciidoc +++ b/docs/reference/esql/functions/description/match.asciidoc @@ -2,4 +2,4 @@ *Description* -Performs a match query on the specified fields. Returns true if the provided query matches the row. +Performs a match query on the specified field. Returns true if the provided query matches the row. diff --git a/docs/reference/esql/functions/kibana/definition/match.json b/docs/reference/esql/functions/kibana/definition/match.json index 867507bfcc408..93299576b4f86 100644 --- a/docs/reference/esql/functions/kibana/definition/match.json +++ b/docs/reference/esql/functions/kibana/definition/match.json @@ -2,7 +2,7 @@ "comment" : "This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../README.md for how to regenerate it.", "type" : "eval", "name" : "match", - "description" : "Performs a match query on the specified fields. Returns true if the provided query matches the row.", + "description" : "Performs a match query on the specified field. Returns true if the provided query matches the row.", "signatures" : [ { "params" : [ diff --git a/docs/reference/esql/functions/kibana/docs/match.md b/docs/reference/esql/functions/kibana/docs/match.md index a757605d720b6..3c06662982bbf 100644 --- a/docs/reference/esql/functions/kibana/docs/match.md +++ b/docs/reference/esql/functions/kibana/docs/match.md @@ -3,7 +3,7 @@ This is generated by ESQL's AbstractFunctionTestCase. Do no edit it. See ../READ --> ### MATCH -Performs a match query on the specified fields. Returns true if the provided query matches the row. +Performs a match query on the specified field. Returns true if the provided query matches the row. ``` from books From 41dc6d393e65a614dbd2cc81e738e841494ea7e1 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 1 Oct 2024 17:25:22 +0200 Subject: [PATCH 43/93] Refactor verifier code --- .../xpack/esql/analysis/Verifier.java | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index dfc82a72210d7..e4e15ef62592c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -645,47 +645,50 @@ private static void checkFilterMatchConditions(LogicalPlan plan, Set fa private static void checkFullTextQueryFunctions(LogicalPlan plan, Set failures) { if (plan instanceof Filter f) { Expression condition = f.condition(); - // Need to check the condition - in case it has a FullTextFunction, all conditions present on it need to be pushed down to - // source - Holder hasFullTextFunction = new Holder<>(false); - condition.forEachDown(FullTextFunction.class, ftf -> { - // Similar to cases present in org.elasticsearch.xpack.esql.optimizer.rules.PushDownAndCombineFilters - - // we can't check if it can be pushed down if we don't have information about the fields present in the query. - hasFullTextFunction.set(true); - plan.forEachDown(LogicalPlan.class, lp -> { - if ((lp instanceof Filter - || lp instanceof OrderBy - || lp instanceof EsRelation - || ftf.hasFieldsInformation()) == false) { - failures.add( - fail( - plan, - "[{}] function cannot be used after {}", - ftf.functionName(), - lp.sourceText().split(" ")[0].toUpperCase(Locale.ROOT) - ) - ); - } - }); - - if (hasFullTextFunction.get() && (canPushToSource(condition, x -> false) == false)) { - // We couldn't push everything to Lucene, and there is a FullTextFunction in the condition. - // Fail this early as we can't push down the FullTextFunction query in this case - failures.add( - fail( - condition, - "Invalid condition [{}]. Use a separate WHERE clause for the {} function instead", - condition.sourceText(), - ftf.functionName(), - ftf.functionName() - ) - ); - } - }); + Holder functionHolder = new Holder<>(); + condition.forEachDown(FullTextFunction.class, functionHolder::set); + FullTextFunction ftf = functionHolder.get(); + if (ftf != null) { + checkCommandUsageAfterFullTextFunction(ftf, plan, failures); + checkConditionCanBePushedDown(ftf, condition, failures); + } } else { plan.forEachExpression(FullTextFunction.class, ftf -> { failures.add(fail(ftf, "[{}] function is only supported in WHERE commands", ftf.functionName())); }); } } + + private static void checkCommandUsageAfterFullTextFunction(FullTextFunction ftf, LogicalPlan plan, Set failures) { + // Similar to cases present in org.elasticsearch.xpack.esql.optimizer.rules.PushDownAndCombineFilters - + // we can't check if it can be pushed down if we don't have information about the fields present in the query. + plan.forEachDown(LogicalPlan.class, lp -> { + if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation || ftf.hasFieldsInformation()) == false) { + failures.add( + fail( + plan, + "[{}] function cannot be used after {}", + ftf.functionName(), + lp.sourceText().split(" ")[0].toUpperCase(Locale.ROOT) + ) + ); + } + }); + } + + private static void checkConditionCanBePushedDown(FullTextFunction ftf, Expression condition, Set failures) { + if (canPushToSource(condition, x -> false) == false) { + // We couldn't push everything to Lucene, and there is a FullTextFunction in the condition. + // Fail this early as we can't push down the FullTextFunction query in this case + failures.add( + fail( + condition, + "Invalid condition [{}]. Use a separate WHERE clause for the {} function instead", + condition.sourceText(), + ftf.functionName(), + ftf.functionName() + ) + ); + } + } } From 5a8a4f508e2403b9513a9813ad86d8b8c71eaf1f Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 09:50:21 +0200 Subject: [PATCH 44/93] Implement Validatable for checking that field is an Elasticsearch field --- .../esql/core/expression/TypeResolutions.java | 12 --------- .../function/fulltext/MatchFunction.java | 24 +++++++++++++---- .../xpack/esql/analysis/VerifierTests.java | 8 ------ .../function/fulltext/MatchFunctionTests.java | 26 ++++++++++++------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java index 5c8576ae7e02e..b817ec17c7bda 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/TypeResolutions.java @@ -63,18 +63,6 @@ public static TypeResolution isString(Expression e, String operationName, ParamO return isType(e, DataType::isString, operationName, paramOrd, "string"); } - public static TypeResolution isField(Expression e, String operationName, ParamOrdinal paramOrd) { - if (e instanceof FieldAttribute fa) { - if (fa.resolved()) { - return TypeResolution.TYPE_RESOLVED; - } - } - - return new TypeResolution( - format(null, "[{}] cannot operate on [{}], which is not a field from an index mapping", operationName, e.sourceText()) - ); - } - public static TypeResolution isIP(Expression e, String operationName, ParamOrdinal paramOrd) { return isType(e, dt -> dt == IP, operationName, paramOrd, "ip"); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index f4c43fd2ec246..8487bf527c2c5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -10,6 +10,9 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.xpack.esql.capabilities.Validatable; +import org.elasticsearch.xpack.esql.common.Failure; +import org.elasticsearch.xpack.esql.common.Failures; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.FieldAttribute; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; @@ -28,14 +31,13 @@ import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND; -import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isField; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isNotNull; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.isString; /** * Full text function that performs a {@link QueryStringQuery} . */ -public class MatchFunction extends FullTextFunction { +public class MatchFunction extends FullTextFunction implements Validatable { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Expression.class, @@ -87,9 +89,21 @@ public Query asQuery(String queryText) { @Override protected TypeResolution resolveNonQueryParamTypes() { - return isNotNull(field, sourceText(), FIRST).and(isField(field, sourceText(), FIRST)) - .and(isString(field, sourceText(), FIRST)) - .and(super.resolveNonQueryParamTypes()); + return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes()); + } + + @Override + public void validate(Failures failures) { + if (field instanceof FieldAttribute == false) { + failures.add( + Failure.fail( + field, + "[{}] cannot operate on [{}], which is not a field from an index mapping", + functionName(), + field.sourceText() + ) + ); + } } @Override diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index ecb60ed08b6d1..c85126693e322 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1251,14 +1251,6 @@ public void testMatchFunctionNullArgs() throws Exception { public void testMatchFunctionTargetsExistingField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - assertEquals( - "1:47: [match(y, \"Anna\")] cannot operate on [y], which is not a field from an index mapping", - error("from test | eval y = concat(\"a\", \"b\") | where match(y, \"Anna\"" + ")") - ); - assertEquals( - "1:47: [match(name, \"Anna\")] cannot operate on [name], which is not a field from an index mapping", - error("from test | rename first_name as name | where match(name, \"Anna\"" + ")") - ); assertEquals("1:39: Unknown column [first_name]", error("from test | keep emp_no | where match(first_name, \"Anna\"" + ")")); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java index 4295e9cc2fe32..5c4e48d14f501 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java @@ -44,19 +44,33 @@ public MatchFunctionTests(@Name("TestCase") Supplier @ParametersFactory public static Iterable parameters() { + Set supported = Set.of(DataType.KEYWORD, DataType.TEXT); + List> supportedPerPosition = List.of(supported, supported); List suppliers = new LinkedList<>(); for (DataType fieldType : validStringDataTypes()) { for (DataType queryType : validStringDataTypes()) { suppliers.add( new TestCaseSupplier( - "<" + fieldType + ", " + queryType + ">", + "<" + fieldType + "-ES field, " + queryType + ">", List.of(fieldType, queryType), () -> testCase(fieldType, randomIdentifier(), queryType, randomAlphaOfLengthBetween(1, 10), equalTo(true)) ) ); + suppliers.add( + new TestCaseSupplier( + "<" + fieldType + "-non ES field, " + queryType + ">", + List.of(fieldType, queryType), + typeErrorSupplier( + true, + supportedPerPosition, + List.of(fieldType, queryType), + MatchFunctionTests::matchTypeErrorSupplier + ) + ) + ); } } - List errorsSuppliers = errorsForCasesWithoutExamples(suppliers, MatchFunctionTests::matchTypeErrorSupplier); + List errorsSuppliers = errorsForCasesWithoutExamples(suppliers, (v, p) -> "string"); // Don't test null, as it is not allowed but the expected message is not a type error - so we check it separately in VerifierTests return parameterSuppliersFromTypedData(errorsSuppliers.stream().filter(s -> s.types().contains(DataType.NULL) == false).toList()); } @@ -69,14 +83,6 @@ private static List validStringDataTypes() { return Arrays.stream(DataType.values()).filter(DataType::isString).toList(); } - public final void testFold() { - Expression expression = buildLiteralExpression(testCase); - if (testCase.getExpectedTypeError() != null) { - assertTrue("expected unresolved", expression.typeResolved().unresolved()); - assertThat(expression.typeResolved().message(), equalTo(testCase.getExpectedTypeError())); - } - } - private static TestCaseSupplier.TestCase testCase( DataType fieldType, String field, From 79cd897df7e7ca257ab74c2f72a12213b020fb52 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 10:29:02 +0200 Subject: [PATCH 45/93] Grammar changes from PR review --- .../esql/src/main/antlr/EsqlBaseParser.g4 | 8 +- .../xpack/esql/parser/EsqlBaseParser.interp | 4 +- .../xpack/esql/parser/EsqlBaseParser.java | 1127 +++++++++-------- .../parser/EsqlBaseParserBaseListener.java | 4 +- .../parser/EsqlBaseParserBaseVisitor.java | 2 +- .../esql/parser/EsqlBaseParserListener.java | 8 +- .../esql/parser/EsqlBaseParserVisitor.java | 4 +- .../xpack/esql/parser/EsqlParser.java | 2 +- .../xpack/esql/parser/ExpressionBuilder.java | 2 +- .../xpack/esql/parser/IdentifierBuilder.java | 2 +- 10 files changed, 590 insertions(+), 573 deletions(-) diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 index e374552fe3a41..2684baffe566b 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4 @@ -102,13 +102,13 @@ primaryExpression ; functionExpression - : functionIdentifier LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP + : functionName LP (ASTERISK | (booleanExpression (COMMA booleanExpression)*))? RP ; -functionIdentifier - : identifier +functionName // Additional function identifiers that are already a reserved word in the language - | DEV_MATCH + : {this.isDevVersion()}? DEV_MATCH + | identifier ; dataType diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index 1ccbe44f24510..08418ae4e5e1c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -267,7 +267,7 @@ valueExpression operatorExpression primaryExpression functionExpression -functionIdentifier +functionName dataType rowCommand fields @@ -318,4 +318,4 @@ inlinestatsCommand atn: -[4, 1, 125, 584, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 142, 8, 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, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 179, 8, 5, 10, 5, 12, 5, 182, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 203, 8, 5, 10, 5, 12, 5, 206, 9, 5, 1, 6, 1, 6, 3, 6, 210, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 222, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 233, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 239, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 247, 8, 9, 10, 9, 12, 9, 250, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 3, 11, 281, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 297, 8, 15, 10, 15, 12, 15, 300, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 307, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 313, 8, 17, 10, 17, 12, 17, 316, 9, 17, 1, 17, 3, 17, 319, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 326, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 334, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 340, 8, 22, 10, 22, 12, 22, 343, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 353, 8, 24, 10, 24, 12, 24, 356, 9, 24, 1, 24, 3, 24, 359, 8, 24, 1, 24, 1, 24, 3, 24, 363, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 370, 8, 26, 1, 26, 1, 26, 3, 26, 374, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 379, 8, 27, 10, 27, 12, 27, 382, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 387, 8, 28, 10, 28, 12, 28, 390, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 395, 8, 29, 10, 29, 12, 29, 398, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 417, 8, 32, 10, 32, 12, 32, 420, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 428, 8, 32, 10, 32, 12, 32, 431, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 439, 8, 32, 10, 32, 12, 32, 442, 9, 32, 1, 32, 1, 32, 3, 32, 446, 8, 32, 1, 33, 1, 33, 3, 33, 450, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 459, 8, 35, 10, 35, 12, 35, 462, 9, 35, 1, 36, 1, 36, 3, 36, 466, 8, 36, 1, 36, 1, 36, 3, 36, 470, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 482, 8, 39, 10, 39, 12, 39, 485, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 495, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 507, 8, 44, 10, 44, 12, 44, 510, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 520, 8, 47, 1, 48, 3, 48, 523, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 528, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 553, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 559, 8, 56, 10, 56, 12, 56, 562, 9, 56, 3, 56, 564, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 569, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 582, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 60, 61, 1, 0, 62, 64, 2, 0, 27, 27, 77, 77, 1, 0, 68, 69, 2, 0, 32, 32, 36, 36, 2, 0, 39, 39, 42, 42, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 609, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 141, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 221, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 286, 1, 0, 0, 0, 26, 288, 1, 0, 0, 0, 28, 290, 1, 0, 0, 0, 30, 293, 1, 0, 0, 0, 32, 306, 1, 0, 0, 0, 34, 308, 1, 0, 0, 0, 36, 325, 1, 0, 0, 0, 38, 327, 1, 0, 0, 0, 40, 329, 1, 0, 0, 0, 42, 333, 1, 0, 0, 0, 44, 335, 1, 0, 0, 0, 46, 344, 1, 0, 0, 0, 48, 348, 1, 0, 0, 0, 50, 364, 1, 0, 0, 0, 52, 367, 1, 0, 0, 0, 54, 375, 1, 0, 0, 0, 56, 383, 1, 0, 0, 0, 58, 391, 1, 0, 0, 0, 60, 399, 1, 0, 0, 0, 62, 401, 1, 0, 0, 0, 64, 445, 1, 0, 0, 0, 66, 449, 1, 0, 0, 0, 68, 451, 1, 0, 0, 0, 70, 454, 1, 0, 0, 0, 72, 463, 1, 0, 0, 0, 74, 471, 1, 0, 0, 0, 76, 474, 1, 0, 0, 0, 78, 477, 1, 0, 0, 0, 80, 486, 1, 0, 0, 0, 82, 490, 1, 0, 0, 0, 84, 496, 1, 0, 0, 0, 86, 500, 1, 0, 0, 0, 88, 503, 1, 0, 0, 0, 90, 511, 1, 0, 0, 0, 92, 515, 1, 0, 0, 0, 94, 519, 1, 0, 0, 0, 96, 522, 1, 0, 0, 0, 98, 527, 1, 0, 0, 0, 100, 531, 1, 0, 0, 0, 102, 533, 1, 0, 0, 0, 104, 535, 1, 0, 0, 0, 106, 538, 1, 0, 0, 0, 108, 542, 1, 0, 0, 0, 110, 545, 1, 0, 0, 0, 112, 548, 1, 0, 0, 0, 114, 568, 1, 0, 0, 0, 116, 572, 1, 0, 0, 0, 118, 577, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 26, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 142, 3, 104, 52, 0, 135, 142, 3, 34, 17, 0, 136, 142, 3, 110, 55, 0, 137, 142, 3, 28, 14, 0, 138, 142, 3, 108, 54, 0, 139, 140, 4, 2, 1, 0, 140, 142, 3, 48, 24, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 5, 1, 0, 0, 0, 143, 160, 3, 50, 25, 0, 144, 160, 3, 8, 4, 0, 145, 160, 3, 74, 37, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 52, 26, 0, 148, 160, 3, 70, 35, 0, 149, 160, 3, 76, 38, 0, 150, 160, 3, 78, 39, 0, 151, 160, 3, 82, 41, 0, 152, 160, 3, 84, 42, 0, 153, 160, 3, 112, 56, 0, 154, 160, 3, 86, 43, 0, 155, 156, 4, 3, 2, 0, 156, 160, 3, 118, 59, 0, 157, 158, 4, 3, 3, 0, 158, 160, 3, 116, 58, 0, 159, 143, 1, 0, 0, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 17, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 45, 0, 0, 166, 195, 3, 10, 5, 8, 167, 195, 3, 16, 8, 0, 168, 195, 3, 12, 6, 0, 169, 171, 3, 16, 8, 0, 170, 172, 5, 45, 0, 0, 171, 170, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 5, 40, 0, 0, 174, 175, 5, 44, 0, 0, 175, 180, 3, 16, 8, 0, 176, 177, 5, 35, 0, 0, 177, 179, 3, 16, 8, 0, 178, 176, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 51, 0, 0, 184, 195, 1, 0, 0, 0, 185, 186, 3, 16, 8, 0, 186, 188, 5, 41, 0, 0, 187, 189, 5, 45, 0, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 5, 46, 0, 0, 191, 195, 1, 0, 0, 0, 192, 193, 4, 5, 4, 0, 193, 195, 3, 14, 7, 0, 194, 164, 1, 0, 0, 0, 194, 167, 1, 0, 0, 0, 194, 168, 1, 0, 0, 0, 194, 169, 1, 0, 0, 0, 194, 185, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 204, 1, 0, 0, 0, 196, 197, 10, 5, 0, 0, 197, 198, 5, 31, 0, 0, 198, 203, 3, 10, 5, 6, 199, 200, 10, 4, 0, 0, 200, 201, 5, 48, 0, 0, 201, 203, 3, 10, 5, 5, 202, 196, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 209, 3, 16, 8, 0, 208, 210, 5, 45, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 5, 43, 0, 0, 212, 213, 3, 100, 50, 0, 213, 222, 1, 0, 0, 0, 214, 216, 3, 16, 8, 0, 215, 217, 5, 45, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 50, 0, 0, 219, 220, 3, 100, 50, 0, 220, 222, 1, 0, 0, 0, 221, 207, 1, 0, 0, 0, 221, 214, 1, 0, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 3, 16, 8, 0, 224, 225, 5, 20, 0, 0, 225, 226, 3, 100, 50, 0, 226, 15, 1, 0, 0, 0, 227, 233, 3, 18, 9, 0, 228, 229, 3, 18, 9, 0, 229, 230, 3, 102, 51, 0, 230, 231, 3, 18, 9, 0, 231, 233, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 17, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 239, 3, 20, 10, 0, 236, 237, 7, 0, 0, 0, 237, 239, 3, 18, 9, 3, 238, 234, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 1, 0, 0, 0, 240, 241, 10, 2, 0, 0, 241, 242, 7, 1, 0, 0, 242, 247, 3, 18, 9, 3, 243, 244, 10, 1, 0, 0, 244, 245, 7, 0, 0, 0, 245, 247, 3, 18, 9, 2, 246, 240, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 19, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 6, 10, -1, 0, 252, 260, 3, 64, 32, 0, 253, 260, 3, 54, 27, 0, 254, 260, 3, 22, 11, 0, 255, 256, 5, 44, 0, 0, 256, 257, 3, 10, 5, 0, 257, 258, 5, 51, 0, 0, 258, 260, 1, 0, 0, 0, 259, 251, 1, 0, 0, 0, 259, 253, 1, 0, 0, 0, 259, 254, 1, 0, 0, 0, 259, 255, 1, 0, 0, 0, 260, 266, 1, 0, 0, 0, 261, 262, 10, 1, 0, 0, 262, 263, 5, 34, 0, 0, 263, 265, 3, 26, 13, 0, 264, 261, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 3, 24, 12, 0, 270, 280, 5, 44, 0, 0, 271, 281, 5, 62, 0, 0, 272, 277, 3, 10, 5, 0, 273, 274, 5, 35, 0, 0, 274, 276, 3, 10, 5, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 271, 1, 0, 0, 0, 280, 272, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 5, 51, 0, 0, 283, 23, 1, 0, 0, 0, 284, 287, 3, 60, 30, 0, 285, 287, 5, 20, 0, 0, 286, 284, 1, 0, 0, 0, 286, 285, 1, 0, 0, 0, 287, 25, 1, 0, 0, 0, 288, 289, 3, 60, 30, 0, 289, 27, 1, 0, 0, 0, 290, 291, 5, 13, 0, 0, 291, 292, 3, 30, 15, 0, 292, 29, 1, 0, 0, 0, 293, 298, 3, 32, 16, 0, 294, 295, 5, 35, 0, 0, 295, 297, 3, 32, 16, 0, 296, 294, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 31, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 307, 3, 10, 5, 0, 302, 303, 3, 54, 27, 0, 303, 304, 5, 33, 0, 0, 304, 305, 3, 10, 5, 0, 305, 307, 1, 0, 0, 0, 306, 301, 1, 0, 0, 0, 306, 302, 1, 0, 0, 0, 307, 33, 1, 0, 0, 0, 308, 309, 5, 6, 0, 0, 309, 314, 3, 36, 18, 0, 310, 311, 5, 35, 0, 0, 311, 313, 3, 36, 18, 0, 312, 310, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 318, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 317, 319, 3, 42, 21, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 35, 1, 0, 0, 0, 320, 321, 3, 38, 19, 0, 321, 322, 5, 109, 0, 0, 322, 323, 3, 40, 20, 0, 323, 326, 1, 0, 0, 0, 324, 326, 3, 40, 20, 0, 325, 320, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 37, 1, 0, 0, 0, 327, 328, 5, 77, 0, 0, 328, 39, 1, 0, 0, 0, 329, 330, 7, 2, 0, 0, 330, 41, 1, 0, 0, 0, 331, 334, 3, 44, 22, 0, 332, 334, 3, 46, 23, 0, 333, 331, 1, 0, 0, 0, 333, 332, 1, 0, 0, 0, 334, 43, 1, 0, 0, 0, 335, 336, 5, 76, 0, 0, 336, 341, 5, 77, 0, 0, 337, 338, 5, 35, 0, 0, 338, 340, 5, 77, 0, 0, 339, 337, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 45, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 66, 0, 0, 345, 346, 3, 44, 22, 0, 346, 347, 5, 67, 0, 0, 347, 47, 1, 0, 0, 0, 348, 349, 5, 21, 0, 0, 349, 354, 3, 36, 18, 0, 350, 351, 5, 35, 0, 0, 351, 353, 3, 36, 18, 0, 352, 350, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 359, 3, 30, 15, 0, 358, 357, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 361, 5, 30, 0, 0, 361, 363, 3, 30, 15, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 49, 1, 0, 0, 0, 364, 365, 5, 4, 0, 0, 365, 366, 3, 30, 15, 0, 366, 51, 1, 0, 0, 0, 367, 369, 5, 16, 0, 0, 368, 370, 3, 30, 15, 0, 369, 368, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 372, 5, 30, 0, 0, 372, 374, 3, 30, 15, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 53, 1, 0, 0, 0, 375, 380, 3, 60, 30, 0, 376, 377, 5, 37, 0, 0, 377, 379, 3, 60, 30, 0, 378, 376, 1, 0, 0, 0, 379, 382, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 55, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 383, 388, 3, 62, 31, 0, 384, 385, 5, 37, 0, 0, 385, 387, 3, 62, 31, 0, 386, 384, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 57, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 391, 396, 3, 56, 28, 0, 392, 393, 5, 35, 0, 0, 393, 395, 3, 56, 28, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 59, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 400, 7, 3, 0, 0, 400, 61, 1, 0, 0, 0, 401, 402, 5, 81, 0, 0, 402, 63, 1, 0, 0, 0, 403, 446, 5, 46, 0, 0, 404, 405, 3, 98, 49, 0, 405, 406, 5, 68, 0, 0, 406, 446, 1, 0, 0, 0, 407, 446, 3, 96, 48, 0, 408, 446, 3, 98, 49, 0, 409, 446, 3, 92, 46, 0, 410, 446, 3, 66, 33, 0, 411, 446, 3, 100, 50, 0, 412, 413, 5, 66, 0, 0, 413, 418, 3, 94, 47, 0, 414, 415, 5, 35, 0, 0, 415, 417, 3, 94, 47, 0, 416, 414, 1, 0, 0, 0, 417, 420, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 421, 422, 5, 67, 0, 0, 422, 446, 1, 0, 0, 0, 423, 424, 5, 66, 0, 0, 424, 429, 3, 92, 46, 0, 425, 426, 5, 35, 0, 0, 426, 428, 3, 92, 46, 0, 427, 425, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 432, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 433, 5, 67, 0, 0, 433, 446, 1, 0, 0, 0, 434, 435, 5, 66, 0, 0, 435, 440, 3, 100, 50, 0, 436, 437, 5, 35, 0, 0, 437, 439, 3, 100, 50, 0, 438, 436, 1, 0, 0, 0, 439, 442, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 443, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 443, 444, 5, 67, 0, 0, 444, 446, 1, 0, 0, 0, 445, 403, 1, 0, 0, 0, 445, 404, 1, 0, 0, 0, 445, 407, 1, 0, 0, 0, 445, 408, 1, 0, 0, 0, 445, 409, 1, 0, 0, 0, 445, 410, 1, 0, 0, 0, 445, 411, 1, 0, 0, 0, 445, 412, 1, 0, 0, 0, 445, 423, 1, 0, 0, 0, 445, 434, 1, 0, 0, 0, 446, 65, 1, 0, 0, 0, 447, 450, 5, 49, 0, 0, 448, 450, 5, 65, 0, 0, 449, 447, 1, 0, 0, 0, 449, 448, 1, 0, 0, 0, 450, 67, 1, 0, 0, 0, 451, 452, 5, 9, 0, 0, 452, 453, 5, 28, 0, 0, 453, 69, 1, 0, 0, 0, 454, 455, 5, 15, 0, 0, 455, 460, 3, 72, 36, 0, 456, 457, 5, 35, 0, 0, 457, 459, 3, 72, 36, 0, 458, 456, 1, 0, 0, 0, 459, 462, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 71, 1, 0, 0, 0, 462, 460, 1, 0, 0, 0, 463, 465, 3, 10, 5, 0, 464, 466, 7, 4, 0, 0, 465, 464, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 469, 1, 0, 0, 0, 467, 468, 5, 47, 0, 0, 468, 470, 7, 5, 0, 0, 469, 467, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 73, 1, 0, 0, 0, 471, 472, 5, 8, 0, 0, 472, 473, 3, 58, 29, 0, 473, 75, 1, 0, 0, 0, 474, 475, 5, 2, 0, 0, 475, 476, 3, 58, 29, 0, 476, 77, 1, 0, 0, 0, 477, 478, 5, 12, 0, 0, 478, 483, 3, 80, 40, 0, 479, 480, 5, 35, 0, 0, 480, 482, 3, 80, 40, 0, 481, 479, 1, 0, 0, 0, 482, 485, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 79, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 486, 487, 3, 56, 28, 0, 487, 488, 5, 85, 0, 0, 488, 489, 3, 56, 28, 0, 489, 81, 1, 0, 0, 0, 490, 491, 5, 1, 0, 0, 491, 492, 3, 20, 10, 0, 492, 494, 3, 100, 50, 0, 493, 495, 3, 88, 44, 0, 494, 493, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 83, 1, 0, 0, 0, 496, 497, 5, 7, 0, 0, 497, 498, 3, 20, 10, 0, 498, 499, 3, 100, 50, 0, 499, 85, 1, 0, 0, 0, 500, 501, 5, 11, 0, 0, 501, 502, 3, 54, 27, 0, 502, 87, 1, 0, 0, 0, 503, 508, 3, 90, 45, 0, 504, 505, 5, 35, 0, 0, 505, 507, 3, 90, 45, 0, 506, 504, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 89, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 3, 60, 30, 0, 512, 513, 5, 33, 0, 0, 513, 514, 3, 64, 32, 0, 514, 91, 1, 0, 0, 0, 515, 516, 7, 6, 0, 0, 516, 93, 1, 0, 0, 0, 517, 520, 3, 96, 48, 0, 518, 520, 3, 98, 49, 0, 519, 517, 1, 0, 0, 0, 519, 518, 1, 0, 0, 0, 520, 95, 1, 0, 0, 0, 521, 523, 7, 0, 0, 0, 522, 521, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 5, 29, 0, 0, 525, 97, 1, 0, 0, 0, 526, 528, 7, 0, 0, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 5, 28, 0, 0, 530, 99, 1, 0, 0, 0, 531, 532, 5, 27, 0, 0, 532, 101, 1, 0, 0, 0, 533, 534, 7, 7, 0, 0, 534, 103, 1, 0, 0, 0, 535, 536, 5, 5, 0, 0, 536, 537, 3, 106, 53, 0, 537, 105, 1, 0, 0, 0, 538, 539, 5, 66, 0, 0, 539, 540, 3, 2, 1, 0, 540, 541, 5, 67, 0, 0, 541, 107, 1, 0, 0, 0, 542, 543, 5, 14, 0, 0, 543, 544, 5, 101, 0, 0, 544, 109, 1, 0, 0, 0, 545, 546, 5, 10, 0, 0, 546, 547, 5, 105, 0, 0, 547, 111, 1, 0, 0, 0, 548, 549, 5, 3, 0, 0, 549, 552, 5, 91, 0, 0, 550, 551, 5, 89, 0, 0, 551, 553, 3, 56, 28, 0, 552, 550, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 563, 1, 0, 0, 0, 554, 555, 5, 90, 0, 0, 555, 560, 3, 114, 57, 0, 556, 557, 5, 35, 0, 0, 557, 559, 3, 114, 57, 0, 558, 556, 1, 0, 0, 0, 559, 562, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 564, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 563, 554, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 113, 1, 0, 0, 0, 565, 566, 3, 56, 28, 0, 566, 567, 5, 33, 0, 0, 567, 569, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 3, 56, 28, 0, 571, 115, 1, 0, 0, 0, 572, 573, 5, 19, 0, 0, 573, 574, 3, 36, 18, 0, 574, 575, 5, 89, 0, 0, 575, 576, 3, 58, 29, 0, 576, 117, 1, 0, 0, 0, 577, 578, 5, 18, 0, 0, 578, 581, 3, 30, 15, 0, 579, 580, 5, 30, 0, 0, 580, 582, 3, 30, 15, 0, 581, 579, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 119, 1, 0, 0, 0, 55, 131, 141, 159, 171, 180, 188, 194, 202, 204, 209, 216, 221, 232, 238, 246, 248, 259, 266, 277, 280, 286, 298, 306, 314, 318, 325, 333, 341, 354, 358, 362, 369, 373, 380, 388, 396, 418, 429, 440, 445, 449, 460, 465, 469, 483, 494, 508, 519, 522, 527, 552, 560, 563, 568, 581] \ No newline at end of file +[4, 1, 125, 585, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 142, 8, 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, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 179, 8, 5, 10, 5, 12, 5, 182, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 203, 8, 5, 10, 5, 12, 5, 206, 9, 5, 1, 6, 1, 6, 3, 6, 210, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 222, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 233, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 239, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 247, 8, 9, 10, 9, 12, 9, 250, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 3, 11, 281, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 288, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 298, 8, 15, 10, 15, 12, 15, 301, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 308, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 314, 8, 17, 10, 17, 12, 17, 317, 9, 17, 1, 17, 3, 17, 320, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 327, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 335, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 341, 8, 22, 10, 22, 12, 22, 344, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 354, 8, 24, 10, 24, 12, 24, 357, 9, 24, 1, 24, 3, 24, 360, 8, 24, 1, 24, 1, 24, 3, 24, 364, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 371, 8, 26, 1, 26, 1, 26, 3, 26, 375, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 380, 8, 27, 10, 27, 12, 27, 383, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 388, 8, 28, 10, 28, 12, 28, 391, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 396, 8, 29, 10, 29, 12, 29, 399, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 418, 8, 32, 10, 32, 12, 32, 421, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 429, 8, 32, 10, 32, 12, 32, 432, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 440, 8, 32, 10, 32, 12, 32, 443, 9, 32, 1, 32, 1, 32, 3, 32, 447, 8, 32, 1, 33, 1, 33, 3, 33, 451, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 460, 8, 35, 10, 35, 12, 35, 463, 9, 35, 1, 36, 1, 36, 3, 36, 467, 8, 36, 1, 36, 1, 36, 3, 36, 471, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 483, 8, 39, 10, 39, 12, 39, 486, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 496, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 508, 8, 44, 10, 44, 12, 44, 511, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 521, 8, 47, 1, 48, 3, 48, 524, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 529, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 554, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 560, 8, 56, 10, 56, 12, 56, 563, 9, 56, 3, 56, 565, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 583, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 60, 61, 1, 0, 62, 64, 2, 0, 27, 27, 77, 77, 1, 0, 68, 69, 2, 0, 32, 32, 36, 36, 2, 0, 39, 39, 42, 42, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 610, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 141, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 221, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 287, 1, 0, 0, 0, 26, 289, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 294, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 309, 1, 0, 0, 0, 36, 326, 1, 0, 0, 0, 38, 328, 1, 0, 0, 0, 40, 330, 1, 0, 0, 0, 42, 334, 1, 0, 0, 0, 44, 336, 1, 0, 0, 0, 46, 345, 1, 0, 0, 0, 48, 349, 1, 0, 0, 0, 50, 365, 1, 0, 0, 0, 52, 368, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 384, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 400, 1, 0, 0, 0, 62, 402, 1, 0, 0, 0, 64, 446, 1, 0, 0, 0, 66, 450, 1, 0, 0, 0, 68, 452, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 464, 1, 0, 0, 0, 74, 472, 1, 0, 0, 0, 76, 475, 1, 0, 0, 0, 78, 478, 1, 0, 0, 0, 80, 487, 1, 0, 0, 0, 82, 491, 1, 0, 0, 0, 84, 497, 1, 0, 0, 0, 86, 501, 1, 0, 0, 0, 88, 504, 1, 0, 0, 0, 90, 512, 1, 0, 0, 0, 92, 516, 1, 0, 0, 0, 94, 520, 1, 0, 0, 0, 96, 523, 1, 0, 0, 0, 98, 528, 1, 0, 0, 0, 100, 532, 1, 0, 0, 0, 102, 534, 1, 0, 0, 0, 104, 536, 1, 0, 0, 0, 106, 539, 1, 0, 0, 0, 108, 543, 1, 0, 0, 0, 110, 546, 1, 0, 0, 0, 112, 549, 1, 0, 0, 0, 114, 569, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 578, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 26, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 142, 3, 104, 52, 0, 135, 142, 3, 34, 17, 0, 136, 142, 3, 110, 55, 0, 137, 142, 3, 28, 14, 0, 138, 142, 3, 108, 54, 0, 139, 140, 4, 2, 1, 0, 140, 142, 3, 48, 24, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 5, 1, 0, 0, 0, 143, 160, 3, 50, 25, 0, 144, 160, 3, 8, 4, 0, 145, 160, 3, 74, 37, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 52, 26, 0, 148, 160, 3, 70, 35, 0, 149, 160, 3, 76, 38, 0, 150, 160, 3, 78, 39, 0, 151, 160, 3, 82, 41, 0, 152, 160, 3, 84, 42, 0, 153, 160, 3, 112, 56, 0, 154, 160, 3, 86, 43, 0, 155, 156, 4, 3, 2, 0, 156, 160, 3, 118, 59, 0, 157, 158, 4, 3, 3, 0, 158, 160, 3, 116, 58, 0, 159, 143, 1, 0, 0, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 17, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 45, 0, 0, 166, 195, 3, 10, 5, 8, 167, 195, 3, 16, 8, 0, 168, 195, 3, 12, 6, 0, 169, 171, 3, 16, 8, 0, 170, 172, 5, 45, 0, 0, 171, 170, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 5, 40, 0, 0, 174, 175, 5, 44, 0, 0, 175, 180, 3, 16, 8, 0, 176, 177, 5, 35, 0, 0, 177, 179, 3, 16, 8, 0, 178, 176, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 51, 0, 0, 184, 195, 1, 0, 0, 0, 185, 186, 3, 16, 8, 0, 186, 188, 5, 41, 0, 0, 187, 189, 5, 45, 0, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 5, 46, 0, 0, 191, 195, 1, 0, 0, 0, 192, 193, 4, 5, 4, 0, 193, 195, 3, 14, 7, 0, 194, 164, 1, 0, 0, 0, 194, 167, 1, 0, 0, 0, 194, 168, 1, 0, 0, 0, 194, 169, 1, 0, 0, 0, 194, 185, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 204, 1, 0, 0, 0, 196, 197, 10, 5, 0, 0, 197, 198, 5, 31, 0, 0, 198, 203, 3, 10, 5, 6, 199, 200, 10, 4, 0, 0, 200, 201, 5, 48, 0, 0, 201, 203, 3, 10, 5, 5, 202, 196, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 209, 3, 16, 8, 0, 208, 210, 5, 45, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 5, 43, 0, 0, 212, 213, 3, 100, 50, 0, 213, 222, 1, 0, 0, 0, 214, 216, 3, 16, 8, 0, 215, 217, 5, 45, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 50, 0, 0, 219, 220, 3, 100, 50, 0, 220, 222, 1, 0, 0, 0, 221, 207, 1, 0, 0, 0, 221, 214, 1, 0, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 3, 16, 8, 0, 224, 225, 5, 20, 0, 0, 225, 226, 3, 100, 50, 0, 226, 15, 1, 0, 0, 0, 227, 233, 3, 18, 9, 0, 228, 229, 3, 18, 9, 0, 229, 230, 3, 102, 51, 0, 230, 231, 3, 18, 9, 0, 231, 233, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 17, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 239, 3, 20, 10, 0, 236, 237, 7, 0, 0, 0, 237, 239, 3, 18, 9, 3, 238, 234, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 1, 0, 0, 0, 240, 241, 10, 2, 0, 0, 241, 242, 7, 1, 0, 0, 242, 247, 3, 18, 9, 3, 243, 244, 10, 1, 0, 0, 244, 245, 7, 0, 0, 0, 245, 247, 3, 18, 9, 2, 246, 240, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 19, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 6, 10, -1, 0, 252, 260, 3, 64, 32, 0, 253, 260, 3, 54, 27, 0, 254, 260, 3, 22, 11, 0, 255, 256, 5, 44, 0, 0, 256, 257, 3, 10, 5, 0, 257, 258, 5, 51, 0, 0, 258, 260, 1, 0, 0, 0, 259, 251, 1, 0, 0, 0, 259, 253, 1, 0, 0, 0, 259, 254, 1, 0, 0, 0, 259, 255, 1, 0, 0, 0, 260, 266, 1, 0, 0, 0, 261, 262, 10, 1, 0, 0, 262, 263, 5, 34, 0, 0, 263, 265, 3, 26, 13, 0, 264, 261, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 3, 24, 12, 0, 270, 280, 5, 44, 0, 0, 271, 281, 5, 62, 0, 0, 272, 277, 3, 10, 5, 0, 273, 274, 5, 35, 0, 0, 274, 276, 3, 10, 5, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 271, 1, 0, 0, 0, 280, 272, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 5, 51, 0, 0, 283, 23, 1, 0, 0, 0, 284, 285, 4, 12, 10, 0, 285, 288, 5, 20, 0, 0, 286, 288, 3, 60, 30, 0, 287, 284, 1, 0, 0, 0, 287, 286, 1, 0, 0, 0, 288, 25, 1, 0, 0, 0, 289, 290, 3, 60, 30, 0, 290, 27, 1, 0, 0, 0, 291, 292, 5, 13, 0, 0, 292, 293, 3, 30, 15, 0, 293, 29, 1, 0, 0, 0, 294, 299, 3, 32, 16, 0, 295, 296, 5, 35, 0, 0, 296, 298, 3, 32, 16, 0, 297, 295, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 31, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 308, 3, 10, 5, 0, 303, 304, 3, 54, 27, 0, 304, 305, 5, 33, 0, 0, 305, 306, 3, 10, 5, 0, 306, 308, 1, 0, 0, 0, 307, 302, 1, 0, 0, 0, 307, 303, 1, 0, 0, 0, 308, 33, 1, 0, 0, 0, 309, 310, 5, 6, 0, 0, 310, 315, 3, 36, 18, 0, 311, 312, 5, 35, 0, 0, 312, 314, 3, 36, 18, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 320, 3, 42, 21, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 35, 1, 0, 0, 0, 321, 322, 3, 38, 19, 0, 322, 323, 5, 109, 0, 0, 323, 324, 3, 40, 20, 0, 324, 327, 1, 0, 0, 0, 325, 327, 3, 40, 20, 0, 326, 321, 1, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 37, 1, 0, 0, 0, 328, 329, 5, 77, 0, 0, 329, 39, 1, 0, 0, 0, 330, 331, 7, 2, 0, 0, 331, 41, 1, 0, 0, 0, 332, 335, 3, 44, 22, 0, 333, 335, 3, 46, 23, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, 0, 335, 43, 1, 0, 0, 0, 336, 337, 5, 76, 0, 0, 337, 342, 5, 77, 0, 0, 338, 339, 5, 35, 0, 0, 339, 341, 5, 77, 0, 0, 340, 338, 1, 0, 0, 0, 341, 344, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 45, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 345, 346, 5, 66, 0, 0, 346, 347, 3, 44, 22, 0, 347, 348, 5, 67, 0, 0, 348, 47, 1, 0, 0, 0, 349, 350, 5, 21, 0, 0, 350, 355, 3, 36, 18, 0, 351, 352, 5, 35, 0, 0, 352, 354, 3, 36, 18, 0, 353, 351, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 358, 360, 3, 30, 15, 0, 359, 358, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 362, 5, 30, 0, 0, 362, 364, 3, 30, 15, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 49, 1, 0, 0, 0, 365, 366, 5, 4, 0, 0, 366, 367, 3, 30, 15, 0, 367, 51, 1, 0, 0, 0, 368, 370, 5, 16, 0, 0, 369, 371, 3, 30, 15, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 373, 5, 30, 0, 0, 373, 375, 3, 30, 15, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 381, 3, 60, 30, 0, 377, 378, 5, 37, 0, 0, 378, 380, 3, 60, 30, 0, 379, 377, 1, 0, 0, 0, 380, 383, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 55, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 384, 389, 3, 62, 31, 0, 385, 386, 5, 37, 0, 0, 386, 388, 3, 62, 31, 0, 387, 385, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 397, 3, 56, 28, 0, 393, 394, 5, 35, 0, 0, 394, 396, 3, 56, 28, 0, 395, 393, 1, 0, 0, 0, 396, 399, 1, 0, 0, 0, 397, 395, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 59, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 401, 7, 3, 0, 0, 401, 61, 1, 0, 0, 0, 402, 403, 5, 81, 0, 0, 403, 63, 1, 0, 0, 0, 404, 447, 5, 46, 0, 0, 405, 406, 3, 98, 49, 0, 406, 407, 5, 68, 0, 0, 407, 447, 1, 0, 0, 0, 408, 447, 3, 96, 48, 0, 409, 447, 3, 98, 49, 0, 410, 447, 3, 92, 46, 0, 411, 447, 3, 66, 33, 0, 412, 447, 3, 100, 50, 0, 413, 414, 5, 66, 0, 0, 414, 419, 3, 94, 47, 0, 415, 416, 5, 35, 0, 0, 416, 418, 3, 94, 47, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 67, 0, 0, 423, 447, 1, 0, 0, 0, 424, 425, 5, 66, 0, 0, 425, 430, 3, 92, 46, 0, 426, 427, 5, 35, 0, 0, 427, 429, 3, 92, 46, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 434, 5, 67, 0, 0, 434, 447, 1, 0, 0, 0, 435, 436, 5, 66, 0, 0, 436, 441, 3, 100, 50, 0, 437, 438, 5, 35, 0, 0, 438, 440, 3, 100, 50, 0, 439, 437, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 5, 67, 0, 0, 445, 447, 1, 0, 0, 0, 446, 404, 1, 0, 0, 0, 446, 405, 1, 0, 0, 0, 446, 408, 1, 0, 0, 0, 446, 409, 1, 0, 0, 0, 446, 410, 1, 0, 0, 0, 446, 411, 1, 0, 0, 0, 446, 412, 1, 0, 0, 0, 446, 413, 1, 0, 0, 0, 446, 424, 1, 0, 0, 0, 446, 435, 1, 0, 0, 0, 447, 65, 1, 0, 0, 0, 448, 451, 5, 49, 0, 0, 449, 451, 5, 65, 0, 0, 450, 448, 1, 0, 0, 0, 450, 449, 1, 0, 0, 0, 451, 67, 1, 0, 0, 0, 452, 453, 5, 9, 0, 0, 453, 454, 5, 28, 0, 0, 454, 69, 1, 0, 0, 0, 455, 456, 5, 15, 0, 0, 456, 461, 3, 72, 36, 0, 457, 458, 5, 35, 0, 0, 458, 460, 3, 72, 36, 0, 459, 457, 1, 0, 0, 0, 460, 463, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 71, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 466, 3, 10, 5, 0, 465, 467, 7, 4, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 47, 0, 0, 469, 471, 7, 5, 0, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 73, 1, 0, 0, 0, 472, 473, 5, 8, 0, 0, 473, 474, 3, 58, 29, 0, 474, 75, 1, 0, 0, 0, 475, 476, 5, 2, 0, 0, 476, 477, 3, 58, 29, 0, 477, 77, 1, 0, 0, 0, 478, 479, 5, 12, 0, 0, 479, 484, 3, 80, 40, 0, 480, 481, 5, 35, 0, 0, 481, 483, 3, 80, 40, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 79, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 3, 56, 28, 0, 488, 489, 5, 85, 0, 0, 489, 490, 3, 56, 28, 0, 490, 81, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 493, 3, 20, 10, 0, 493, 495, 3, 100, 50, 0, 494, 496, 3, 88, 44, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 83, 1, 0, 0, 0, 497, 498, 5, 7, 0, 0, 498, 499, 3, 20, 10, 0, 499, 500, 3, 100, 50, 0, 500, 85, 1, 0, 0, 0, 501, 502, 5, 11, 0, 0, 502, 503, 3, 54, 27, 0, 503, 87, 1, 0, 0, 0, 504, 509, 3, 90, 45, 0, 505, 506, 5, 35, 0, 0, 506, 508, 3, 90, 45, 0, 507, 505, 1, 0, 0, 0, 508, 511, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 89, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 514, 5, 33, 0, 0, 514, 515, 3, 64, 32, 0, 515, 91, 1, 0, 0, 0, 516, 517, 7, 6, 0, 0, 517, 93, 1, 0, 0, 0, 518, 521, 3, 96, 48, 0, 519, 521, 3, 98, 49, 0, 520, 518, 1, 0, 0, 0, 520, 519, 1, 0, 0, 0, 521, 95, 1, 0, 0, 0, 522, 524, 7, 0, 0, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 29, 0, 0, 526, 97, 1, 0, 0, 0, 527, 529, 7, 0, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 28, 0, 0, 531, 99, 1, 0, 0, 0, 532, 533, 5, 27, 0, 0, 533, 101, 1, 0, 0, 0, 534, 535, 7, 7, 0, 0, 535, 103, 1, 0, 0, 0, 536, 537, 5, 5, 0, 0, 537, 538, 3, 106, 53, 0, 538, 105, 1, 0, 0, 0, 539, 540, 5, 66, 0, 0, 540, 541, 3, 2, 1, 0, 541, 542, 5, 67, 0, 0, 542, 107, 1, 0, 0, 0, 543, 544, 5, 14, 0, 0, 544, 545, 5, 101, 0, 0, 545, 109, 1, 0, 0, 0, 546, 547, 5, 10, 0, 0, 547, 548, 5, 105, 0, 0, 548, 111, 1, 0, 0, 0, 549, 550, 5, 3, 0, 0, 550, 553, 5, 91, 0, 0, 551, 552, 5, 89, 0, 0, 552, 554, 3, 56, 28, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 564, 1, 0, 0, 0, 555, 556, 5, 90, 0, 0, 556, 561, 3, 114, 57, 0, 557, 558, 5, 35, 0, 0, 558, 560, 3, 114, 57, 0, 559, 557, 1, 0, 0, 0, 560, 563, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 565, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 564, 555, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 113, 1, 0, 0, 0, 566, 567, 3, 56, 28, 0, 567, 568, 5, 33, 0, 0, 568, 570, 1, 0, 0, 0, 569, 566, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 3, 56, 28, 0, 572, 115, 1, 0, 0, 0, 573, 574, 5, 19, 0, 0, 574, 575, 3, 36, 18, 0, 575, 576, 5, 89, 0, 0, 576, 577, 3, 58, 29, 0, 577, 117, 1, 0, 0, 0, 578, 579, 5, 18, 0, 0, 579, 582, 3, 30, 15, 0, 580, 581, 5, 30, 0, 0, 581, 583, 3, 30, 15, 0, 582, 580, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 119, 1, 0, 0, 0, 55, 131, 141, 159, 171, 180, 188, 194, 202, 204, 209, 216, 221, 232, 238, 246, 248, 259, 266, 277, 280, 287, 299, 307, 315, 319, 326, 334, 342, 355, 359, 363, 370, 374, 381, 389, 397, 419, 430, 441, 446, 450, 461, 466, 470, 484, 495, 509, 520, 523, 528, 553, 561, 564, 569, 582] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index b6236cbdf6acc..3debcd072670b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -8,7 +8,16 @@ * 2.0. */ -import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.FailedPredicateException; +import org.antlr.v4.runtime.NoViableAltException; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.RuntimeMetaData; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.Vocabulary; +import org.antlr.v4.runtime.VocabularyImpl; import org.antlr.v4.runtime.atn.ATN; import org.antlr.v4.runtime.atn.ATNDeserializer; import org.antlr.v4.runtime.atn.ParserATNSimulator; @@ -58,7 +67,7 @@ public class EsqlBaseParser extends ParserConfig { RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, RULE_matchBooleanExpression = 7, RULE_valueExpression = 8, RULE_operatorExpression = 9, - RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_functionIdentifier = 12, + RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_functionName = 12, RULE_dataType = 13, RULE_rowCommand = 14, RULE_fields = 15, RULE_field = 16, RULE_fromCommand = 17, RULE_indexPattern = 18, RULE_clusterString = 19, RULE_indexString = 20, RULE_metadata = 21, RULE_metadataOption = 22, RULE_deprecated_metadata = 23, @@ -79,7 +88,7 @@ private static String[] makeRuleNames() { "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", - "functionIdentifier", "dataType", "rowCommand", "fields", "field", "fromCommand", + "functionName", "dataType", "rowCommand", "fields", "field", "fromCommand", "indexPattern", "clusterString", "indexString", "metadata", "metadataOption", "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", "identifier", @@ -1772,8 +1781,8 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc @SuppressWarnings("CheckReturnValue") public static class FunctionExpressionContext extends ParserRuleContext { - public FunctionIdentifierContext functionIdentifier() { - return getRuleContext(FunctionIdentifierContext.class,0); + public FunctionNameContext functionName() { + return getRuleContext(FunctionNameContext.class,0); } public TerminalNode LP() { return getToken(EsqlBaseParser.LP, 0); } public TerminalNode RP() { return getToken(EsqlBaseParser.RP, 0); } @@ -1816,7 +1825,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx enterOuterAlt(_localctx, 1); { setState(269); - functionIdentifier(); + functionName(); setState(270); match(LP); setState(280); @@ -1869,55 +1878,54 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } @SuppressWarnings("CheckReturnValue") - public static class FunctionIdentifierContext extends ParserRuleContext { + public static class FunctionNameContext extends ParserRuleContext { + public TerminalNode DEV_MATCH() { return getToken(EsqlBaseParser.DEV_MATCH, 0); } public IdentifierContext identifier() { return getRuleContext(IdentifierContext.class,0); } - public TerminalNode DEV_MATCH() { return getToken(EsqlBaseParser.DEV_MATCH, 0); } @SuppressWarnings("this-escape") - public FunctionIdentifierContext(ParserRuleContext parent, int invokingState) { + public FunctionNameContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_functionIdentifier; } + @Override public int getRuleIndex() { return RULE_functionName; } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterFunctionIdentifier(this); + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterFunctionName(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitFunctionIdentifier(this); + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitFunctionName(this); } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitFunctionIdentifier(this); + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitFunctionName(this); else return visitor.visitChildren(this); } } - public final FunctionIdentifierContext functionIdentifier() throws RecognitionException { - FunctionIdentifierContext _localctx = new FunctionIdentifierContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_functionIdentifier); + public final FunctionNameContext functionName() throws RecognitionException { + FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_functionName); try { - setState(286); + setState(287); _errHandler.sync(this); - switch (_input.LA(1)) { - case UNQUOTED_IDENTIFIER: - case QUOTED_IDENTIFIER: + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { setState(284); - identifier(); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(285); + match(DEV_MATCH); } break; - case DEV_MATCH: + case 2: enterOuterAlt(_localctx, 2); { - setState(285); - match(DEV_MATCH); + setState(286); + identifier(); } break; - default: - throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -1974,7 +1982,7 @@ public final DataTypeContext dataType() throws RecognitionException { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(288); + setState(289); identifier(); } } @@ -2021,9 +2029,9 @@ public final RowCommandContext rowCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(290); - match(ROW); setState(291); + match(ROW); + setState(292); fields(); } } @@ -2077,23 +2085,23 @@ public final FieldsContext fields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(293); + setState(294); field(); - setState(298); + setState(299); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,21,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(294); - match(COMMA); setState(295); + match(COMMA); + setState(296); field(); } } } - setState(300); + setState(301); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,21,_ctx); } @@ -2143,24 +2151,24 @@ public final FieldContext field() throws RecognitionException { FieldContext _localctx = new FieldContext(_ctx, getState()); enterRule(_localctx, 32, RULE_field); try { - setState(306); + setState(307); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(301); + setState(302); booleanExpression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(302); - qualifiedName(); setState(303); - match(ASSIGN); + qualifiedName(); setState(304); + match(ASSIGN); + setState(305); booleanExpression(0); } break; @@ -2220,34 +2228,34 @@ public final FromCommandContext fromCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(308); - match(FROM); setState(309); + match(FROM); + setState(310); indexPattern(); - setState(314); + setState(315); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(310); - match(COMMA); setState(311); + match(COMMA); + setState(312); indexPattern(); } } } - setState(316); + setState(317); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(318); + setState(319); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - setState(317); + setState(318); metadata(); } break; @@ -2298,24 +2306,24 @@ public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); enterRule(_localctx, 36, RULE_indexPattern); try { - setState(325); + setState(326); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(320); - clusterString(); setState(321); - match(COLON); + clusterString(); setState(322); + match(COLON); + setState(323); indexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(324); + setState(325); indexString(); } break; @@ -2361,7 +2369,7 @@ public final ClusterStringContext clusterString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(327); + setState(328); match(UNQUOTED_SOURCE); } } @@ -2407,7 +2415,7 @@ public final IndexStringContext indexString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(329); + setState(330); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -2462,20 +2470,20 @@ public final MetadataContext metadata() throws RecognitionException { MetadataContext _localctx = new MetadataContext(_ctx, getState()); enterRule(_localctx, 42, RULE_metadata); try { - setState(333); + setState(334); _errHandler.sync(this); switch (_input.LA(1)) { case METADATA: enterOuterAlt(_localctx, 1); { - setState(331); + setState(332); metadataOption(); } break; case OPENING_BRACKET: enterOuterAlt(_localctx, 2); { - setState(332); + setState(333); deprecated_metadata(); } break; @@ -2532,25 +2540,25 @@ public final MetadataOptionContext metadataOption() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(335); - match(METADATA); setState(336); + match(METADATA); + setState(337); match(UNQUOTED_SOURCE); - setState(341); + setState(342); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,27,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(337); - match(COMMA); setState(338); + match(COMMA); + setState(339); match(UNQUOTED_SOURCE); } } } - setState(343); + setState(344); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,27,_ctx); } @@ -2599,11 +2607,11 @@ public final Deprecated_metadataContext deprecated_metadata() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(344); - match(OPENING_BRACKET); setState(345); - metadataOption(); + match(OPENING_BRACKET); setState(346); + metadataOption(); + setState(347); match(CLOSING_BRACKET); } } @@ -2667,46 +2675,46 @@ public final MetricsCommandContext metricsCommand() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(348); - match(DEV_METRICS); setState(349); + match(DEV_METRICS); + setState(350); indexPattern(); - setState(354); + setState(355); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(350); - match(COMMA); setState(351); + match(COMMA); + setState(352); indexPattern(); } } } - setState(356); + setState(357); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } - setState(358); + setState(359); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: { - setState(357); + setState(358); ((MetricsCommandContext)_localctx).aggregates = fields(); } break; } - setState(362); + setState(363); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { - setState(360); - match(BY); setState(361); + match(BY); + setState(362); ((MetricsCommandContext)_localctx).grouping = fields(); } break; @@ -2756,9 +2764,9 @@ public final EvalCommandContext evalCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(364); - match(EVAL); setState(365); + match(EVAL); + setState(366); fields(); } } @@ -2811,26 +2819,26 @@ public final StatsCommandContext statsCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(367); + setState(368); match(STATS); - setState(369); + setState(370); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(368); + setState(369); ((StatsCommandContext)_localctx).stats = fields(); } break; } - setState(373); + setState(374); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(371); - match(BY); setState(372); + match(BY); + setState(373); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2887,23 +2895,23 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(375); + setState(376); identifier(); - setState(380); + setState(381); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(376); - match(DOT); setState(377); + match(DOT); + setState(378); identifier(); } } } - setState(382); + setState(383); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } @@ -2959,23 +2967,23 @@ public final QualifiedNamePatternContext qualifiedNamePattern() throws Recogniti int _alt; enterOuterAlt(_localctx, 1); { - setState(383); + setState(384); identifierPattern(); - setState(388); + setState(389); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(384); - match(DOT); setState(385); + match(DOT); + setState(386); identifierPattern(); } } } - setState(390); + setState(391); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } @@ -3031,23 +3039,23 @@ public final QualifiedNamePatternsContext qualifiedNamePatterns() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(391); + setState(392); qualifiedNamePattern(); - setState(396); + setState(397); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(392); - match(COMMA); setState(393); + match(COMMA); + setState(394); qualifiedNamePattern(); } } } - setState(398); + setState(399); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } @@ -3095,7 +3103,7 @@ public final IdentifierContext identifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(399); + setState(400); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -3147,7 +3155,7 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(401); + setState(402); match(ID_PATTERN); } } @@ -3418,14 +3426,14 @@ public final ConstantContext constant() throws RecognitionException { enterRule(_localctx, 64, RULE_constant); int _la; try { - setState(445); + setState(446); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(403); + setState(404); match(NULL); } break; @@ -3433,9 +3441,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(404); - integerValue(); setState(405); + integerValue(); + setState(406); match(UNQUOTED_IDENTIFIER); } break; @@ -3443,7 +3451,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(407); + setState(408); decimalValue(); } break; @@ -3451,7 +3459,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(408); + setState(409); integerValue(); } break; @@ -3459,7 +3467,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(409); + setState(410); booleanValue(); } break; @@ -3467,7 +3475,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParamsContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(410); + setState(411); params(); } break; @@ -3475,7 +3483,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(411); + setState(412); string(); } break; @@ -3483,27 +3491,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(412); - match(OPENING_BRACKET); setState(413); + match(OPENING_BRACKET); + setState(414); numericValue(); - setState(418); + setState(419); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(414); - match(COMMA); setState(415); + match(COMMA); + setState(416); numericValue(); } } - setState(420); + setState(421); _errHandler.sync(this); _la = _input.LA(1); } - setState(421); + setState(422); match(CLOSING_BRACKET); } break; @@ -3511,27 +3519,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(423); - match(OPENING_BRACKET); setState(424); + match(OPENING_BRACKET); + setState(425); booleanValue(); - setState(429); + setState(430); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(425); - match(COMMA); setState(426); + match(COMMA); + setState(427); booleanValue(); } } - setState(431); + setState(432); _errHandler.sync(this); _la = _input.LA(1); } - setState(432); + setState(433); match(CLOSING_BRACKET); } break; @@ -3539,27 +3547,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(434); - match(OPENING_BRACKET); setState(435); + match(OPENING_BRACKET); + setState(436); string(); - setState(440); + setState(441); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(436); - match(COMMA); setState(437); + match(COMMA); + setState(438); string(); } } - setState(442); + setState(443); _errHandler.sync(this); _la = _input.LA(1); } - setState(443); + setState(444); match(CLOSING_BRACKET); } break; @@ -3633,14 +3641,14 @@ public final ParamsContext params() throws RecognitionException { ParamsContext _localctx = new ParamsContext(_ctx, getState()); enterRule(_localctx, 66, RULE_params); try { - setState(449); + setState(450); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(447); + setState(448); match(PARAM); } break; @@ -3648,7 +3656,7 @@ public final ParamsContext params() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(448); + setState(449); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -3697,9 +3705,9 @@ public final LimitCommandContext limitCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(451); - match(LIMIT); setState(452); + match(LIMIT); + setState(453); match(INTEGER_LITERAL); } } @@ -3754,25 +3762,25 @@ public final SortCommandContext sortCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(454); - match(SORT); setState(455); + match(SORT); + setState(456); orderExpression(); - setState(460); + setState(461); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,41,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(456); - match(COMMA); setState(457); + match(COMMA); + setState(458); orderExpression(); } } } - setState(462); + setState(463); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,41,_ctx); } @@ -3828,14 +3836,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(463); + setState(464); booleanExpression(0); - setState(465); + setState(466); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(464); + setState(465); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3849,14 +3857,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(469); + setState(470); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(467); - match(NULLS); setState(468); + match(NULLS); + setState(469); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3915,9 +3923,9 @@ public final KeepCommandContext keepCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(471); - match(KEEP); setState(472); + match(KEEP); + setState(473); qualifiedNamePatterns(); } } @@ -3964,9 +3972,9 @@ public final DropCommandContext dropCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(474); - match(DROP); setState(475); + match(DROP); + setState(476); qualifiedNamePatterns(); } } @@ -4021,25 +4029,25 @@ public final RenameCommandContext renameCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(477); - match(RENAME); setState(478); + match(RENAME); + setState(479); renameClause(); - setState(483); + setState(484); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(479); - match(COMMA); setState(480); + match(COMMA); + setState(481); renameClause(); } } } - setState(485); + setState(486); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -4093,11 +4101,11 @@ public final RenameClauseContext renameClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(486); - ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); setState(487); - match(AS); + ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); setState(488); + match(AS); + setState(489); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } } @@ -4150,18 +4158,18 @@ public final DissectCommandContext dissectCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(490); - match(DISSECT); setState(491); - primaryExpression(0); + match(DISSECT); setState(492); + primaryExpression(0); + setState(493); string(); - setState(494); + setState(495); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(493); + setState(494); commandOptions(); } break; @@ -4214,11 +4222,11 @@ public final GrokCommandContext grokCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(496); - match(GROK); setState(497); - primaryExpression(0); + match(GROK); setState(498); + primaryExpression(0); + setState(499); string(); } } @@ -4265,9 +4273,9 @@ public final MvExpandCommandContext mvExpandCommand() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(500); - match(MV_EXPAND); setState(501); + match(MV_EXPAND); + setState(502); qualifiedName(); } } @@ -4321,23 +4329,23 @@ public final CommandOptionsContext commandOptions() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(503); + setState(504); commandOption(); - setState(508); + setState(509); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(504); - match(COMMA); setState(505); + match(COMMA); + setState(506); commandOption(); } } } - setState(510); + setState(511); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } @@ -4389,11 +4397,11 @@ public final CommandOptionContext commandOption() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(511); - identifier(); setState(512); - match(ASSIGN); + identifier(); setState(513); + match(ASSIGN); + setState(514); constant(); } } @@ -4439,7 +4447,7 @@ public final BooleanValueContext booleanValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(515); + setState(516); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -4494,20 +4502,20 @@ public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); enterRule(_localctx, 94, RULE_numericValue); try { - setState(519); + setState(520); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(517); + setState(518); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(518); + setState(519); integerValue(); } break; @@ -4556,12 +4564,12 @@ public final DecimalValueContext decimalValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(522); + setState(523); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(521); + setState(522); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4574,7 +4582,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(524); + setState(525); match(DECIMAL_LITERAL); } } @@ -4621,12 +4629,12 @@ public final IntegerValueContext integerValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(528); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(526); + setState(527); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4639,7 +4647,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(529); + setState(530); match(INTEGER_LITERAL); } } @@ -4683,7 +4691,7 @@ public final StringContext string() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(532); match(QUOTED_STRING); } } @@ -4733,7 +4741,7 @@ public final ComparisonOperatorContext comparisonOperator() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(533); + setState(534); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125899906842624000L) != 0)) ) { _errHandler.recoverInline(this); @@ -4788,9 +4796,9 @@ public final ExplainCommandContext explainCommand() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(535); - match(EXPLAIN); setState(536); + match(EXPLAIN); + setState(537); subqueryExpression(); } } @@ -4838,11 +4846,11 @@ public final SubqueryExpressionContext subqueryExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(538); - match(OPENING_BRACKET); setState(539); - query(0); + match(OPENING_BRACKET); setState(540); + query(0); + setState(541); match(CLOSING_BRACKET); } } @@ -4899,9 +4907,9 @@ public final ShowCommandContext showCommand() throws RecognitionException { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(542); - match(SHOW); setState(543); + match(SHOW); + setState(544); match(INFO); } } @@ -4958,9 +4966,9 @@ public final MetaCommandContext metaCommand() throws RecognitionException { _localctx = new MetaFunctionsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(545); - match(META); setState(546); + match(META); + setState(547); match(FUNCTIONS); } } @@ -5023,46 +5031,46 @@ public final EnrichCommandContext enrichCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(548); - match(ENRICH); setState(549); + match(ENRICH); + setState(550); ((EnrichCommandContext)_localctx).policyName = match(ENRICH_POLICY_NAME); - setState(552); + setState(553); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(550); - match(ON); setState(551); + match(ON); + setState(552); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(563); + setState(564); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(554); - match(WITH); setState(555); + match(WITH); + setState(556); enrichWithClause(); - setState(560); + setState(561); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(556); - match(COMMA); setState(557); + match(COMMA); + setState(558); enrichWithClause(); } } } - setState(562); + setState(563); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } @@ -5119,19 +5127,19 @@ public final EnrichWithClauseContext enrichWithClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(568); + setState(569); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(565); - ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); setState(566); + ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); + setState(567); match(ASSIGN); } break; } - setState(570); + setState(571); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -5184,13 +5192,13 @@ public final LookupCommandContext lookupCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(572); - match(DEV_LOOKUP); setState(573); - ((LookupCommandContext)_localctx).tableName = indexPattern(); + match(DEV_LOOKUP); setState(574); - match(ON); + ((LookupCommandContext)_localctx).tableName = indexPattern(); setState(575); + match(ON); + setState(576); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5243,18 +5251,18 @@ public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(577); - match(DEV_INLINESTATS); setState(578); + match(DEV_INLINESTATS); + setState(579); ((InlinestatsCommandContext)_localctx).stats = fields(); - setState(581); + setState(582); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(579); - match(BY); setState(580); + match(BY); + setState(581); ((InlinestatsCommandContext)_localctx).grouping = fields(); } break; @@ -5286,6 +5294,8 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); case 10: return primaryExpression_sempred((PrimaryExpressionContext)_localctx, predIndex); + case 12: + return functionName_sempred((FunctionNameContext)_localctx, predIndex); } return true; } @@ -5339,9 +5349,16 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in } return true; } + private boolean functionName_sempred(FunctionNameContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.isDevVersion(); + } + return true; + } public static final String _serializedATN = - "\u0004\u0001}\u0248\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001}\u0249\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -5382,334 +5399,334 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in "\n\u0109\b\n\n\n\f\n\u010c\t\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001"+ "\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0114\b\u000b\n\u000b\f\u000b"+ "\u0117\t\u000b\u0003\u000b\u0119\b\u000b\u0001\u000b\u0001\u000b\u0001"+ - "\f\u0001\f\u0003\f\u011f\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u0129\b\u000f\n"+ - "\u000f\f\u000f\u012c\t\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0003\u0010\u0133\b\u0010\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0005\u0011\u0139\b\u0011\n\u0011\f\u0011\u013c\t\u0011"+ - "\u0001\u0011\u0003\u0011\u013f\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0012\u0001\u0012\u0003\u0012\u0146\b\u0012\u0001\u0013\u0001\u0013"+ - "\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0003\u0015\u014e\b\u0015"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0154\b\u0016"+ - "\n\u0016\f\u0016\u0157\t\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ - "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0161"+ - "\b\u0018\n\u0018\f\u0018\u0164\t\u0018\u0001\u0018\u0003\u0018\u0167\b"+ - "\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u016b\b\u0018\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u0172\b\u001a\u0001"+ - "\u001a\u0001\u001a\u0003\u001a\u0176\b\u001a\u0001\u001b\u0001\u001b\u0001"+ - "\u001b\u0005\u001b\u017b\b\u001b\n\u001b\f\u001b\u017e\t\u001b\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0005\u001c\u0183\b\u001c\n\u001c\f\u001c\u0186"+ - "\t\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u018b\b\u001d"+ - "\n\u001d\f\u001d\u018e\t\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001"+ - "\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 "+ - "\u0001 \u0001 \u0001 \u0001 \u0005 \u01a1\b \n \f \u01a4\t \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0005 \u01ac\b \n \f \u01af\t \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0005 \u01b7\b \n \f \u01ba\t \u0001 \u0001"+ - " \u0003 \u01be\b \u0001!\u0001!\u0003!\u01c2\b!\u0001\"\u0001\"\u0001"+ - "\"\u0001#\u0001#\u0001#\u0001#\u0005#\u01cb\b#\n#\f#\u01ce\t#\u0001$\u0001"+ - "$\u0003$\u01d2\b$\u0001$\u0001$\u0003$\u01d6\b$\u0001%\u0001%\u0001%\u0001"+ - "&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0005\'\u01e2\b\'\n\'"+ - "\f\'\u01e5\t\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001"+ - ")\u0003)\u01ef\b)\u0001*\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001"+ - ",\u0001,\u0001,\u0005,\u01fb\b,\n,\f,\u01fe\t,\u0001-\u0001-\u0001-\u0001"+ - "-\u0001.\u0001.\u0001/\u0001/\u0003/\u0208\b/\u00010\u00030\u020b\b0\u0001"+ - "0\u00010\u00011\u00031\u0210\b1\u00011\u00011\u00012\u00012\u00013\u0001"+ - "3\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+ - "6\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00038\u0229\b8\u0001"+ - "8\u00018\u00018\u00018\u00058\u022f\b8\n8\f8\u0232\t8\u00038\u0234\b8"+ - "\u00019\u00019\u00019\u00039\u0239\b9\u00019\u00019\u0001:\u0001:\u0001"+ - ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0003;\u0246\b;\u0001;\u0000"+ - "\u0004\u0002\n\u0012\u0014<\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ - "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ - "TVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000<=\u0001\u0000>@\u0002\u0000\u001b"+ - "\u001bMM\u0001\u0000DE\u0002\u0000 $$\u0002\u0000\'\'**\u0002\u0000&"+ - "&44\u0002\u0000557;\u0261\u0000x\u0001\u0000\u0000\u0000\u0002{\u0001"+ - "\u0000\u0000\u0000\u0004\u008d\u0001\u0000\u0000\u0000\u0006\u009f\u0001"+ - "\u0000\u0000\u0000\b\u00a1\u0001\u0000\u0000\u0000\n\u00c2\u0001\u0000"+ - "\u0000\u0000\f\u00dd\u0001\u0000\u0000\u0000\u000e\u00df\u0001\u0000\u0000"+ - "\u0000\u0010\u00e8\u0001\u0000\u0000\u0000\u0012\u00ee\u0001\u0000\u0000"+ - "\u0000\u0014\u0103\u0001\u0000\u0000\u0000\u0016\u010d\u0001\u0000\u0000"+ - "\u0000\u0018\u011e\u0001\u0000\u0000\u0000\u001a\u0120\u0001\u0000\u0000"+ - "\u0000\u001c\u0122\u0001\u0000\u0000\u0000\u001e\u0125\u0001\u0000\u0000"+ - "\u0000 \u0132\u0001\u0000\u0000\u0000\"\u0134\u0001\u0000\u0000\u0000"+ - "$\u0145\u0001\u0000\u0000\u0000&\u0147\u0001\u0000\u0000\u0000(\u0149"+ - "\u0001\u0000\u0000\u0000*\u014d\u0001\u0000\u0000\u0000,\u014f\u0001\u0000"+ - "\u0000\u0000.\u0158\u0001\u0000\u0000\u00000\u015c\u0001\u0000\u0000\u0000"+ - "2\u016c\u0001\u0000\u0000\u00004\u016f\u0001\u0000\u0000\u00006\u0177"+ - "\u0001\u0000\u0000\u00008\u017f\u0001\u0000\u0000\u0000:\u0187\u0001\u0000"+ - "\u0000\u0000<\u018f\u0001\u0000\u0000\u0000>\u0191\u0001\u0000\u0000\u0000"+ - "@\u01bd\u0001\u0000\u0000\u0000B\u01c1\u0001\u0000\u0000\u0000D\u01c3"+ - "\u0001\u0000\u0000\u0000F\u01c6\u0001\u0000\u0000\u0000H\u01cf\u0001\u0000"+ - "\u0000\u0000J\u01d7\u0001\u0000\u0000\u0000L\u01da\u0001\u0000\u0000\u0000"+ - "N\u01dd\u0001\u0000\u0000\u0000P\u01e6\u0001\u0000\u0000\u0000R\u01ea"+ - "\u0001\u0000\u0000\u0000T\u01f0\u0001\u0000\u0000\u0000V\u01f4\u0001\u0000"+ - "\u0000\u0000X\u01f7\u0001\u0000\u0000\u0000Z\u01ff\u0001\u0000\u0000\u0000"+ - "\\\u0203\u0001\u0000\u0000\u0000^\u0207\u0001\u0000\u0000\u0000`\u020a"+ - "\u0001\u0000\u0000\u0000b\u020f\u0001\u0000\u0000\u0000d\u0213\u0001\u0000"+ - "\u0000\u0000f\u0215\u0001\u0000\u0000\u0000h\u0217\u0001\u0000\u0000\u0000"+ - "j\u021a\u0001\u0000\u0000\u0000l\u021e\u0001\u0000\u0000\u0000n\u0221"+ - "\u0001\u0000\u0000\u0000p\u0224\u0001\u0000\u0000\u0000r\u0238\u0001\u0000"+ - "\u0000\u0000t\u023c\u0001\u0000\u0000\u0000v\u0241\u0001\u0000\u0000\u0000"+ - "xy\u0003\u0002\u0001\u0000yz\u0005\u0000\u0000\u0001z\u0001\u0001\u0000"+ - "\u0000\u0000{|\u0006\u0001\uffff\uffff\u0000|}\u0003\u0004\u0002\u0000"+ - "}\u0083\u0001\u0000\u0000\u0000~\u007f\n\u0001\u0000\u0000\u007f\u0080"+ - "\u0005\u001a\u0000\u0000\u0080\u0082\u0003\u0006\u0003\u0000\u0081~\u0001"+ - "\u0000\u0000\u0000\u0082\u0085\u0001\u0000\u0000\u0000\u0083\u0081\u0001"+ - "\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000\u0000\u0084\u0003\u0001"+ - "\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000\u0000\u0086\u008e\u0003"+ - "h4\u0000\u0087\u008e\u0003\"\u0011\u0000\u0088\u008e\u0003n7\u0000\u0089"+ - "\u008e\u0003\u001c\u000e\u0000\u008a\u008e\u0003l6\u0000\u008b\u008c\u0004"+ - "\u0002\u0001\u0000\u008c\u008e\u00030\u0018\u0000\u008d\u0086\u0001\u0000"+ - "\u0000\u0000\u008d\u0087\u0001\u0000\u0000\u0000\u008d\u0088\u0001\u0000"+ - "\u0000\u0000\u008d\u0089\u0001\u0000\u0000\u0000\u008d\u008a\u0001\u0000"+ - "\u0000\u0000\u008d\u008b\u0001\u0000\u0000\u0000\u008e\u0005\u0001\u0000"+ - "\u0000\u0000\u008f\u00a0\u00032\u0019\u0000\u0090\u00a0\u0003\b\u0004"+ - "\u0000\u0091\u00a0\u0003J%\u0000\u0092\u00a0\u0003D\"\u0000\u0093\u00a0"+ - "\u00034\u001a\u0000\u0094\u00a0\u0003F#\u0000\u0095\u00a0\u0003L&\u0000"+ - "\u0096\u00a0\u0003N\'\u0000\u0097\u00a0\u0003R)\u0000\u0098\u00a0\u0003"+ - "T*\u0000\u0099\u00a0\u0003p8\u0000\u009a\u00a0\u0003V+\u0000\u009b\u009c"+ - "\u0004\u0003\u0002\u0000\u009c\u00a0\u0003v;\u0000\u009d\u009e\u0004\u0003"+ - "\u0003\u0000\u009e\u00a0\u0003t:\u0000\u009f\u008f\u0001\u0000\u0000\u0000"+ - "\u009f\u0090\u0001\u0000\u0000\u0000\u009f\u0091\u0001\u0000\u0000\u0000"+ - "\u009f\u0092\u0001\u0000\u0000\u0000\u009f\u0093\u0001\u0000\u0000\u0000"+ - "\u009f\u0094\u0001\u0000\u0000\u0000\u009f\u0095\u0001\u0000\u0000\u0000"+ - "\u009f\u0096\u0001\u0000\u0000\u0000\u009f\u0097\u0001\u0000\u0000\u0000"+ - "\u009f\u0098\u0001\u0000\u0000\u0000\u009f\u0099\u0001\u0000\u0000\u0000"+ - "\u009f\u009a\u0001\u0000\u0000\u0000\u009f\u009b\u0001\u0000\u0000\u0000"+ - "\u009f\u009d\u0001\u0000\u0000\u0000\u00a0\u0007\u0001\u0000\u0000\u0000"+ - "\u00a1\u00a2\u0005\u0011\u0000\u0000\u00a2\u00a3\u0003\n\u0005\u0000\u00a3"+ - "\t\u0001\u0000\u0000\u0000\u00a4\u00a5\u0006\u0005\uffff\uffff\u0000\u00a5"+ - "\u00a6\u0005-\u0000\u0000\u00a6\u00c3\u0003\n\u0005\b\u00a7\u00c3\u0003"+ - "\u0010\b\u0000\u00a8\u00c3\u0003\f\u0006\u0000\u00a9\u00ab\u0003\u0010"+ - "\b\u0000\u00aa\u00ac\u0005-\u0000\u0000\u00ab\u00aa\u0001\u0000\u0000"+ - "\u0000\u00ab\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000"+ - "\u0000\u00ad\u00ae\u0005(\u0000\u0000\u00ae\u00af\u0005,\u0000\u0000\u00af"+ - "\u00b4\u0003\u0010\b\u0000\u00b0\u00b1\u0005#\u0000\u0000\u00b1\u00b3"+ - "\u0003\u0010\b\u0000\u00b2\u00b0\u0001\u0000\u0000\u0000\u00b3\u00b6\u0001"+ - "\u0000\u0000\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b4\u00b5\u0001"+ - "\u0000\u0000\u0000\u00b5\u00b7\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001"+ - "\u0000\u0000\u0000\u00b7\u00b8\u00053\u0000\u0000\u00b8\u00c3\u0001\u0000"+ - "\u0000\u0000\u00b9\u00ba\u0003\u0010\b\u0000\u00ba\u00bc\u0005)\u0000"+ - "\u0000\u00bb\u00bd\u0005-\u0000\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000"+ - "\u00bc\u00bd\u0001\u0000\u0000\u0000\u00bd\u00be\u0001\u0000\u0000\u0000"+ - "\u00be\u00bf\u0005.\u0000\u0000\u00bf\u00c3\u0001\u0000\u0000\u0000\u00c0"+ - "\u00c1\u0004\u0005\u0004\u0000\u00c1\u00c3\u0003\u000e\u0007\u0000\u00c2"+ - "\u00a4\u0001\u0000\u0000\u0000\u00c2\u00a7\u0001\u0000\u0000\u0000\u00c2"+ - "\u00a8\u0001\u0000\u0000\u0000\u00c2\u00a9\u0001\u0000\u0000\u0000\u00c2"+ - "\u00b9\u0001\u0000\u0000\u0000\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c3"+ - "\u00cc\u0001\u0000\u0000\u0000\u00c4\u00c5\n\u0005\u0000\u0000\u00c5\u00c6"+ - "\u0005\u001f\u0000\u0000\u00c6\u00cb\u0003\n\u0005\u0006\u00c7\u00c8\n"+ - "\u0004\u0000\u0000\u00c8\u00c9\u00050\u0000\u0000\u00c9\u00cb\u0003\n"+ - "\u0005\u0005\u00ca\u00c4\u0001\u0000\u0000\u0000\u00ca\u00c7\u0001\u0000"+ - "\u0000\u0000\u00cb\u00ce\u0001\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cd\u0001\u0000\u0000\u0000\u00cd\u000b\u0001\u0000"+ - "\u0000\u0000\u00ce\u00cc\u0001\u0000\u0000\u0000\u00cf\u00d1\u0003\u0010"+ - "\b\u0000\u00d0\u00d2\u0005-\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000"+ - "\u0000\u00d1\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000"+ - "\u0000\u00d3\u00d4\u0005+\u0000\u0000\u00d4\u00d5\u0003d2\u0000\u00d5"+ - "\u00de\u0001\u0000\u0000\u0000\u00d6\u00d8\u0003\u0010\b\u0000\u00d7\u00d9"+ - "\u0005-\u0000\u0000\u00d8\u00d7\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001"+ - "\u0000\u0000\u0000\u00d9\u00da\u0001\u0000\u0000\u0000\u00da\u00db\u0005"+ - "2\u0000\u0000\u00db\u00dc\u0003d2\u0000\u00dc\u00de\u0001\u0000\u0000"+ - "\u0000\u00dd\u00cf\u0001\u0000\u0000\u0000\u00dd\u00d6\u0001\u0000\u0000"+ - "\u0000\u00de\r\u0001\u0000\u0000\u0000\u00df\u00e0\u0003\u0010\b\u0000"+ - "\u00e0\u00e1\u0005\u0014\u0000\u0000\u00e1\u00e2\u0003d2\u0000\u00e2\u000f"+ - "\u0001\u0000\u0000\u0000\u00e3\u00e9\u0003\u0012\t\u0000\u00e4\u00e5\u0003"+ - "\u0012\t\u0000\u00e5\u00e6\u0003f3\u0000\u00e6\u00e7\u0003\u0012\t\u0000"+ - "\u00e7\u00e9\u0001\u0000\u0000\u0000\u00e8\u00e3\u0001\u0000\u0000\u0000"+ - "\u00e8\u00e4\u0001\u0000\u0000\u0000\u00e9\u0011\u0001\u0000\u0000\u0000"+ - "\u00ea\u00eb\u0006\t\uffff\uffff\u0000\u00eb\u00ef\u0003\u0014\n\u0000"+ - "\u00ec\u00ed\u0007\u0000\u0000\u0000\u00ed\u00ef\u0003\u0012\t\u0003\u00ee"+ - "\u00ea\u0001\u0000\u0000\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ef"+ - "\u00f8\u0001\u0000\u0000\u0000\u00f0\u00f1\n\u0002\u0000\u0000\u00f1\u00f2"+ - "\u0007\u0001\u0000\u0000\u00f2\u00f7\u0003\u0012\t\u0003\u00f3\u00f4\n"+ - "\u0001\u0000\u0000\u00f4\u00f5\u0007\u0000\u0000\u0000\u00f5\u00f7\u0003"+ - "\u0012\t\u0002\u00f6\u00f0\u0001\u0000\u0000\u0000\u00f6\u00f3\u0001\u0000"+ - "\u0000\u0000\u00f7\u00fa\u0001\u0000\u0000\u0000\u00f8\u00f6\u0001\u0000"+ - "\u0000\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9\u0013\u0001\u0000"+ - "\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000\u00fb\u00fc\u0006\n\uffff"+ - "\uffff\u0000\u00fc\u0104\u0003@ \u0000\u00fd\u0104\u00036\u001b\u0000"+ - "\u00fe\u0104\u0003\u0016\u000b\u0000\u00ff\u0100\u0005,\u0000\u0000\u0100"+ - "\u0101\u0003\n\u0005\u0000\u0101\u0102\u00053\u0000\u0000\u0102\u0104"+ - "\u0001\u0000\u0000\u0000\u0103\u00fb\u0001\u0000\u0000\u0000\u0103\u00fd"+ - "\u0001\u0000\u0000\u0000\u0103\u00fe\u0001\u0000\u0000\u0000\u0103\u00ff"+ - "\u0001\u0000\u0000\u0000\u0104\u010a\u0001\u0000\u0000\u0000\u0105\u0106"+ - "\n\u0001\u0000\u0000\u0106\u0107\u0005\"\u0000\u0000\u0107\u0109\u0003"+ - "\u001a\r\u0000\u0108\u0105\u0001\u0000\u0000\u0000\u0109\u010c\u0001\u0000"+ - "\u0000\u0000\u010a\u0108\u0001\u0000\u0000\u0000\u010a\u010b\u0001\u0000"+ - "\u0000\u0000\u010b\u0015\u0001\u0000\u0000\u0000\u010c\u010a\u0001\u0000"+ - "\u0000\u0000\u010d\u010e\u0003\u0018\f\u0000\u010e\u0118\u0005,\u0000"+ - "\u0000\u010f\u0119\u0005>\u0000\u0000\u0110\u0115\u0003\n\u0005\u0000"+ - "\u0111\u0112\u0005#\u0000\u0000\u0112\u0114\u0003\n\u0005\u0000\u0113"+ - "\u0111\u0001\u0000\u0000\u0000\u0114\u0117\u0001\u0000\u0000\u0000\u0115"+ - "\u0113\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000\u0000\u0000\u0116"+ - "\u0119\u0001\u0000\u0000\u0000\u0117\u0115\u0001\u0000\u0000\u0000\u0118"+ - "\u010f\u0001\u0000\u0000\u0000\u0118\u0110\u0001\u0000\u0000\u0000\u0118"+ - "\u0119\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000\u0000\u011a"+ - "\u011b\u00053\u0000\u0000\u011b\u0017\u0001\u0000\u0000\u0000\u011c\u011f"+ - "\u0003<\u001e\u0000\u011d\u011f\u0005\u0014\u0000\u0000\u011e\u011c\u0001"+ - "\u0000\u0000\u0000\u011e\u011d\u0001\u0000\u0000\u0000\u011f\u0019\u0001"+ - "\u0000\u0000\u0000\u0120\u0121\u0003<\u001e\u0000\u0121\u001b\u0001\u0000"+ - "\u0000\u0000\u0122\u0123\u0005\r\u0000\u0000\u0123\u0124\u0003\u001e\u000f"+ - "\u0000\u0124\u001d\u0001\u0000\u0000\u0000\u0125\u012a\u0003 \u0010\u0000"+ - "\u0126\u0127\u0005#\u0000\u0000\u0127\u0129\u0003 \u0010\u0000\u0128\u0126"+ - "\u0001\u0000\u0000\u0000\u0129\u012c\u0001\u0000\u0000\u0000\u012a\u0128"+ - "\u0001\u0000\u0000\u0000\u012a\u012b\u0001\u0000\u0000\u0000\u012b\u001f"+ - "\u0001\u0000\u0000\u0000\u012c\u012a\u0001\u0000\u0000\u0000\u012d\u0133"+ - "\u0003\n\u0005\u0000\u012e\u012f\u00036\u001b\u0000\u012f\u0130\u0005"+ - "!\u0000\u0000\u0130\u0131\u0003\n\u0005\u0000\u0131\u0133\u0001\u0000"+ - "\u0000\u0000\u0132\u012d\u0001\u0000\u0000\u0000\u0132\u012e\u0001\u0000"+ - "\u0000\u0000\u0133!\u0001\u0000\u0000\u0000\u0134\u0135\u0005\u0006\u0000"+ - "\u0000\u0135\u013a\u0003$\u0012\u0000\u0136\u0137\u0005#\u0000\u0000\u0137"+ - "\u0139\u0003$\u0012\u0000\u0138\u0136\u0001\u0000\u0000\u0000\u0139\u013c"+ - "\u0001\u0000\u0000\u0000\u013a\u0138\u0001\u0000\u0000\u0000\u013a\u013b"+ - "\u0001\u0000\u0000\u0000\u013b\u013e\u0001\u0000\u0000\u0000\u013c\u013a"+ - "\u0001\u0000\u0000\u0000\u013d\u013f\u0003*\u0015\u0000\u013e\u013d\u0001"+ - "\u0000\u0000\u0000\u013e\u013f\u0001\u0000\u0000\u0000\u013f#\u0001\u0000"+ - "\u0000\u0000\u0140\u0141\u0003&\u0013\u0000\u0141\u0142\u0005m\u0000\u0000"+ - "\u0142\u0143\u0003(\u0014\u0000\u0143\u0146\u0001\u0000\u0000\u0000\u0144"+ - "\u0146\u0003(\u0014\u0000\u0145\u0140\u0001\u0000\u0000\u0000\u0145\u0144"+ - "\u0001\u0000\u0000\u0000\u0146%\u0001\u0000\u0000\u0000\u0147\u0148\u0005"+ - "M\u0000\u0000\u0148\'\u0001\u0000\u0000\u0000\u0149\u014a\u0007\u0002"+ - "\u0000\u0000\u014a)\u0001\u0000\u0000\u0000\u014b\u014e\u0003,\u0016\u0000"+ - "\u014c\u014e\u0003.\u0017\u0000\u014d\u014b\u0001\u0000\u0000\u0000\u014d"+ - "\u014c\u0001\u0000\u0000\u0000\u014e+\u0001\u0000\u0000\u0000\u014f\u0150"+ - "\u0005L\u0000\u0000\u0150\u0155\u0005M\u0000\u0000\u0151\u0152\u0005#"+ - "\u0000\u0000\u0152\u0154\u0005M\u0000\u0000\u0153\u0151\u0001\u0000\u0000"+ - "\u0000\u0154\u0157\u0001\u0000\u0000\u0000\u0155\u0153\u0001\u0000\u0000"+ - "\u0000\u0155\u0156\u0001\u0000\u0000\u0000\u0156-\u0001\u0000\u0000\u0000"+ - "\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u0159\u0005B\u0000\u0000\u0159"+ - "\u015a\u0003,\u0016\u0000\u015a\u015b\u0005C\u0000\u0000\u015b/\u0001"+ - "\u0000\u0000\u0000\u015c\u015d\u0005\u0015\u0000\u0000\u015d\u0162\u0003"+ - "$\u0012\u0000\u015e\u015f\u0005#\u0000\u0000\u015f\u0161\u0003$\u0012"+ - "\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0161\u0164\u0001\u0000\u0000"+ - "\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163\u0001\u0000\u0000"+ - "\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164\u0162\u0001\u0000\u0000"+ - "\u0000\u0165\u0167\u0003\u001e\u000f\u0000\u0166\u0165\u0001\u0000\u0000"+ - "\u0000\u0166\u0167\u0001\u0000\u0000\u0000\u0167\u016a\u0001\u0000\u0000"+ - "\u0000\u0168\u0169\u0005\u001e\u0000\u0000\u0169\u016b\u0003\u001e\u000f"+ - "\u0000\u016a\u0168\u0001\u0000\u0000\u0000\u016a\u016b\u0001\u0000\u0000"+ - "\u0000\u016b1\u0001\u0000\u0000\u0000\u016c\u016d\u0005\u0004\u0000\u0000"+ - "\u016d\u016e\u0003\u001e\u000f\u0000\u016e3\u0001\u0000\u0000\u0000\u016f"+ - "\u0171\u0005\u0010\u0000\u0000\u0170\u0172\u0003\u001e\u000f\u0000\u0171"+ - "\u0170\u0001\u0000\u0000\u0000\u0171\u0172\u0001\u0000\u0000\u0000\u0172"+ - "\u0175\u0001\u0000\u0000\u0000\u0173\u0174\u0005\u001e\u0000\u0000\u0174"+ - "\u0176\u0003\u001e\u000f\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0175"+ - "\u0176\u0001\u0000\u0000\u0000\u01765\u0001\u0000\u0000\u0000\u0177\u017c"+ - "\u0003<\u001e\u0000\u0178\u0179\u0005%\u0000\u0000\u0179\u017b\u0003<"+ - "\u001e\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017b\u017e\u0001\u0000"+ - "\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017d\u0001\u0000"+ - "\u0000\u0000\u017d7\u0001\u0000\u0000\u0000\u017e\u017c\u0001\u0000\u0000"+ - "\u0000\u017f\u0184\u0003>\u001f\u0000\u0180\u0181\u0005%\u0000\u0000\u0181"+ - "\u0183\u0003>\u001f\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0183\u0186"+ - "\u0001\u0000\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0184\u0185"+ - "\u0001\u0000\u0000\u0000\u01859\u0001\u0000\u0000\u0000\u0186\u0184\u0001"+ - "\u0000\u0000\u0000\u0187\u018c\u00038\u001c\u0000\u0188\u0189\u0005#\u0000"+ - "\u0000\u0189\u018b\u00038\u001c\u0000\u018a\u0188\u0001\u0000\u0000\u0000"+ - "\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000\u0000\u0000"+ - "\u018c\u018d\u0001\u0000\u0000\u0000\u018d;\u0001\u0000\u0000\u0000\u018e"+ - "\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0007\u0003\u0000\u0000\u0190"+ - "=\u0001\u0000\u0000\u0000\u0191\u0192\u0005Q\u0000\u0000\u0192?\u0001"+ - "\u0000\u0000\u0000\u0193\u01be\u0005.\u0000\u0000\u0194\u0195\u0003b1"+ - "\u0000\u0195\u0196\u0005D\u0000\u0000\u0196\u01be\u0001\u0000\u0000\u0000"+ - "\u0197\u01be\u0003`0\u0000\u0198\u01be\u0003b1\u0000\u0199\u01be\u0003"+ - "\\.\u0000\u019a\u01be\u0003B!\u0000\u019b\u01be\u0003d2\u0000\u019c\u019d"+ - "\u0005B\u0000\u0000\u019d\u01a2\u0003^/\u0000\u019e\u019f\u0005#\u0000"+ - "\u0000\u019f\u01a1\u0003^/\u0000\u01a0\u019e\u0001\u0000\u0000\u0000\u01a1"+ - "\u01a4\u0001\u0000\u0000\u0000\u01a2\u01a0\u0001\u0000\u0000\u0000\u01a2"+ - "\u01a3\u0001\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4"+ - "\u01a2\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005C\u0000\u0000\u01a6\u01be"+ - "\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005B\u0000\u0000\u01a8\u01ad\u0003"+ - "\\.\u0000\u01a9\u01aa\u0005#\u0000\u0000\u01aa\u01ac\u0003\\.\u0000\u01ab"+ - "\u01a9\u0001\u0000\u0000\u0000\u01ac\u01af\u0001\u0000\u0000\u0000\u01ad"+ - "\u01ab\u0001\u0000\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae"+ - "\u01b0\u0001\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01b0"+ - "\u01b1\u0005C\u0000\u0000\u01b1\u01be\u0001\u0000\u0000\u0000\u01b2\u01b3"+ - "\u0005B\u0000\u0000\u01b3\u01b8\u0003d2\u0000\u01b4\u01b5\u0005#\u0000"+ - "\u0000\u01b5\u01b7\u0003d2\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b7"+ - "\u01ba\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b9\u0001\u0000\u0000\u0000\u01b9\u01bb\u0001\u0000\u0000\u0000\u01ba"+ - "\u01b8\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005C\u0000\u0000\u01bc\u01be"+ - "\u0001\u0000\u0000\u0000\u01bd\u0193\u0001\u0000\u0000\u0000\u01bd\u0194"+ - "\u0001\u0000\u0000\u0000\u01bd\u0197\u0001\u0000\u0000\u0000\u01bd\u0198"+ - "\u0001\u0000\u0000\u0000\u01bd\u0199\u0001\u0000\u0000\u0000\u01bd\u019a"+ - "\u0001\u0000\u0000\u0000\u01bd\u019b\u0001\u0000\u0000\u0000\u01bd\u019c"+ - "\u0001\u0000\u0000\u0000\u01bd\u01a7\u0001\u0000\u0000\u0000\u01bd\u01b2"+ - "\u0001\u0000\u0000\u0000\u01beA\u0001\u0000\u0000\u0000\u01bf\u01c2\u0005"+ - "1\u0000\u0000\u01c0\u01c2\u0005A\u0000\u0000\u01c1\u01bf\u0001\u0000\u0000"+ - "\u0000\u01c1\u01c0\u0001\u0000\u0000\u0000\u01c2C\u0001\u0000\u0000\u0000"+ - "\u01c3\u01c4\u0005\t\u0000\u0000\u01c4\u01c5\u0005\u001c\u0000\u0000\u01c5"+ - "E\u0001\u0000\u0000\u0000\u01c6\u01c7\u0005\u000f\u0000\u0000\u01c7\u01cc"+ - "\u0003H$\u0000\u01c8\u01c9\u0005#\u0000\u0000\u01c9\u01cb\u0003H$\u0000"+ - "\u01ca\u01c8\u0001\u0000\u0000\u0000\u01cb\u01ce\u0001\u0000\u0000\u0000"+ - "\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cc\u01cd\u0001\u0000\u0000\u0000"+ - "\u01cdG\u0001\u0000\u0000\u0000\u01ce\u01cc\u0001\u0000\u0000\u0000\u01cf"+ - "\u01d1\u0003\n\u0005\u0000\u01d0\u01d2\u0007\u0004\u0000\u0000\u01d1\u01d0"+ - "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0001\u0000\u0000\u0000\u01d2\u01d5"+ - "\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005/\u0000\u0000\u01d4\u01d6\u0007"+ - "\u0005\u0000\u0000\u01d5\u01d3\u0001\u0000\u0000\u0000\u01d5\u01d6\u0001"+ - "\u0000\u0000\u0000\u01d6I\u0001\u0000\u0000\u0000\u01d7\u01d8\u0005\b"+ - "\u0000\u0000\u01d8\u01d9\u0003:\u001d\u0000\u01d9K\u0001\u0000\u0000\u0000"+ - "\u01da\u01db\u0005\u0002\u0000\u0000\u01db\u01dc\u0003:\u001d\u0000\u01dc"+ - "M\u0001\u0000\u0000\u0000\u01dd\u01de\u0005\f\u0000\u0000\u01de\u01e3"+ - "\u0003P(\u0000\u01df\u01e0\u0005#\u0000\u0000\u01e0\u01e2\u0003P(\u0000"+ - "\u01e1\u01df\u0001\u0000\u0000\u0000\u01e2\u01e5\u0001\u0000\u0000\u0000"+ - "\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000"+ - "\u01e4O\u0001\u0000\u0000\u0000\u01e5\u01e3\u0001\u0000\u0000\u0000\u01e6"+ - "\u01e7\u00038\u001c\u0000\u01e7\u01e8\u0005U\u0000\u0000\u01e8\u01e9\u0003"+ - "8\u001c\u0000\u01e9Q\u0001\u0000\u0000\u0000\u01ea\u01eb\u0005\u0001\u0000"+ - "\u0000\u01eb\u01ec\u0003\u0014\n\u0000\u01ec\u01ee\u0003d2\u0000\u01ed"+ - "\u01ef\u0003X,\u0000\u01ee\u01ed\u0001\u0000\u0000\u0000\u01ee\u01ef\u0001"+ - "\u0000\u0000\u0000\u01efS\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0007"+ - "\u0000\u0000\u01f1\u01f2\u0003\u0014\n\u0000\u01f2\u01f3\u0003d2\u0000"+ - "\u01f3U\u0001\u0000\u0000\u0000\u01f4\u01f5\u0005\u000b\u0000\u0000\u01f5"+ - "\u01f6\u00036\u001b\u0000\u01f6W\u0001\u0000\u0000\u0000\u01f7\u01fc\u0003"+ - "Z-\u0000\u01f8\u01f9\u0005#\u0000\u0000\u01f9\u01fb\u0003Z-\u0000\u01fa"+ - "\u01f8\u0001\u0000\u0000\u0000\u01fb\u01fe\u0001\u0000\u0000\u0000\u01fc"+ - "\u01fa\u0001\u0000\u0000\u0000\u01fc\u01fd\u0001\u0000\u0000\u0000\u01fd"+ - "Y\u0001\u0000\u0000\u0000\u01fe\u01fc\u0001\u0000\u0000\u0000\u01ff\u0200"+ - "\u0003<\u001e\u0000\u0200\u0201\u0005!\u0000\u0000\u0201\u0202\u0003@"+ - " \u0000\u0202[\u0001\u0000\u0000\u0000\u0203\u0204\u0007\u0006\u0000\u0000"+ - "\u0204]\u0001\u0000\u0000\u0000\u0205\u0208\u0003`0\u0000\u0206\u0208"+ - "\u0003b1\u0000\u0207\u0205\u0001\u0000\u0000\u0000\u0207\u0206\u0001\u0000"+ - "\u0000\u0000\u0208_\u0001\u0000\u0000\u0000\u0209\u020b\u0007\u0000\u0000"+ - "\u0000\u020a\u0209\u0001\u0000\u0000\u0000\u020a\u020b\u0001\u0000\u0000"+ - "\u0000\u020b\u020c\u0001\u0000\u0000\u0000\u020c\u020d\u0005\u001d\u0000"+ - "\u0000\u020da\u0001\u0000\u0000\u0000\u020e\u0210\u0007\u0000\u0000\u0000"+ - "\u020f\u020e\u0001\u0000\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000"+ - "\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212\u0005\u001c\u0000\u0000"+ - "\u0212c\u0001\u0000\u0000\u0000\u0213\u0214\u0005\u001b\u0000\u0000\u0214"+ - "e\u0001\u0000\u0000\u0000\u0215\u0216\u0007\u0007\u0000\u0000\u0216g\u0001"+ - "\u0000\u0000\u0000\u0217\u0218\u0005\u0005\u0000\u0000\u0218\u0219\u0003"+ - "j5\u0000\u0219i\u0001\u0000\u0000\u0000\u021a\u021b\u0005B\u0000\u0000"+ - "\u021b\u021c\u0003\u0002\u0001\u0000\u021c\u021d\u0005C\u0000\u0000\u021d"+ - "k\u0001\u0000\u0000\u0000\u021e\u021f\u0005\u000e\u0000\u0000\u021f\u0220"+ - "\u0005e\u0000\u0000\u0220m\u0001\u0000\u0000\u0000\u0221\u0222\u0005\n"+ - "\u0000\u0000\u0222\u0223\u0005i\u0000\u0000\u0223o\u0001\u0000\u0000\u0000"+ - "\u0224\u0225\u0005\u0003\u0000\u0000\u0225\u0228\u0005[\u0000\u0000\u0226"+ - "\u0227\u0005Y\u0000\u0000\u0227\u0229\u00038\u001c\u0000\u0228\u0226\u0001"+ - "\u0000\u0000\u0000\u0228\u0229\u0001\u0000\u0000\u0000\u0229\u0233\u0001"+ - "\u0000\u0000\u0000\u022a\u022b\u0005Z\u0000\u0000\u022b\u0230\u0003r9"+ - "\u0000\u022c\u022d\u0005#\u0000\u0000\u022d\u022f\u0003r9\u0000\u022e"+ - "\u022c\u0001\u0000\u0000\u0000\u022f\u0232\u0001\u0000\u0000\u0000\u0230"+ - "\u022e\u0001\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231"+ - "\u0234\u0001\u0000\u0000\u0000\u0232\u0230\u0001\u0000\u0000\u0000\u0233"+ - "\u022a\u0001\u0000\u0000\u0000\u0233\u0234\u0001\u0000\u0000\u0000\u0234"+ - "q\u0001\u0000\u0000\u0000\u0235\u0236\u00038\u001c\u0000\u0236\u0237\u0005"+ - "!\u0000\u0000\u0237\u0239\u0001\u0000\u0000\u0000\u0238\u0235\u0001\u0000"+ - "\u0000\u0000\u0238\u0239\u0001\u0000\u0000\u0000\u0239\u023a\u0001\u0000"+ - "\u0000\u0000\u023a\u023b\u00038\u001c\u0000\u023bs\u0001\u0000\u0000\u0000"+ - "\u023c\u023d\u0005\u0013\u0000\u0000\u023d\u023e\u0003$\u0012\u0000\u023e"+ - "\u023f\u0005Y\u0000\u0000\u023f\u0240\u0003:\u001d\u0000\u0240u\u0001"+ - "\u0000\u0000\u0000\u0241\u0242\u0005\u0012\u0000\u0000\u0242\u0245\u0003"+ - "\u001e\u000f\u0000\u0243\u0244\u0005\u001e\u0000\u0000\u0244\u0246\u0003"+ - "\u001e\u000f\u0000\u0245\u0243\u0001\u0000\u0000\u0000\u0245\u0246\u0001"+ - "\u0000\u0000\u0000\u0246w\u0001\u0000\u0000\u00007\u0083\u008d\u009f\u00ab"+ - "\u00b4\u00bc\u00c2\u00ca\u00cc\u00d1\u00d8\u00dd\u00e8\u00ee\u00f6\u00f8"+ - "\u0103\u010a\u0115\u0118\u011e\u012a\u0132\u013a\u013e\u0145\u014d\u0155"+ - "\u0162\u0166\u016a\u0171\u0175\u017c\u0184\u018c\u01a2\u01ad\u01b8\u01bd"+ - "\u01c1\u01cc\u01d1\u01d5\u01e3\u01ee\u01fc\u0207\u020a\u020f\u0228\u0230"+ - "\u0233\u0238\u0245"; + "\f\u0001\f\u0001\f\u0003\f\u0120\b\f\u0001\r\u0001\r\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0005\u000f\u012a"+ + "\b\u000f\n\u000f\f\u000f\u012d\t\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0003\u0010\u0134\b\u0010\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0005\u0011\u013a\b\u0011\n\u0011\f\u0011\u013d"+ + "\t\u0011\u0001\u0011\u0003\u0011\u0140\b\u0011\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0147\b\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0003\u0015"+ + "\u014f\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016"+ + "\u0155\b\u0016\n\u0016\f\u0016\u0158\t\u0016\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005"+ + "\u0018\u0162\b\u0018\n\u0018\f\u0018\u0165\t\u0018\u0001\u0018\u0003\u0018"+ + "\u0168\b\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u016c\b\u0018\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0003\u001a\u0173"+ + "\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u0177\b\u001a\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0005\u001b\u017c\b\u001b\n\u001b\f\u001b\u017f"+ + "\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c\u0184\b\u001c"+ + "\n\u001c\f\u001c\u0187\t\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0005"+ + "\u001d\u018c\b\u001d\n\u001d\f\u001d\u018f\t\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01a2\b \n \f \u01a5"+ + "\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01ad\b \n \f \u01b0"+ + "\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01b8\b \n \f \u01bb"+ + "\t \u0001 \u0001 \u0003 \u01bf\b \u0001!\u0001!\u0003!\u01c3\b!\u0001"+ + "\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0005#\u01cc\b#\n#\f#\u01cf"+ + "\t#\u0001$\u0001$\u0003$\u01d3\b$\u0001$\u0001$\u0003$\u01d7\b$\u0001"+ + "%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0005"+ + "\'\u01e3\b\'\n\'\f\'\u01e6\t\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0003)\u01f0\b)\u0001*\u0001*\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001,\u0001,\u0001,\u0005,\u01fc\b,\n,\f,\u01ff\t,\u0001-\u0001"+ + "-\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u0003/\u0209\b/\u00010\u0003"+ + "0\u020c\b0\u00010\u00010\u00011\u00031\u0211\b1\u00011\u00011\u00012\u0001"+ + "2\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "6\u00016\u00016\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u0003"+ + "8\u022a\b8\u00018\u00018\u00018\u00018\u00058\u0230\b8\n8\f8\u0233\t8"+ + "\u00038\u0235\b8\u00019\u00019\u00019\u00039\u023a\b9\u00019\u00019\u0001"+ + ":\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0003;\u0247"+ + "\b;\u0001;\u0000\u0004\u0002\n\u0012\u0014<\u0000\u0002\u0004\u0006\b"+ + "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ + "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000<=\u0001\u0000"+ + ">@\u0002\u0000\u001b\u001bMM\u0001\u0000DE\u0002\u0000 $$\u0002\u0000"+ + "\'\'**\u0002\u0000&&44\u0002\u0000557;\u0262\u0000x\u0001\u0000\u0000"+ + "\u0000\u0002{\u0001\u0000\u0000\u0000\u0004\u008d\u0001\u0000\u0000\u0000"+ + "\u0006\u009f\u0001\u0000\u0000\u0000\b\u00a1\u0001\u0000\u0000\u0000\n"+ + "\u00c2\u0001\u0000\u0000\u0000\f\u00dd\u0001\u0000\u0000\u0000\u000e\u00df"+ + "\u0001\u0000\u0000\u0000\u0010\u00e8\u0001\u0000\u0000\u0000\u0012\u00ee"+ + "\u0001\u0000\u0000\u0000\u0014\u0103\u0001\u0000\u0000\u0000\u0016\u010d"+ + "\u0001\u0000\u0000\u0000\u0018\u011f\u0001\u0000\u0000\u0000\u001a\u0121"+ + "\u0001\u0000\u0000\u0000\u001c\u0123\u0001\u0000\u0000\u0000\u001e\u0126"+ + "\u0001\u0000\u0000\u0000 \u0133\u0001\u0000\u0000\u0000\"\u0135\u0001"+ + "\u0000\u0000\u0000$\u0146\u0001\u0000\u0000\u0000&\u0148\u0001\u0000\u0000"+ + "\u0000(\u014a\u0001\u0000\u0000\u0000*\u014e\u0001\u0000\u0000\u0000,"+ + "\u0150\u0001\u0000\u0000\u0000.\u0159\u0001\u0000\u0000\u00000\u015d\u0001"+ + "\u0000\u0000\u00002\u016d\u0001\u0000\u0000\u00004\u0170\u0001\u0000\u0000"+ + "\u00006\u0178\u0001\u0000\u0000\u00008\u0180\u0001\u0000\u0000\u0000:"+ + "\u0188\u0001\u0000\u0000\u0000<\u0190\u0001\u0000\u0000\u0000>\u0192\u0001"+ + "\u0000\u0000\u0000@\u01be\u0001\u0000\u0000\u0000B\u01c2\u0001\u0000\u0000"+ + "\u0000D\u01c4\u0001\u0000\u0000\u0000F\u01c7\u0001\u0000\u0000\u0000H"+ + "\u01d0\u0001\u0000\u0000\u0000J\u01d8\u0001\u0000\u0000\u0000L\u01db\u0001"+ + "\u0000\u0000\u0000N\u01de\u0001\u0000\u0000\u0000P\u01e7\u0001\u0000\u0000"+ + "\u0000R\u01eb\u0001\u0000\u0000\u0000T\u01f1\u0001\u0000\u0000\u0000V"+ + "\u01f5\u0001\u0000\u0000\u0000X\u01f8\u0001\u0000\u0000\u0000Z\u0200\u0001"+ + "\u0000\u0000\u0000\\\u0204\u0001\u0000\u0000\u0000^\u0208\u0001\u0000"+ + "\u0000\u0000`\u020b\u0001\u0000\u0000\u0000b\u0210\u0001\u0000\u0000\u0000"+ + "d\u0214\u0001\u0000\u0000\u0000f\u0216\u0001\u0000\u0000\u0000h\u0218"+ + "\u0001\u0000\u0000\u0000j\u021b\u0001\u0000\u0000\u0000l\u021f\u0001\u0000"+ + "\u0000\u0000n\u0222\u0001\u0000\u0000\u0000p\u0225\u0001\u0000\u0000\u0000"+ + "r\u0239\u0001\u0000\u0000\u0000t\u023d\u0001\u0000\u0000\u0000v\u0242"+ + "\u0001\u0000\u0000\u0000xy\u0003\u0002\u0001\u0000yz\u0005\u0000\u0000"+ + "\u0001z\u0001\u0001\u0000\u0000\u0000{|\u0006\u0001\uffff\uffff\u0000"+ + "|}\u0003\u0004\u0002\u0000}\u0083\u0001\u0000\u0000\u0000~\u007f\n\u0001"+ + "\u0000\u0000\u007f\u0080\u0005\u001a\u0000\u0000\u0080\u0082\u0003\u0006"+ + "\u0003\u0000\u0081~\u0001\u0000\u0000\u0000\u0082\u0085\u0001\u0000\u0000"+ + "\u0000\u0083\u0081\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000"+ + "\u0000\u0084\u0003\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ + "\u0000\u0086\u008e\u0003h4\u0000\u0087\u008e\u0003\"\u0011\u0000\u0088"+ + "\u008e\u0003n7\u0000\u0089\u008e\u0003\u001c\u000e\u0000\u008a\u008e\u0003"+ + "l6\u0000\u008b\u008c\u0004\u0002\u0001\u0000\u008c\u008e\u00030\u0018"+ + "\u0000\u008d\u0086\u0001\u0000\u0000\u0000\u008d\u0087\u0001\u0000\u0000"+ + "\u0000\u008d\u0088\u0001\u0000\u0000\u0000\u008d\u0089\u0001\u0000\u0000"+ + "\u0000\u008d\u008a\u0001\u0000\u0000\u0000\u008d\u008b\u0001\u0000\u0000"+ + "\u0000\u008e\u0005\u0001\u0000\u0000\u0000\u008f\u00a0\u00032\u0019\u0000"+ + "\u0090\u00a0\u0003\b\u0004\u0000\u0091\u00a0\u0003J%\u0000\u0092\u00a0"+ + "\u0003D\"\u0000\u0093\u00a0\u00034\u001a\u0000\u0094\u00a0\u0003F#\u0000"+ + "\u0095\u00a0\u0003L&\u0000\u0096\u00a0\u0003N\'\u0000\u0097\u00a0\u0003"+ + "R)\u0000\u0098\u00a0\u0003T*\u0000\u0099\u00a0\u0003p8\u0000\u009a\u00a0"+ + "\u0003V+\u0000\u009b\u009c\u0004\u0003\u0002\u0000\u009c\u00a0\u0003v"+ + ";\u0000\u009d\u009e\u0004\u0003\u0003\u0000\u009e\u00a0\u0003t:\u0000"+ + "\u009f\u008f\u0001\u0000\u0000\u0000\u009f\u0090\u0001\u0000\u0000\u0000"+ + "\u009f\u0091\u0001\u0000\u0000\u0000\u009f\u0092\u0001\u0000\u0000\u0000"+ + "\u009f\u0093\u0001\u0000\u0000\u0000\u009f\u0094\u0001\u0000\u0000\u0000"+ + "\u009f\u0095\u0001\u0000\u0000\u0000\u009f\u0096\u0001\u0000\u0000\u0000"+ + "\u009f\u0097\u0001\u0000\u0000\u0000\u009f\u0098\u0001\u0000\u0000\u0000"+ + "\u009f\u0099\u0001\u0000\u0000\u0000\u009f\u009a\u0001\u0000\u0000\u0000"+ + "\u009f\u009b\u0001\u0000\u0000\u0000\u009f\u009d\u0001\u0000\u0000\u0000"+ + "\u00a0\u0007\u0001\u0000\u0000\u0000\u00a1\u00a2\u0005\u0011\u0000\u0000"+ + "\u00a2\u00a3\u0003\n\u0005\u0000\u00a3\t\u0001\u0000\u0000\u0000\u00a4"+ + "\u00a5\u0006\u0005\uffff\uffff\u0000\u00a5\u00a6\u0005-\u0000\u0000\u00a6"+ + "\u00c3\u0003\n\u0005\b\u00a7\u00c3\u0003\u0010\b\u0000\u00a8\u00c3\u0003"+ + "\f\u0006\u0000\u00a9\u00ab\u0003\u0010\b\u0000\u00aa\u00ac\u0005-\u0000"+ + "\u0000\u00ab\u00aa\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000"+ + "\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad\u00ae\u0005(\u0000\u0000"+ + "\u00ae\u00af\u0005,\u0000\u0000\u00af\u00b4\u0003\u0010\b\u0000\u00b0"+ + "\u00b1\u0005#\u0000\u0000\u00b1\u00b3\u0003\u0010\b\u0000\u00b2\u00b0"+ + "\u0001\u0000\u0000\u0000\u00b3\u00b6\u0001\u0000\u0000\u0000\u00b4\u00b2"+ + "\u0001\u0000\u0000\u0000\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u00b7"+ + "\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b7\u00b8"+ + "\u00053\u0000\u0000\u00b8\u00c3\u0001\u0000\u0000\u0000\u00b9\u00ba\u0003"+ + "\u0010\b\u0000\u00ba\u00bc\u0005)\u0000\u0000\u00bb\u00bd\u0005-\u0000"+ + "\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001\u0000\u0000"+ + "\u0000\u00bd\u00be\u0001\u0000\u0000\u0000\u00be\u00bf\u0005.\u0000\u0000"+ + "\u00bf\u00c3\u0001\u0000\u0000\u0000\u00c0\u00c1\u0004\u0005\u0004\u0000"+ + "\u00c1\u00c3\u0003\u000e\u0007\u0000\u00c2\u00a4\u0001\u0000\u0000\u0000"+ + "\u00c2\u00a7\u0001\u0000\u0000\u0000\u00c2\u00a8\u0001\u0000\u0000\u0000"+ + "\u00c2\u00a9\u0001\u0000\u0000\u0000\u00c2\u00b9\u0001\u0000\u0000\u0000"+ + "\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c3\u00cc\u0001\u0000\u0000\u0000"+ + "\u00c4\u00c5\n\u0005\u0000\u0000\u00c5\u00c6\u0005\u001f\u0000\u0000\u00c6"+ + "\u00cb\u0003\n\u0005\u0006\u00c7\u00c8\n\u0004\u0000\u0000\u00c8\u00c9"+ + "\u00050\u0000\u0000\u00c9\u00cb\u0003\n\u0005\u0005\u00ca\u00c4\u0001"+ + "\u0000\u0000\u0000\u00ca\u00c7\u0001\u0000\u0000\u0000\u00cb\u00ce\u0001"+ + "\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cd\u0001"+ + "\u0000\u0000\u0000\u00cd\u000b\u0001\u0000\u0000\u0000\u00ce\u00cc\u0001"+ + "\u0000\u0000\u0000\u00cf\u00d1\u0003\u0010\b\u0000\u00d0\u00d2\u0005-"+ + "\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000\u0000\u00d1\u00d2\u0001\u0000"+ + "\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005+\u0000"+ + "\u0000\u00d4\u00d5\u0003d2\u0000\u00d5\u00de\u0001\u0000\u0000\u0000\u00d6"+ + "\u00d8\u0003\u0010\b\u0000\u00d7\u00d9\u0005-\u0000\u0000\u00d8\u00d7"+ + "\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000\u0000\u00d9\u00da"+ + "\u0001\u0000\u0000\u0000\u00da\u00db\u00052\u0000\u0000\u00db\u00dc\u0003"+ + "d2\u0000\u00dc\u00de\u0001\u0000\u0000\u0000\u00dd\u00cf\u0001\u0000\u0000"+ + "\u0000\u00dd\u00d6\u0001\u0000\u0000\u0000\u00de\r\u0001\u0000\u0000\u0000"+ + "\u00df\u00e0\u0003\u0010\b\u0000\u00e0\u00e1\u0005\u0014\u0000\u0000\u00e1"+ + "\u00e2\u0003d2\u0000\u00e2\u000f\u0001\u0000\u0000\u0000\u00e3\u00e9\u0003"+ + "\u0012\t\u0000\u00e4\u00e5\u0003\u0012\t\u0000\u00e5\u00e6\u0003f3\u0000"+ + "\u00e6\u00e7\u0003\u0012\t\u0000\u00e7\u00e9\u0001\u0000\u0000\u0000\u00e8"+ + "\u00e3\u0001\u0000\u0000\u0000\u00e8\u00e4\u0001\u0000\u0000\u0000\u00e9"+ + "\u0011\u0001\u0000\u0000\u0000\u00ea\u00eb\u0006\t\uffff\uffff\u0000\u00eb"+ + "\u00ef\u0003\u0014\n\u0000\u00ec\u00ed\u0007\u0000\u0000\u0000\u00ed\u00ef"+ + "\u0003\u0012\t\u0003\u00ee\u00ea\u0001\u0000\u0000\u0000\u00ee\u00ec\u0001"+ + "\u0000\u0000\u0000\u00ef\u00f8\u0001\u0000\u0000\u0000\u00f0\u00f1\n\u0002"+ + "\u0000\u0000\u00f1\u00f2\u0007\u0001\u0000\u0000\u00f2\u00f7\u0003\u0012"+ + "\t\u0003\u00f3\u00f4\n\u0001\u0000\u0000\u00f4\u00f5\u0007\u0000\u0000"+ + "\u0000\u00f5\u00f7\u0003\u0012\t\u0002\u00f6\u00f0\u0001\u0000\u0000\u0000"+ + "\u00f6\u00f3\u0001\u0000\u0000\u0000\u00f7\u00fa\u0001\u0000\u0000\u0000"+ + "\u00f8\u00f6\u0001\u0000\u0000\u0000\u00f8\u00f9\u0001\u0000\u0000\u0000"+ + "\u00f9\u0013\u0001\u0000\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000"+ + "\u00fb\u00fc\u0006\n\uffff\uffff\u0000\u00fc\u0104\u0003@ \u0000\u00fd"+ + "\u0104\u00036\u001b\u0000\u00fe\u0104\u0003\u0016\u000b\u0000\u00ff\u0100"+ + "\u0005,\u0000\u0000\u0100\u0101\u0003\n\u0005\u0000\u0101\u0102\u0005"+ + "3\u0000\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u00fb\u0001\u0000"+ + "\u0000\u0000\u0103\u00fd\u0001\u0000\u0000\u0000\u0103\u00fe\u0001\u0000"+ + "\u0000\u0000\u0103\u00ff\u0001\u0000\u0000\u0000\u0104\u010a\u0001\u0000"+ + "\u0000\u0000\u0105\u0106\n\u0001\u0000\u0000\u0106\u0107\u0005\"\u0000"+ + "\u0000\u0107\u0109\u0003\u001a\r\u0000\u0108\u0105\u0001\u0000\u0000\u0000"+ + "\u0109\u010c\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000\u0000\u0000"+ + "\u010a\u010b\u0001\u0000\u0000\u0000\u010b\u0015\u0001\u0000\u0000\u0000"+ + "\u010c\u010a\u0001\u0000\u0000\u0000\u010d\u010e\u0003\u0018\f\u0000\u010e"+ + "\u0118\u0005,\u0000\u0000\u010f\u0119\u0005>\u0000\u0000\u0110\u0115\u0003"+ + "\n\u0005\u0000\u0111\u0112\u0005#\u0000\u0000\u0112\u0114\u0003\n\u0005"+ + "\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\u0117\u0001\u0000\u0000"+ + "\u0000\u0115\u0113\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000\u0000"+ + "\u0000\u0116\u0119\u0001\u0000\u0000\u0000\u0117\u0115\u0001\u0000\u0000"+ + "\u0000\u0118\u010f\u0001\u0000\u0000\u0000\u0118\u0110\u0001\u0000\u0000"+ + "\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000"+ + "\u0000\u011a\u011b\u00053\u0000\u0000\u011b\u0017\u0001\u0000\u0000\u0000"+ + "\u011c\u011d\u0004\f\n\u0000\u011d\u0120\u0005\u0014\u0000\u0000\u011e"+ + "\u0120\u0003<\u001e\u0000\u011f\u011c\u0001\u0000\u0000\u0000\u011f\u011e"+ + "\u0001\u0000\u0000\u0000\u0120\u0019\u0001\u0000\u0000\u0000\u0121\u0122"+ + "\u0003<\u001e\u0000\u0122\u001b\u0001\u0000\u0000\u0000\u0123\u0124\u0005"+ + "\r\u0000\u0000\u0124\u0125\u0003\u001e\u000f\u0000\u0125\u001d\u0001\u0000"+ + "\u0000\u0000\u0126\u012b\u0003 \u0010\u0000\u0127\u0128\u0005#\u0000\u0000"+ + "\u0128\u012a\u0003 \u0010\u0000\u0129\u0127\u0001\u0000\u0000\u0000\u012a"+ + "\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000\u012b"+ + "\u012c\u0001\u0000\u0000\u0000\u012c\u001f\u0001\u0000\u0000\u0000\u012d"+ + "\u012b\u0001\u0000\u0000\u0000\u012e\u0134\u0003\n\u0005\u0000\u012f\u0130"+ + "\u00036\u001b\u0000\u0130\u0131\u0005!\u0000\u0000\u0131\u0132\u0003\n"+ + "\u0005\u0000\u0132\u0134\u0001\u0000\u0000\u0000\u0133\u012e\u0001\u0000"+ + "\u0000\u0000\u0133\u012f\u0001\u0000\u0000\u0000\u0134!\u0001\u0000\u0000"+ + "\u0000\u0135\u0136\u0005\u0006\u0000\u0000\u0136\u013b\u0003$\u0012\u0000"+ + "\u0137\u0138\u0005#\u0000\u0000\u0138\u013a\u0003$\u0012\u0000\u0139\u0137"+ + "\u0001\u0000\u0000\u0000\u013a\u013d\u0001\u0000\u0000\u0000\u013b\u0139"+ + "\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000\u0000\u013c\u013f"+ + "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ + "\u0003*\u0015\u0000\u013f\u013e\u0001\u0000\u0000\u0000\u013f\u0140\u0001"+ + "\u0000\u0000\u0000\u0140#\u0001\u0000\u0000\u0000\u0141\u0142\u0003&\u0013"+ + "\u0000\u0142\u0143\u0005m\u0000\u0000\u0143\u0144\u0003(\u0014\u0000\u0144"+ + "\u0147\u0001\u0000\u0000\u0000\u0145\u0147\u0003(\u0014\u0000\u0146\u0141"+ + "\u0001\u0000\u0000\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147%\u0001"+ + "\u0000\u0000\u0000\u0148\u0149\u0005M\u0000\u0000\u0149\'\u0001\u0000"+ + "\u0000\u0000\u014a\u014b\u0007\u0002\u0000\u0000\u014b)\u0001\u0000\u0000"+ + "\u0000\u014c\u014f\u0003,\u0016\u0000\u014d\u014f\u0003.\u0017\u0000\u014e"+ + "\u014c\u0001\u0000\u0000\u0000\u014e\u014d\u0001\u0000\u0000\u0000\u014f"+ + "+\u0001\u0000\u0000\u0000\u0150\u0151\u0005L\u0000\u0000\u0151\u0156\u0005"+ + "M\u0000\u0000\u0152\u0153\u0005#\u0000\u0000\u0153\u0155\u0005M\u0000"+ + "\u0000\u0154\u0152\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000"+ + "\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001\u0000\u0000"+ + "\u0000\u0157-\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000"+ + "\u0159\u015a\u0005B\u0000\u0000\u015a\u015b\u0003,\u0016\u0000\u015b\u015c"+ + "\u0005C\u0000\u0000\u015c/\u0001\u0000\u0000\u0000\u015d\u015e\u0005\u0015"+ + "\u0000\u0000\u015e\u0163\u0003$\u0012\u0000\u015f\u0160\u0005#\u0000\u0000"+ + "\u0160\u0162\u0003$\u0012\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0162"+ + "\u0165\u0001\u0000\u0000\u0000\u0163\u0161\u0001\u0000\u0000\u0000\u0163"+ + "\u0164\u0001\u0000\u0000\u0000\u0164\u0167\u0001\u0000\u0000\u0000\u0165"+ + "\u0163\u0001\u0000\u0000\u0000\u0166\u0168\u0003\u001e\u000f\u0000\u0167"+ + "\u0166\u0001\u0000\u0000\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168"+ + "\u016b\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u001e\u0000\u0000\u016a"+ + "\u016c\u0003\u001e\u000f\u0000\u016b\u0169\u0001\u0000\u0000\u0000\u016b"+ + "\u016c\u0001\u0000\u0000\u0000\u016c1\u0001\u0000\u0000\u0000\u016d\u016e"+ + "\u0005\u0004\u0000\u0000\u016e\u016f\u0003\u001e\u000f\u0000\u016f3\u0001"+ + "\u0000\u0000\u0000\u0170\u0172\u0005\u0010\u0000\u0000\u0171\u0173\u0003"+ + "\u001e\u000f\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u0172\u0173\u0001"+ + "\u0000\u0000\u0000\u0173\u0176\u0001\u0000\u0000\u0000\u0174\u0175\u0005"+ + "\u001e\u0000\u0000\u0175\u0177\u0003\u001e\u000f\u0000\u0176\u0174\u0001"+ + "\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u01775\u0001\u0000"+ + "\u0000\u0000\u0178\u017d\u0003<\u001e\u0000\u0179\u017a\u0005%\u0000\u0000"+ + "\u017a\u017c\u0003<\u001e\u0000\u017b\u0179\u0001\u0000\u0000\u0000\u017c"+ + "\u017f\u0001\u0000\u0000\u0000\u017d\u017b\u0001\u0000\u0000\u0000\u017d"+ + "\u017e\u0001\u0000\u0000\u0000\u017e7\u0001\u0000\u0000\u0000\u017f\u017d"+ + "\u0001\u0000\u0000\u0000\u0180\u0185\u0003>\u001f\u0000\u0181\u0182\u0005"+ + "%\u0000\u0000\u0182\u0184\u0003>\u001f\u0000\u0183\u0181\u0001\u0000\u0000"+ + "\u0000\u0184\u0187\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000"+ + "\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u01869\u0001\u0000\u0000\u0000"+ + "\u0187\u0185\u0001\u0000\u0000\u0000\u0188\u018d\u00038\u001c\u0000\u0189"+ + "\u018a\u0005#\u0000\u0000\u018a\u018c\u00038\u001c\u0000\u018b\u0189\u0001"+ + "\u0000\u0000\u0000\u018c\u018f\u0001\u0000\u0000\u0000\u018d\u018b\u0001"+ + "\u0000\u0000\u0000\u018d\u018e\u0001\u0000\u0000\u0000\u018e;\u0001\u0000"+ + "\u0000\u0000\u018f\u018d\u0001\u0000\u0000\u0000\u0190\u0191\u0007\u0003"+ + "\u0000\u0000\u0191=\u0001\u0000\u0000\u0000\u0192\u0193\u0005Q\u0000\u0000"+ + "\u0193?\u0001\u0000\u0000\u0000\u0194\u01bf\u0005.\u0000\u0000\u0195\u0196"+ + "\u0003b1\u0000\u0196\u0197\u0005D\u0000\u0000\u0197\u01bf\u0001\u0000"+ + "\u0000\u0000\u0198\u01bf\u0003`0\u0000\u0199\u01bf\u0003b1\u0000\u019a"+ + "\u01bf\u0003\\.\u0000\u019b\u01bf\u0003B!\u0000\u019c\u01bf\u0003d2\u0000"+ + "\u019d\u019e\u0005B\u0000\u0000\u019e\u01a3\u0003^/\u0000\u019f\u01a0"+ + "\u0005#\u0000\u0000\u01a0\u01a2\u0003^/\u0000\u01a1\u019f\u0001\u0000"+ + "\u0000\u0000\u01a2\u01a5\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ + "\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000"+ + "\u0000\u0000\u01a5\u01a3\u0001\u0000\u0000\u0000\u01a6\u01a7\u0005C\u0000"+ + "\u0000\u01a7\u01bf\u0001\u0000\u0000\u0000\u01a8\u01a9\u0005B\u0000\u0000"+ + "\u01a9\u01ae\u0003\\.\u0000\u01aa\u01ab\u0005#\u0000\u0000\u01ab\u01ad"+ + "\u0003\\.\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001"+ + "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001"+ + "\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b2\u0005C\u0000\u0000\u01b2\u01bf\u0001\u0000"+ + "\u0000\u0000\u01b3\u01b4\u0005B\u0000\u0000\u01b4\u01b9\u0003d2\u0000"+ + "\u01b5\u01b6\u0005#\u0000\u0000\u01b6\u01b8\u0003d2\u0000\u01b7\u01b5"+ + "\u0001\u0000\u0000\u0000\u01b8\u01bb\u0001\u0000\u0000\u0000\u01b9\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bc"+ + "\u0001\u0000\u0000\u0000\u01bb\u01b9\u0001\u0000\u0000\u0000\u01bc\u01bd"+ + "\u0005C\u0000\u0000\u01bd\u01bf\u0001\u0000\u0000\u0000\u01be\u0194\u0001"+ + "\u0000\u0000\u0000\u01be\u0195\u0001\u0000\u0000\u0000\u01be\u0198\u0001"+ + "\u0000\u0000\u0000\u01be\u0199\u0001\u0000\u0000\u0000\u01be\u019a\u0001"+ + "\u0000\u0000\u0000\u01be\u019b\u0001\u0000\u0000\u0000\u01be\u019c\u0001"+ + "\u0000\u0000\u0000\u01be\u019d\u0001\u0000\u0000\u0000\u01be\u01a8\u0001"+ + "\u0000\u0000\u0000\u01be\u01b3\u0001\u0000\u0000\u0000\u01bfA\u0001\u0000"+ + "\u0000\u0000\u01c0\u01c3\u00051\u0000\u0000\u01c1\u01c3\u0005A\u0000\u0000"+ + "\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c1\u0001\u0000\u0000\u0000"+ + "\u01c3C\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\t\u0000\u0000\u01c5"+ + "\u01c6\u0005\u001c\u0000\u0000\u01c6E\u0001\u0000\u0000\u0000\u01c7\u01c8"+ + "\u0005\u000f\u0000\u0000\u01c8\u01cd\u0003H$\u0000\u01c9\u01ca\u0005#"+ + "\u0000\u0000\u01ca\u01cc\u0003H$\u0000\u01cb\u01c9\u0001\u0000\u0000\u0000"+ + "\u01cc\u01cf\u0001\u0000\u0000\u0000\u01cd\u01cb\u0001\u0000\u0000\u0000"+ + "\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ceG\u0001\u0000\u0000\u0000\u01cf"+ + "\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d2\u0003\n\u0005\u0000\u01d1\u01d3"+ + "\u0007\u0004\u0000\u0000\u01d2\u01d1\u0001\u0000\u0000\u0000\u01d2\u01d3"+ + "\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4\u01d5"+ + "\u0005/\u0000\u0000\u01d5\u01d7\u0007\u0005\u0000\u0000\u01d6\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7I\u0001\u0000"+ + "\u0000\u0000\u01d8\u01d9\u0005\b\u0000\u0000\u01d9\u01da\u0003:\u001d"+ + "\u0000\u01daK\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u0002\u0000\u0000"+ + "\u01dc\u01dd\u0003:\u001d\u0000\u01ddM\u0001\u0000\u0000\u0000\u01de\u01df"+ + "\u0005\f\u0000\u0000\u01df\u01e4\u0003P(\u0000\u01e0\u01e1\u0005#\u0000"+ + "\u0000\u01e1\u01e3\u0003P(\u0000\u01e2\u01e0\u0001\u0000\u0000\u0000\u01e3"+ + "\u01e6\u0001\u0000\u0000\u0000\u01e4\u01e2\u0001\u0000\u0000\u0000\u01e4"+ + "\u01e5\u0001\u0000\u0000\u0000\u01e5O\u0001\u0000\u0000\u0000\u01e6\u01e4"+ + "\u0001\u0000\u0000\u0000\u01e7\u01e8\u00038\u001c\u0000\u01e8\u01e9\u0005"+ + "U\u0000\u0000\u01e9\u01ea\u00038\u001c\u0000\u01eaQ\u0001\u0000\u0000"+ + "\u0000\u01eb\u01ec\u0005\u0001\u0000\u0000\u01ec\u01ed\u0003\u0014\n\u0000"+ + "\u01ed\u01ef\u0003d2\u0000\u01ee\u01f0\u0003X,\u0000\u01ef\u01ee\u0001"+ + "\u0000\u0000\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0S\u0001\u0000"+ + "\u0000\u0000\u01f1\u01f2\u0005\u0007\u0000\u0000\u01f2\u01f3\u0003\u0014"+ + "\n\u0000\u01f3\u01f4\u0003d2\u0000\u01f4U\u0001\u0000\u0000\u0000\u01f5"+ + "\u01f6\u0005\u000b\u0000\u0000\u01f6\u01f7\u00036\u001b\u0000\u01f7W\u0001"+ + "\u0000\u0000\u0000\u01f8\u01fd\u0003Z-\u0000\u01f9\u01fa\u0005#\u0000"+ + "\u0000\u01fa\u01fc\u0003Z-\u0000\u01fb\u01f9\u0001\u0000\u0000\u0000\u01fc"+ + "\u01ff\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fd"+ + "\u01fe\u0001\u0000\u0000\u0000\u01feY\u0001\u0000\u0000\u0000\u01ff\u01fd"+ + "\u0001\u0000\u0000\u0000\u0200\u0201\u0003<\u001e\u0000\u0201\u0202\u0005"+ + "!\u0000\u0000\u0202\u0203\u0003@ \u0000\u0203[\u0001\u0000\u0000\u0000"+ + "\u0204\u0205\u0007\u0006\u0000\u0000\u0205]\u0001\u0000\u0000\u0000\u0206"+ + "\u0209\u0003`0\u0000\u0207\u0209\u0003b1\u0000\u0208\u0206\u0001\u0000"+ + "\u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0209_\u0001\u0000\u0000"+ + "\u0000\u020a\u020c\u0007\u0000\u0000\u0000\u020b\u020a\u0001\u0000\u0000"+ + "\u0000\u020b\u020c\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000\u0000"+ + "\u0000\u020d\u020e\u0005\u001d\u0000\u0000\u020ea\u0001\u0000\u0000\u0000"+ + "\u020f\u0211\u0007\u0000\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000"+ + "\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212\u0001\u0000\u0000\u0000"+ + "\u0212\u0213\u0005\u001c\u0000\u0000\u0213c\u0001\u0000\u0000\u0000\u0214"+ + "\u0215\u0005\u001b\u0000\u0000\u0215e\u0001\u0000\u0000\u0000\u0216\u0217"+ + "\u0007\u0007\u0000\u0000\u0217g\u0001\u0000\u0000\u0000\u0218\u0219\u0005"+ + "\u0005\u0000\u0000\u0219\u021a\u0003j5\u0000\u021ai\u0001\u0000\u0000"+ + "\u0000\u021b\u021c\u0005B\u0000\u0000\u021c\u021d\u0003\u0002\u0001\u0000"+ + "\u021d\u021e\u0005C\u0000\u0000\u021ek\u0001\u0000\u0000\u0000\u021f\u0220"+ + "\u0005\u000e\u0000\u0000\u0220\u0221\u0005e\u0000\u0000\u0221m\u0001\u0000"+ + "\u0000\u0000\u0222\u0223\u0005\n\u0000\u0000\u0223\u0224\u0005i\u0000"+ + "\u0000\u0224o\u0001\u0000\u0000\u0000\u0225\u0226\u0005\u0003\u0000\u0000"+ + "\u0226\u0229\u0005[\u0000\u0000\u0227\u0228\u0005Y\u0000\u0000\u0228\u022a"+ + "\u00038\u001c\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u0229\u022a\u0001"+ + "\u0000\u0000\u0000\u022a\u0234\u0001\u0000\u0000\u0000\u022b\u022c\u0005"+ + "Z\u0000\u0000\u022c\u0231\u0003r9\u0000\u022d\u022e\u0005#\u0000\u0000"+ + "\u022e\u0230\u0003r9\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u0230\u0233"+ + "\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000\u0000\u0000\u0231\u0232"+ + "\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000\u0000\u0000\u0233\u0231"+ + "\u0001\u0000\u0000\u0000\u0234\u022b\u0001\u0000\u0000\u0000\u0234\u0235"+ + "\u0001\u0000\u0000\u0000\u0235q\u0001\u0000\u0000\u0000\u0236\u0237\u0003"+ + "8\u001c\u0000\u0237\u0238\u0005!\u0000\u0000\u0238\u023a\u0001\u0000\u0000"+ + "\u0000\u0239\u0236\u0001\u0000\u0000\u0000\u0239\u023a\u0001\u0000\u0000"+ + "\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b\u023c\u00038\u001c\u0000"+ + "\u023cs\u0001\u0000\u0000\u0000\u023d\u023e\u0005\u0013\u0000\u0000\u023e"+ + "\u023f\u0003$\u0012\u0000\u023f\u0240\u0005Y\u0000\u0000\u0240\u0241\u0003"+ + ":\u001d\u0000\u0241u\u0001\u0000\u0000\u0000\u0242\u0243\u0005\u0012\u0000"+ + "\u0000\u0243\u0246\u0003\u001e\u000f\u0000\u0244\u0245\u0005\u001e\u0000"+ + "\u0000\u0245\u0247\u0003\u001e\u000f\u0000\u0246\u0244\u0001\u0000\u0000"+ + "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247w\u0001\u0000\u0000\u0000"+ + "7\u0083\u008d\u009f\u00ab\u00b4\u00bc\u00c2\u00ca\u00cc\u00d1\u00d8\u00dd"+ + "\u00e8\u00ee\u00f6\u00f8\u0103\u010a\u0115\u0118\u011f\u012b\u0133\u013b"+ + "\u013f\u0146\u014e\u0156\u0163\u0167\u016b\u0172\u0176\u017d\u0185\u018d"+ + "\u01a3\u01ae\u01b9\u01be\u01c2\u01cd\u01d2\u01d6\u01e4\u01ef\u01fd\u0208"+ + "\u020b\u0210\u0229\u0231\u0234\u0239\u0246"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java index 4b035f2478444..00643ce4f6fb6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java @@ -337,13 +337,13 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener { * *

The default implementation does nothing.

*/ - @Override public void enterFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { } + @Override public void enterFunctionName(EsqlBaseParser.FunctionNameContext ctx) { } /** * {@inheritDoc} * *

The default implementation does nothing.

*/ - @Override public void exitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { } + @Override public void exitFunctionName(EsqlBaseParser.FunctionNameContext ctx) { } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java index dce6c14559001..fc9248504e0fb 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java @@ -208,7 +208,7 @@ public class EsqlBaseParserBaseVisitor extends AbstractParseTreeVisitor im *

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

*/ - @Override public T visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { return visitChildren(ctx); } + @Override public T visitFunctionName(EsqlBaseParser.FunctionNameContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java index 676ace9e56d7b..366a82194ea7e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java @@ -314,15 +314,15 @@ public interface EsqlBaseParserListener extends ParseTreeListener { */ void exitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx); /** - * Enter a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * Enter a parse tree produced by {@link EsqlBaseParser#functionName}. * @param ctx the parse tree */ - void enterFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); + void enterFunctionName(EsqlBaseParser.FunctionNameContext ctx); /** - * Exit a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * Exit a parse tree produced by {@link EsqlBaseParser#functionName}. * @param ctx the parse tree */ - void exitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); + void exitFunctionName(EsqlBaseParser.FunctionNameContext ctx); /** * Enter a parse tree produced by the {@code toDataType} * labeled alternative in {@link EsqlBaseParser#dataType}. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java index 6eaa544f046ed..772a0eda2c449 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java @@ -194,11 +194,11 @@ public interface EsqlBaseParserVisitor extends ParseTreeVisitor { */ T visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx); /** - * Visit a parse tree produced by {@link EsqlBaseParser#functionIdentifier}. + * Visit a parse tree produced by {@link EsqlBaseParser#functionName}. * @param ctx the parse tree * @return the visitor result */ - T visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx); + T visitFunctionName(EsqlBaseParser.FunctionNameContext ctx); /** * Visit a parse tree produced by the {@code toDataType} * labeled alternative in {@link EsqlBaseParser#dataType}. diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java index 156fca3cbb19b..620a25e0170ea 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlParser.java @@ -98,7 +98,7 @@ private class PostProcessor extends EsqlBaseParserBaseListener { @Override public void exitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { // TODO remove this at some point - EsqlBaseParser.FunctionIdentifierContext identifier = ctx.functionIdentifier(); + EsqlBaseParser.FunctionNameContext identifier = ctx.functionName(); if (identifier.getText().equalsIgnoreCase("is_null")) { throw new ParsingException( source(ctx), diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java index 1d63741dc8c57..6a4e567a67565 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java @@ -537,7 +537,7 @@ public UnresolvedAttribute visitDereference(EsqlBaseParser.DereferenceContext ct @Override public Expression visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { - String name = visitFunctionIdentifier(ctx.functionIdentifier()); + String name = visitFunctionName(ctx.functionName()); List args = expressions(ctx.booleanExpression()); if ("count".equals(EsqlFunctionRegistry.normalizeName(name))) { // to simplify the registration, handle in the parser the special count cases diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java index 7a1e345a059ff..aeab287877931 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java @@ -25,7 +25,7 @@ public String visitIdentifier(IdentifierContext ctx) { } @Override - public String visitFunctionIdentifier(EsqlBaseParser.FunctionIdentifierContext ctx) { + public String visitFunctionName(EsqlBaseParser.FunctionNameContext ctx) { if (ctx.DEV_MATCH() != null) { return ctx.DEV_MATCH().getText(); } From 78511729f79e97e4fdb4bf3b700a5d350c2dbebf Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 10:31:55 +0200 Subject: [PATCH 46/93] Change FullTextFunction constructor signature --- .../esql/expression/function/fulltext/FullTextFunction.java | 5 ++--- .../esql/expression/function/fulltext/MatchFunction.java | 2 +- .../expression/function/fulltext/QueryStringFunction.java | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 3a961feaff07b..2c9e7f5d87e64 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Stream; import static org.elasticsearch.common.logging.LoggerMessageFormat.format; import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.DEFAULT; @@ -45,8 +44,8 @@ public static List getNamedWriteables() { private final Expression query; - protected FullTextFunction(Source source, Expression query, Expression... nonQueryChildren) { - super(source, Stream.concat(Stream.of(query), Stream.of(nonQueryChildren)).toList()); + protected FullTextFunction(Source source, Expression query, List children) { + super(source, children); this.query = query; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 8487bf527c2c5..1a6fd38ccebb2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -62,7 +62,7 @@ public MatchFunction( description = "Text you wish to find in the provided field." ) Expression matchQuery ) { - super(source, matchQuery, field); + super(source, matchQuery, List.of(matchQuery, field)); this.field = field; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 3f723a662e808..f5c2aeeedf51d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -49,7 +49,7 @@ public QueryStringFunction( description = "Query string in Lucene query string format." ) Expression queryString ) { - super(source, queryString); + super(source, queryString, List.of(queryString)); } private QueryStringFunction(StreamInput in) throws IOException { From e44497800da5e4d7db87e80f765c22d5b99c39f4 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 10:36:16 +0200 Subject: [PATCH 47/93] Centralize writeTo in FullTextFunction --- .../expression/function/fulltext/FullTextFunction.java | 9 +++++++++ .../esql/expression/function/fulltext/MatchFunction.java | 8 -------- .../function/fulltext/QueryStringFunction.java | 7 ------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 2c9e7f5d87e64..62169818ec20f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -9,6 +9,7 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; +import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; @@ -17,6 +18,7 @@ import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -95,6 +97,13 @@ public final Query asQuery() { ); } + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(query()); + out.writeCollection(children()); + } + /** * Overriden by subclasses to return the corresponding Lucene query from a query text * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 1a6fd38ccebb2..a2e25c81953b0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -9,7 +9,6 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.capabilities.Validatable; import org.elasticsearch.xpack.esql.common.Failure; import org.elasticsearch.xpack.esql.common.Failures; @@ -70,13 +69,6 @@ private MatchFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); } - @Override - public void writeTo(StreamOutput out) throws IOException { - source().writeTo(out); - out.writeNamedWriteable(field); - out.writeNamedWriteable(query()); - } - @Override public String functionName() { return "MATCH"; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index f5c2aeeedf51d..8a2978cb29848 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -9,7 +9,6 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; @@ -56,12 +55,6 @@ private QueryStringFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); } - @Override - public void writeTo(StreamOutput out) throws IOException { - source().writeTo(out); - out.writeNamedWriteable(query()); - } - @Override public String functionName() { return "QSTR"; From 70ad4b0f8d98f44b01e482b8535d146424a95351 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 10:43:38 +0200 Subject: [PATCH 48/93] Rename resolveQueryType, add javadoc --- .../function/fulltext/FullTextFunction.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 62169818ec20f..9809a9c5e6019 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -62,15 +62,21 @@ protected final TypeResolution resolveType() { return new TypeResolution("Unresolved children"); } - return resolveNonQueryParamTypes().and(resolveQueryType()); + return resolveNonQueryParamTypes().and(resolveQueryParamType()); } - private TypeResolution resolveQueryType() { + /** + * Resolves the type for the query parameter, as part of the type resolution for the function + * + * @return type resolution for query parameter + */ + private TypeResolution resolveQueryParamType() { return isString(query(), sourceText(), queryParamOrdinal()).and(isNotNullAndFoldable(query(), sourceText(), queryParamOrdinal())); } /** - * Subclasses can override this method for custom type resolution + * Subclasses can override this method for custom type resolution for additional function parameters + * * @return type resolution for non-query parameter types */ protected TypeResolution resolveNonQueryParamTypes() { @@ -101,7 +107,7 @@ public final Query asQuery() { public void writeTo(StreamOutput out) throws IOException { source().writeTo(out); out.writeNamedWriteable(query()); - out.writeCollection(children()); + out.writeNamedWriteableCollection(children()); } /** From 1380c706b4e7a3ab379b35ed77168f835166a642 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 12:42:35 +0200 Subject: [PATCH 49/93] Distinguish between MatchFunction and QueryStringFunction for pushing down --- .../esql/expression/function/fulltext/MatchFunction.java | 4 ++++ .../rules/physical/local/PushFiltersToSource.java | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index a2e25c81953b0..98b2c4bbf3ac5 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -122,4 +122,8 @@ protected TypeResolutions.ParamOrdinal queryParamOrdinal() { public boolean hasFieldsInformation() { return true; } + + public Expression field() { + return field; + } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java index 0a71bce2575fa..df41a9070551d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java @@ -28,7 +28,8 @@ import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.CollectionUtils; import org.elasticsearch.xpack.esql.core.util.Queries; -import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; import org.elasticsearch.xpack.esql.expression.function.scalar.ip.CIDRMatch; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesFunction; import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.Equals; @@ -195,8 +196,10 @@ public static boolean canPushToSource(Expression exp, Predicate return mqp.field() instanceof FieldAttribute && DataType.isString(mqp.field().dataType()); } else if (exp instanceof StringQueryPredicate) { return true; - } else if (exp instanceof FullTextFunction) { + } else if (exp instanceof QueryStringFunction) { return true; + } else if (exp instanceof MatchFunction mf) { + return mf.field() instanceof FieldAttribute && DataType.isString(mf.field().dataType()); } return false; } From fedefcea574f09e6260cbc233e8b936e0376420e Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 13:37:27 +0200 Subject: [PATCH 50/93] Remove hasFieldsInformation() and revert to an instanceof comparison --- .../elasticsearch/xpack/esql/analysis/Verifier.java | 10 ++++++---- .../expression/function/fulltext/FullTextFunction.java | 2 -- .../expression/function/fulltext/MatchFunction.java | 5 ----- .../function/fulltext/QueryStringFunction.java | 5 ----- 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index e4e15ef62592c..bbf25ebc9c395 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -28,6 +28,7 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.AggregateFunction; import org.elasticsearch.xpack.esql.expression.function.aggregate.Rate; import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; import org.elasticsearch.xpack.esql.expression.function.grouping.GroupingFunction; import org.elasticsearch.xpack.esql.expression.predicate.operator.arithmetic.Neg; import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.Equals; @@ -649,8 +650,10 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f condition.forEachDown(FullTextFunction.class, functionHolder::set); FullTextFunction ftf = functionHolder.get(); if (ftf != null) { - checkCommandUsageAfterFullTextFunction(ftf, plan, failures); checkConditionCanBePushedDown(ftf, condition, failures); + if (ftf instanceof QueryStringFunction) { + checkCommandUsageAfterFullTextFunction(ftf, plan, failures); + } } } else { plan.forEachExpression(FullTextFunction.class, ftf -> { @@ -660,10 +663,9 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f } private static void checkCommandUsageAfterFullTextFunction(FullTextFunction ftf, LogicalPlan plan, Set failures) { - // Similar to cases present in org.elasticsearch.xpack.esql.optimizer.rules.PushDownAndCombineFilters - - // we can't check if it can be pushed down if we don't have information about the fields present in the query. + // Check commands used before the function plan.forEachDown(LogicalPlan.class, lp -> { - if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation || ftf.hasFieldsInformation()) == false) { + if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { failures.add( fail( plan, diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 9809a9c5e6019..a457916736ed1 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -125,6 +125,4 @@ public void writeTo(StreamOutput out) throws IOException { protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return DEFAULT; } - - public abstract boolean hasFieldsInformation(); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 98b2c4bbf3ac5..85d7ceae089ec 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -118,11 +118,6 @@ protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return SECOND; } - @Override - public boolean hasFieldsInformation() { - return true; - } - public Expression field() { return field; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 8a2978cb29848..08fb79b921939 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -80,9 +80,4 @@ public String getWriteableName() { return ENTRY.name; } - @Override - public boolean hasFieldsInformation() { - return false; - } - } From 1c500ddaa309b8c49b96fa92cff073614af2a8bd Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 13:45:25 +0200 Subject: [PATCH 51/93] Move up method --- .../expression/function/fulltext/MatchFunction.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 85d7ceae089ec..fb23578a05fe6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -69,6 +69,11 @@ private MatchFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); } + @Override + public String getWriteableName() { + return ENTRY.name; + } + @Override public String functionName() { return "MATCH"; @@ -109,11 +114,6 @@ protected NodeInfo info() { return NodeInfo.create(this, MatchFunction::new, field, query()); } - @Override - public String getWriteableName() { - return ENTRY.name; - } - protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return SECOND; } From dcc8bf6ed7e3f444c91427a43199e9b45bc10fb5 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 13:48:45 +0200 Subject: [PATCH 52/93] Move up method --- .../function/fulltext/QueryStringFunction.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 08fb79b921939..3d2828245aafd 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -55,6 +55,11 @@ private QueryStringFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); } + @Override + public String getWriteableName() { + return ENTRY.name; + } + @Override public String functionName() { return "QSTR"; @@ -75,9 +80,4 @@ protected NodeInfo info() { return NodeInfo.create(this, QueryStringFunction::new, query()); } - @Override - public String getWriteableName() { - return ENTRY.name; - } - } From 8b646a8490a262db607c7a73c2030c5f15c55a8d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 13:51:06 +0200 Subject: [PATCH 53/93] Remove unnecessary variable --- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index c85126693e322..f83d63c7e5db8 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -25,7 +25,6 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; @@ -1182,7 +1181,6 @@ public void testMatchFunctionOnlyAllowedInWhere() throws Exception { } private void checkFullTextFunctionsOnlyAllowedInWhere(String functionName, String functionInvocation) throws Exception { - String function = functionName.toLowerCase(Locale.ROOT); assertEquals( "1:22: [" + functionName + "] function is only supported in WHERE commands", error("from test | eval y = " + functionInvocation) From b97aaf601aa875547e0aecf411ff92b6b40ab401 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 2 Oct 2024 19:45:05 +0200 Subject: [PATCH 54/93] Fix deserialization --- .../esql/expression/function/fulltext/MatchFunction.java | 9 ++++++--- .../function/fulltext/QueryStringFunction.java | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index fb23578a05fe6..de722891f9736 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -41,7 +41,7 @@ public class MatchFunction extends FullTextFunction implements Validatable { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Expression.class, "Match", - MatchFunction::new + MatchFunction::readFromStream ); private final Expression field; @@ -65,8 +65,11 @@ public MatchFunction( this.field = field; } - private MatchFunction(StreamInput in) throws IOException { - this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); + private static MatchFunction readFromStream(StreamInput in) throws IOException { + Source source = Source.readFrom((PlanStreamInput) in); + Expression query = in.readNamedWriteable(Expression.class); + Expression field = in.readNamedWriteableCollectionAsList(Expression.class).getLast(); + return new MatchFunction(source, field, query); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 3d2828245aafd..799c28e6cbfcf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -53,6 +53,8 @@ public QueryStringFunction( private QueryStringFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); + // This is not needed but we consume it + in.readNamedWriteableCollectionAsList(Expression.class); } @Override From fc58631c055417ea0dd2217064fa26ab4e008124 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 10:24:39 +0200 Subject: [PATCH 55/93] Reimplement conditions to check for disjunctions --- .../xpack/esql/analysis/Verifier.java | 131 +++++++++++++----- 1 file changed, 98 insertions(+), 33 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index bbf25ebc9c395..c32bb7518f8ba 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -19,8 +19,12 @@ import org.elasticsearch.xpack.esql.core.expression.FieldAttribute; import org.elasticsearch.xpack.esql.core.expression.NamedExpression; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; +import org.elasticsearch.xpack.esql.core.expression.function.Function; import org.elasticsearch.xpack.esql.core.expression.predicate.BinaryOperator; import org.elasticsearch.xpack.esql.core.expression.predicate.fulltext.MatchQueryPredicate; +import org.elasticsearch.xpack.esql.core.expression.predicate.logical.BinaryLogic; +import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Not; +import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Or; import org.elasticsearch.xpack.esql.core.expression.predicate.operator.comparison.BinaryComparison; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.Holder; @@ -56,6 +60,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Stream; @@ -646,15 +651,12 @@ private static void checkFilterMatchConditions(LogicalPlan plan, Set fa private static void checkFullTextQueryFunctions(LogicalPlan plan, Set failures) { if (plan instanceof Filter f) { Expression condition = f.condition(); - Holder functionHolder = new Holder<>(); - condition.forEachDown(FullTextFunction.class, functionHolder::set); - FullTextFunction ftf = functionHolder.get(); - if (ftf != null) { - checkConditionCanBePushedDown(ftf, condition, failures); - if (ftf instanceof QueryStringFunction) { - checkCommandUsageAfterFullTextFunction(ftf, plan, failures); - } - } + checkCommandsAfterQueryStringFunction(plan, condition, failures); + checkFullTextFunctionsConditions(condition, failures); + forEachFullTextFunctionParent( + condition, + (ftf, parents) -> { checkFullTextFunctionsParents(parents, ftf, condition, failures); } + ); } else { plan.forEachExpression(FullTextFunction.class, ftf -> { failures.add(fail(ftf, "[{}] function is only supported in WHERE commands", ftf.functionName())); @@ -662,35 +664,98 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f } } - private static void checkCommandUsageAfterFullTextFunction(FullTextFunction ftf, LogicalPlan plan, Set failures) { - // Check commands used before the function - plan.forEachDown(LogicalPlan.class, lp -> { - if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { + private static void checkCommandsAfterQueryStringFunction(LogicalPlan plan, Expression condition, Set failures) { + condition.forEachDown(QueryStringFunction.class, qsf -> { + plan.forEachDown(LogicalPlan.class, lp -> { + if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { + failures.add( + fail( + plan, + "[{}] function cannot be used after {}", + qsf.functionName(), + lp.sourceText().split(" ")[0].toUpperCase(Locale.ROOT) + ) + ); + } + }); + }); + } + + private static void forEachFullTextFunctionParent( + Expression parent, + BiConsumer> consumer + ) { + forEachFullTextFunctionParent(parent, consumer, new ArrayList<>()); + } + + private static void forEachFullTextFunctionParent( + Expression parent, + BiConsumer> consumer, + List parents + ) { + if (parent instanceof FullTextFunction ftf) { + consumer.accept(ftf, parents); + return; + } + + parents.add(parent); + parent.children().forEach(c -> forEachFullTextFunctionParent(c, consumer, parents)); + parents.removeLast(); + } + + private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { + condition.forEachUp(Or.class, or -> { + Expression left = or.left(); + Expression right = or.right(); + left.forEachDown(FullTextFunction.class, ftf -> { + if (canPushToSource(right, x -> false) == false) { + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", + or.sourceText(), + ftf.functionName(), + right.sourceText() + ) + ); + } + }); + right.forEachDown(FullTextFunction.class, ftf -> { + if (canPushToSource(left, x -> false) == false) { + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", + or.sourceText(), + ftf.functionName(), + left.sourceText() + ) + ); + } + }); + }); + } + + private static void checkFullTextFunctionsParents( + List parents, + Function function, + Expression condition, + Set failures + ) { + for (Expression parent : parents.reversed()) { + if ((parent instanceof FullTextFunction == false) + && (parent instanceof BinaryLogic == false) + && (parent instanceof Not == false)) { failures.add( fail( - plan, - "[{}] function cannot be used after {}", - ftf.functionName(), - lp.sourceText().split(" ")[0].toUpperCase(Locale.ROOT) + condition, + "Invalid condition [{}]. Function {} can't be used with {}", + condition.sourceText(), + function.functionName(), + ((Function) parent).functionName() ) ); } - }); - } - - private static void checkConditionCanBePushedDown(FullTextFunction ftf, Expression condition, Set failures) { - if (canPushToSource(condition, x -> false) == false) { - // We couldn't push everything to Lucene, and there is a FullTextFunction in the condition. - // Fail this early as we can't push down the FullTextFunction query in this case - failures.add( - fail( - condition, - "Invalid condition [{}]. Use a separate WHERE clause for the {} function instead", - condition.sourceText(), - ftf.functionName(), - ftf.functionName() - ) - ); } } } From 97a6cf836bcfcde45661088929a48418277955a3 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 10:25:05 +0200 Subject: [PATCH 56/93] Add tests for new checks --- .../main/resources/match-function.csv-spec | 12 ++++ .../src/main/resources/qstr-function.csv-spec | 12 ++++ .../xpack/esql/analysis/VerifierTests.java | 65 ++++++++++++++++++- 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index f110b71c665ed..a013cf027b3f0 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -141,6 +141,18 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; +matchWithNonPushableConjunction +required_capability: match_function + +from books +| where match(title, "Rings") and length(title) > 75 +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +4023 |A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings +; + matchWithMultipleWhereClauses required_capability: match_function diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec index cd4ccdb5b3e87..8cdfcd5a377ae 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec @@ -88,6 +88,18 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; +qstrWithNonPushableConjunction +required_capability: qstr_function + +from books +| where qstr("title: Rings") and length(title) > 75 +| keep book_no, title; +ignoreOrder:true + +book_no:keyword | title:text +4023 |A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings +; + qstrWithMultipleWhereClauses required_capability: qstr_function diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index f83d63c7e5db8..0bb87e095c266 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.esql.analysis; import org.elasticsearch.Build; +import org.elasticsearch.common.logging.LoggerMessageFormat; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; @@ -1152,7 +1153,7 @@ public void testMatchFunctionNotAllowedWithNonPushableExpressions() { assertEquals( "1:19: Invalid condition [match(first_name, \"Anna\") or length(first_name) > 5]. " - + "Use a separate WHERE clause for the MATCH function instead", + + "Function MATCH can't be used as part of an or condition that includes [length(first_name) > 5]", error("from test | where match(first_name, \"Anna\") or length(first_name) > 5") ); } @@ -1162,7 +1163,7 @@ public void testQueryStringFunctionNotAllowedWithNonPushableExpressions() { assertEquals( "1:19: Invalid condition [qstr(\"first_name:Anna\") or length(first_name) > 5]. " - + "Use a separate WHERE clause for the QSTR function instead", + + "Function QSTR can't be used as part of an or condition that includes [length(first_name) > 5]", error("from test | where qstr(\"first_name:Anna\") or length(first_name) > 5") ); } @@ -1206,6 +1207,66 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } + public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { + checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); + } + + public void testMatchWithDisjunctionsThatCannotBePushedDown() { + checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); + } + + private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { + assertEquals( + LoggerMessageFormat.format(null, + "1:19: Invalid condition [{} or length(first_name) > 12]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", + functionInvocation, + functionName + ), + error("from test | where " + functionInvocation + " or length(first_name) > 12") + ); + assertEquals( + LoggerMessageFormat.format(null, + "1:19: Invalid condition [({} and first_name is not null) or (length(first_name) > 12 and first_name is null)]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and first_name is null]", + functionInvocation, + functionName + ), + error( + "from test | where (" + + functionInvocation + + " and first_name is not null) or (length(first_name) > 12 and first_name is null)" + ) + ); + } + + public void testQueryStringFunctionWithNonBooleanFunctions() { + checkFullTextFunctionsWithNonBooleanFunctions("QSTR", "qstr(\"first_name: Anna\")"); + } + + public void testMatchFunctionWithNonBooleanFunctions() { + checkFullTextFunctionsWithNonBooleanFunctions("MATCH", "match(first_name, \"Anna\")"); + } + + private void checkFullTextFunctionsWithNonBooleanFunctions(String functionName, String functionInvocation) { + assertEquals( + "1:19: Invalid condition [" + functionInvocation + " is not null]. Function " + functionName + " can't be used with ISNOTNULL", + error("from test | where " + functionInvocation + " is not null") + ); + assertEquals( + "1:19: Invalid condition [" + functionInvocation + " is null]. Function " + functionName + " can't be used with ISNULL", + error("from test | where " + functionInvocation + " is null") + ); + assertEquals( + "1:19: Invalid condition [" + + functionInvocation + + " in (\"hello\", \"world\")]. Function " + + functionName + + " can't be used with IN", + error("from test | where " + functionInvocation + " in (\"hello\", \"world\")") + ); + } + public void testMatchFunctionArgNotNullOrConstant() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); From 2e3e0a00294ce13a2b17f072d60e96f2e9d9849c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 10:40:41 +0200 Subject: [PATCH 57/93] Refactor checks using new Node method --- .../xpack/esql/core/tree/Node.java | 22 ++++++++++++ .../xpack/esql/analysis/Verifier.java | 36 +++---------------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java index feeba39756373..e9cda41dec1b7 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java @@ -14,6 +14,7 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -94,6 +95,27 @@ public void forEachUp(Class typeToken, Consumer acti }); } + /** + * Executes the action on every parent of the specified typeToken. + * + * @param typeToken the type of the node to search for + * @param action the action to execute for each parent of the specified typeToken + */ + @SuppressWarnings("unchecked") + public E forEachParent(Class typeToken, BiConsumer action) { + if (typeToken.isInstance(this)) { + return (E) this; + } + for (Node child : children()) { + E foundMatchingChild = child.forEachParent(typeToken, action); + if (foundMatchingChild != null) { + action.accept(foundMatchingChild, (T) this); + return foundMatchingChild; + } + } + return null; + } + public void forEachPropertyOnly(Class typeToken, Consumer rule) { forEachProperty(typeToken, rule); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index c32bb7518f8ba..b1ace89014335 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -60,7 +60,6 @@ import java.util.List; import java.util.Locale; import java.util.Set; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Stream; @@ -653,10 +652,7 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f Expression condition = f.condition(); checkCommandsAfterQueryStringFunction(plan, condition, failures); checkFullTextFunctionsConditions(condition, failures); - forEachFullTextFunctionParent( - condition, - (ftf, parents) -> { checkFullTextFunctionsParents(parents, ftf, condition, failures); } - ); + checkFullTextFunctionsParents(condition, failures); } else { plan.forEachExpression(FullTextFunction.class, ftf -> { failures.add(fail(ftf, "[{}] function is only supported in WHERE commands", ftf.functionName())); @@ -681,28 +677,6 @@ private static void checkCommandsAfterQueryStringFunction(LogicalPlan plan, Expr }); } - private static void forEachFullTextFunctionParent( - Expression parent, - BiConsumer> consumer - ) { - forEachFullTextFunctionParent(parent, consumer, new ArrayList<>()); - } - - private static void forEachFullTextFunctionParent( - Expression parent, - BiConsumer> consumer, - List parents - ) { - if (parent instanceof FullTextFunction ftf) { - consumer.accept(ftf, parents); - return; - } - - parents.add(parent); - parent.children().forEach(c -> forEachFullTextFunctionParent(c, consumer, parents)); - parents.removeLast(); - } - private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { condition.forEachUp(Or.class, or -> { Expression left = or.left(); @@ -737,12 +711,10 @@ private static void checkFullTextFunctionsConditions(Expression condition, Set parents, - Function function, Expression condition, Set failures ) { - for (Expression parent : parents.reversed()) { + condition.forEachParent(FullTextFunction.class, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) && (parent instanceof BinaryLogic == false) && (parent instanceof Not == false)) { @@ -751,11 +723,11 @@ private static void checkFullTextFunctionsParents( condition, "Invalid condition [{}]. Function {} can't be used with {}", condition.sourceText(), - function.functionName(), + ftf.functionName(), ((Function) parent).functionName() ) ); } - } + }); } } From e5ce2203f3db801fd336b3817260ca2a05406f69 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 11:27:07 +0200 Subject: [PATCH 58/93] Adding disjunction tests --- .../src/main/resources/match-function.csv-spec | 7 ++++--- .../testFixtures/src/main/resources/qstr-function.csv-spec | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index a013cf027b3f0..9aed8d555176d 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -102,18 +102,19 @@ book_no:keyword | author:text | stars: 3293 | Danny Faulkner | 2 ; -matchWithDisjunction +matchWithPushableDisjunction required_capability: match_function from books -| where match(title, "Return") or year > 2020 +| where match(title, "Return") or book_no == "7140" or year > 2020 | keep book_no, title; ignoreOrder:true book_no:keyword | title:text 2714 | Return of the King Being the Third Part of The Lord of the Rings -6818 | Hadji Murad 7350 | Return of the Shadow +7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) +6818 | Hadji Murad ; matchWithConjunction diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec index 8cdfcd5a377ae..f46badba632d8 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec @@ -49,18 +49,19 @@ book_no:keyword | title:text 7350 | Return of the Shadow ; -qstrWithDisjunction +qstrWithPushableDisjunction required_capability: qstr_function from books -| where qstr("title:Return") or year > 2020 +| where qstr("title:Return") or book_no == "7140" or year > 2020 | keep book_no, title; ignoreOrder:true book_no:keyword | title:text 2714 | Return of the King Being the Third Part of The Lord of the Rings -6818 | Hadji Murad 7350 | Return of the Shadow +7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) +6818 | Hadji Murad ; qstrWithConjunction From 71be4796f90ac1e9c3440e2d8861f03eaf4723df Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 11:40:45 +0200 Subject: [PATCH 59/93] Spotless --- .../org/elasticsearch/xpack/esql/analysis/Verifier.java | 5 +---- .../elasticsearch/xpack/esql/analysis/VerifierTests.java | 6 ++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index b1ace89014335..b4dc627b36373 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -710,10 +710,7 @@ private static void checkFullTextFunctionsConditions(Expression condition, Set failures - ) { + private static void checkFullTextFunctionsParents(Expression condition, Set failures) { condition.forEachParent(FullTextFunction.class, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) && (parent instanceof BinaryLogic == false) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 0bb87e095c266..765f79c6e317d 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1217,7 +1217,8 @@ public void testMatchWithDisjunctionsThatCannotBePushedDown() { private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { assertEquals( - LoggerMessageFormat.format(null, + LoggerMessageFormat.format( + null, "1:19: Invalid condition [{} or length(first_name) > 12]. " + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", functionInvocation, @@ -1226,7 +1227,8 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St error("from test | where " + functionInvocation + " or length(first_name) > 12") ); assertEquals( - LoggerMessageFormat.format(null, + LoggerMessageFormat.format( + null, "1:19: Invalid condition [({} and first_name is not null) or (length(first_name) > 12 and first_name is null)]. " + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and first_name is null]", functionInvocation, From 1f228d277ba1bf36e788a367e548a82fba033d82 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Thu, 3 Oct 2024 12:39:28 +0200 Subject: [PATCH 60/93] Reverted serialization change --- .../function/fulltext/FullTextFunction.java | 9 --------- .../function/fulltext/MatchFunction.java | 17 +++++++++++------ .../function/fulltext/QueryStringFunction.java | 9 +++++++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index a457916736ed1..b4394372a154f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -9,7 +9,6 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; -import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; @@ -18,7 +17,6 @@ import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -103,13 +101,6 @@ public final Query asQuery() { ); } - @Override - public void writeTo(StreamOutput out) throws IOException { - source().writeTo(out); - out.writeNamedWriteable(query()); - out.writeNamedWriteableCollection(children()); - } - /** * Overriden by subclasses to return the corresponding Lucene query from a query text * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index de722891f9736..c865db41f0cc2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -9,6 +9,7 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.capabilities.Validatable; import org.elasticsearch.xpack.esql.common.Failure; import org.elasticsearch.xpack.esql.common.Failures; @@ -41,7 +42,7 @@ public class MatchFunction extends FullTextFunction implements Validatable { public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( Expression.class, "Match", - MatchFunction::readFromStream + MatchFunction::new ); private final Expression field; @@ -65,11 +66,15 @@ public MatchFunction( this.field = field; } - private static MatchFunction readFromStream(StreamInput in) throws IOException { - Source source = Source.readFrom((PlanStreamInput) in); - Expression query = in.readNamedWriteable(Expression.class); - Expression field = in.readNamedWriteableCollectionAsList(Expression.class).getLast(); - return new MatchFunction(source, field, query); + private MatchFunction(StreamInput in) throws IOException { + this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(field); + out.writeNamedWriteable(query()); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 799c28e6cbfcf..c5421d5148590 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -9,6 +9,7 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; @@ -53,8 +54,12 @@ public QueryStringFunction( private QueryStringFunction(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); - // This is not needed but we consume it - in.readNamedWriteableCollectionAsList(Expression.class); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + source().writeTo(out); + out.writeNamedWriteable(query()); } @Override From 233528d0e25c41397f8a524f25799323502f0091 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 4 Oct 2024 09:19:36 +0200 Subject: [PATCH 61/93] Add multivalued fields tests --- .../main/resources/match-function.csv-spec | 33 ++++++++++++ .../src/main/resources/qstr-function.csv-spec | 52 +++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 9aed8d555176d..da3ccfa56d085 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -169,3 +169,36 @@ book_no:keyword | title:text 4023 | A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings 7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) ; + +matchMultivaluedField +required_capability: match_function + +from employees +| where match(job_positions, "Tech Lead") and match(job_positions, "Reporting Analyst") +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10004 | Chirstian | Koblick +10010 | Duangkaew | Piveteau +10011 | Mary | Sluis +10088 | Jungsoon | Syrzycki +10093 | Sailaja | Desikan +10097 | Remzi | Waschkowski +; + +testMultiValuedFieldWithConjunction +required_capability: match_function + +from employees +| where (match(job_positions, "Data Scientist") or match(job_positions, "Support Engineer")) and gender == "F" +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10023 | Bojan | Montemayor +10041 | Uri | Lenart +10044 | Mingsen | Casley +10053 | Sanjiv | Zschoche +10069 | Margareta | Bierman +; diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec index f46badba632d8..5ab569c8b48fd 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec @@ -114,3 +114,55 @@ book_no:keyword | title:text 4023 | A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings 7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) ; + + +matchMultivaluedTextField +required_capability: match_function + +from employees +| where qstr("job_positions: (Tech Lead) AND job_positions:(Reporting Analyst)") +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10004 | Chirstian | Koblick +10010 | Duangkaew | Piveteau +10011 | Mary | Sluis +10088 | Jungsoon | Syrzycki +10093 | Sailaja | Desikan +10097 | Remzi | Waschkowski +; + +matchMultivaluedNumericField +required_capability: match_function + +from employees +| where qstr("salary_change: [14 TO *]") +| keep emp_no, first_name, last_name, salary_change; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword | salary_change:double +10003 | Parto | Bamford | [12.82, 14.68] +10015 | Guoxiang | Nooteboom | [12.4, 14.25] +10023 | Bojan | Montemayor | [0.8, 14.63] +10040 | Weiyi | Meriste | [-8.94, 1.92, 6.97, 14.74] +10061 | Tse | Herber | [-2.58, -0.95, 14.39] +10065 | Satosi | Awdeh | [-9.81, -1.47, 14.44] +10099 | Valter | Sullins | [-8.78, -3.98, 10.71, 14.26] +; + +testMultiValuedFieldWithConjunction +required_capability: match_function + +from employees +| where (qstr("job_positions: (Data Scientist) OR job_positions:(Support Engineer)")) and gender == "F" +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10023 | Bojan | Montemayor +10041 | Uri | Lenart +10044 | Mingsen | Casley +10053 | Sanjiv | Zschoche +10069 | Margareta | Bierman +; From 98db692cdce31672a6e11bda86993a8b1b5ba310 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 4 Oct 2024 09:33:27 +0200 Subject: [PATCH 62/93] Refactor check into separate method --- .../xpack/esql/analysis/Verifier.java | 44 ++++++++----------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index b4dc627b36373..c2cc4dcd9dedd 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -681,32 +681,24 @@ private static void checkFullTextFunctionsConditions(Expression condition, Set { Expression left = or.left(); Expression right = or.right(); - left.forEachDown(FullTextFunction.class, ftf -> { - if (canPushToSource(right, x -> false) == false) { - failures.add( - fail( - or, - "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", - or.sourceText(), - ftf.functionName(), - right.sourceText() - ) - ); - } - }); - right.forEachDown(FullTextFunction.class, ftf -> { - if (canPushToSource(left, x -> false) == false) { - failures.add( - fail( - or, - "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", - or.sourceText(), - ftf.functionName(), - left.sourceText() - ) - ); - } - }); + checkDisjunction(failures, or, left, right); + checkDisjunction(failures, or, right, left); + }); + } + + private static void checkDisjunction(Set failures, Or or, Expression left, Expression right) { + left.forEachDown(FullTextFunction.class, ftf -> { + if (canPushToSource(right, x -> false) == false) { + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", + or.sourceText(), + ftf.functionName(), + right.sourceText() + ) + ); + } }); } From 5f313999286e9fcf48ff580c143af8341c7b5421 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 4 Oct 2024 09:35:05 +0200 Subject: [PATCH 63/93] Remove duplicate tests --- .../xpack/esql/analysis/VerifierTests.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 765f79c6e317d..cbc662ce6132d 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1148,26 +1148,6 @@ public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { ); } - public void testMatchFunctionNotAllowedWithNonPushableExpressions() { - assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - - assertEquals( - "1:19: Invalid condition [match(first_name, \"Anna\") or length(first_name) > 5]. " - + "Function MATCH can't be used as part of an or condition that includes [length(first_name) > 5]", - error("from test | where match(first_name, \"Anna\") or length(first_name) > 5") - ); - } - - public void testQueryStringFunctionNotAllowedWithNonPushableExpressions() { - assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - - assertEquals( - "1:19: Invalid condition [qstr(\"first_name:Anna\") or length(first_name) > 5]. " - + "Function QSTR can't be used as part of an or condition that includes [length(first_name) > 5]", - error("from test | where qstr(\"first_name:Anna\") or length(first_name) > 5") - ); - } - public void testQueryStringFunctionOnlyAllowedInWhere() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); From 9dac2c69efb10ce24e0634f794c4dfec42617ccf Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 4 Oct 2024 10:21:23 +0200 Subject: [PATCH 64/93] Add unsupported behaviour tests, and add limit checks for match function --- .../xpack/esql/analysis/Verifier.java | 23 +++++++++++++++++-- .../xpack/esql/analysis/VerifierTests.java | 17 ++++++++++++++ .../optimizer/LogicalPlanOptimizerTests.java | 21 +++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index c2cc4dcd9dedd..ca536d9972d1e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -32,6 +32,7 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.AggregateFunction; import org.elasticsearch.xpack.esql.expression.function.aggregate.Rate; import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; import org.elasticsearch.xpack.esql.expression.function.grouping.GroupingFunction; import org.elasticsearch.xpack.esql.expression.predicate.operator.arithmetic.Neg; @@ -650,7 +651,8 @@ private static void checkFilterMatchConditions(LogicalPlan plan, Set fa private static void checkFullTextQueryFunctions(LogicalPlan plan, Set failures) { if (plan instanceof Filter f) { Expression condition = f.condition(); - checkCommandsAfterQueryStringFunction(plan, condition, failures); + checkCommandsBeforeQueryStringFunction(plan, condition, failures); + checkCommandsBeforeMatchFunction(plan, condition, failures); checkFullTextFunctionsConditions(condition, failures); checkFullTextFunctionsParents(condition, failures); } else { @@ -660,7 +662,7 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f } } - private static void checkCommandsAfterQueryStringFunction(LogicalPlan plan, Expression condition, Set failures) { + private static void checkCommandsBeforeQueryStringFunction(LogicalPlan plan, Expression condition, Set failures) { condition.forEachDown(QueryStringFunction.class, qsf -> { plan.forEachDown(LogicalPlan.class, lp -> { if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { @@ -677,6 +679,23 @@ private static void checkCommandsAfterQueryStringFunction(LogicalPlan plan, Expr }); } + private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expression condition, Set failures) { + condition.forEachDown(MatchFunction.class, qsf -> { + plan.forEachDown(LogicalPlan.class, lp -> { + if (lp instanceof Limit) { + failures.add( + fail( + plan, + "[{}] function cannot be used after {}", + qsf.functionName(), + lp.sourceText().split(" ")[0].toUpperCase(Locale.ROOT) + ) + ); + } + }); + }); + } + private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { condition.forEachUp(Or.class, or -> { Expression left = or.left(); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index cbc662ce6132d..7df7633525ff0 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1088,6 +1088,13 @@ public void testMatchFilter() throws Exception { ); } + public void testMatchFunctionNotAllowedAfterCommands() throws Exception { + assertEquals( + "1:24: [MATCH] function cannot be used after LIMIT", + error("from test | limit 10 | where match(first_name, \"Anna\")") + ); + } + public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); @@ -1271,6 +1278,16 @@ public void testMatchFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } + // These should pass eventually once we lift some restrictions on match function + public void testMatchFunctionCurrentlyUnsupportedBehaviour() throws Exception { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + assertEquals( + "1:68: Unknown column [first_name]", + error("from test | stats max_salary = max(salary) by emp_no | where match(first_name, \"Anna\")") + ); + } + public void testMatchFunctionNullArgs() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index 6ff541de1854a..e166ab468d64f 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -5565,6 +5565,27 @@ public void testToDatePeriodToTimeDurationWithField() { assertEquals("1:60: argument of [to_timeduration(x)] must be a constant, received [x]", e.getMessage().substring(header.length())); } + // These should pass eventually once we lift some restrictions on match function + public void testMatchWithNonIndexedColumnCurrentlyUnsupported() { + final String header = "Found 1 problem\nline "; + + VerificationException e = expectThrows(VerificationException.class, () -> plan(""" + from test | eval initial = substring(first_name, 1) | where match(initial, "A")""")); + assertTrue(e.getMessage().startsWith("Found ")); + assertEquals( + "1:67: [MATCH] cannot operate on [initial], which is not a field from an index mapping", + e.getMessage().substring(header.length()) + ); + + e = expectThrows(VerificationException.class, () -> plan(""" + from test | eval text=concat(first_name, last_name) | where match(text, "cat")""")); + assertTrue(e.getMessage().startsWith("Found ")); + assertEquals( + "1:67: [MATCH] cannot operate on [text], which is not a field from an index mapping", + e.getMessage().substring(header.length()) + ); + } + private Literal nullOf(DataType dataType) { return new Literal(Source.EMPTY, null, dataType); } From 3aa66af776216351a8155e0dc368aae934dc626c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 4 Oct 2024 10:44:03 +0200 Subject: [PATCH 65/93] Add mixed query string / match function CSV test --- .../src/main/resources/match-function.csv-spec | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index da3ccfa56d085..3f4c7bce86dc5 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -202,3 +202,17 @@ emp_no:integer | first_name:keyword | last_name:keyword 10053 | Sanjiv | Zschoche 10069 | Margareta | Bierman ; + +testMatchAndQueryStringFunctions +required_capability: match_function +required_capability: qstr_function + +from employees +| where match(job_positions, "Data Scientist") and qstr("job_positions: (Support Engineer) and gender: F") +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10041 | Uri | Lenart +10043 | Yishay | Tzvieli +; From 141dddab6a29967837c04d08a403f389f99c4e28 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 7 Oct 2024 13:01:06 +0200 Subject: [PATCH 66/93] Add assumeTrue check in test --- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 7df7633525ff0..2b9215e5f2342 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1089,6 +1089,8 @@ public void testMatchFilter() throws Exception { } public void testMatchFunctionNotAllowedAfterCommands() throws Exception { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + assertEquals( "1:24: [MATCH] function cannot be used after LIMIT", error("from test | limit 10 | where match(first_name, \"Anna\")") From a25db902ffa1b23a80c712e078368d6c807304f1 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 7 Oct 2024 16:43:37 +0200 Subject: [PATCH 67/93] Additional test for keyword fields being pushable to Lucene --- .../src/main/resources/match-function.csv-spec | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 3f4c7bce86dc5..96481e15e3ee9 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -203,6 +203,20 @@ emp_no:integer | first_name:keyword | last_name:keyword 10069 | Margareta | Bierman ; +testFieldWithKeywordComparisonDisjunction +required_capability: match_function + +from employees +| where match(last_name, "Kalloufi") or last_name == "Piveteau" +| keep emp_no, first_name, last_name; +ignoreOrder:true + +emp_no:integer | first_name:keyword | last_name:keyword +10008 | Saniya | Kalloufi +10010 | Duangkaew | Piveteau +10084 | Tuval | Kalloufi +; + testMatchAndQueryStringFunctions required_capability: match_function required_capability: qstr_function From 419b8fbe6bb36b1dc4b3491be57631a44d3f2b05 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 7 Oct 2024 17:08:49 +0200 Subject: [PATCH 68/93] Removed duplicate tests --- .../xpack/esql/analysis/VerifierTests.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 2b9215e5f2342..1c8d088f4d1a2 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1258,17 +1258,9 @@ private void checkFullTextFunctionsWithNonBooleanFunctions(String functionName, ); } - public void testMatchFunctionArgNotNullOrConstant() throws Exception { + public void testMatchFunctionArgNotConstant() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - assertEquals( - "1:19: first argument of [match(null, \"Anna\")] cannot be null, received [null]", - error("from test | where match(null, \"Anna\")") - ); - assertEquals( - "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", - error("from test | where match(first_name, null)") - ); assertEquals( "1:19: second argument of [match(first_name, first_name)] must be a constant, received [first_name]", error("from test | where match(first_name, first_name)") @@ -1301,11 +1293,6 @@ public void testMatchFunctionNullArgs() throws Exception { "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", error("from test | where match(first_name, null)") ); - - assertEquals( - "1:19: second argument of [match(first_name, null)] cannot be null, received [null]", - error("from test | where match(first_name, null)") - ); } public void testMatchFunctionTargetsExistingField() throws Exception { From 80311e27eb5cf57e90fe1191868a041cd6073187 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Mon, 7 Oct 2024 17:13:04 +0200 Subject: [PATCH 69/93] Remove unnecessary concatenation --- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 1c8d088f4d1a2..56f6e0673600a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1298,7 +1298,7 @@ public void testMatchFunctionNullArgs() throws Exception { public void testMatchFunctionTargetsExistingField() throws Exception { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - assertEquals("1:39: Unknown column [first_name]", error("from test | keep emp_no | where match(first_name, \"Anna\"" + ")")); + assertEquals("1:39: Unknown column [first_name]", error("from test | keep emp_no | where match(first_name, \"Anna\")")); } public void testCoalesceWithMixedNumericTypes() { From c433aa1e657097d7329365cc44be4570981cbab7 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 11:14:02 +0200 Subject: [PATCH 70/93] Move disjunctions check from Verifier to the LocalPhysicalVerifier --- .../xpack/esql/analysis/Verifier.java | 27 ----- .../optimizer/LocalPhysicalPlanOptimizer.java | 8 +- .../esql/optimizer/LocalPhysicalVerifier.java | 79 +++++++++++++ .../physical/local/LucenePushDownUtils.java | 2 +- .../xpack/esql/analysis/VerifierTests.java | 36 ------ .../LocalPhysicalPlanOptimizerTests.java | 104 ++++++++++++++++++ 6 files changed, 188 insertions(+), 68 deletions(-) create mode 100644 x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index ca536d9972d1e..be2c9eb7ce0df 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -24,7 +24,6 @@ import org.elasticsearch.xpack.esql.core.expression.predicate.fulltext.MatchQueryPredicate; import org.elasticsearch.xpack.esql.core.expression.predicate.logical.BinaryLogic; import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Not; -import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Or; import org.elasticsearch.xpack.esql.core.expression.predicate.operator.comparison.BinaryComparison; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.Holder; @@ -653,7 +652,6 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f Expression condition = f.condition(); checkCommandsBeforeQueryStringFunction(plan, condition, failures); checkCommandsBeforeMatchFunction(plan, condition, failures); - checkFullTextFunctionsConditions(condition, failures); checkFullTextFunctionsParents(condition, failures); } else { plan.forEachExpression(FullTextFunction.class, ftf -> { @@ -696,31 +694,6 @@ private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expressio }); } - private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { - condition.forEachUp(Or.class, or -> { - Expression left = or.left(); - Expression right = or.right(); - checkDisjunction(failures, or, left, right); - checkDisjunction(failures, or, right, left); - }); - } - - private static void checkDisjunction(Set failures, Or or, Expression left, Expression right) { - left.forEachDown(FullTextFunction.class, ftf -> { - if (canPushToSource(right, x -> false) == false) { - failures.add( - fail( - or, - "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", - or.sourceText(), - ftf.functionName(), - right.sourceText() - ) - ); - } - }); - } - private static void checkFullTextFunctionsParents(Expression condition, Set failures) { condition.forEachParent(FullTextFunction.class, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java index 48bafd8eef00e..c3df757d30a83 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java @@ -33,18 +33,18 @@ */ public class LocalPhysicalPlanOptimizer extends ParameterizedRuleExecutor { - private final PhysicalVerifier verifier = PhysicalVerifier.INSTANCE; + private final LocalPhysicalVerifier verifier = LocalPhysicalVerifier.INSTANCE; public LocalPhysicalPlanOptimizer(LocalPhysicalOptimizerContext context) { super(context); } public PhysicalPlan localOptimize(PhysicalPlan plan) { - return verify(execute(plan)); + return verify(execute(plan), context()); } - PhysicalPlan verify(PhysicalPlan plan) { - Collection failures = verifier.verify(plan); + PhysicalPlan verify(PhysicalPlan plan, LocalPhysicalOptimizerContext context) { + Collection failures = verifier.verify(plan, context); if (failures.isEmpty() == false) { throw new VerificationException(failures); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java new file mode 100644 index 0000000000000..0e0599d1478c5 --- /dev/null +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +package org.elasticsearch.xpack.esql.optimizer; + +import org.elasticsearch.xpack.esql.common.Failure; +import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Or; +import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; +import org.elasticsearch.xpack.esql.optimizer.rules.physical.local.LucenePushDownUtils; +import org.elasticsearch.xpack.esql.plan.physical.FilterExec; +import org.elasticsearch.xpack.esql.plan.physical.PhysicalPlan; + +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.elasticsearch.xpack.esql.common.Failure.fail; +import static org.elasticsearch.xpack.esql.optimizer.rules.physical.local.PushFiltersToSource.canPushToSource; + +/** Local physical plan verifier. */ +public final class LocalPhysicalVerifier { + + public static final LocalPhysicalVerifier INSTANCE = new LocalPhysicalVerifier(); + + private LocalPhysicalVerifier() {} + + /** Verifies the physical plan. */ + public Collection verify(PhysicalPlan plan, LocalPhysicalOptimizerContext context) { + Set failures = new LinkedHashSet<>(); + + plan.forEachDown(p -> { + checkFullTextQueryFunctions(p, context, failures); + }); + + return failures; + } + + private static void checkFullTextQueryFunctions(PhysicalPlan plan, LocalPhysicalOptimizerContext ctx, Set failures) { + if (plan instanceof FilterExec fe) { + checkFullTextFunctionsConditions(fe.condition(), ctx, failures); + } + } + + private static void checkFullTextFunctionsConditions(Expression condition, LocalPhysicalOptimizerContext ctx, Set failures) { + condition.forEachUp(Or.class, or -> { + Expression left = or.left(); + Expression right = or.right(); + checkDisjunction(failures, or, left, right, ctx); + checkDisjunction(failures, or, right, left, ctx); + }); + } + + private static void checkDisjunction( + Set failures, + Or or, + Expression first, + Expression second, + LocalPhysicalOptimizerContext ctx + ) { + first.forEachDown(FullTextFunction.class, ftf -> { + if (canPushToSource(second, x -> LucenePushDownUtils.hasIdenticalDelegate(x, ctx.searchStats())) == false) { + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", + or.sourceText(), + ftf.functionName(), + second.sourceText() + ) + ); + } + }); + } +} diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java index 1242629c1da3c..7993eba43f38e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java @@ -14,7 +14,7 @@ import java.util.function.Predicate; -class LucenePushDownUtils { +public class LucenePushDownUtils { /** * this method is supposed to be used to define if a field can be used for exact push down (eg. sort or filter). * "aggregatable" is the most accurate information we can have from field_caps as of now. diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 56f6e0673600a..2fae5a9984787 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -8,7 +8,6 @@ package org.elasticsearch.xpack.esql.analysis; import org.elasticsearch.Build; -import org.elasticsearch.common.logging.LoggerMessageFormat; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; @@ -1196,41 +1195,6 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } - public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { - checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); - } - - public void testMatchWithDisjunctionsThatCannotBePushedDown() { - checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); - } - - private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { - assertEquals( - LoggerMessageFormat.format( - null, - "1:19: Invalid condition [{} or length(first_name) > 12]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", - functionInvocation, - functionName - ), - error("from test | where " + functionInvocation + " or length(first_name) > 12") - ); - assertEquals( - LoggerMessageFormat.format( - null, - "1:19: Invalid condition [({} and first_name is not null) or (length(first_name) > 12 and first_name is null)]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and first_name is null]", - functionInvocation, - functionName - ), - error( - "from test | where (" - + functionInvocation - + " and first_name is not null) or (length(first_name) > 12 and first_name is null)" - ) - ); - } - public void testQueryStringFunctionWithNonBooleanFunctions() { checkFullTextFunctionsWithNonBooleanFunctions("QSTR", "qstr(\"first_name: Anna\")"); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index b4f5f540a43c0..20f45fc55b1bf 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -11,6 +11,7 @@ import org.apache.lucene.search.IndexSearcher; import org.elasticsearch.Build; +import org.elasticsearch.common.logging.LoggerMessageFormat; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.IndexMode; @@ -25,6 +26,7 @@ import org.elasticsearch.xpack.core.enrich.EnrichPolicy; import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.EsqlTestUtils.TestSearchStats; +import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; import org.elasticsearch.xpack.esql.analysis.AnalyzerContext; @@ -76,6 +78,7 @@ import static org.elasticsearch.xpack.esql.EsqlTestUtils.withDefaultLimitWarning; import static org.elasticsearch.xpack.esql.plan.physical.EsStatsQueryExec.StatsType; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; @@ -739,6 +742,107 @@ public void testMatchFunctionMultipleWhereClauses() { assertThat(query.query().toString(), is(expected.toString())); } + public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { + assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); + + checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); + } + + public void testMatchWithDisjunctionsThatCannotBePushedDown() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); + } + + private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { + VerificationException ve = expectThrows( + VerificationException.class, + () -> plannerOptimizer.plan("from test | where " + functionInvocation + " or length(first_name) > 12", IS_SV_STATS) + ); + assertThat( + ve.getMessage(), + containsString( + LoggerMessageFormat.format( + null, + "1:19: Invalid condition [{} or length(first_name) > 12]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", + functionInvocation, + functionName + ) + ) + ); + ve = expectThrows( + VerificationException.class, + () -> plannerOptimizer.plan( + "from test | where (" + functionInvocation + " and emp_no < 1000) or (length(first_name) > 12 and emp_no > 1000)", + IS_SV_STATS + ) + ); + assertThat( + ve.getMessage(), + containsString( + LoggerMessageFormat.format( + null, + "1:19: Invalid condition [({} and emp_no < 1000) or (length(first_name) > 12 and emp_no > 1000)]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and emp_no > 1000]", + functionInvocation, + functionName + ) + ) + ); + } + + public void testMatchFunctionDisjunctionNonPushableClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(first_name, "Peter") or length(last_name) > 10 + """; + + VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); + assertThat( + ve.getMessage(), + containsString( + "Invalid condition [match(first_name, \"Peter\") or length(last_name) > 10]. " + + "Function MATCH can't be used as part of an or condition that includes [length(last_name) > 10]" + ) + ); + } + + /** + * Expected: + * LimitExec[1000[INTEGER]] + * \_ExchangeExec[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, job{f}#11, job.raw{f}#12, languages{f}#7, last_ + * name{f}#8, long_noidx{f}#13, salary{f}#9],false] + * \_ProjectExec[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, job{f}#11, job.raw{f}#12, languages{f}#7, last_ + * name{f}#8, long_noidx{f}#13, salary{f}#9]] + * \_FieldExtractExec[_meta_field{f}#10, emp_no{f}#4, first_name{f} + * \_EsQueryExec[test], indexMode[standard], + * query[{"bool":{"should":[{"match":{"first_name":{"query":"Peter"}}},{"esql_single_value":{"field":"last_name", + * "next":{"term":{"last_name":{"value":"Griffin"}}},"source":"last_name == \"Griffin\"@2:39"}}],"boost":1.0}}] + */ + public void testMatchFunctionDisjunctionPushableClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(first_name, "Peter") or last_name == "Griffin" + """; + var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); + + var limit = as(plan, LimitExec.class); + var exchange = as(limit.child(), ExchangeExec.class); + var project = as(exchange.child(), ProjectExec.class); + var field = as(project.child(), FieldExtractExec.class); + var query = as(field.child(), EsQueryExec.class); + assertThat(query.limit().fold(), is(1000)); + + var queryStringLeft = QueryBuilders.matchQuery("first_name", "Peter"); + Source termSource = new Source(2, 38, "last_name == \"Griffin\""); + var queryStringRight = wrapWithSingleQuery(queryText, QueryBuilders.termQuery("last_name", "Griffin"), "last_name", termSource); + var expected = QueryBuilders.boolQuery().should(queryStringLeft).should(queryStringRight); + assertThat(query.query().toString(), is(expected.toString())); + } + /** * Expecting * LimitExec[1000[INTEGER]] From 2200f4d2a9c12bcbb3e2363006a4c57b57a57a76 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 12:51:38 +0200 Subject: [PATCH 71/93] Remove unneeded test --- .../LocalPhysicalPlanOptimizerTests.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 20f45fc55b1bf..106492049eee9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -792,23 +792,6 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St ); } - public void testMatchFunctionDisjunctionNonPushableClauses() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - String queryText = """ - from test - | where match(first_name, "Peter") or length(last_name) > 10 - """; - - VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); - assertThat( - ve.getMessage(), - containsString( - "Invalid condition [match(first_name, \"Peter\") or length(last_name) > 10]. " - + "Function MATCH can't be used as part of an or condition that includes [length(last_name) > 10]" - ) - ); - } - /** * Expected: * LimitExec[1000[INTEGER]] From deb539b9b02c766eacf341ec8c28b9472f43d13f Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 12:52:00 +0200 Subject: [PATCH 72/93] Add disjunction that is pushable --- .../src/main/resources/match-function.csv-spec | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 96481e15e3ee9..8b3d3fc04fdbf 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -142,6 +142,21 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; +matchWithTextEqualsFunctionPushedToLucene +required_capability: match_function + +from books +| where author == "Danny Faulkner" or match(title, "Hobbit") +| keep book_no, author, title; +ignoreOrder:true + +book_no:keyword | author:text | title:text +4289 | J R R Tolkien | Poems from the Hobbit +7480 | J. R. R. Tolkien | The Hobbit +6405 | J. R. R. Tolkien | The Hobbit or There and Back Again +3293 | Danny Faulkner | Universe by Design +; + matchWithNonPushableConjunction required_capability: match_function From e27c11249e4be943a26aa5c5af8bc25d33a55faf Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 12:53:27 +0200 Subject: [PATCH 73/93] Spotless --- .../xpack/esql/optimizer/LocalPhysicalVerifier.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java index 0e0599d1478c5..e45f5d2eef515 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java @@ -33,9 +33,7 @@ private LocalPhysicalVerifier() {} public Collection verify(PhysicalPlan plan, LocalPhysicalOptimizerContext context) { Set failures = new LinkedHashSet<>(); - plan.forEachDown(p -> { - checkFullTextQueryFunctions(p, context, failures); - }); + plan.forEachDown(p -> { checkFullTextQueryFunctions(p, context, failures); }); return failures; } From cc3293097f99bcd7b3a30a7c55fb25487012e798 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:07:22 +0200 Subject: [PATCH 74/93] Replace getFirst() for get(0) --- .../xpack/esql/expression/function/fulltext/MatchFunction.java | 2 +- .../esql/expression/function/fulltext/QueryStringFunction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index c865db41f0cc2..527f9e0bdfd6b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -114,7 +114,7 @@ public void validate(Failures failures) { @Override public Expression replaceChildren(List newChildren) { // Query is the first child, field is the second child - return new MatchFunction(source(), newChildren.get(1), newChildren.getFirst()); + return new MatchFunction(source(), newChildren.get(1), newChildren.get(0)); } @Override diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index c5421d5148590..2db497e8b2df8 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -79,7 +79,7 @@ public Query asQuery(String queryText) { @Override public Expression replaceChildren(List newChildren) { - return new QueryStringFunction(source(), newChildren.getFirst()); + return new QueryStringFunction(source(), newChildren.get(0)); } @Override From 2ddcbb597956e1597964ba9b7003d581f73881f2 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:16:55 +0200 Subject: [PATCH 75/93] Replace getFirst() for get(0), change children list order --- .../esql/expression/function/fulltext/MatchFunction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 527f9e0bdfd6b..367fd2a6b4202 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -62,7 +62,7 @@ public MatchFunction( description = "Text you wish to find in the provided field." ) Expression matchQuery ) { - super(source, matchQuery, List.of(matchQuery, field)); + super(source, matchQuery, List.of(field, matchQuery)); this.field = field; } @@ -114,7 +114,7 @@ public void validate(Failures failures) { @Override public Expression replaceChildren(List newChildren) { // Query is the first child, field is the second child - return new MatchFunction(source(), newChildren.get(1), newChildren.get(0)); + return new MatchFunction(source(), newChildren.get(0), newChildren.get(1)); } @Override From 87dcd7f02da733ee217e9329d4cd2db9d0e1b651 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:17:18 +0200 Subject: [PATCH 76/93] Regenerated from tests --- docs/reference/esql/functions/kibana/definition/match.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/reference/esql/functions/kibana/definition/match.json b/docs/reference/esql/functions/kibana/definition/match.json index 93299576b4f86..d2fe0bba53866 100644 --- a/docs/reference/esql/functions/kibana/definition/match.json +++ b/docs/reference/esql/functions/kibana/definition/match.json @@ -80,5 +80,6 @@ "examples" : [ "from books \n| where match(author, \"Faulkner\")\n| keep book_no, author \n| sort book_no \n| limit 5;" ], - "preview" : true + "preview" : true, + "snapshot_only" : true } From 19f05465e146f831807aa0f714074ac5192fce6e Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:18:55 +0200 Subject: [PATCH 77/93] Removed MATCH command from the lexer --- .../esql/src/main/antlr/EsqlBaseLexer.g4 | 4 +- .../esql/src/main/antlr/EsqlBaseLexer.tokens | 162 +- .../esql/src/main/antlr/EsqlBaseParser.tokens | 162 +- .../xpack/esql/parser/EsqlBaseLexer.interp | 9 +- .../xpack/esql/parser/EsqlBaseLexer.java | 1866 ++++++++--------- .../xpack/esql/parser/EsqlBaseParser.interp | 6 +- .../xpack/esql/parser/EsqlBaseParser.java | 436 ++-- 7 files changed, 1313 insertions(+), 1332 deletions(-) diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 index 6570a25469971..515c8e06d4fa8 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4 @@ -87,7 +87,6 @@ WHERE : 'where' -> pushMode(EXPRESSION_MODE); // MYCOMMAND : 'mycommand' -> ... DEV_INLINESTATS : {this.isDevVersion()}? 'inlinestats' -> pushMode(EXPRESSION_MODE); DEV_LOOKUP : {this.isDevVersion()}? 'lookup' -> pushMode(LOOKUP_MODE); -DEV_MATCH : {this.isDevVersion()}? 'match' -> pushMode(EXPRESSION_MODE); DEV_METRICS : {this.isDevVersion()}? 'metrics' -> pushMode(METRICS_MODE); // @@ -210,8 +209,7 @@ ASTERISK : '*'; SLASH : '/'; PERCENT : '%'; -// move it in the main section if the feature gets promoted -DEV_MATCH_OP : {this.isDevVersion()}? DEV_MATCH -> type(DEV_MATCH); +DEV_MATCH : {this.isDevVersion()}? 'match'; NAMED_OR_POSITIONAL_PARAM : PARAM (LETTER | UNDERSCORE) UNQUOTED_ID_BODY* diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens index 747fbbc64cf5f..318681e075150 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens @@ -17,51 +17,51 @@ STATS=16 WHERE=17 DEV_INLINESTATS=18 DEV_LOOKUP=19 -DEV_MATCH=20 -DEV_METRICS=21 -UNKNOWN_CMD=22 -LINE_COMMENT=23 -MULTILINE_COMMENT=24 -WS=25 -PIPE=26 -QUOTED_STRING=27 -INTEGER_LITERAL=28 -DECIMAL_LITERAL=29 -BY=30 -AND=31 -ASC=32 -ASSIGN=33 -CAST_OP=34 -COMMA=35 -DESC=36 -DOT=37 -FALSE=38 -FIRST=39 -IN=40 -IS=41 -LAST=42 -LIKE=43 -LP=44 -NOT=45 -NULL=46 -NULLS=47 -OR=48 -PARAM=49 -RLIKE=50 -RP=51 -TRUE=52 -EQ=53 -CIEQ=54 -NEQ=55 -LT=56 -LTE=57 -GT=58 -GTE=59 -PLUS=60 -MINUS=61 -ASTERISK=62 -SLASH=63 -PERCENT=64 +DEV_METRICS=20 +UNKNOWN_CMD=21 +LINE_COMMENT=22 +MULTILINE_COMMENT=23 +WS=24 +PIPE=25 +QUOTED_STRING=26 +INTEGER_LITERAL=27 +DECIMAL_LITERAL=28 +BY=29 +AND=30 +ASC=31 +ASSIGN=32 +CAST_OP=33 +COMMA=34 +DESC=35 +DOT=36 +FALSE=37 +FIRST=38 +IN=39 +IS=40 +LAST=41 +LIKE=42 +LP=43 +NOT=44 +NULL=45 +NULLS=46 +OR=47 +PARAM=48 +RLIKE=49 +RP=50 +TRUE=51 +EQ=52 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +DEV_MATCH=64 NAMED_OR_POSITIONAL_PARAM=65 OPENING_BRACKET=66 CLOSING_BRACKET=67 @@ -140,42 +140,42 @@ CLOSING_METRICS_WS=125 'sort'=15 'stats'=16 'where'=17 -'|'=26 -'by'=30 -'and'=31 -'asc'=32 -'='=33 -'::'=34 -','=35 -'desc'=36 -'.'=37 -'false'=38 -'first'=39 -'in'=40 -'is'=41 -'last'=42 -'like'=43 -'('=44 -'not'=45 -'null'=46 -'nulls'=47 -'or'=48 -'?'=49 -'rlike'=50 -')'=51 -'true'=52 -'=='=53 -'=~'=54 -'!='=55 -'<'=56 -'<='=57 -'>'=58 -'>='=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 +'|'=25 +'by'=29 +'and'=30 +'asc'=31 +'='=32 +'::'=33 +','=34 +'desc'=35 +'.'=36 +'false'=37 +'first'=38 +'in'=39 +'is'=40 +'last'=41 +'like'=42 +'('=43 +'not'=44 +'null'=45 +'nulls'=46 +'or'=47 +'?'=48 +'rlike'=49 +')'=50 +'true'=51 +'=='=52 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 ']'=67 'metadata'=76 'as'=85 diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens index 747fbbc64cf5f..318681e075150 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens @@ -17,51 +17,51 @@ STATS=16 WHERE=17 DEV_INLINESTATS=18 DEV_LOOKUP=19 -DEV_MATCH=20 -DEV_METRICS=21 -UNKNOWN_CMD=22 -LINE_COMMENT=23 -MULTILINE_COMMENT=24 -WS=25 -PIPE=26 -QUOTED_STRING=27 -INTEGER_LITERAL=28 -DECIMAL_LITERAL=29 -BY=30 -AND=31 -ASC=32 -ASSIGN=33 -CAST_OP=34 -COMMA=35 -DESC=36 -DOT=37 -FALSE=38 -FIRST=39 -IN=40 -IS=41 -LAST=42 -LIKE=43 -LP=44 -NOT=45 -NULL=46 -NULLS=47 -OR=48 -PARAM=49 -RLIKE=50 -RP=51 -TRUE=52 -EQ=53 -CIEQ=54 -NEQ=55 -LT=56 -LTE=57 -GT=58 -GTE=59 -PLUS=60 -MINUS=61 -ASTERISK=62 -SLASH=63 -PERCENT=64 +DEV_METRICS=20 +UNKNOWN_CMD=21 +LINE_COMMENT=22 +MULTILINE_COMMENT=23 +WS=24 +PIPE=25 +QUOTED_STRING=26 +INTEGER_LITERAL=27 +DECIMAL_LITERAL=28 +BY=29 +AND=30 +ASC=31 +ASSIGN=32 +CAST_OP=33 +COMMA=34 +DESC=35 +DOT=36 +FALSE=37 +FIRST=38 +IN=39 +IS=40 +LAST=41 +LIKE=42 +LP=43 +NOT=44 +NULL=45 +NULLS=46 +OR=47 +PARAM=48 +RLIKE=49 +RP=50 +TRUE=51 +EQ=52 +CIEQ=53 +NEQ=54 +LT=55 +LTE=56 +GT=57 +GTE=58 +PLUS=59 +MINUS=60 +ASTERISK=61 +SLASH=62 +PERCENT=63 +DEV_MATCH=64 NAMED_OR_POSITIONAL_PARAM=65 OPENING_BRACKET=66 CLOSING_BRACKET=67 @@ -140,42 +140,42 @@ CLOSING_METRICS_WS=125 'sort'=15 'stats'=16 'where'=17 -'|'=26 -'by'=30 -'and'=31 -'asc'=32 -'='=33 -'::'=34 -','=35 -'desc'=36 -'.'=37 -'false'=38 -'first'=39 -'in'=40 -'is'=41 -'last'=42 -'like'=43 -'('=44 -'not'=45 -'null'=46 -'nulls'=47 -'or'=48 -'?'=49 -'rlike'=50 -')'=51 -'true'=52 -'=='=53 -'=~'=54 -'!='=55 -'<'=56 -'<='=57 -'>'=58 -'>='=59 -'+'=60 -'-'=61 -'*'=62 -'/'=63 -'%'=64 +'|'=25 +'by'=29 +'and'=30 +'asc'=31 +'='=32 +'::'=33 +','=34 +'desc'=35 +'.'=36 +'false'=37 +'first'=38 +'in'=39 +'is'=40 +'last'=41 +'like'=42 +'('=43 +'not'=44 +'null'=45 +'nulls'=46 +'or'=47 +'?'=48 +'rlike'=49 +')'=50 +'true'=51 +'=='=52 +'=~'=53 +'!='=54 +'<'=55 +'<='=56 +'>'=57 +'>='=58 +'+'=59 +'-'=60 +'*'=61 +'/'=62 +'%'=63 ']'=67 'metadata'=76 'as'=85 diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 8122a56884280..6028424dc7c8d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -24,7 +24,6 @@ null null null null -null '|' null null @@ -66,6 +65,7 @@ null '%' null null +null ']' null null @@ -147,7 +147,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -192,6 +191,7 @@ MINUS ASTERISK SLASH PERCENT +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -274,7 +274,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -329,7 +328,7 @@ MINUS ASTERISK SLASH PERCENT -DEV_MATCH_OP +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -475,4 +474,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 125, 1474, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 4, 21, 591, 8, 21, 11, 21, 12, 21, 592, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 601, 8, 22, 10, 22, 12, 22, 604, 9, 22, 1, 22, 3, 22, 607, 8, 22, 1, 22, 3, 22, 610, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 619, 8, 23, 10, 23, 12, 23, 622, 9, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 4, 24, 630, 8, 24, 11, 24, 12, 24, 631, 1, 24, 1, 24, 1, 25, 1, 25, 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, 3, 30, 651, 8, 30, 1, 30, 4, 30, 654, 8, 30, 11, 30, 12, 30, 655, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 665, 8, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 672, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 677, 8, 36, 10, 36, 12, 36, 680, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 688, 8, 36, 10, 36, 12, 36, 691, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 698, 8, 36, 1, 36, 3, 36, 701, 8, 36, 3, 36, 703, 8, 36, 1, 37, 4, 37, 706, 8, 37, 11, 37, 12, 37, 707, 1, 38, 4, 38, 711, 8, 38, 11, 38, 12, 38, 712, 1, 38, 1, 38, 5, 38, 717, 8, 38, 10, 38, 12, 38, 720, 9, 38, 1, 38, 1, 38, 4, 38, 724, 8, 38, 11, 38, 12, 38, 725, 1, 38, 4, 38, 729, 8, 38, 11, 38, 12, 38, 730, 1, 38, 1, 38, 5, 38, 735, 8, 38, 10, 38, 12, 38, 738, 9, 38, 3, 38, 740, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 4, 38, 746, 8, 38, 11, 38, 12, 38, 747, 1, 38, 1, 38, 3, 38, 752, 8, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 3, 75, 879, 8, 75, 1, 75, 5, 75, 882, 8, 75, 10, 75, 12, 75, 885, 9, 75, 1, 75, 1, 75, 4, 75, 889, 8, 75, 11, 75, 12, 75, 890, 3, 75, 893, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 5, 78, 907, 8, 78, 10, 78, 12, 78, 910, 9, 78, 1, 78, 1, 78, 3, 78, 914, 8, 78, 1, 78, 4, 78, 917, 8, 78, 11, 78, 12, 78, 918, 3, 78, 921, 8, 78, 1, 79, 1, 79, 4, 79, 925, 8, 79, 11, 79, 12, 79, 926, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 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, 3, 96, 1004, 8, 96, 1, 97, 4, 97, 1007, 8, 97, 11, 97, 12, 97, 1008, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1048, 8, 106, 1, 107, 1, 107, 3, 107, 1052, 8, 107, 1, 107, 5, 107, 1055, 8, 107, 10, 107, 12, 107, 1058, 9, 107, 1, 107, 1, 107, 3, 107, 1062, 8, 107, 1, 107, 4, 107, 1065, 8, 107, 11, 107, 12, 107, 1066, 3, 107, 1069, 8, 107, 1, 108, 1, 108, 4, 108, 1073, 8, 108, 11, 108, 12, 108, 1074, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 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, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 4, 126, 1150, 8, 126, 11, 126, 12, 126, 1151, 1, 126, 1, 126, 3, 126, 1156, 8, 126, 1, 126, 4, 126, 1159, 8, 126, 11, 126, 12, 126, 1160, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 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, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 160, 4, 160, 1311, 8, 160, 11, 160, 12, 160, 1312, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 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, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 2, 620, 689, 0, 196, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 26, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 0, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 0, 166, 65, 168, 66, 170, 67, 172, 68, 174, 0, 176, 69, 178, 70, 180, 71, 182, 72, 184, 0, 186, 0, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 0, 214, 0, 216, 78, 218, 79, 220, 80, 222, 0, 224, 0, 226, 0, 228, 0, 230, 0, 232, 81, 234, 82, 236, 83, 238, 84, 240, 0, 242, 0, 244, 0, 246, 0, 248, 85, 250, 0, 252, 86, 254, 87, 256, 88, 258, 0, 260, 0, 262, 89, 264, 90, 266, 0, 268, 91, 270, 0, 272, 92, 274, 93, 276, 94, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 0, 292, 95, 294, 96, 296, 97, 298, 0, 300, 0, 302, 0, 304, 0, 306, 98, 308, 99, 310, 100, 312, 0, 314, 101, 316, 102, 318, 103, 320, 104, 322, 0, 324, 105, 326, 106, 328, 107, 330, 108, 332, 0, 334, 109, 336, 110, 338, 111, 340, 112, 342, 113, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 0, 358, 114, 360, 115, 362, 116, 364, 0, 366, 0, 368, 0, 370, 0, 372, 117, 374, 118, 376, 119, 378, 0, 380, 0, 382, 0, 384, 120, 386, 121, 388, 122, 390, 0, 392, 0, 394, 123, 396, 124, 398, 125, 400, 0, 402, 0, 404, 0, 406, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1501, 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, 1, 66, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 172, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 1, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 3, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 4, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 5, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 6, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 7, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 12, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 13, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 14, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 15, 406, 1, 0, 0, 0, 16, 408, 1, 0, 0, 0, 18, 418, 1, 0, 0, 0, 20, 425, 1, 0, 0, 0, 22, 434, 1, 0, 0, 0, 24, 441, 1, 0, 0, 0, 26, 451, 1, 0, 0, 0, 28, 458, 1, 0, 0, 0, 30, 465, 1, 0, 0, 0, 32, 472, 1, 0, 0, 0, 34, 480, 1, 0, 0, 0, 36, 487, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 508, 1, 0, 0, 0, 42, 514, 1, 0, 0, 0, 44, 521, 1, 0, 0, 0, 46, 528, 1, 0, 0, 0, 48, 536, 1, 0, 0, 0, 50, 544, 1, 0, 0, 0, 52, 559, 1, 0, 0, 0, 54, 569, 1, 0, 0, 0, 56, 578, 1, 0, 0, 0, 58, 590, 1, 0, 0, 0, 60, 596, 1, 0, 0, 0, 62, 613, 1, 0, 0, 0, 64, 629, 1, 0, 0, 0, 66, 635, 1, 0, 0, 0, 68, 639, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 646, 1, 0, 0, 0, 76, 648, 1, 0, 0, 0, 78, 657, 1, 0, 0, 0, 80, 659, 1, 0, 0, 0, 82, 664, 1, 0, 0, 0, 84, 666, 1, 0, 0, 0, 86, 671, 1, 0, 0, 0, 88, 702, 1, 0, 0, 0, 90, 705, 1, 0, 0, 0, 92, 751, 1, 0, 0, 0, 94, 753, 1, 0, 0, 0, 96, 756, 1, 0, 0, 0, 98, 760, 1, 0, 0, 0, 100, 764, 1, 0, 0, 0, 102, 766, 1, 0, 0, 0, 104, 769, 1, 0, 0, 0, 106, 771, 1, 0, 0, 0, 108, 776, 1, 0, 0, 0, 110, 778, 1, 0, 0, 0, 112, 784, 1, 0, 0, 0, 114, 790, 1, 0, 0, 0, 116, 793, 1, 0, 0, 0, 118, 796, 1, 0, 0, 0, 120, 801, 1, 0, 0, 0, 122, 806, 1, 0, 0, 0, 124, 808, 1, 0, 0, 0, 126, 812, 1, 0, 0, 0, 128, 817, 1, 0, 0, 0, 130, 823, 1, 0, 0, 0, 132, 826, 1, 0, 0, 0, 134, 828, 1, 0, 0, 0, 136, 834, 1, 0, 0, 0, 138, 836, 1, 0, 0, 0, 140, 841, 1, 0, 0, 0, 142, 844, 1, 0, 0, 0, 144, 847, 1, 0, 0, 0, 146, 850, 1, 0, 0, 0, 148, 852, 1, 0, 0, 0, 150, 855, 1, 0, 0, 0, 152, 857, 1, 0, 0, 0, 154, 860, 1, 0, 0, 0, 156, 862, 1, 0, 0, 0, 158, 864, 1, 0, 0, 0, 160, 866, 1, 0, 0, 0, 162, 868, 1, 0, 0, 0, 164, 870, 1, 0, 0, 0, 166, 892, 1, 0, 0, 0, 168, 894, 1, 0, 0, 0, 170, 899, 1, 0, 0, 0, 172, 920, 1, 0, 0, 0, 174, 922, 1, 0, 0, 0, 176, 930, 1, 0, 0, 0, 178, 932, 1, 0, 0, 0, 180, 936, 1, 0, 0, 0, 182, 940, 1, 0, 0, 0, 184, 944, 1, 0, 0, 0, 186, 949, 1, 0, 0, 0, 188, 954, 1, 0, 0, 0, 190, 958, 1, 0, 0, 0, 192, 962, 1, 0, 0, 0, 194, 966, 1, 0, 0, 0, 196, 971, 1, 0, 0, 0, 198, 975, 1, 0, 0, 0, 200, 979, 1, 0, 0, 0, 202, 983, 1, 0, 0, 0, 204, 987, 1, 0, 0, 0, 206, 991, 1, 0, 0, 0, 208, 1003, 1, 0, 0, 0, 210, 1006, 1, 0, 0, 0, 212, 1010, 1, 0, 0, 0, 214, 1014, 1, 0, 0, 0, 216, 1018, 1, 0, 0, 0, 218, 1022, 1, 0, 0, 0, 220, 1026, 1, 0, 0, 0, 222, 1030, 1, 0, 0, 0, 224, 1035, 1, 0, 0, 0, 226, 1039, 1, 0, 0, 0, 228, 1047, 1, 0, 0, 0, 230, 1068, 1, 0, 0, 0, 232, 1072, 1, 0, 0, 0, 234, 1076, 1, 0, 0, 0, 236, 1080, 1, 0, 0, 0, 238, 1084, 1, 0, 0, 0, 240, 1088, 1, 0, 0, 0, 242, 1093, 1, 0, 0, 0, 244, 1097, 1, 0, 0, 0, 246, 1101, 1, 0, 0, 0, 248, 1105, 1, 0, 0, 0, 250, 1108, 1, 0, 0, 0, 252, 1112, 1, 0, 0, 0, 254, 1116, 1, 0, 0, 0, 256, 1120, 1, 0, 0, 0, 258, 1124, 1, 0, 0, 0, 260, 1129, 1, 0, 0, 0, 262, 1134, 1, 0, 0, 0, 264, 1139, 1, 0, 0, 0, 266, 1146, 1, 0, 0, 0, 268, 1155, 1, 0, 0, 0, 270, 1162, 1, 0, 0, 0, 272, 1166, 1, 0, 0, 0, 274, 1170, 1, 0, 0, 0, 276, 1174, 1, 0, 0, 0, 278, 1178, 1, 0, 0, 0, 280, 1184, 1, 0, 0, 0, 282, 1188, 1, 0, 0, 0, 284, 1192, 1, 0, 0, 0, 286, 1196, 1, 0, 0, 0, 288, 1200, 1, 0, 0, 0, 290, 1204, 1, 0, 0, 0, 292, 1208, 1, 0, 0, 0, 294, 1212, 1, 0, 0, 0, 296, 1216, 1, 0, 0, 0, 298, 1220, 1, 0, 0, 0, 300, 1225, 1, 0, 0, 0, 302, 1229, 1, 0, 0, 0, 304, 1233, 1, 0, 0, 0, 306, 1237, 1, 0, 0, 0, 308, 1241, 1, 0, 0, 0, 310, 1245, 1, 0, 0, 0, 312, 1249, 1, 0, 0, 0, 314, 1254, 1, 0, 0, 0, 316, 1259, 1, 0, 0, 0, 318, 1263, 1, 0, 0, 0, 320, 1267, 1, 0, 0, 0, 322, 1271, 1, 0, 0, 0, 324, 1276, 1, 0, 0, 0, 326, 1286, 1, 0, 0, 0, 328, 1290, 1, 0, 0, 0, 330, 1294, 1, 0, 0, 0, 332, 1298, 1, 0, 0, 0, 334, 1303, 1, 0, 0, 0, 336, 1310, 1, 0, 0, 0, 338, 1314, 1, 0, 0, 0, 340, 1318, 1, 0, 0, 0, 342, 1322, 1, 0, 0, 0, 344, 1326, 1, 0, 0, 0, 346, 1331, 1, 0, 0, 0, 348, 1335, 1, 0, 0, 0, 350, 1339, 1, 0, 0, 0, 352, 1343, 1, 0, 0, 0, 354, 1348, 1, 0, 0, 0, 356, 1352, 1, 0, 0, 0, 358, 1356, 1, 0, 0, 0, 360, 1360, 1, 0, 0, 0, 362, 1364, 1, 0, 0, 0, 364, 1368, 1, 0, 0, 0, 366, 1374, 1, 0, 0, 0, 368, 1378, 1, 0, 0, 0, 370, 1382, 1, 0, 0, 0, 372, 1386, 1, 0, 0, 0, 374, 1390, 1, 0, 0, 0, 376, 1394, 1, 0, 0, 0, 378, 1398, 1, 0, 0, 0, 380, 1403, 1, 0, 0, 0, 382, 1409, 1, 0, 0, 0, 384, 1415, 1, 0, 0, 0, 386, 1419, 1, 0, 0, 0, 388, 1423, 1, 0, 0, 0, 390, 1427, 1, 0, 0, 0, 392, 1433, 1, 0, 0, 0, 394, 1439, 1, 0, 0, 0, 396, 1443, 1, 0, 0, 0, 398, 1447, 1, 0, 0, 0, 400, 1451, 1, 0, 0, 0, 402, 1457, 1, 0, 0, 0, 404, 1463, 1, 0, 0, 0, 406, 1469, 1, 0, 0, 0, 408, 409, 7, 0, 0, 0, 409, 410, 7, 1, 0, 0, 410, 411, 7, 2, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 4, 0, 0, 414, 415, 7, 5, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 6, 0, 0, 0, 417, 17, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 7, 6, 0, 0, 420, 421, 7, 7, 0, 0, 421, 422, 7, 8, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 6, 1, 1, 0, 424, 19, 1, 0, 0, 0, 425, 426, 7, 3, 0, 0, 426, 427, 7, 9, 0, 0, 427, 428, 7, 6, 0, 0, 428, 429, 7, 1, 0, 0, 429, 430, 7, 4, 0, 0, 430, 431, 7, 10, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 6, 2, 2, 0, 433, 21, 1, 0, 0, 0, 434, 435, 7, 3, 0, 0, 435, 436, 7, 11, 0, 0, 436, 437, 7, 12, 0, 0, 437, 438, 7, 13, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 6, 3, 0, 0, 440, 23, 1, 0, 0, 0, 441, 442, 7, 3, 0, 0, 442, 443, 7, 14, 0, 0, 443, 444, 7, 8, 0, 0, 444, 445, 7, 13, 0, 0, 445, 446, 7, 12, 0, 0, 446, 447, 7, 1, 0, 0, 447, 448, 7, 9, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 6, 4, 3, 0, 450, 25, 1, 0, 0, 0, 451, 452, 7, 15, 0, 0, 452, 453, 7, 6, 0, 0, 453, 454, 7, 7, 0, 0, 454, 455, 7, 16, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 5, 4, 0, 457, 27, 1, 0, 0, 0, 458, 459, 7, 17, 0, 0, 459, 460, 7, 6, 0, 0, 460, 461, 7, 7, 0, 0, 461, 462, 7, 18, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 6, 0, 0, 464, 29, 1, 0, 0, 0, 465, 466, 7, 18, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 8, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 6, 7, 1, 0, 471, 31, 1, 0, 0, 0, 472, 473, 7, 13, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 16, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 5, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 8, 0, 0, 479, 33, 1, 0, 0, 0, 480, 481, 7, 16, 0, 0, 481, 482, 7, 3, 0, 0, 482, 483, 7, 5, 0, 0, 483, 484, 7, 12, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 9, 5, 0, 486, 35, 1, 0, 0, 0, 487, 488, 7, 16, 0, 0, 488, 489, 7, 11, 0, 0, 489, 490, 5, 95, 0, 0, 490, 491, 7, 3, 0, 0, 491, 492, 7, 14, 0, 0, 492, 493, 7, 8, 0, 0, 493, 494, 7, 12, 0, 0, 494, 495, 7, 9, 0, 0, 495, 496, 7, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 6, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 6, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 9, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 7, 16, 0, 0, 504, 505, 7, 3, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 7, 0, 507, 39, 1, 0, 0, 0, 508, 509, 7, 6, 0, 0, 509, 510, 7, 7, 0, 0, 510, 511, 7, 19, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 12, 0, 0, 513, 41, 1, 0, 0, 0, 514, 515, 7, 2, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 19, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 6, 13, 8, 0, 520, 43, 1, 0, 0, 0, 521, 522, 7, 2, 0, 0, 522, 523, 7, 7, 0, 0, 523, 524, 7, 6, 0, 0, 524, 525, 7, 5, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 14, 0, 0, 527, 45, 1, 0, 0, 0, 528, 529, 7, 2, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 12, 0, 0, 531, 532, 7, 5, 0, 0, 532, 533, 7, 2, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 6, 15, 0, 0, 535, 47, 1, 0, 0, 0, 536, 537, 7, 19, 0, 0, 537, 538, 7, 10, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 7, 6, 0, 0, 540, 541, 7, 3, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 6, 16, 0, 0, 543, 49, 1, 0, 0, 0, 544, 545, 4, 17, 0, 0, 545, 546, 7, 1, 0, 0, 546, 547, 7, 9, 0, 0, 547, 548, 7, 13, 0, 0, 548, 549, 7, 1, 0, 0, 549, 550, 7, 9, 0, 0, 550, 551, 7, 3, 0, 0, 551, 552, 7, 2, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 12, 0, 0, 554, 555, 7, 5, 0, 0, 555, 556, 7, 2, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 6, 17, 0, 0, 558, 51, 1, 0, 0, 0, 559, 560, 4, 18, 1, 0, 560, 561, 7, 13, 0, 0, 561, 562, 7, 7, 0, 0, 562, 563, 7, 7, 0, 0, 563, 564, 7, 18, 0, 0, 564, 565, 7, 20, 0, 0, 565, 566, 7, 8, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 18, 9, 0, 568, 53, 1, 0, 0, 0, 569, 570, 4, 19, 2, 0, 570, 571, 7, 16, 0, 0, 571, 572, 7, 12, 0, 0, 572, 573, 7, 5, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 10, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 19, 0, 0, 577, 55, 1, 0, 0, 0, 578, 579, 4, 20, 3, 0, 579, 580, 7, 16, 0, 0, 580, 581, 7, 3, 0, 0, 581, 582, 7, 5, 0, 0, 582, 583, 7, 6, 0, 0, 583, 584, 7, 1, 0, 0, 584, 585, 7, 4, 0, 0, 585, 586, 7, 2, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 6, 20, 10, 0, 588, 57, 1, 0, 0, 0, 589, 591, 8, 21, 0, 0, 590, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 6, 21, 0, 0, 595, 59, 1, 0, 0, 0, 596, 597, 5, 47, 0, 0, 597, 598, 5, 47, 0, 0, 598, 602, 1, 0, 0, 0, 599, 601, 8, 22, 0, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 606, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 607, 5, 13, 0, 0, 606, 605, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 609, 1, 0, 0, 0, 608, 610, 5, 10, 0, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 6, 22, 11, 0, 612, 61, 1, 0, 0, 0, 613, 614, 5, 47, 0, 0, 614, 615, 5, 42, 0, 0, 615, 620, 1, 0, 0, 0, 616, 619, 3, 62, 23, 0, 617, 619, 9, 0, 0, 0, 618, 616, 1, 0, 0, 0, 618, 617, 1, 0, 0, 0, 619, 622, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 623, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 624, 5, 42, 0, 0, 624, 625, 5, 47, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 23, 11, 0, 627, 63, 1, 0, 0, 0, 628, 630, 7, 23, 0, 0, 629, 628, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 24, 11, 0, 634, 65, 1, 0, 0, 0, 635, 636, 5, 124, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 6, 25, 12, 0, 638, 67, 1, 0, 0, 0, 639, 640, 7, 24, 0, 0, 640, 69, 1, 0, 0, 0, 641, 642, 7, 25, 0, 0, 642, 71, 1, 0, 0, 0, 643, 644, 5, 92, 0, 0, 644, 645, 7, 26, 0, 0, 645, 73, 1, 0, 0, 0, 646, 647, 8, 27, 0, 0, 647, 75, 1, 0, 0, 0, 648, 650, 7, 3, 0, 0, 649, 651, 7, 28, 0, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 653, 1, 0, 0, 0, 652, 654, 3, 68, 26, 0, 653, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 77, 1, 0, 0, 0, 657, 658, 5, 64, 0, 0, 658, 79, 1, 0, 0, 0, 659, 660, 5, 96, 0, 0, 660, 81, 1, 0, 0, 0, 661, 665, 8, 29, 0, 0, 662, 663, 5, 96, 0, 0, 663, 665, 5, 96, 0, 0, 664, 661, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 83, 1, 0, 0, 0, 666, 667, 5, 95, 0, 0, 667, 85, 1, 0, 0, 0, 668, 672, 3, 70, 27, 0, 669, 672, 3, 68, 26, 0, 670, 672, 3, 84, 34, 0, 671, 668, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 670, 1, 0, 0, 0, 672, 87, 1, 0, 0, 0, 673, 678, 5, 34, 0, 0, 674, 677, 3, 72, 28, 0, 675, 677, 3, 74, 29, 0, 676, 674, 1, 0, 0, 0, 676, 675, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 703, 5, 34, 0, 0, 682, 683, 5, 34, 0, 0, 683, 684, 5, 34, 0, 0, 684, 685, 5, 34, 0, 0, 685, 689, 1, 0, 0, 0, 686, 688, 8, 22, 0, 0, 687, 686, 1, 0, 0, 0, 688, 691, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 692, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 692, 693, 5, 34, 0, 0, 693, 694, 5, 34, 0, 0, 694, 695, 5, 34, 0, 0, 695, 697, 1, 0, 0, 0, 696, 698, 5, 34, 0, 0, 697, 696, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 1, 0, 0, 0, 699, 701, 5, 34, 0, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 703, 1, 0, 0, 0, 702, 673, 1, 0, 0, 0, 702, 682, 1, 0, 0, 0, 703, 89, 1, 0, 0, 0, 704, 706, 3, 68, 26, 0, 705, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 91, 1, 0, 0, 0, 709, 711, 3, 68, 26, 0, 710, 709, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 718, 3, 108, 46, 0, 715, 717, 3, 68, 26, 0, 716, 715, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 752, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 723, 3, 108, 46, 0, 722, 724, 3, 68, 26, 0, 723, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 752, 1, 0, 0, 0, 727, 729, 3, 68, 26, 0, 728, 727, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 739, 1, 0, 0, 0, 732, 736, 3, 108, 46, 0, 733, 735, 3, 68, 26, 0, 734, 733, 1, 0, 0, 0, 735, 738, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 740, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 739, 732, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 742, 3, 76, 30, 0, 742, 752, 1, 0, 0, 0, 743, 745, 3, 108, 46, 0, 744, 746, 3, 68, 26, 0, 745, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 3, 76, 30, 0, 750, 752, 1, 0, 0, 0, 751, 710, 1, 0, 0, 0, 751, 721, 1, 0, 0, 0, 751, 728, 1, 0, 0, 0, 751, 743, 1, 0, 0, 0, 752, 93, 1, 0, 0, 0, 753, 754, 7, 30, 0, 0, 754, 755, 7, 31, 0, 0, 755, 95, 1, 0, 0, 0, 756, 757, 7, 12, 0, 0, 757, 758, 7, 9, 0, 0, 758, 759, 7, 0, 0, 0, 759, 97, 1, 0, 0, 0, 760, 761, 7, 12, 0, 0, 761, 762, 7, 2, 0, 0, 762, 763, 7, 4, 0, 0, 763, 99, 1, 0, 0, 0, 764, 765, 5, 61, 0, 0, 765, 101, 1, 0, 0, 0, 766, 767, 5, 58, 0, 0, 767, 768, 5, 58, 0, 0, 768, 103, 1, 0, 0, 0, 769, 770, 5, 44, 0, 0, 770, 105, 1, 0, 0, 0, 771, 772, 7, 0, 0, 0, 772, 773, 7, 3, 0, 0, 773, 774, 7, 2, 0, 0, 774, 775, 7, 4, 0, 0, 775, 107, 1, 0, 0, 0, 776, 777, 5, 46, 0, 0, 777, 109, 1, 0, 0, 0, 778, 779, 7, 15, 0, 0, 779, 780, 7, 12, 0, 0, 780, 781, 7, 13, 0, 0, 781, 782, 7, 2, 0, 0, 782, 783, 7, 3, 0, 0, 783, 111, 1, 0, 0, 0, 784, 785, 7, 15, 0, 0, 785, 786, 7, 1, 0, 0, 786, 787, 7, 6, 0, 0, 787, 788, 7, 2, 0, 0, 788, 789, 7, 5, 0, 0, 789, 113, 1, 0, 0, 0, 790, 791, 7, 1, 0, 0, 791, 792, 7, 9, 0, 0, 792, 115, 1, 0, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 2, 0, 0, 795, 117, 1, 0, 0, 0, 796, 797, 7, 13, 0, 0, 797, 798, 7, 12, 0, 0, 798, 799, 7, 2, 0, 0, 799, 800, 7, 5, 0, 0, 800, 119, 1, 0, 0, 0, 801, 802, 7, 13, 0, 0, 802, 803, 7, 1, 0, 0, 803, 804, 7, 18, 0, 0, 804, 805, 7, 3, 0, 0, 805, 121, 1, 0, 0, 0, 806, 807, 5, 40, 0, 0, 807, 123, 1, 0, 0, 0, 808, 809, 7, 9, 0, 0, 809, 810, 7, 7, 0, 0, 810, 811, 7, 5, 0, 0, 811, 125, 1, 0, 0, 0, 812, 813, 7, 9, 0, 0, 813, 814, 7, 20, 0, 0, 814, 815, 7, 13, 0, 0, 815, 816, 7, 13, 0, 0, 816, 127, 1, 0, 0, 0, 817, 818, 7, 9, 0, 0, 818, 819, 7, 20, 0, 0, 819, 820, 7, 13, 0, 0, 820, 821, 7, 13, 0, 0, 821, 822, 7, 2, 0, 0, 822, 129, 1, 0, 0, 0, 823, 824, 7, 7, 0, 0, 824, 825, 7, 6, 0, 0, 825, 131, 1, 0, 0, 0, 826, 827, 5, 63, 0, 0, 827, 133, 1, 0, 0, 0, 828, 829, 7, 6, 0, 0, 829, 830, 7, 13, 0, 0, 830, 831, 7, 1, 0, 0, 831, 832, 7, 18, 0, 0, 832, 833, 7, 3, 0, 0, 833, 135, 1, 0, 0, 0, 834, 835, 5, 41, 0, 0, 835, 137, 1, 0, 0, 0, 836, 837, 7, 5, 0, 0, 837, 838, 7, 6, 0, 0, 838, 839, 7, 20, 0, 0, 839, 840, 7, 3, 0, 0, 840, 139, 1, 0, 0, 0, 841, 842, 5, 61, 0, 0, 842, 843, 5, 61, 0, 0, 843, 141, 1, 0, 0, 0, 844, 845, 5, 61, 0, 0, 845, 846, 5, 126, 0, 0, 846, 143, 1, 0, 0, 0, 847, 848, 5, 33, 0, 0, 848, 849, 5, 61, 0, 0, 849, 145, 1, 0, 0, 0, 850, 851, 5, 60, 0, 0, 851, 147, 1, 0, 0, 0, 852, 853, 5, 60, 0, 0, 853, 854, 5, 61, 0, 0, 854, 149, 1, 0, 0, 0, 855, 856, 5, 62, 0, 0, 856, 151, 1, 0, 0, 0, 857, 858, 5, 62, 0, 0, 858, 859, 5, 61, 0, 0, 859, 153, 1, 0, 0, 0, 860, 861, 5, 43, 0, 0, 861, 155, 1, 0, 0, 0, 862, 863, 5, 45, 0, 0, 863, 157, 1, 0, 0, 0, 864, 865, 5, 42, 0, 0, 865, 159, 1, 0, 0, 0, 866, 867, 5, 47, 0, 0, 867, 161, 1, 0, 0, 0, 868, 869, 5, 37, 0, 0, 869, 163, 1, 0, 0, 0, 870, 871, 4, 74, 4, 0, 871, 872, 3, 54, 19, 0, 872, 873, 1, 0, 0, 0, 873, 874, 6, 74, 13, 0, 874, 165, 1, 0, 0, 0, 875, 878, 3, 132, 58, 0, 876, 879, 3, 70, 27, 0, 877, 879, 3, 84, 34, 0, 878, 876, 1, 0, 0, 0, 878, 877, 1, 0, 0, 0, 879, 883, 1, 0, 0, 0, 880, 882, 3, 86, 35, 0, 881, 880, 1, 0, 0, 0, 882, 885, 1, 0, 0, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 893, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 888, 3, 132, 58, 0, 887, 889, 3, 68, 26, 0, 888, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 1, 0, 0, 0, 892, 875, 1, 0, 0, 0, 892, 886, 1, 0, 0, 0, 893, 167, 1, 0, 0, 0, 894, 895, 5, 91, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 6, 76, 0, 0, 897, 898, 6, 76, 0, 0, 898, 169, 1, 0, 0, 0, 899, 900, 5, 93, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 6, 77, 12, 0, 902, 903, 6, 77, 12, 0, 903, 171, 1, 0, 0, 0, 904, 908, 3, 70, 27, 0, 905, 907, 3, 86, 35, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 921, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 914, 3, 84, 34, 0, 912, 914, 3, 78, 31, 0, 913, 911, 1, 0, 0, 0, 913, 912, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 917, 3, 86, 35, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 921, 173, 1, 0, 0, 0, 922, 924, 3, 80, 32, 0, 923, 925, 3, 82, 33, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 3, 80, 32, 0, 929, 175, 1, 0, 0, 0, 930, 931, 3, 174, 79, 0, 931, 177, 1, 0, 0, 0, 932, 933, 3, 60, 22, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 81, 11, 0, 935, 179, 1, 0, 0, 0, 936, 937, 3, 62, 23, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 82, 11, 0, 939, 181, 1, 0, 0, 0, 940, 941, 3, 64, 24, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 83, 11, 0, 943, 183, 1, 0, 0, 0, 944, 945, 3, 168, 76, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 84, 14, 0, 947, 948, 6, 84, 15, 0, 948, 185, 1, 0, 0, 0, 949, 950, 3, 66, 25, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 85, 16, 0, 952, 953, 6, 85, 12, 0, 953, 187, 1, 0, 0, 0, 954, 955, 3, 64, 24, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 86, 11, 0, 957, 189, 1, 0, 0, 0, 958, 959, 3, 60, 22, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 87, 11, 0, 961, 191, 1, 0, 0, 0, 962, 963, 3, 62, 23, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 88, 11, 0, 965, 193, 1, 0, 0, 0, 966, 967, 3, 66, 25, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 89, 16, 0, 969, 970, 6, 89, 12, 0, 970, 195, 1, 0, 0, 0, 971, 972, 3, 168, 76, 0, 972, 973, 1, 0, 0, 0, 973, 974, 6, 90, 14, 0, 974, 197, 1, 0, 0, 0, 975, 976, 3, 170, 77, 0, 976, 977, 1, 0, 0, 0, 977, 978, 6, 91, 17, 0, 978, 199, 1, 0, 0, 0, 979, 980, 3, 334, 159, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 92, 18, 0, 982, 201, 1, 0, 0, 0, 983, 984, 3, 104, 44, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 93, 19, 0, 986, 203, 1, 0, 0, 0, 987, 988, 3, 100, 42, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 94, 20, 0, 990, 205, 1, 0, 0, 0, 991, 992, 7, 16, 0, 0, 992, 993, 7, 3, 0, 0, 993, 994, 7, 5, 0, 0, 994, 995, 7, 12, 0, 0, 995, 996, 7, 0, 0, 0, 996, 997, 7, 12, 0, 0, 997, 998, 7, 5, 0, 0, 998, 999, 7, 12, 0, 0, 999, 207, 1, 0, 0, 0, 1000, 1004, 8, 32, 0, 0, 1001, 1002, 5, 47, 0, 0, 1002, 1004, 8, 33, 0, 0, 1003, 1000, 1, 0, 0, 0, 1003, 1001, 1, 0, 0, 0, 1004, 209, 1, 0, 0, 0, 1005, 1007, 3, 208, 96, 0, 1006, 1005, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1006, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 211, 1, 0, 0, 0, 1010, 1011, 3, 210, 97, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 98, 21, 0, 1013, 213, 1, 0, 0, 0, 1014, 1015, 3, 88, 36, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 6, 99, 22, 0, 1017, 215, 1, 0, 0, 0, 1018, 1019, 3, 60, 22, 0, 1019, 1020, 1, 0, 0, 0, 1020, 1021, 6, 100, 11, 0, 1021, 217, 1, 0, 0, 0, 1022, 1023, 3, 62, 23, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 101, 11, 0, 1025, 219, 1, 0, 0, 0, 1026, 1027, 3, 64, 24, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 102, 11, 0, 1029, 221, 1, 0, 0, 0, 1030, 1031, 3, 66, 25, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 103, 16, 0, 1033, 1034, 6, 103, 12, 0, 1034, 223, 1, 0, 0, 0, 1035, 1036, 3, 108, 46, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 6, 104, 23, 0, 1038, 225, 1, 0, 0, 0, 1039, 1040, 3, 104, 44, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 6, 105, 19, 0, 1042, 227, 1, 0, 0, 0, 1043, 1048, 3, 70, 27, 0, 1044, 1048, 3, 68, 26, 0, 1045, 1048, 3, 84, 34, 0, 1046, 1048, 3, 158, 71, 0, 1047, 1043, 1, 0, 0, 0, 1047, 1044, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1046, 1, 0, 0, 0, 1048, 229, 1, 0, 0, 0, 1049, 1052, 3, 70, 27, 0, 1050, 1052, 3, 158, 71, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 1056, 1, 0, 0, 0, 1053, 1055, 3, 228, 106, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1058, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1069, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1059, 1062, 3, 84, 34, 0, 1060, 1062, 3, 78, 31, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1060, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1065, 3, 228, 106, 0, 1064, 1063, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1069, 1, 0, 0, 0, 1068, 1051, 1, 0, 0, 0, 1068, 1061, 1, 0, 0, 0, 1069, 231, 1, 0, 0, 0, 1070, 1073, 3, 230, 107, 0, 1071, 1073, 3, 174, 79, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1071, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 233, 1, 0, 0, 0, 1076, 1077, 3, 60, 22, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 109, 11, 0, 1079, 235, 1, 0, 0, 0, 1080, 1081, 3, 62, 23, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 110, 11, 0, 1083, 237, 1, 0, 0, 0, 1084, 1085, 3, 64, 24, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 111, 11, 0, 1087, 239, 1, 0, 0, 0, 1088, 1089, 3, 66, 25, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 112, 16, 0, 1091, 1092, 6, 112, 12, 0, 1092, 241, 1, 0, 0, 0, 1093, 1094, 3, 100, 42, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 113, 20, 0, 1096, 243, 1, 0, 0, 0, 1097, 1098, 3, 104, 44, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 6, 114, 19, 0, 1100, 245, 1, 0, 0, 0, 1101, 1102, 3, 108, 46, 0, 1102, 1103, 1, 0, 0, 0, 1103, 1104, 6, 115, 23, 0, 1104, 247, 1, 0, 0, 0, 1105, 1106, 7, 12, 0, 0, 1106, 1107, 7, 2, 0, 0, 1107, 249, 1, 0, 0, 0, 1108, 1109, 3, 232, 108, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 6, 117, 24, 0, 1111, 251, 1, 0, 0, 0, 1112, 1113, 3, 60, 22, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 6, 118, 11, 0, 1115, 253, 1, 0, 0, 0, 1116, 1117, 3, 62, 23, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 6, 119, 11, 0, 1119, 255, 1, 0, 0, 0, 1120, 1121, 3, 64, 24, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 120, 11, 0, 1123, 257, 1, 0, 0, 0, 1124, 1125, 3, 66, 25, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 6, 121, 16, 0, 1127, 1128, 6, 121, 12, 0, 1128, 259, 1, 0, 0, 0, 1129, 1130, 3, 168, 76, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1132, 6, 122, 14, 0, 1132, 1133, 6, 122, 25, 0, 1133, 261, 1, 0, 0, 0, 1134, 1135, 7, 7, 0, 0, 1135, 1136, 7, 9, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 123, 26, 0, 1138, 263, 1, 0, 0, 0, 1139, 1140, 7, 19, 0, 0, 1140, 1141, 7, 1, 0, 0, 1141, 1142, 7, 5, 0, 0, 1142, 1143, 7, 10, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 124, 26, 0, 1145, 265, 1, 0, 0, 0, 1146, 1147, 8, 34, 0, 0, 1147, 267, 1, 0, 0, 0, 1148, 1150, 3, 266, 125, 0, 1149, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 3, 334, 159, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1149, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1159, 3, 266, 125, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 269, 1, 0, 0, 0, 1162, 1163, 3, 268, 126, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 6, 127, 27, 0, 1165, 271, 1, 0, 0, 0, 1166, 1167, 3, 60, 22, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 6, 128, 11, 0, 1169, 273, 1, 0, 0, 0, 1170, 1171, 3, 62, 23, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 6, 129, 11, 0, 1173, 275, 1, 0, 0, 0, 1174, 1175, 3, 64, 24, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 6, 130, 11, 0, 1177, 277, 1, 0, 0, 0, 1178, 1179, 3, 66, 25, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 6, 131, 16, 0, 1181, 1182, 6, 131, 12, 0, 1182, 1183, 6, 131, 12, 0, 1183, 279, 1, 0, 0, 0, 1184, 1185, 3, 100, 42, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 132, 20, 0, 1187, 281, 1, 0, 0, 0, 1188, 1189, 3, 104, 44, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 133, 19, 0, 1191, 283, 1, 0, 0, 0, 1192, 1193, 3, 108, 46, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 134, 23, 0, 1195, 285, 1, 0, 0, 0, 1196, 1197, 3, 264, 124, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 135, 28, 0, 1199, 287, 1, 0, 0, 0, 1200, 1201, 3, 232, 108, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 136, 24, 0, 1203, 289, 1, 0, 0, 0, 1204, 1205, 3, 176, 80, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 137, 29, 0, 1207, 291, 1, 0, 0, 0, 1208, 1209, 3, 60, 22, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 138, 11, 0, 1211, 293, 1, 0, 0, 0, 1212, 1213, 3, 62, 23, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 139, 11, 0, 1215, 295, 1, 0, 0, 0, 1216, 1217, 3, 64, 24, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 140, 11, 0, 1219, 297, 1, 0, 0, 0, 1220, 1221, 3, 66, 25, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 141, 16, 0, 1223, 1224, 6, 141, 12, 0, 1224, 299, 1, 0, 0, 0, 1225, 1226, 3, 108, 46, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 142, 23, 0, 1228, 301, 1, 0, 0, 0, 1229, 1230, 3, 176, 80, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 143, 29, 0, 1232, 303, 1, 0, 0, 0, 1233, 1234, 3, 172, 78, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 6, 144, 30, 0, 1236, 305, 1, 0, 0, 0, 1237, 1238, 3, 60, 22, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 6, 145, 11, 0, 1240, 307, 1, 0, 0, 0, 1241, 1242, 3, 62, 23, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 6, 146, 11, 0, 1244, 309, 1, 0, 0, 0, 1245, 1246, 3, 64, 24, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 6, 147, 11, 0, 1248, 311, 1, 0, 0, 0, 1249, 1250, 3, 66, 25, 0, 1250, 1251, 1, 0, 0, 0, 1251, 1252, 6, 148, 16, 0, 1252, 1253, 6, 148, 12, 0, 1253, 313, 1, 0, 0, 0, 1254, 1255, 7, 1, 0, 0, 1255, 1256, 7, 9, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 1258, 7, 7, 0, 0, 1258, 315, 1, 0, 0, 0, 1259, 1260, 3, 60, 22, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 6, 150, 11, 0, 1262, 317, 1, 0, 0, 0, 1263, 1264, 3, 62, 23, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 6, 151, 11, 0, 1266, 319, 1, 0, 0, 0, 1267, 1268, 3, 64, 24, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 6, 152, 11, 0, 1270, 321, 1, 0, 0, 0, 1271, 1272, 3, 66, 25, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 6, 153, 16, 0, 1274, 1275, 6, 153, 12, 0, 1275, 323, 1, 0, 0, 0, 1276, 1277, 7, 15, 0, 0, 1277, 1278, 7, 20, 0, 0, 1278, 1279, 7, 9, 0, 0, 1279, 1280, 7, 4, 0, 0, 1280, 1281, 7, 5, 0, 0, 1281, 1282, 7, 1, 0, 0, 1282, 1283, 7, 7, 0, 0, 1283, 1284, 7, 9, 0, 0, 1284, 1285, 7, 2, 0, 0, 1285, 325, 1, 0, 0, 0, 1286, 1287, 3, 60, 22, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 155, 11, 0, 1289, 327, 1, 0, 0, 0, 1290, 1291, 3, 62, 23, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1293, 6, 156, 11, 0, 1293, 329, 1, 0, 0, 0, 1294, 1295, 3, 64, 24, 0, 1295, 1296, 1, 0, 0, 0, 1296, 1297, 6, 157, 11, 0, 1297, 331, 1, 0, 0, 0, 1298, 1299, 3, 170, 77, 0, 1299, 1300, 1, 0, 0, 0, 1300, 1301, 6, 158, 17, 0, 1301, 1302, 6, 158, 12, 0, 1302, 333, 1, 0, 0, 0, 1303, 1304, 5, 58, 0, 0, 1304, 335, 1, 0, 0, 0, 1305, 1311, 3, 78, 31, 0, 1306, 1311, 3, 68, 26, 0, 1307, 1311, 3, 108, 46, 0, 1308, 1311, 3, 70, 27, 0, 1309, 1311, 3, 84, 34, 0, 1310, 1305, 1, 0, 0, 0, 1310, 1306, 1, 0, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 337, 1, 0, 0, 0, 1314, 1315, 3, 60, 22, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 6, 161, 11, 0, 1317, 339, 1, 0, 0, 0, 1318, 1319, 3, 62, 23, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 162, 11, 0, 1321, 341, 1, 0, 0, 0, 1322, 1323, 3, 64, 24, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 163, 11, 0, 1325, 343, 1, 0, 0, 0, 1326, 1327, 3, 66, 25, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 164, 16, 0, 1329, 1330, 6, 164, 12, 0, 1330, 345, 1, 0, 0, 0, 1331, 1332, 3, 334, 159, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 165, 18, 0, 1334, 347, 1, 0, 0, 0, 1335, 1336, 3, 104, 44, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, 166, 19, 0, 1338, 349, 1, 0, 0, 0, 1339, 1340, 3, 108, 46, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1342, 6, 167, 23, 0, 1342, 351, 1, 0, 0, 0, 1343, 1344, 3, 262, 123, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 6, 168, 31, 0, 1346, 1347, 6, 168, 32, 0, 1347, 353, 1, 0, 0, 0, 1348, 1349, 3, 210, 97, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1351, 6, 169, 21, 0, 1351, 355, 1, 0, 0, 0, 1352, 1353, 3, 88, 36, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 6, 170, 22, 0, 1355, 357, 1, 0, 0, 0, 1356, 1357, 3, 60, 22, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 171, 11, 0, 1359, 359, 1, 0, 0, 0, 1360, 1361, 3, 62, 23, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1363, 6, 172, 11, 0, 1363, 361, 1, 0, 0, 0, 1364, 1365, 3, 64, 24, 0, 1365, 1366, 1, 0, 0, 0, 1366, 1367, 6, 173, 11, 0, 1367, 363, 1, 0, 0, 0, 1368, 1369, 3, 66, 25, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1371, 6, 174, 16, 0, 1371, 1372, 6, 174, 12, 0, 1372, 1373, 6, 174, 12, 0, 1373, 365, 1, 0, 0, 0, 1374, 1375, 3, 104, 44, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 175, 19, 0, 1377, 367, 1, 0, 0, 0, 1378, 1379, 3, 108, 46, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 6, 176, 23, 0, 1381, 369, 1, 0, 0, 0, 1382, 1383, 3, 232, 108, 0, 1383, 1384, 1, 0, 0, 0, 1384, 1385, 6, 177, 24, 0, 1385, 371, 1, 0, 0, 0, 1386, 1387, 3, 60, 22, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 178, 11, 0, 1389, 373, 1, 0, 0, 0, 1390, 1391, 3, 62, 23, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 11, 0, 1393, 375, 1, 0, 0, 0, 1394, 1395, 3, 64, 24, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 6, 180, 11, 0, 1397, 377, 1, 0, 0, 0, 1398, 1399, 3, 66, 25, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 6, 181, 16, 0, 1401, 1402, 6, 181, 12, 0, 1402, 379, 1, 0, 0, 0, 1403, 1404, 3, 210, 97, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 182, 21, 0, 1406, 1407, 6, 182, 12, 0, 1407, 1408, 6, 182, 33, 0, 1408, 381, 1, 0, 0, 0, 1409, 1410, 3, 88, 36, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1412, 6, 183, 22, 0, 1412, 1413, 6, 183, 12, 0, 1413, 1414, 6, 183, 33, 0, 1414, 383, 1, 0, 0, 0, 1415, 1416, 3, 60, 22, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 6, 184, 11, 0, 1418, 385, 1, 0, 0, 0, 1419, 1420, 3, 62, 23, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1422, 6, 185, 11, 0, 1422, 387, 1, 0, 0, 0, 1423, 1424, 3, 64, 24, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 186, 11, 0, 1426, 389, 1, 0, 0, 0, 1427, 1428, 3, 334, 159, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 187, 18, 0, 1430, 1431, 6, 187, 12, 0, 1431, 1432, 6, 187, 10, 0, 1432, 391, 1, 0, 0, 0, 1433, 1434, 3, 104, 44, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 188, 19, 0, 1436, 1437, 6, 188, 12, 0, 1437, 1438, 6, 188, 10, 0, 1438, 393, 1, 0, 0, 0, 1439, 1440, 3, 60, 22, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 6, 189, 11, 0, 1442, 395, 1, 0, 0, 0, 1443, 1444, 3, 62, 23, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 6, 190, 11, 0, 1446, 397, 1, 0, 0, 0, 1447, 1448, 3, 64, 24, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1450, 6, 191, 11, 0, 1450, 399, 1, 0, 0, 0, 1451, 1452, 3, 176, 80, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 192, 12, 0, 1454, 1455, 6, 192, 0, 0, 1455, 1456, 6, 192, 29, 0, 1456, 401, 1, 0, 0, 0, 1457, 1458, 3, 172, 78, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1460, 6, 193, 12, 0, 1460, 1461, 6, 193, 0, 0, 1461, 1462, 6, 193, 30, 0, 1462, 403, 1, 0, 0, 0, 1463, 1464, 3, 94, 39, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1466, 6, 194, 12, 0, 1466, 1467, 6, 194, 0, 0, 1467, 1468, 6, 194, 34, 0, 1468, 405, 1, 0, 0, 0, 1469, 1470, 3, 66, 25, 0, 1470, 1471, 1, 0, 0, 0, 1471, 1472, 6, 195, 16, 0, 1472, 1473, 6, 195, 12, 0, 1473, 407, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 592, 602, 606, 609, 618, 620, 631, 650, 655, 664, 671, 676, 678, 689, 697, 700, 702, 707, 712, 718, 725, 730, 736, 739, 747, 751, 878, 883, 890, 892, 908, 913, 918, 920, 926, 1003, 1008, 1047, 1051, 1056, 1061, 1066, 1068, 1072, 1074, 1151, 1155, 1160, 1310, 1312, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 20, 0, 7, 66, 0, 5, 0, 0, 7, 26, 0, 7, 67, 0, 7, 109, 0, 7, 35, 0, 7, 33, 0, 7, 77, 0, 7, 27, 0, 7, 37, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 30, 0] \ No newline at end of file +[4, 0, 125, 1465, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 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, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 580, 8, 20, 11, 20, 12, 20, 581, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 590, 8, 21, 10, 21, 12, 21, 593, 9, 21, 1, 21, 3, 21, 596, 8, 21, 1, 21, 3, 21, 599, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 608, 8, 22, 10, 22, 12, 22, 611, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 619, 8, 23, 11, 23, 12, 23, 620, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 3, 29, 640, 8, 29, 1, 29, 4, 29, 643, 8, 29, 11, 29, 12, 29, 644, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 654, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 661, 8, 34, 1, 35, 1, 35, 1, 35, 5, 35, 666, 8, 35, 10, 35, 12, 35, 669, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 677, 8, 35, 10, 35, 12, 35, 680, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 687, 8, 35, 1, 35, 3, 35, 690, 8, 35, 3, 35, 692, 8, 35, 1, 36, 4, 36, 695, 8, 36, 11, 36, 12, 36, 696, 1, 37, 4, 37, 700, 8, 37, 11, 37, 12, 37, 701, 1, 37, 1, 37, 5, 37, 706, 8, 37, 10, 37, 12, 37, 709, 9, 37, 1, 37, 1, 37, 4, 37, 713, 8, 37, 11, 37, 12, 37, 714, 1, 37, 4, 37, 718, 8, 37, 11, 37, 12, 37, 719, 1, 37, 1, 37, 5, 37, 724, 8, 37, 10, 37, 12, 37, 727, 9, 37, 3, 37, 729, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 4, 37, 735, 8, 37, 11, 37, 12, 37, 736, 1, 37, 1, 37, 3, 37, 741, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 3, 74, 870, 8, 74, 1, 74, 5, 74, 873, 8, 74, 10, 74, 12, 74, 876, 9, 74, 1, 74, 1, 74, 4, 74, 880, 8, 74, 11, 74, 12, 74, 881, 3, 74, 884, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 5, 77, 898, 8, 77, 10, 77, 12, 77, 901, 9, 77, 1, 77, 1, 77, 3, 77, 905, 8, 77, 1, 77, 4, 77, 908, 8, 77, 11, 77, 12, 77, 909, 3, 77, 912, 8, 77, 1, 78, 1, 78, 4, 78, 916, 8, 78, 11, 78, 12, 78, 917, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 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, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 995, 8, 95, 1, 96, 4, 96, 998, 8, 96, 11, 96, 12, 96, 999, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1039, 8, 105, 1, 106, 1, 106, 3, 106, 1043, 8, 106, 1, 106, 5, 106, 1046, 8, 106, 10, 106, 12, 106, 1049, 9, 106, 1, 106, 1, 106, 3, 106, 1053, 8, 106, 1, 106, 4, 106, 1056, 8, 106, 11, 106, 12, 106, 1057, 3, 106, 1060, 8, 106, 1, 107, 1, 107, 4, 107, 1064, 8, 107, 11, 107, 12, 107, 1065, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 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, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 4, 125, 1141, 8, 125, 11, 125, 12, 125, 1142, 1, 125, 1, 125, 3, 125, 1147, 8, 125, 1, 125, 4, 125, 1150, 8, 125, 11, 125, 12, 125, 1151, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 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, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 4, 159, 1302, 8, 159, 11, 159, 12, 159, 1303, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 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, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 2, 609, 678, 0, 195, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 25, 66, 0, 68, 0, 70, 0, 72, 0, 74, 0, 76, 0, 78, 0, 80, 0, 82, 0, 84, 0, 86, 26, 88, 27, 90, 28, 92, 29, 94, 30, 96, 31, 98, 32, 100, 33, 102, 34, 104, 35, 106, 36, 108, 37, 110, 38, 112, 39, 114, 40, 116, 41, 118, 42, 120, 43, 122, 44, 124, 45, 126, 46, 128, 47, 130, 48, 132, 49, 134, 50, 136, 51, 138, 52, 140, 53, 142, 54, 144, 55, 146, 56, 148, 57, 150, 58, 152, 59, 154, 60, 156, 61, 158, 62, 160, 63, 162, 64, 164, 65, 166, 66, 168, 67, 170, 68, 172, 0, 174, 69, 176, 70, 178, 71, 180, 72, 182, 0, 184, 0, 186, 73, 188, 74, 190, 75, 192, 0, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 76, 206, 0, 208, 77, 210, 0, 212, 0, 214, 78, 216, 79, 218, 80, 220, 0, 222, 0, 224, 0, 226, 0, 228, 0, 230, 81, 232, 82, 234, 83, 236, 84, 238, 0, 240, 0, 242, 0, 244, 0, 246, 85, 248, 0, 250, 86, 252, 87, 254, 88, 256, 0, 258, 0, 260, 89, 262, 90, 264, 0, 266, 91, 268, 0, 270, 92, 272, 93, 274, 94, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 0, 290, 95, 292, 96, 294, 97, 296, 0, 298, 0, 300, 0, 302, 0, 304, 98, 306, 99, 308, 100, 310, 0, 312, 101, 314, 102, 316, 103, 318, 104, 320, 0, 322, 105, 324, 106, 326, 107, 328, 108, 330, 0, 332, 109, 334, 110, 336, 111, 338, 112, 340, 113, 342, 0, 344, 0, 346, 0, 348, 0, 350, 0, 352, 0, 354, 0, 356, 114, 358, 115, 360, 116, 362, 0, 364, 0, 366, 0, 368, 0, 370, 117, 372, 118, 374, 119, 376, 0, 378, 0, 380, 0, 382, 120, 384, 121, 386, 122, 388, 0, 390, 0, 392, 123, 394, 124, 396, 125, 398, 0, 400, 0, 402, 0, 404, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1492, 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, 1, 64, 1, 0, 0, 0, 1, 86, 1, 0, 0, 0, 1, 88, 1, 0, 0, 0, 1, 90, 1, 0, 0, 0, 1, 92, 1, 0, 0, 0, 1, 94, 1, 0, 0, 0, 1, 96, 1, 0, 0, 0, 1, 98, 1, 0, 0, 0, 1, 100, 1, 0, 0, 0, 1, 102, 1, 0, 0, 0, 1, 104, 1, 0, 0, 0, 1, 106, 1, 0, 0, 0, 1, 108, 1, 0, 0, 0, 1, 110, 1, 0, 0, 0, 1, 112, 1, 0, 0, 0, 1, 114, 1, 0, 0, 0, 1, 116, 1, 0, 0, 0, 1, 118, 1, 0, 0, 0, 1, 120, 1, 0, 0, 0, 1, 122, 1, 0, 0, 0, 1, 124, 1, 0, 0, 0, 1, 126, 1, 0, 0, 0, 1, 128, 1, 0, 0, 0, 1, 130, 1, 0, 0, 0, 1, 132, 1, 0, 0, 0, 1, 134, 1, 0, 0, 0, 1, 136, 1, 0, 0, 0, 1, 138, 1, 0, 0, 0, 1, 140, 1, 0, 0, 0, 1, 142, 1, 0, 0, 0, 1, 144, 1, 0, 0, 0, 1, 146, 1, 0, 0, 0, 1, 148, 1, 0, 0, 0, 1, 150, 1, 0, 0, 0, 1, 152, 1, 0, 0, 0, 1, 154, 1, 0, 0, 0, 1, 156, 1, 0, 0, 0, 1, 158, 1, 0, 0, 0, 1, 160, 1, 0, 0, 0, 1, 162, 1, 0, 0, 0, 1, 164, 1, 0, 0, 0, 1, 166, 1, 0, 0, 0, 1, 168, 1, 0, 0, 0, 1, 170, 1, 0, 0, 0, 1, 174, 1, 0, 0, 0, 1, 176, 1, 0, 0, 0, 1, 178, 1, 0, 0, 0, 1, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 3, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 3, 218, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 224, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 4, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 5, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 6, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 7, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 9, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 10, 320, 1, 0, 0, 0, 10, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 11, 330, 1, 0, 0, 0, 11, 332, 1, 0, 0, 0, 11, 334, 1, 0, 0, 0, 11, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 12, 342, 1, 0, 0, 0, 12, 344, 1, 0, 0, 0, 12, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 13, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 13, 374, 1, 0, 0, 0, 14, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 14, 386, 1, 0, 0, 0, 15, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 15, 404, 1, 0, 0, 0, 16, 406, 1, 0, 0, 0, 18, 416, 1, 0, 0, 0, 20, 423, 1, 0, 0, 0, 22, 432, 1, 0, 0, 0, 24, 439, 1, 0, 0, 0, 26, 449, 1, 0, 0, 0, 28, 456, 1, 0, 0, 0, 30, 463, 1, 0, 0, 0, 32, 470, 1, 0, 0, 0, 34, 478, 1, 0, 0, 0, 36, 485, 1, 0, 0, 0, 38, 497, 1, 0, 0, 0, 40, 506, 1, 0, 0, 0, 42, 512, 1, 0, 0, 0, 44, 519, 1, 0, 0, 0, 46, 526, 1, 0, 0, 0, 48, 534, 1, 0, 0, 0, 50, 542, 1, 0, 0, 0, 52, 557, 1, 0, 0, 0, 54, 567, 1, 0, 0, 0, 56, 579, 1, 0, 0, 0, 58, 585, 1, 0, 0, 0, 60, 602, 1, 0, 0, 0, 62, 618, 1, 0, 0, 0, 64, 624, 1, 0, 0, 0, 66, 628, 1, 0, 0, 0, 68, 630, 1, 0, 0, 0, 70, 632, 1, 0, 0, 0, 72, 635, 1, 0, 0, 0, 74, 637, 1, 0, 0, 0, 76, 646, 1, 0, 0, 0, 78, 648, 1, 0, 0, 0, 80, 653, 1, 0, 0, 0, 82, 655, 1, 0, 0, 0, 84, 660, 1, 0, 0, 0, 86, 691, 1, 0, 0, 0, 88, 694, 1, 0, 0, 0, 90, 740, 1, 0, 0, 0, 92, 742, 1, 0, 0, 0, 94, 745, 1, 0, 0, 0, 96, 749, 1, 0, 0, 0, 98, 753, 1, 0, 0, 0, 100, 755, 1, 0, 0, 0, 102, 758, 1, 0, 0, 0, 104, 760, 1, 0, 0, 0, 106, 765, 1, 0, 0, 0, 108, 767, 1, 0, 0, 0, 110, 773, 1, 0, 0, 0, 112, 779, 1, 0, 0, 0, 114, 782, 1, 0, 0, 0, 116, 785, 1, 0, 0, 0, 118, 790, 1, 0, 0, 0, 120, 795, 1, 0, 0, 0, 122, 797, 1, 0, 0, 0, 124, 801, 1, 0, 0, 0, 126, 806, 1, 0, 0, 0, 128, 812, 1, 0, 0, 0, 130, 815, 1, 0, 0, 0, 132, 817, 1, 0, 0, 0, 134, 823, 1, 0, 0, 0, 136, 825, 1, 0, 0, 0, 138, 830, 1, 0, 0, 0, 140, 833, 1, 0, 0, 0, 142, 836, 1, 0, 0, 0, 144, 839, 1, 0, 0, 0, 146, 841, 1, 0, 0, 0, 148, 844, 1, 0, 0, 0, 150, 846, 1, 0, 0, 0, 152, 849, 1, 0, 0, 0, 154, 851, 1, 0, 0, 0, 156, 853, 1, 0, 0, 0, 158, 855, 1, 0, 0, 0, 160, 857, 1, 0, 0, 0, 162, 859, 1, 0, 0, 0, 164, 883, 1, 0, 0, 0, 166, 885, 1, 0, 0, 0, 168, 890, 1, 0, 0, 0, 170, 911, 1, 0, 0, 0, 172, 913, 1, 0, 0, 0, 174, 921, 1, 0, 0, 0, 176, 923, 1, 0, 0, 0, 178, 927, 1, 0, 0, 0, 180, 931, 1, 0, 0, 0, 182, 935, 1, 0, 0, 0, 184, 940, 1, 0, 0, 0, 186, 945, 1, 0, 0, 0, 188, 949, 1, 0, 0, 0, 190, 953, 1, 0, 0, 0, 192, 957, 1, 0, 0, 0, 194, 962, 1, 0, 0, 0, 196, 966, 1, 0, 0, 0, 198, 970, 1, 0, 0, 0, 200, 974, 1, 0, 0, 0, 202, 978, 1, 0, 0, 0, 204, 982, 1, 0, 0, 0, 206, 994, 1, 0, 0, 0, 208, 997, 1, 0, 0, 0, 210, 1001, 1, 0, 0, 0, 212, 1005, 1, 0, 0, 0, 214, 1009, 1, 0, 0, 0, 216, 1013, 1, 0, 0, 0, 218, 1017, 1, 0, 0, 0, 220, 1021, 1, 0, 0, 0, 222, 1026, 1, 0, 0, 0, 224, 1030, 1, 0, 0, 0, 226, 1038, 1, 0, 0, 0, 228, 1059, 1, 0, 0, 0, 230, 1063, 1, 0, 0, 0, 232, 1067, 1, 0, 0, 0, 234, 1071, 1, 0, 0, 0, 236, 1075, 1, 0, 0, 0, 238, 1079, 1, 0, 0, 0, 240, 1084, 1, 0, 0, 0, 242, 1088, 1, 0, 0, 0, 244, 1092, 1, 0, 0, 0, 246, 1096, 1, 0, 0, 0, 248, 1099, 1, 0, 0, 0, 250, 1103, 1, 0, 0, 0, 252, 1107, 1, 0, 0, 0, 254, 1111, 1, 0, 0, 0, 256, 1115, 1, 0, 0, 0, 258, 1120, 1, 0, 0, 0, 260, 1125, 1, 0, 0, 0, 262, 1130, 1, 0, 0, 0, 264, 1137, 1, 0, 0, 0, 266, 1146, 1, 0, 0, 0, 268, 1153, 1, 0, 0, 0, 270, 1157, 1, 0, 0, 0, 272, 1161, 1, 0, 0, 0, 274, 1165, 1, 0, 0, 0, 276, 1169, 1, 0, 0, 0, 278, 1175, 1, 0, 0, 0, 280, 1179, 1, 0, 0, 0, 282, 1183, 1, 0, 0, 0, 284, 1187, 1, 0, 0, 0, 286, 1191, 1, 0, 0, 0, 288, 1195, 1, 0, 0, 0, 290, 1199, 1, 0, 0, 0, 292, 1203, 1, 0, 0, 0, 294, 1207, 1, 0, 0, 0, 296, 1211, 1, 0, 0, 0, 298, 1216, 1, 0, 0, 0, 300, 1220, 1, 0, 0, 0, 302, 1224, 1, 0, 0, 0, 304, 1228, 1, 0, 0, 0, 306, 1232, 1, 0, 0, 0, 308, 1236, 1, 0, 0, 0, 310, 1240, 1, 0, 0, 0, 312, 1245, 1, 0, 0, 0, 314, 1250, 1, 0, 0, 0, 316, 1254, 1, 0, 0, 0, 318, 1258, 1, 0, 0, 0, 320, 1262, 1, 0, 0, 0, 322, 1267, 1, 0, 0, 0, 324, 1277, 1, 0, 0, 0, 326, 1281, 1, 0, 0, 0, 328, 1285, 1, 0, 0, 0, 330, 1289, 1, 0, 0, 0, 332, 1294, 1, 0, 0, 0, 334, 1301, 1, 0, 0, 0, 336, 1305, 1, 0, 0, 0, 338, 1309, 1, 0, 0, 0, 340, 1313, 1, 0, 0, 0, 342, 1317, 1, 0, 0, 0, 344, 1322, 1, 0, 0, 0, 346, 1326, 1, 0, 0, 0, 348, 1330, 1, 0, 0, 0, 350, 1334, 1, 0, 0, 0, 352, 1339, 1, 0, 0, 0, 354, 1343, 1, 0, 0, 0, 356, 1347, 1, 0, 0, 0, 358, 1351, 1, 0, 0, 0, 360, 1355, 1, 0, 0, 0, 362, 1359, 1, 0, 0, 0, 364, 1365, 1, 0, 0, 0, 366, 1369, 1, 0, 0, 0, 368, 1373, 1, 0, 0, 0, 370, 1377, 1, 0, 0, 0, 372, 1381, 1, 0, 0, 0, 374, 1385, 1, 0, 0, 0, 376, 1389, 1, 0, 0, 0, 378, 1394, 1, 0, 0, 0, 380, 1400, 1, 0, 0, 0, 382, 1406, 1, 0, 0, 0, 384, 1410, 1, 0, 0, 0, 386, 1414, 1, 0, 0, 0, 388, 1418, 1, 0, 0, 0, 390, 1424, 1, 0, 0, 0, 392, 1430, 1, 0, 0, 0, 394, 1434, 1, 0, 0, 0, 396, 1438, 1, 0, 0, 0, 398, 1442, 1, 0, 0, 0, 400, 1448, 1, 0, 0, 0, 402, 1454, 1, 0, 0, 0, 404, 1460, 1, 0, 0, 0, 406, 407, 7, 0, 0, 0, 407, 408, 7, 1, 0, 0, 408, 409, 7, 2, 0, 0, 409, 410, 7, 2, 0, 0, 410, 411, 7, 3, 0, 0, 411, 412, 7, 4, 0, 0, 412, 413, 7, 5, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 6, 0, 0, 0, 415, 17, 1, 0, 0, 0, 416, 417, 7, 0, 0, 0, 417, 418, 7, 6, 0, 0, 418, 419, 7, 7, 0, 0, 419, 420, 7, 8, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 6, 1, 1, 0, 422, 19, 1, 0, 0, 0, 423, 424, 7, 3, 0, 0, 424, 425, 7, 9, 0, 0, 425, 426, 7, 6, 0, 0, 426, 427, 7, 1, 0, 0, 427, 428, 7, 4, 0, 0, 428, 429, 7, 10, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 6, 2, 2, 0, 431, 21, 1, 0, 0, 0, 432, 433, 7, 3, 0, 0, 433, 434, 7, 11, 0, 0, 434, 435, 7, 12, 0, 0, 435, 436, 7, 13, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 6, 3, 0, 0, 438, 23, 1, 0, 0, 0, 439, 440, 7, 3, 0, 0, 440, 441, 7, 14, 0, 0, 441, 442, 7, 8, 0, 0, 442, 443, 7, 13, 0, 0, 443, 444, 7, 12, 0, 0, 444, 445, 7, 1, 0, 0, 445, 446, 7, 9, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 6, 4, 3, 0, 448, 25, 1, 0, 0, 0, 449, 450, 7, 15, 0, 0, 450, 451, 7, 6, 0, 0, 451, 452, 7, 7, 0, 0, 452, 453, 7, 16, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 6, 5, 4, 0, 455, 27, 1, 0, 0, 0, 456, 457, 7, 17, 0, 0, 457, 458, 7, 6, 0, 0, 458, 459, 7, 7, 0, 0, 459, 460, 7, 18, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 6, 6, 0, 0, 462, 29, 1, 0, 0, 0, 463, 464, 7, 18, 0, 0, 464, 465, 7, 3, 0, 0, 465, 466, 7, 3, 0, 0, 466, 467, 7, 8, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 6, 7, 1, 0, 469, 31, 1, 0, 0, 0, 470, 471, 7, 13, 0, 0, 471, 472, 7, 1, 0, 0, 472, 473, 7, 16, 0, 0, 473, 474, 7, 1, 0, 0, 474, 475, 7, 5, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 6, 8, 0, 0, 477, 33, 1, 0, 0, 0, 478, 479, 7, 16, 0, 0, 479, 480, 7, 3, 0, 0, 480, 481, 7, 5, 0, 0, 481, 482, 7, 12, 0, 0, 482, 483, 1, 0, 0, 0, 483, 484, 6, 9, 5, 0, 484, 35, 1, 0, 0, 0, 485, 486, 7, 16, 0, 0, 486, 487, 7, 11, 0, 0, 487, 488, 5, 95, 0, 0, 488, 489, 7, 3, 0, 0, 489, 490, 7, 14, 0, 0, 490, 491, 7, 8, 0, 0, 491, 492, 7, 12, 0, 0, 492, 493, 7, 9, 0, 0, 493, 494, 7, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 6, 10, 6, 0, 496, 37, 1, 0, 0, 0, 497, 498, 7, 6, 0, 0, 498, 499, 7, 3, 0, 0, 499, 500, 7, 9, 0, 0, 500, 501, 7, 12, 0, 0, 501, 502, 7, 16, 0, 0, 502, 503, 7, 3, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 6, 11, 7, 0, 505, 39, 1, 0, 0, 0, 506, 507, 7, 6, 0, 0, 507, 508, 7, 7, 0, 0, 508, 509, 7, 19, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 6, 12, 0, 0, 511, 41, 1, 0, 0, 0, 512, 513, 7, 2, 0, 0, 513, 514, 7, 10, 0, 0, 514, 515, 7, 7, 0, 0, 515, 516, 7, 19, 0, 0, 516, 517, 1, 0, 0, 0, 517, 518, 6, 13, 8, 0, 518, 43, 1, 0, 0, 0, 519, 520, 7, 2, 0, 0, 520, 521, 7, 7, 0, 0, 521, 522, 7, 6, 0, 0, 522, 523, 7, 5, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 6, 14, 0, 0, 525, 45, 1, 0, 0, 0, 526, 527, 7, 2, 0, 0, 527, 528, 7, 5, 0, 0, 528, 529, 7, 12, 0, 0, 529, 530, 7, 5, 0, 0, 530, 531, 7, 2, 0, 0, 531, 532, 1, 0, 0, 0, 532, 533, 6, 15, 0, 0, 533, 47, 1, 0, 0, 0, 534, 535, 7, 19, 0, 0, 535, 536, 7, 10, 0, 0, 536, 537, 7, 3, 0, 0, 537, 538, 7, 6, 0, 0, 538, 539, 7, 3, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 6, 16, 0, 0, 541, 49, 1, 0, 0, 0, 542, 543, 4, 17, 0, 0, 543, 544, 7, 1, 0, 0, 544, 545, 7, 9, 0, 0, 545, 546, 7, 13, 0, 0, 546, 547, 7, 1, 0, 0, 547, 548, 7, 9, 0, 0, 548, 549, 7, 3, 0, 0, 549, 550, 7, 2, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 12, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 2, 0, 0, 554, 555, 1, 0, 0, 0, 555, 556, 6, 17, 0, 0, 556, 51, 1, 0, 0, 0, 557, 558, 4, 18, 1, 0, 558, 559, 7, 13, 0, 0, 559, 560, 7, 7, 0, 0, 560, 561, 7, 7, 0, 0, 561, 562, 7, 18, 0, 0, 562, 563, 7, 20, 0, 0, 563, 564, 7, 8, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 6, 18, 9, 0, 566, 53, 1, 0, 0, 0, 567, 568, 4, 19, 2, 0, 568, 569, 7, 16, 0, 0, 569, 570, 7, 3, 0, 0, 570, 571, 7, 5, 0, 0, 571, 572, 7, 6, 0, 0, 572, 573, 7, 1, 0, 0, 573, 574, 7, 4, 0, 0, 574, 575, 7, 2, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 19, 10, 0, 577, 55, 1, 0, 0, 0, 578, 580, 8, 21, 0, 0, 579, 578, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 6, 20, 0, 0, 584, 57, 1, 0, 0, 0, 585, 586, 5, 47, 0, 0, 586, 587, 5, 47, 0, 0, 587, 591, 1, 0, 0, 0, 588, 590, 8, 22, 0, 0, 589, 588, 1, 0, 0, 0, 590, 593, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 595, 1, 0, 0, 0, 593, 591, 1, 0, 0, 0, 594, 596, 5, 13, 0, 0, 595, 594, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 598, 1, 0, 0, 0, 597, 599, 5, 10, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 6, 21, 11, 0, 601, 59, 1, 0, 0, 0, 602, 603, 5, 47, 0, 0, 603, 604, 5, 42, 0, 0, 604, 609, 1, 0, 0, 0, 605, 608, 3, 60, 22, 0, 606, 608, 9, 0, 0, 0, 607, 605, 1, 0, 0, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 42, 0, 0, 613, 614, 5, 47, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 6, 22, 11, 0, 616, 61, 1, 0, 0, 0, 617, 619, 7, 23, 0, 0, 618, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 6, 23, 11, 0, 623, 63, 1, 0, 0, 0, 624, 625, 5, 124, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 6, 24, 12, 0, 627, 65, 1, 0, 0, 0, 628, 629, 7, 24, 0, 0, 629, 67, 1, 0, 0, 0, 630, 631, 7, 25, 0, 0, 631, 69, 1, 0, 0, 0, 632, 633, 5, 92, 0, 0, 633, 634, 7, 26, 0, 0, 634, 71, 1, 0, 0, 0, 635, 636, 8, 27, 0, 0, 636, 73, 1, 0, 0, 0, 637, 639, 7, 3, 0, 0, 638, 640, 7, 28, 0, 0, 639, 638, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 1, 0, 0, 0, 641, 643, 3, 66, 25, 0, 642, 641, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 75, 1, 0, 0, 0, 646, 647, 5, 64, 0, 0, 647, 77, 1, 0, 0, 0, 648, 649, 5, 96, 0, 0, 649, 79, 1, 0, 0, 0, 650, 654, 8, 29, 0, 0, 651, 652, 5, 96, 0, 0, 652, 654, 5, 96, 0, 0, 653, 650, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 654, 81, 1, 0, 0, 0, 655, 656, 5, 95, 0, 0, 656, 83, 1, 0, 0, 0, 657, 661, 3, 68, 26, 0, 658, 661, 3, 66, 25, 0, 659, 661, 3, 82, 33, 0, 660, 657, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 659, 1, 0, 0, 0, 661, 85, 1, 0, 0, 0, 662, 667, 5, 34, 0, 0, 663, 666, 3, 70, 27, 0, 664, 666, 3, 72, 28, 0, 665, 663, 1, 0, 0, 0, 665, 664, 1, 0, 0, 0, 666, 669, 1, 0, 0, 0, 667, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 670, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 692, 5, 34, 0, 0, 671, 672, 5, 34, 0, 0, 672, 673, 5, 34, 0, 0, 673, 674, 5, 34, 0, 0, 674, 678, 1, 0, 0, 0, 675, 677, 8, 22, 0, 0, 676, 675, 1, 0, 0, 0, 677, 680, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 678, 676, 1, 0, 0, 0, 679, 681, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 682, 5, 34, 0, 0, 682, 683, 5, 34, 0, 0, 683, 684, 5, 34, 0, 0, 684, 686, 1, 0, 0, 0, 685, 687, 5, 34, 0, 0, 686, 685, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 690, 5, 34, 0, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 692, 1, 0, 0, 0, 691, 662, 1, 0, 0, 0, 691, 671, 1, 0, 0, 0, 692, 87, 1, 0, 0, 0, 693, 695, 3, 66, 25, 0, 694, 693, 1, 0, 0, 0, 695, 696, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 89, 1, 0, 0, 0, 698, 700, 3, 66, 25, 0, 699, 698, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 707, 3, 106, 45, 0, 704, 706, 3, 66, 25, 0, 705, 704, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 741, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 710, 712, 3, 106, 45, 0, 711, 713, 3, 66, 25, 0, 712, 711, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 741, 1, 0, 0, 0, 716, 718, 3, 66, 25, 0, 717, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 717, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 728, 1, 0, 0, 0, 721, 725, 3, 106, 45, 0, 722, 724, 3, 66, 25, 0, 723, 722, 1, 0, 0, 0, 724, 727, 1, 0, 0, 0, 725, 723, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 729, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 728, 721, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 3, 74, 29, 0, 731, 741, 1, 0, 0, 0, 732, 734, 3, 106, 45, 0, 733, 735, 3, 66, 25, 0, 734, 733, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 3, 74, 29, 0, 739, 741, 1, 0, 0, 0, 740, 699, 1, 0, 0, 0, 740, 710, 1, 0, 0, 0, 740, 717, 1, 0, 0, 0, 740, 732, 1, 0, 0, 0, 741, 91, 1, 0, 0, 0, 742, 743, 7, 30, 0, 0, 743, 744, 7, 31, 0, 0, 744, 93, 1, 0, 0, 0, 745, 746, 7, 12, 0, 0, 746, 747, 7, 9, 0, 0, 747, 748, 7, 0, 0, 0, 748, 95, 1, 0, 0, 0, 749, 750, 7, 12, 0, 0, 750, 751, 7, 2, 0, 0, 751, 752, 7, 4, 0, 0, 752, 97, 1, 0, 0, 0, 753, 754, 5, 61, 0, 0, 754, 99, 1, 0, 0, 0, 755, 756, 5, 58, 0, 0, 756, 757, 5, 58, 0, 0, 757, 101, 1, 0, 0, 0, 758, 759, 5, 44, 0, 0, 759, 103, 1, 0, 0, 0, 760, 761, 7, 0, 0, 0, 761, 762, 7, 3, 0, 0, 762, 763, 7, 2, 0, 0, 763, 764, 7, 4, 0, 0, 764, 105, 1, 0, 0, 0, 765, 766, 5, 46, 0, 0, 766, 107, 1, 0, 0, 0, 767, 768, 7, 15, 0, 0, 768, 769, 7, 12, 0, 0, 769, 770, 7, 13, 0, 0, 770, 771, 7, 2, 0, 0, 771, 772, 7, 3, 0, 0, 772, 109, 1, 0, 0, 0, 773, 774, 7, 15, 0, 0, 774, 775, 7, 1, 0, 0, 775, 776, 7, 6, 0, 0, 776, 777, 7, 2, 0, 0, 777, 778, 7, 5, 0, 0, 778, 111, 1, 0, 0, 0, 779, 780, 7, 1, 0, 0, 780, 781, 7, 9, 0, 0, 781, 113, 1, 0, 0, 0, 782, 783, 7, 1, 0, 0, 783, 784, 7, 2, 0, 0, 784, 115, 1, 0, 0, 0, 785, 786, 7, 13, 0, 0, 786, 787, 7, 12, 0, 0, 787, 788, 7, 2, 0, 0, 788, 789, 7, 5, 0, 0, 789, 117, 1, 0, 0, 0, 790, 791, 7, 13, 0, 0, 791, 792, 7, 1, 0, 0, 792, 793, 7, 18, 0, 0, 793, 794, 7, 3, 0, 0, 794, 119, 1, 0, 0, 0, 795, 796, 5, 40, 0, 0, 796, 121, 1, 0, 0, 0, 797, 798, 7, 9, 0, 0, 798, 799, 7, 7, 0, 0, 799, 800, 7, 5, 0, 0, 800, 123, 1, 0, 0, 0, 801, 802, 7, 9, 0, 0, 802, 803, 7, 20, 0, 0, 803, 804, 7, 13, 0, 0, 804, 805, 7, 13, 0, 0, 805, 125, 1, 0, 0, 0, 806, 807, 7, 9, 0, 0, 807, 808, 7, 20, 0, 0, 808, 809, 7, 13, 0, 0, 809, 810, 7, 13, 0, 0, 810, 811, 7, 2, 0, 0, 811, 127, 1, 0, 0, 0, 812, 813, 7, 7, 0, 0, 813, 814, 7, 6, 0, 0, 814, 129, 1, 0, 0, 0, 815, 816, 5, 63, 0, 0, 816, 131, 1, 0, 0, 0, 817, 818, 7, 6, 0, 0, 818, 819, 7, 13, 0, 0, 819, 820, 7, 1, 0, 0, 820, 821, 7, 18, 0, 0, 821, 822, 7, 3, 0, 0, 822, 133, 1, 0, 0, 0, 823, 824, 5, 41, 0, 0, 824, 135, 1, 0, 0, 0, 825, 826, 7, 5, 0, 0, 826, 827, 7, 6, 0, 0, 827, 828, 7, 20, 0, 0, 828, 829, 7, 3, 0, 0, 829, 137, 1, 0, 0, 0, 830, 831, 5, 61, 0, 0, 831, 832, 5, 61, 0, 0, 832, 139, 1, 0, 0, 0, 833, 834, 5, 61, 0, 0, 834, 835, 5, 126, 0, 0, 835, 141, 1, 0, 0, 0, 836, 837, 5, 33, 0, 0, 837, 838, 5, 61, 0, 0, 838, 143, 1, 0, 0, 0, 839, 840, 5, 60, 0, 0, 840, 145, 1, 0, 0, 0, 841, 842, 5, 60, 0, 0, 842, 843, 5, 61, 0, 0, 843, 147, 1, 0, 0, 0, 844, 845, 5, 62, 0, 0, 845, 149, 1, 0, 0, 0, 846, 847, 5, 62, 0, 0, 847, 848, 5, 61, 0, 0, 848, 151, 1, 0, 0, 0, 849, 850, 5, 43, 0, 0, 850, 153, 1, 0, 0, 0, 851, 852, 5, 45, 0, 0, 852, 155, 1, 0, 0, 0, 853, 854, 5, 42, 0, 0, 854, 157, 1, 0, 0, 0, 855, 856, 5, 47, 0, 0, 856, 159, 1, 0, 0, 0, 857, 858, 5, 37, 0, 0, 858, 161, 1, 0, 0, 0, 859, 860, 4, 73, 3, 0, 860, 861, 7, 16, 0, 0, 861, 862, 7, 12, 0, 0, 862, 863, 7, 5, 0, 0, 863, 864, 7, 4, 0, 0, 864, 865, 7, 10, 0, 0, 865, 163, 1, 0, 0, 0, 866, 869, 3, 130, 57, 0, 867, 870, 3, 68, 26, 0, 868, 870, 3, 82, 33, 0, 869, 867, 1, 0, 0, 0, 869, 868, 1, 0, 0, 0, 870, 874, 1, 0, 0, 0, 871, 873, 3, 84, 34, 0, 872, 871, 1, 0, 0, 0, 873, 876, 1, 0, 0, 0, 874, 872, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 884, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 877, 879, 3, 130, 57, 0, 878, 880, 3, 66, 25, 0, 879, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 884, 1, 0, 0, 0, 883, 866, 1, 0, 0, 0, 883, 877, 1, 0, 0, 0, 884, 165, 1, 0, 0, 0, 885, 886, 5, 91, 0, 0, 886, 887, 1, 0, 0, 0, 887, 888, 6, 75, 0, 0, 888, 889, 6, 75, 0, 0, 889, 167, 1, 0, 0, 0, 890, 891, 5, 93, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 6, 76, 12, 0, 893, 894, 6, 76, 12, 0, 894, 169, 1, 0, 0, 0, 895, 899, 3, 68, 26, 0, 896, 898, 3, 84, 34, 0, 897, 896, 1, 0, 0, 0, 898, 901, 1, 0, 0, 0, 899, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 912, 1, 0, 0, 0, 901, 899, 1, 0, 0, 0, 902, 905, 3, 82, 33, 0, 903, 905, 3, 76, 30, 0, 904, 902, 1, 0, 0, 0, 904, 903, 1, 0, 0, 0, 905, 907, 1, 0, 0, 0, 906, 908, 3, 84, 34, 0, 907, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 907, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 912, 1, 0, 0, 0, 911, 895, 1, 0, 0, 0, 911, 904, 1, 0, 0, 0, 912, 171, 1, 0, 0, 0, 913, 915, 3, 78, 31, 0, 914, 916, 3, 80, 32, 0, 915, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 3, 78, 31, 0, 920, 173, 1, 0, 0, 0, 921, 922, 3, 172, 78, 0, 922, 175, 1, 0, 0, 0, 923, 924, 3, 58, 21, 0, 924, 925, 1, 0, 0, 0, 925, 926, 6, 80, 11, 0, 926, 177, 1, 0, 0, 0, 927, 928, 3, 60, 22, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 81, 11, 0, 930, 179, 1, 0, 0, 0, 931, 932, 3, 62, 23, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 82, 11, 0, 934, 181, 1, 0, 0, 0, 935, 936, 3, 166, 75, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 83, 13, 0, 938, 939, 6, 83, 14, 0, 939, 183, 1, 0, 0, 0, 940, 941, 3, 64, 24, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 84, 15, 0, 943, 944, 6, 84, 12, 0, 944, 185, 1, 0, 0, 0, 945, 946, 3, 62, 23, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 85, 11, 0, 948, 187, 1, 0, 0, 0, 949, 950, 3, 58, 21, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 86, 11, 0, 952, 189, 1, 0, 0, 0, 953, 954, 3, 60, 22, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 87, 11, 0, 956, 191, 1, 0, 0, 0, 957, 958, 3, 64, 24, 0, 958, 959, 1, 0, 0, 0, 959, 960, 6, 88, 15, 0, 960, 961, 6, 88, 12, 0, 961, 193, 1, 0, 0, 0, 962, 963, 3, 166, 75, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 89, 13, 0, 965, 195, 1, 0, 0, 0, 966, 967, 3, 168, 76, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 90, 16, 0, 969, 197, 1, 0, 0, 0, 970, 971, 3, 332, 158, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 91, 17, 0, 973, 199, 1, 0, 0, 0, 974, 975, 3, 102, 43, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 92, 18, 0, 977, 201, 1, 0, 0, 0, 978, 979, 3, 98, 41, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 93, 19, 0, 981, 203, 1, 0, 0, 0, 982, 983, 7, 16, 0, 0, 983, 984, 7, 3, 0, 0, 984, 985, 7, 5, 0, 0, 985, 986, 7, 12, 0, 0, 986, 987, 7, 0, 0, 0, 987, 988, 7, 12, 0, 0, 988, 989, 7, 5, 0, 0, 989, 990, 7, 12, 0, 0, 990, 205, 1, 0, 0, 0, 991, 995, 8, 32, 0, 0, 992, 993, 5, 47, 0, 0, 993, 995, 8, 33, 0, 0, 994, 991, 1, 0, 0, 0, 994, 992, 1, 0, 0, 0, 995, 207, 1, 0, 0, 0, 996, 998, 3, 206, 95, 0, 997, 996, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 209, 1, 0, 0, 0, 1001, 1002, 3, 208, 96, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 97, 20, 0, 1004, 211, 1, 0, 0, 0, 1005, 1006, 3, 86, 35, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1008, 6, 98, 21, 0, 1008, 213, 1, 0, 0, 0, 1009, 1010, 3, 58, 21, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 6, 99, 11, 0, 1012, 215, 1, 0, 0, 0, 1013, 1014, 3, 60, 22, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 6, 100, 11, 0, 1016, 217, 1, 0, 0, 0, 1017, 1018, 3, 62, 23, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 6, 101, 11, 0, 1020, 219, 1, 0, 0, 0, 1021, 1022, 3, 64, 24, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 6, 102, 15, 0, 1024, 1025, 6, 102, 12, 0, 1025, 221, 1, 0, 0, 0, 1026, 1027, 3, 106, 45, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 103, 22, 0, 1029, 223, 1, 0, 0, 0, 1030, 1031, 3, 102, 43, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 104, 18, 0, 1033, 225, 1, 0, 0, 0, 1034, 1039, 3, 68, 26, 0, 1035, 1039, 3, 66, 25, 0, 1036, 1039, 3, 82, 33, 0, 1037, 1039, 3, 156, 70, 0, 1038, 1034, 1, 0, 0, 0, 1038, 1035, 1, 0, 0, 0, 1038, 1036, 1, 0, 0, 0, 1038, 1037, 1, 0, 0, 0, 1039, 227, 1, 0, 0, 0, 1040, 1043, 3, 68, 26, 0, 1041, 1043, 3, 156, 70, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1041, 1, 0, 0, 0, 1043, 1047, 1, 0, 0, 0, 1044, 1046, 3, 226, 105, 0, 1045, 1044, 1, 0, 0, 0, 1046, 1049, 1, 0, 0, 0, 1047, 1045, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1060, 1, 0, 0, 0, 1049, 1047, 1, 0, 0, 0, 1050, 1053, 3, 82, 33, 0, 1051, 1053, 3, 76, 30, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1051, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1056, 3, 226, 105, 0, 1055, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1060, 1, 0, 0, 0, 1059, 1042, 1, 0, 0, 0, 1059, 1052, 1, 0, 0, 0, 1060, 229, 1, 0, 0, 0, 1061, 1064, 3, 228, 106, 0, 1062, 1064, 3, 172, 78, 0, 1063, 1061, 1, 0, 0, 0, 1063, 1062, 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1063, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 231, 1, 0, 0, 0, 1067, 1068, 3, 58, 21, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1070, 6, 108, 11, 0, 1070, 233, 1, 0, 0, 0, 1071, 1072, 3, 60, 22, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 109, 11, 0, 1074, 235, 1, 0, 0, 0, 1075, 1076, 3, 62, 23, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 110, 11, 0, 1078, 237, 1, 0, 0, 0, 1079, 1080, 3, 64, 24, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 111, 15, 0, 1082, 1083, 6, 111, 12, 0, 1083, 239, 1, 0, 0, 0, 1084, 1085, 3, 98, 41, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 112, 19, 0, 1087, 241, 1, 0, 0, 0, 1088, 1089, 3, 102, 43, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 113, 18, 0, 1091, 243, 1, 0, 0, 0, 1092, 1093, 3, 106, 45, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 114, 22, 0, 1095, 245, 1, 0, 0, 0, 1096, 1097, 7, 12, 0, 0, 1097, 1098, 7, 2, 0, 0, 1098, 247, 1, 0, 0, 0, 1099, 1100, 3, 230, 107, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 116, 23, 0, 1102, 249, 1, 0, 0, 0, 1103, 1104, 3, 58, 21, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 6, 117, 11, 0, 1106, 251, 1, 0, 0, 0, 1107, 1108, 3, 60, 22, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 118, 11, 0, 1110, 253, 1, 0, 0, 0, 1111, 1112, 3, 62, 23, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 119, 11, 0, 1114, 255, 1, 0, 0, 0, 1115, 1116, 3, 64, 24, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 120, 15, 0, 1118, 1119, 6, 120, 12, 0, 1119, 257, 1, 0, 0, 0, 1120, 1121, 3, 166, 75, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1123, 6, 121, 13, 0, 1123, 1124, 6, 121, 24, 0, 1124, 259, 1, 0, 0, 0, 1125, 1126, 7, 7, 0, 0, 1126, 1127, 7, 9, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 6, 122, 25, 0, 1129, 261, 1, 0, 0, 0, 1130, 1131, 7, 19, 0, 0, 1131, 1132, 7, 1, 0, 0, 1132, 1133, 7, 5, 0, 0, 1133, 1134, 7, 10, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 6, 123, 25, 0, 1136, 263, 1, 0, 0, 0, 1137, 1138, 8, 34, 0, 0, 1138, 265, 1, 0, 0, 0, 1139, 1141, 3, 264, 124, 0, 1140, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1140, 1, 0, 0, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 3, 332, 158, 0, 1145, 1147, 1, 0, 0, 0, 1146, 1140, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1149, 1, 0, 0, 0, 1148, 1150, 3, 264, 124, 0, 1149, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 267, 1, 0, 0, 0, 1153, 1154, 3, 266, 125, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 6, 126, 26, 0, 1156, 269, 1, 0, 0, 0, 1157, 1158, 3, 58, 21, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 6, 127, 11, 0, 1160, 271, 1, 0, 0, 0, 1161, 1162, 3, 60, 22, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 6, 128, 11, 0, 1164, 273, 1, 0, 0, 0, 1165, 1166, 3, 62, 23, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 129, 11, 0, 1168, 275, 1, 0, 0, 0, 1169, 1170, 3, 64, 24, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 6, 130, 15, 0, 1172, 1173, 6, 130, 12, 0, 1173, 1174, 6, 130, 12, 0, 1174, 277, 1, 0, 0, 0, 1175, 1176, 3, 98, 41, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 131, 19, 0, 1178, 279, 1, 0, 0, 0, 1179, 1180, 3, 102, 43, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 132, 18, 0, 1182, 281, 1, 0, 0, 0, 1183, 1184, 3, 106, 45, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 133, 22, 0, 1186, 283, 1, 0, 0, 0, 1187, 1188, 3, 262, 123, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 134, 27, 0, 1190, 285, 1, 0, 0, 0, 1191, 1192, 3, 230, 107, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 135, 23, 0, 1194, 287, 1, 0, 0, 0, 1195, 1196, 3, 174, 79, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 136, 28, 0, 1198, 289, 1, 0, 0, 0, 1199, 1200, 3, 58, 21, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 137, 11, 0, 1202, 291, 1, 0, 0, 0, 1203, 1204, 3, 60, 22, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1206, 6, 138, 11, 0, 1206, 293, 1, 0, 0, 0, 1207, 1208, 3, 62, 23, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 6, 139, 11, 0, 1210, 295, 1, 0, 0, 0, 1211, 1212, 3, 64, 24, 0, 1212, 1213, 1, 0, 0, 0, 1213, 1214, 6, 140, 15, 0, 1214, 1215, 6, 140, 12, 0, 1215, 297, 1, 0, 0, 0, 1216, 1217, 3, 106, 45, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 141, 22, 0, 1219, 299, 1, 0, 0, 0, 1220, 1221, 3, 174, 79, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 142, 28, 0, 1223, 301, 1, 0, 0, 0, 1224, 1225, 3, 170, 77, 0, 1225, 1226, 1, 0, 0, 0, 1226, 1227, 6, 143, 29, 0, 1227, 303, 1, 0, 0, 0, 1228, 1229, 3, 58, 21, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 144, 11, 0, 1231, 305, 1, 0, 0, 0, 1232, 1233, 3, 60, 22, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 145, 11, 0, 1235, 307, 1, 0, 0, 0, 1236, 1237, 3, 62, 23, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 146, 11, 0, 1239, 309, 1, 0, 0, 0, 1240, 1241, 3, 64, 24, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 147, 15, 0, 1243, 1244, 6, 147, 12, 0, 1244, 311, 1, 0, 0, 0, 1245, 1246, 7, 1, 0, 0, 1246, 1247, 7, 9, 0, 0, 1247, 1248, 7, 15, 0, 0, 1248, 1249, 7, 7, 0, 0, 1249, 313, 1, 0, 0, 0, 1250, 1251, 3, 58, 21, 0, 1251, 1252, 1, 0, 0, 0, 1252, 1253, 6, 149, 11, 0, 1253, 315, 1, 0, 0, 0, 1254, 1255, 3, 60, 22, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1257, 6, 150, 11, 0, 1257, 317, 1, 0, 0, 0, 1258, 1259, 3, 62, 23, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 6, 151, 11, 0, 1261, 319, 1, 0, 0, 0, 1262, 1263, 3, 64, 24, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 152, 15, 0, 1265, 1266, 6, 152, 12, 0, 1266, 321, 1, 0, 0, 0, 1267, 1268, 7, 15, 0, 0, 1268, 1269, 7, 20, 0, 0, 1269, 1270, 7, 9, 0, 0, 1270, 1271, 7, 4, 0, 0, 1271, 1272, 7, 5, 0, 0, 1272, 1273, 7, 1, 0, 0, 1273, 1274, 7, 7, 0, 0, 1274, 1275, 7, 9, 0, 0, 1275, 1276, 7, 2, 0, 0, 1276, 323, 1, 0, 0, 0, 1277, 1278, 3, 58, 21, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 154, 11, 0, 1280, 325, 1, 0, 0, 0, 1281, 1282, 3, 60, 22, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 155, 11, 0, 1284, 327, 1, 0, 0, 0, 1285, 1286, 3, 62, 23, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1288, 6, 156, 11, 0, 1288, 329, 1, 0, 0, 0, 1289, 1290, 3, 168, 76, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 157, 16, 0, 1292, 1293, 6, 157, 12, 0, 1293, 331, 1, 0, 0, 0, 1294, 1295, 5, 58, 0, 0, 1295, 333, 1, 0, 0, 0, 1296, 1302, 3, 76, 30, 0, 1297, 1302, 3, 66, 25, 0, 1298, 1302, 3, 106, 45, 0, 1299, 1302, 3, 68, 26, 0, 1300, 1302, 3, 82, 33, 0, 1301, 1296, 1, 0, 0, 0, 1301, 1297, 1, 0, 0, 0, 1301, 1298, 1, 0, 0, 0, 1301, 1299, 1, 0, 0, 0, 1301, 1300, 1, 0, 0, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 335, 1, 0, 0, 0, 1305, 1306, 3, 58, 21, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 6, 160, 11, 0, 1308, 337, 1, 0, 0, 0, 1309, 1310, 3, 60, 22, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1312, 6, 161, 11, 0, 1312, 339, 1, 0, 0, 0, 1313, 1314, 3, 62, 23, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1316, 6, 162, 11, 0, 1316, 341, 1, 0, 0, 0, 1317, 1318, 3, 64, 24, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 6, 163, 15, 0, 1320, 1321, 6, 163, 12, 0, 1321, 343, 1, 0, 0, 0, 1322, 1323, 3, 332, 158, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 164, 17, 0, 1325, 345, 1, 0, 0, 0, 1326, 1327, 3, 102, 43, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 165, 18, 0, 1329, 347, 1, 0, 0, 0, 1330, 1331, 3, 106, 45, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1333, 6, 166, 22, 0, 1333, 349, 1, 0, 0, 0, 1334, 1335, 3, 260, 122, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 167, 30, 0, 1337, 1338, 6, 167, 31, 0, 1338, 351, 1, 0, 0, 0, 1339, 1340, 3, 208, 96, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1342, 6, 168, 20, 0, 1342, 353, 1, 0, 0, 0, 1343, 1344, 3, 86, 35, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 6, 169, 21, 0, 1346, 355, 1, 0, 0, 0, 1347, 1348, 3, 58, 21, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1350, 6, 170, 11, 0, 1350, 357, 1, 0, 0, 0, 1351, 1352, 3, 60, 22, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 6, 171, 11, 0, 1354, 359, 1, 0, 0, 0, 1355, 1356, 3, 62, 23, 0, 1356, 1357, 1, 0, 0, 0, 1357, 1358, 6, 172, 11, 0, 1358, 361, 1, 0, 0, 0, 1359, 1360, 3, 64, 24, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 173, 15, 0, 1362, 1363, 6, 173, 12, 0, 1363, 1364, 6, 173, 12, 0, 1364, 363, 1, 0, 0, 0, 1365, 1366, 3, 102, 43, 0, 1366, 1367, 1, 0, 0, 0, 1367, 1368, 6, 174, 18, 0, 1368, 365, 1, 0, 0, 0, 1369, 1370, 3, 106, 45, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 175, 22, 0, 1372, 367, 1, 0, 0, 0, 1373, 1374, 3, 230, 107, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 176, 23, 0, 1376, 369, 1, 0, 0, 0, 1377, 1378, 3, 58, 21, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 177, 11, 0, 1380, 371, 1, 0, 0, 0, 1381, 1382, 3, 60, 22, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, 178, 11, 0, 1384, 373, 1, 0, 0, 0, 1385, 1386, 3, 62, 23, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 6, 179, 11, 0, 1388, 375, 1, 0, 0, 0, 1389, 1390, 3, 64, 24, 0, 1390, 1391, 1, 0, 0, 0, 1391, 1392, 6, 180, 15, 0, 1392, 1393, 6, 180, 12, 0, 1393, 377, 1, 0, 0, 0, 1394, 1395, 3, 208, 96, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 6, 181, 20, 0, 1397, 1398, 6, 181, 12, 0, 1398, 1399, 6, 181, 32, 0, 1399, 379, 1, 0, 0, 0, 1400, 1401, 3, 86, 35, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1403, 6, 182, 21, 0, 1403, 1404, 6, 182, 12, 0, 1404, 1405, 6, 182, 32, 0, 1405, 381, 1, 0, 0, 0, 1406, 1407, 3, 58, 21, 0, 1407, 1408, 1, 0, 0, 0, 1408, 1409, 6, 183, 11, 0, 1409, 383, 1, 0, 0, 0, 1410, 1411, 3, 60, 22, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 184, 11, 0, 1413, 385, 1, 0, 0, 0, 1414, 1415, 3, 62, 23, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 11, 0, 1417, 387, 1, 0, 0, 0, 1418, 1419, 3, 332, 158, 0, 1419, 1420, 1, 0, 0, 0, 1420, 1421, 6, 186, 17, 0, 1421, 1422, 6, 186, 12, 0, 1422, 1423, 6, 186, 10, 0, 1423, 389, 1, 0, 0, 0, 1424, 1425, 3, 102, 43, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1427, 6, 187, 18, 0, 1427, 1428, 6, 187, 12, 0, 1428, 1429, 6, 187, 10, 0, 1429, 391, 1, 0, 0, 0, 1430, 1431, 3, 58, 21, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1433, 6, 188, 11, 0, 1433, 393, 1, 0, 0, 0, 1434, 1435, 3, 60, 22, 0, 1435, 1436, 1, 0, 0, 0, 1436, 1437, 6, 189, 11, 0, 1437, 395, 1, 0, 0, 0, 1438, 1439, 3, 62, 23, 0, 1439, 1440, 1, 0, 0, 0, 1440, 1441, 6, 190, 11, 0, 1441, 397, 1, 0, 0, 0, 1442, 1443, 3, 174, 79, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1445, 6, 191, 12, 0, 1445, 1446, 6, 191, 0, 0, 1446, 1447, 6, 191, 28, 0, 1447, 399, 1, 0, 0, 0, 1448, 1449, 3, 170, 77, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1451, 6, 192, 12, 0, 1451, 1452, 6, 192, 0, 0, 1452, 1453, 6, 192, 29, 0, 1453, 401, 1, 0, 0, 0, 1454, 1455, 3, 92, 38, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 193, 12, 0, 1457, 1458, 6, 193, 0, 0, 1458, 1459, 6, 193, 33, 0, 1459, 403, 1, 0, 0, 0, 1460, 1461, 3, 64, 24, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 6, 194, 15, 0, 1463, 1464, 6, 194, 12, 0, 1464, 405, 1, 0, 0, 0, 66, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 581, 591, 595, 598, 607, 609, 620, 639, 644, 653, 660, 665, 667, 678, 686, 689, 691, 696, 701, 707, 714, 719, 725, 728, 736, 740, 869, 874, 881, 883, 899, 904, 909, 911, 917, 994, 999, 1038, 1042, 1047, 1052, 1057, 1059, 1063, 1065, 1142, 1146, 1151, 1301, 1303, 34, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 10, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 12, 0, 5, 14, 0, 0, 1, 0, 4, 0, 0, 7, 66, 0, 5, 0, 0, 7, 25, 0, 7, 67, 0, 7, 109, 0, 7, 34, 0, 7, 32, 0, 7, 77, 0, 7, 26, 0, 7, 36, 0, 7, 81, 0, 5, 11, 0, 5, 7, 0, 7, 91, 0, 7, 90, 0, 7, 69, 0, 7, 68, 0, 7, 89, 0, 5, 13, 0, 5, 15, 0, 7, 29, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index 97b21edea760a..d1f73cb63b002 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -29,13 +29,13 @@ public class EsqlBaseLexer extends LexerConfig { public static final int DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, - WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, - UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, - QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, - ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, - IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, - PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, - GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, + WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_METRICS=20, UNKNOWN_CMD=21, + LINE_COMMENT=22, MULTILINE_COMMENT=23, WS=24, PIPE=25, QUOTED_STRING=26, + INTEGER_LITERAL=27, DECIMAL_LITERAL=28, BY=29, AND=30, ASC=31, ASSIGN=32, + CAST_OP=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, IN=39, IS=40, + LAST=41, LIKE=42, LP=43, NOT=44, NULL=45, NULLS=46, OR=47, PARAM=48, RLIKE=49, + RP=50, TRUE=51, EQ=52, CIEQ=53, NEQ=54, LT=55, LTE=56, GT=57, GTE=58, + PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, DEV_MATCH=64, NAMED_OR_POSITIONAL_PARAM=65, OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, @@ -73,15 +73,15 @@ private static String[] makeRuleNames() { return new String[] { "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", - "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", - "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", + "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", + "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", + "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", + "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DEV_MATCH_OP", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "SLASH", "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", @@ -121,15 +121,15 @@ private static String[] makeLiteralNames() { null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, - null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", - "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", - "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", - "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", - null, null, null, null, null, null, null, null, "'metadata'", null, null, - null, null, null, null, null, null, "'as'", null, null, null, "'on'", - "'with'", null, null, null, null, null, null, null, null, null, null, - "'info'", null, null, null, "'functions'", null, null, null, "':'" + null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", + "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", + "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", + "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", + "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, null, "']'", null, + null, null, null, null, null, null, null, "'metadata'", null, null, null, + null, null, null, null, null, "'as'", null, null, null, "'on'", "'with'", + null, null, null, null, null, null, null, null, null, null, "'info'", + null, null, null, "'functions'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -137,20 +137,20 @@ private static String[] makeSymbolicNames() { return new String[] { null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", - "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", + "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", + "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", + "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", + "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", @@ -229,11 +229,9 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { case 18: return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); case 19: - return DEV_MATCH_sempred((RuleContext)_localctx, predIndex); - case 20: return DEV_METRICS_sempred((RuleContext)_localctx, predIndex); - case 74: - return DEV_MATCH_OP_sempred((RuleContext)_localctx, predIndex); + case 73: + return DEV_MATCH_sempred((RuleContext)_localctx, predIndex); } return true; } @@ -251,30 +249,23 @@ private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) { } return true; } - private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 2: return this.isDevVersion(); } return true; } - private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 3: return this.isDevVersion(); } return true; } - private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 4: - return this.isDevVersion(); - } - return true; - } public static final String _serializedATN = - "\u0004\u0000}\u05c2\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000}\u05b9\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ @@ -330,907 +321,900 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { "\u0002\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc"+ "\u0002\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf"+ "\u0002\u00c0\u0007\u00c0\u0002\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2"+ - "\u0002\u00c3\u0007\u00c3\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ - "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003"+ - "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ - "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006"+ - "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ + "\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ - "\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001"+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0015\u0004\u0015\u024f\b\u0015\u000b\u0015\f"+ - "\u0015\u0250\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0005\u0016\u0259\b\u0016\n\u0016\f\u0016\u025c\t\u0016\u0001"+ - "\u0016\u0003\u0016\u025f\b\u0016\u0001\u0016\u0003\u0016\u0262\b\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0005\u0017\u026b\b\u0017\n\u0017\f\u0017\u026e\t\u0017\u0001"+ - "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0004"+ - "\u0018\u0276\b\u0018\u000b\u0018\f\u0018\u0277\u0001\u0018\u0001\u0018"+ - "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d"+ - "\u0001\u001d\u0001\u001e\u0001\u001e\u0003\u001e\u028b\b\u001e\u0001\u001e"+ - "\u0004\u001e\u028e\b\u001e\u000b\u001e\f\u001e\u028f\u0001\u001f\u0001"+ - "\u001f\u0001 \u0001 \u0001!\u0001!\u0001!\u0003!\u0299\b!\u0001\"\u0001"+ - "\"\u0001#\u0001#\u0001#\u0003#\u02a0\b#\u0001$\u0001$\u0001$\u0005$\u02a5"+ - "\b$\n$\f$\u02a8\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u02b0"+ - "\b$\n$\f$\u02b3\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0003$\u02ba\b$"+ - "\u0001$\u0003$\u02bd\b$\u0003$\u02bf\b$\u0001%\u0004%\u02c2\b%\u000b%"+ - "\f%\u02c3\u0001&\u0004&\u02c7\b&\u000b&\f&\u02c8\u0001&\u0001&\u0005&"+ - "\u02cd\b&\n&\f&\u02d0\t&\u0001&\u0001&\u0004&\u02d4\b&\u000b&\f&\u02d5"+ - "\u0001&\u0004&\u02d9\b&\u000b&\f&\u02da\u0001&\u0001&\u0005&\u02df\b&"+ - "\n&\f&\u02e2\t&\u0003&\u02e4\b&\u0001&\u0001&\u0001&\u0001&\u0004&\u02ea"+ - "\b&\u000b&\f&\u02eb\u0001&\u0001&\u0003&\u02f0\b&\u0001\'\u0001\'\u0001"+ - "\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001*\u0001"+ - "*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ - "-\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ - "0\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u0001"+ - "2\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ - "4\u00015\u00015\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u0001"+ - "7\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u0001"+ - "9\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ - "<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ - "C\u0001C\u0001D\u0001D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001"+ - "G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001J\u0001J\u0001J\u0001J\u0001"+ - "K\u0001K\u0001K\u0003K\u036f\bK\u0001K\u0005K\u0372\bK\nK\fK\u0375\tK"+ - "\u0001K\u0001K\u0004K\u0379\bK\u000bK\fK\u037a\u0003K\u037d\bK\u0001L"+ - "\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001"+ - "N\u0001N\u0005N\u038b\bN\nN\fN\u038e\tN\u0001N\u0001N\u0003N\u0392\bN"+ - "\u0001N\u0004N\u0395\bN\u000bN\fN\u0396\u0003N\u0399\bN\u0001O\u0001O"+ - "\u0004O\u039d\bO\u000bO\fO\u039e\u0001O\u0001O\u0001P\u0001P\u0001Q\u0001"+ - "Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001"+ - "S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001"+ - "U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001"+ - "X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001"+ - "Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001"+ - "]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001"+ - "_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001_\u0001`\u0001`\u0001`\u0003"+ - "`\u03ec\b`\u0001a\u0004a\u03ef\ba\u000ba\fa\u03f0\u0001b\u0001b\u0001"+ - "b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ - "e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001"+ - "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ - "i\u0001j\u0001j\u0001j\u0001j\u0003j\u0418\bj\u0001k\u0001k\u0003k\u041c"+ - "\bk\u0001k\u0005k\u041f\bk\nk\fk\u0422\tk\u0001k\u0001k\u0003k\u0426\b"+ - "k\u0001k\u0004k\u0429\bk\u000bk\fk\u042a\u0003k\u042d\bk\u0001l\u0001"+ - "l\u0004l\u0431\bl\u000bl\fl\u0432\u0001m\u0001m\u0001m\u0001m\u0001n\u0001"+ - "n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001"+ - "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001"+ - "s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001"+ - "u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001x\u0001"+ - "x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001"+ - "z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001"+ - "|\u0001|\u0001|\u0001|\u0001|\u0001}\u0001}\u0001~\u0004~\u047e\b~\u000b"+ - "~\f~\u047f\u0001~\u0001~\u0003~\u0484\b~\u0001~\u0004~\u0487\b~\u000b"+ - "~\f~\u0488\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080"+ - "\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081"+ - "\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083"+ - "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084"+ - "\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085"+ - "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087"+ - "\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088"+ - "\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a"+ - "\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b"+ - "\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d"+ - "\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e"+ - "\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f"+ - "\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091"+ - "\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092"+ - "\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094"+ - "\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095"+ - "\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096"+ - "\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098"+ - "\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099"+ - "\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c"+ - "\u0001\u009c\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f"+ - "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0004\u00a0"+ - "\u051f\b\u00a0\u000b\u00a0\f\u00a0\u0520\u0001\u00a1\u0001\u00a1\u0001"+ - "\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001"+ - "\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001"+ - "\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001"+ - "\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001"+ - "\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001"+ - "\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001"+ - "\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001"+ - "\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001"+ - "\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001"+ - "\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001"+ - "\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001"+ - "\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001"+ - "\u00b2\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001"+ - "\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001"+ - "\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001"+ - "\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001"+ - "\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001"+ - "\u00b8\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001"+ - "\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001"+ - "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+ - "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+ - "\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+ - "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+ - "\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001"+ - "\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+ - "\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001"+ - "\u00c3\u0001\u00c3\u0002\u026c\u02b1\u0000\u00c4\u0010\u0001\u0012\u0002"+ - "\u0014\u0003\u0016\u0004\u0018\u0005\u001a\u0006\u001c\u0007\u001e\b "+ - "\t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u00112\u00124\u00136\u00148"+ - "\u0015:\u0016<\u0017>\u0018@\u0019B\u001aD\u0000F\u0000H\u0000J\u0000"+ - "L\u0000N\u0000P\u0000R\u0000T\u0000V\u0000X\u001bZ\u001c\\\u001d^\u001e"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0014\u0004\u0014\u0244\b\u0014\u000b"+ + "\u0014\f\u0014\u0245\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0005\u0015\u024e\b\u0015\n\u0015\f\u0015\u0251\t\u0015"+ + "\u0001\u0015\u0003\u0015\u0254\b\u0015\u0001\u0015\u0003\u0015\u0257\b"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0005\u0016\u0260\b\u0016\n\u0016\f\u0016\u0263\t\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017"+ + "\u0004\u0017\u026b\b\u0017\u000b\u0017\f\u0017\u026c\u0001\u0017\u0001"+ + "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001"+ + "\u0019\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0003\u001d\u0280\b\u001d\u0001"+ + "\u001d\u0004\u001d\u0283\b\u001d\u000b\u001d\f\u001d\u0284\u0001\u001e"+ + "\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0003 \u028e"+ + "\b \u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0003\"\u0295\b\"\u0001#\u0001"+ + "#\u0001#\u0005#\u029a\b#\n#\f#\u029d\t#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0005#\u02a5\b#\n#\f#\u02a8\t#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0003#\u02af\b#\u0001#\u0003#\u02b2\b#\u0003#\u02b4\b#\u0001$\u0004"+ + "$\u02b7\b$\u000b$\f$\u02b8\u0001%\u0004%\u02bc\b%\u000b%\f%\u02bd\u0001"+ + "%\u0001%\u0005%\u02c2\b%\n%\f%\u02c5\t%\u0001%\u0001%\u0004%\u02c9\b%"+ + "\u000b%\f%\u02ca\u0001%\u0004%\u02ce\b%\u000b%\f%\u02cf\u0001%\u0001%"+ + "\u0005%\u02d4\b%\n%\f%\u02d7\t%\u0003%\u02d9\b%\u0001%\u0001%\u0001%\u0001"+ + "%\u0004%\u02df\b%\u000b%\f%\u02e0\u0001%\u0001%\u0003%\u02e5\b%\u0001"+ + "&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001(\u0001"+ + "(\u0001)\u0001)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001"+ + ".\u0001/\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00013\u00013\u0001"+ + "3\u00013\u00013\u00014\u00014\u00015\u00015\u00015\u00015\u00016\u0001"+ + "6\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00017\u00017\u0001"+ + "8\u00018\u00018\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001;\u0001;\u0001<\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001"+ + "=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001@\u0001@\u0001A\u0001"+ + "A\u0001A\u0001B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001E\u0001"+ + "E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001I\u0001"+ + "I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0003J\u0366\bJ\u0001J\u0005"+ + "J\u0369\bJ\nJ\fJ\u036c\tJ\u0001J\u0001J\u0004J\u0370\bJ\u000bJ\fJ\u0371"+ + "\u0003J\u0374\bJ\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001"+ + "L\u0001L\u0001L\u0001M\u0001M\u0005M\u0382\bM\nM\fM\u0385\tM\u0001M\u0001"+ + "M\u0003M\u0389\bM\u0001M\u0004M\u038c\bM\u000bM\fM\u038d\u0003M\u0390"+ + "\bM\u0001N\u0001N\u0004N\u0394\bN\u000bN\fN\u0395\u0001N\u0001N\u0001"+ + "O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001"+ + "T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001U\u0001U\u0001V\u0001V\u0001"+ + "V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001"+ + "X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001[\u0001"+ + "[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001\\\u0001]\u0001]\u0001]\u0001"+ + "]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ + "_\u0001_\u0001_\u0003_\u03e3\b_\u0001`\u0004`\u03e6\b`\u000b`\f`\u03e7"+ + "\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001"+ + "c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001"+ + "e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001g\u0001g\u0001g\u0001"+ + "h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001i\u0003i\u040f\bi\u0001"+ + "j\u0001j\u0003j\u0413\bj\u0001j\u0005j\u0416\bj\nj\fj\u0419\tj\u0001j"+ + "\u0001j\u0003j\u041d\bj\u0001j\u0004j\u0420\bj\u000bj\fj\u0421\u0003j"+ + "\u0424\bj\u0001k\u0001k\u0004k\u0428\bk\u000bk\fk\u0429\u0001l\u0001l"+ + "\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001n\u0001"+ + "n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001"+ + "q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001"+ + "s\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001u\u0001u\u0001v\u0001"+ + "v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001"+ + "x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001"+ + "z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001{\u0001|\u0001"+ + "|\u0001}\u0004}\u0475\b}\u000b}\f}\u0476\u0001}\u0001}\u0003}\u047b\b"+ + "}\u0001}\u0004}\u047e\b}\u000b}\f}\u047f\u0001~\u0001~\u0001~\u0001~\u0001"+ + "\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u0080\u0001\u0080\u0001"+ + "\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ + "\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001"+ + "\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001"+ + "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001"+ + "\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001"+ + "\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001"+ + "\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001"+ + "\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001"+ + "\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001"+ + "\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001"+ + "\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001"+ + "\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001"+ + "\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0004"+ + "\u009f\u0516\b\u009f\u000b\u009f\f\u009f\u0517\u0001\u00a0\u0001\u00a0"+ + "\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4"+ + "\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae\u0001\u00ae"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be"+ + "\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ + "\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2"+ + "\u0001\u00c2\u0001\u00c2\u0002\u0261\u02a6\u0000\u00c3\u0010\u0001\u0012"+ + "\u0002\u0014\u0003\u0016\u0004\u0018\u0005\u001a\u0006\u001c\u0007\u001e"+ + "\b \t\"\n$\u000b&\f(\r*\u000e,\u000f.\u00100\u00112\u00124\u00136\u0014"+ + "8\u0015:\u0016<\u0017>\u0018@\u0019B\u0000D\u0000F\u0000H\u0000J\u0000"+ + "L\u0000N\u0000P\u0000R\u0000T\u0000V\u001aX\u001bZ\u001c\\\u001d^\u001e"+ "`\u001fb d!f\"h#j$l%n&p\'r(t)v*x+z,|-~.\u0080/\u00820\u00841\u00862\u0088"+ "3\u008a4\u008c5\u008e6\u00907\u00928\u00949\u0096:\u0098;\u009a<\u009c"+ - "=\u009e>\u00a0?\u00a2@\u00a4\u0000\u00a6A\u00a8B\u00aaC\u00acD\u00ae\u0000"+ - "\u00b0E\u00b2F\u00b4G\u00b6H\u00b8\u0000\u00ba\u0000\u00bcI\u00beJ\u00c0"+ - "K\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc\u0000"+ - "\u00ceL\u00d0\u0000\u00d2M\u00d4\u0000\u00d6\u0000\u00d8N\u00daO\u00dc"+ - "P\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6\u0000\u00e8Q\u00ea"+ - "R\u00ecS\u00eeT\u00f0\u0000\u00f2\u0000\u00f4\u0000\u00f6\u0000\u00f8"+ - "U\u00fa\u0000\u00fcV\u00feW\u0100X\u0102\u0000\u0104\u0000\u0106Y\u0108"+ - "Z\u010a\u0000\u010c[\u010e\u0000\u0110\\\u0112]\u0114^\u0116\u0000\u0118"+ - "\u0000\u011a\u0000\u011c\u0000\u011e\u0000\u0120\u0000\u0122\u0000\u0124"+ - "_\u0126`\u0128a\u012a\u0000\u012c\u0000\u012e\u0000\u0130\u0000\u0132"+ - "b\u0134c\u0136d\u0138\u0000\u013ae\u013cf\u013eg\u0140h\u0142\u0000\u0144"+ - "i\u0146j\u0148k\u014al\u014c\u0000\u014em\u0150n\u0152o\u0154p\u0156q"+ + "=\u009e>\u00a0?\u00a2@\u00a4A\u00a6B\u00a8C\u00aaD\u00ac\u0000\u00aeE"+ + "\u00b0F\u00b2G\u00b4H\u00b6\u0000\u00b8\u0000\u00baI\u00bcJ\u00beK\u00c0"+ + "\u0000\u00c2\u0000\u00c4\u0000\u00c6\u0000\u00c8\u0000\u00ca\u0000\u00cc"+ + "L\u00ce\u0000\u00d0M\u00d2\u0000\u00d4\u0000\u00d6N\u00d8O\u00daP\u00dc"+ + "\u0000\u00de\u0000\u00e0\u0000\u00e2\u0000\u00e4\u0000\u00e6Q\u00e8R\u00ea"+ + "S\u00ecT\u00ee\u0000\u00f0\u0000\u00f2\u0000\u00f4\u0000\u00f6U\u00f8"+ + "\u0000\u00faV\u00fcW\u00feX\u0100\u0000\u0102\u0000\u0104Y\u0106Z\u0108"+ + "\u0000\u010a[\u010c\u0000\u010e\\\u0110]\u0112^\u0114\u0000\u0116\u0000"+ + "\u0118\u0000\u011a\u0000\u011c\u0000\u011e\u0000\u0120\u0000\u0122_\u0124"+ + "`\u0126a\u0128\u0000\u012a\u0000\u012c\u0000\u012e\u0000\u0130b\u0132"+ + "c\u0134d\u0136\u0000\u0138e\u013af\u013cg\u013eh\u0140\u0000\u0142i\u0144"+ + "j\u0146k\u0148l\u014a\u0000\u014cm\u014en\u0150o\u0152p\u0154q\u0156\u0000"+ "\u0158\u0000\u015a\u0000\u015c\u0000\u015e\u0000\u0160\u0000\u0162\u0000"+ - "\u0164\u0000\u0166r\u0168s\u016at\u016c\u0000\u016e\u0000\u0170\u0000"+ - "\u0172\u0000\u0174u\u0176v\u0178w\u017a\u0000\u017c\u0000\u017e\u0000"+ - "\u0180x\u0182y\u0184z\u0186\u0000\u0188\u0000\u018a{\u018c|\u018e}\u0190"+ - "\u0000\u0192\u0000\u0194\u0000\u0196\u0000\u0010\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd"+ - "\u0002\u0000IIii\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002"+ - "\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000"+ - "NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002"+ - "\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002\u0000GGgg\u0002\u0000"+ - "KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\u0002"+ - "\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002\u0000AZaz\b\u0000"+ - "\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001"+ - "\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\u000b\u0000\t\n\r\r \"\",,/"+ - "/::==[[]]||\u0002\u0000**//\u000b\u0000\t\n\r\r \"#,,//::<<>?\\\\||\u05dd"+ - "\u0000\u0010\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000"+ - "\u0000\u0014\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000"+ - "\u0000\u0018\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000"+ - "\u0000\u001c\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000"+ - "\u0000 \u0001\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000"+ - "$\u0001\u0000\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001"+ - "\u0000\u0000\u0000\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000"+ - "\u0000\u0000.\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u0000"+ - "2\u0001\u0000\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001"+ - "\u0000\u0000\u0000\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000"+ - "\u0000\u0000<\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0000"+ - "@\u0001\u0000\u0000\u0000\u0001B\u0001\u0000\u0000\u0000\u0001X\u0001"+ - "\u0000\u0000\u0000\u0001Z\u0001\u0000\u0000\u0000\u0001\\\u0001\u0000"+ - "\u0000\u0000\u0001^\u0001\u0000\u0000\u0000\u0001`\u0001\u0000\u0000\u0000"+ - "\u0001b\u0001\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001f"+ - "\u0001\u0000\u0000\u0000\u0001h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000"+ - "\u0000\u0000\u0001l\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000"+ - "\u0001p\u0001\u0000\u0000\u0000\u0001r\u0001\u0000\u0000\u0000\u0001t"+ - "\u0001\u0000\u0000\u0000\u0001v\u0001\u0000\u0000\u0000\u0001x\u0001\u0000"+ - "\u0000\u0000\u0001z\u0001\u0000\u0000\u0000\u0001|\u0001\u0000\u0000\u0000"+ - "\u0001~\u0001\u0000\u0000\u0000\u0001\u0080\u0001\u0000\u0000\u0000\u0001"+ - "\u0082\u0001\u0000\u0000\u0000\u0001\u0084\u0001\u0000\u0000\u0000\u0001"+ - "\u0086\u0001\u0000\u0000\u0000\u0001\u0088\u0001\u0000\u0000\u0000\u0001"+ - "\u008a\u0001\u0000\u0000\u0000\u0001\u008c\u0001\u0000\u0000\u0000\u0001"+ - "\u008e\u0001\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001"+ - "\u0092\u0001\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0001"+ - "\u0096\u0001\u0000\u0000\u0000\u0001\u0098\u0001\u0000\u0000\u0000\u0001"+ - "\u009a\u0001\u0000\u0000\u0000\u0001\u009c\u0001\u0000\u0000\u0000\u0001"+ - "\u009e\u0001\u0000\u0000\u0000\u0001\u00a0\u0001\u0000\u0000\u0000\u0001"+ - "\u00a2\u0001\u0000\u0000\u0000\u0001\u00a4\u0001\u0000\u0000\u0000\u0001"+ - "\u00a6\u0001\u0000\u0000\u0000\u0001\u00a8\u0001\u0000\u0000\u0000\u0001"+ - "\u00aa\u0001\u0000\u0000\u0000\u0001\u00ac\u0001\u0000\u0000\u0000\u0001"+ - "\u00b0\u0001\u0000\u0000\u0000\u0001\u00b2\u0001\u0000\u0000\u0000\u0001"+ - "\u00b4\u0001\u0000\u0000\u0000\u0001\u00b6\u0001\u0000\u0000\u0000\u0002"+ - "\u00b8\u0001\u0000\u0000\u0000\u0002\u00ba\u0001\u0000\u0000\u0000\u0002"+ - "\u00bc\u0001\u0000\u0000\u0000\u0002\u00be\u0001\u0000\u0000\u0000\u0002"+ - "\u00c0\u0001\u0000\u0000\u0000\u0003\u00c2\u0001\u0000\u0000\u0000\u0003"+ - "\u00c4\u0001\u0000\u0000\u0000\u0003\u00c6\u0001\u0000\u0000\u0000\u0003"+ - "\u00c8\u0001\u0000\u0000\u0000\u0003\u00ca\u0001\u0000\u0000\u0000\u0003"+ - "\u00cc\u0001\u0000\u0000\u0000\u0003\u00ce\u0001\u0000\u0000\u0000\u0003"+ - "\u00d2\u0001\u0000\u0000\u0000\u0003\u00d4\u0001\u0000\u0000\u0000\u0003"+ - "\u00d6\u0001\u0000\u0000\u0000\u0003\u00d8\u0001\u0000\u0000\u0000\u0003"+ - "\u00da\u0001\u0000\u0000\u0000\u0003\u00dc\u0001\u0000\u0000\u0000\u0004"+ - "\u00de\u0001\u0000\u0000\u0000\u0004\u00e0\u0001\u0000\u0000\u0000\u0004"+ - "\u00e2\u0001\u0000\u0000\u0000\u0004\u00e8\u0001\u0000\u0000\u0000\u0004"+ - "\u00ea\u0001\u0000\u0000\u0000\u0004\u00ec\u0001\u0000\u0000\u0000\u0004"+ - "\u00ee\u0001\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005"+ - "\u00f2\u0001\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005"+ - "\u00f6\u0001\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005"+ - "\u00fa\u0001\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005"+ - "\u00fe\u0001\u0000\u0000\u0000\u0005\u0100\u0001\u0000\u0000\u0000\u0006"+ - "\u0102\u0001\u0000\u0000\u0000\u0006\u0104\u0001\u0000\u0000\u0000\u0006"+ - "\u0106\u0001\u0000\u0000\u0000\u0006\u0108\u0001\u0000\u0000\u0000\u0006"+ - "\u010c\u0001\u0000\u0000\u0000\u0006\u010e\u0001\u0000\u0000\u0000\u0006"+ - "\u0110\u0001\u0000\u0000\u0000\u0006\u0112\u0001\u0000\u0000\u0000\u0006"+ - "\u0114\u0001\u0000\u0000\u0000\u0007\u0116\u0001\u0000\u0000\u0000\u0007"+ - "\u0118\u0001\u0000\u0000\u0000\u0007\u011a\u0001\u0000\u0000\u0000\u0007"+ - "\u011c\u0001\u0000\u0000\u0000\u0007\u011e\u0001\u0000\u0000\u0000\u0007"+ - "\u0120\u0001\u0000\u0000\u0000\u0007\u0122\u0001\u0000\u0000\u0000\u0007"+ - "\u0124\u0001\u0000\u0000\u0000\u0007\u0126\u0001\u0000\u0000\u0000\u0007"+ - "\u0128\u0001\u0000\u0000\u0000\b\u012a\u0001\u0000\u0000\u0000\b\u012c"+ - "\u0001\u0000\u0000\u0000\b\u012e\u0001\u0000\u0000\u0000\b\u0130\u0001"+ - "\u0000\u0000\u0000\b\u0132\u0001\u0000\u0000\u0000\b\u0134\u0001\u0000"+ - "\u0000\u0000\b\u0136\u0001\u0000\u0000\u0000\t\u0138\u0001\u0000\u0000"+ - "\u0000\t\u013a\u0001\u0000\u0000\u0000\t\u013c\u0001\u0000\u0000\u0000"+ - "\t\u013e\u0001\u0000\u0000\u0000\t\u0140\u0001\u0000\u0000\u0000\n\u0142"+ - "\u0001\u0000\u0000\u0000\n\u0144\u0001\u0000\u0000\u0000\n\u0146\u0001"+ - "\u0000\u0000\u0000\n\u0148\u0001\u0000\u0000\u0000\n\u014a\u0001\u0000"+ - "\u0000\u0000\u000b\u014c\u0001\u0000\u0000\u0000\u000b\u014e\u0001\u0000"+ - "\u0000\u0000\u000b\u0150\u0001\u0000\u0000\u0000\u000b\u0152\u0001\u0000"+ - "\u0000\u0000\u000b\u0154\u0001\u0000\u0000\u0000\u000b\u0156\u0001\u0000"+ - "\u0000\u0000\f\u0158\u0001\u0000\u0000\u0000\f\u015a\u0001\u0000\u0000"+ - "\u0000\f\u015c\u0001\u0000\u0000\u0000\f\u015e\u0001\u0000\u0000\u0000"+ - "\f\u0160\u0001\u0000\u0000\u0000\f\u0162\u0001\u0000\u0000\u0000\f\u0164"+ - "\u0001\u0000\u0000\u0000\f\u0166\u0001\u0000\u0000\u0000\f\u0168\u0001"+ - "\u0000\u0000\u0000\f\u016a\u0001\u0000\u0000\u0000\r\u016c\u0001\u0000"+ - "\u0000\u0000\r\u016e\u0001\u0000\u0000\u0000\r\u0170\u0001\u0000\u0000"+ - "\u0000\r\u0172\u0001\u0000\u0000\u0000\r\u0174\u0001\u0000\u0000\u0000"+ - "\r\u0176\u0001\u0000\u0000\u0000\r\u0178\u0001\u0000\u0000\u0000\u000e"+ - "\u017a\u0001\u0000\u0000\u0000\u000e\u017c\u0001\u0000\u0000\u0000\u000e"+ - "\u017e\u0001\u0000\u0000\u0000\u000e\u0180\u0001\u0000\u0000\u0000\u000e"+ - "\u0182\u0001\u0000\u0000\u0000\u000e\u0184\u0001\u0000\u0000\u0000\u000f"+ - "\u0186\u0001\u0000\u0000\u0000\u000f\u0188\u0001\u0000\u0000\u0000\u000f"+ - "\u018a\u0001\u0000\u0000\u0000\u000f\u018c\u0001\u0000\u0000\u0000\u000f"+ - "\u018e\u0001\u0000\u0000\u0000\u000f\u0190\u0001\u0000\u0000\u0000\u000f"+ - "\u0192\u0001\u0000\u0000\u0000\u000f\u0194\u0001\u0000\u0000\u0000\u000f"+ - "\u0196\u0001\u0000\u0000\u0000\u0010\u0198\u0001\u0000\u0000\u0000\u0012"+ - "\u01a2\u0001\u0000\u0000\u0000\u0014\u01a9\u0001\u0000\u0000\u0000\u0016"+ - "\u01b2\u0001\u0000\u0000\u0000\u0018\u01b9\u0001\u0000\u0000\u0000\u001a"+ - "\u01c3\u0001\u0000\u0000\u0000\u001c\u01ca\u0001\u0000\u0000\u0000\u001e"+ - "\u01d1\u0001\u0000\u0000\u0000 \u01d8\u0001\u0000\u0000\u0000\"\u01e0"+ - "\u0001\u0000\u0000\u0000$\u01e7\u0001\u0000\u0000\u0000&\u01f3\u0001\u0000"+ - "\u0000\u0000(\u01fc\u0001\u0000\u0000\u0000*\u0202\u0001\u0000\u0000\u0000"+ - ",\u0209\u0001\u0000\u0000\u0000.\u0210\u0001\u0000\u0000\u00000\u0218"+ - "\u0001\u0000\u0000\u00002\u0220\u0001\u0000\u0000\u00004\u022f\u0001\u0000"+ - "\u0000\u00006\u0239\u0001\u0000\u0000\u00008\u0242\u0001\u0000\u0000\u0000"+ - ":\u024e\u0001\u0000\u0000\u0000<\u0254\u0001\u0000\u0000\u0000>\u0265"+ - "\u0001\u0000\u0000\u0000@\u0275\u0001\u0000\u0000\u0000B\u027b\u0001\u0000"+ - "\u0000\u0000D\u027f\u0001\u0000\u0000\u0000F\u0281\u0001\u0000\u0000\u0000"+ - "H\u0283\u0001\u0000\u0000\u0000J\u0286\u0001\u0000\u0000\u0000L\u0288"+ - "\u0001\u0000\u0000\u0000N\u0291\u0001\u0000\u0000\u0000P\u0293\u0001\u0000"+ - "\u0000\u0000R\u0298\u0001\u0000\u0000\u0000T\u029a\u0001\u0000\u0000\u0000"+ - "V\u029f\u0001\u0000\u0000\u0000X\u02be\u0001\u0000\u0000\u0000Z\u02c1"+ - "\u0001\u0000\u0000\u0000\\\u02ef\u0001\u0000\u0000\u0000^\u02f1\u0001"+ - "\u0000\u0000\u0000`\u02f4\u0001\u0000\u0000\u0000b\u02f8\u0001\u0000\u0000"+ - "\u0000d\u02fc\u0001\u0000\u0000\u0000f\u02fe\u0001\u0000\u0000\u0000h"+ - "\u0301\u0001\u0000\u0000\u0000j\u0303\u0001\u0000\u0000\u0000l\u0308\u0001"+ - "\u0000\u0000\u0000n\u030a\u0001\u0000\u0000\u0000p\u0310\u0001\u0000\u0000"+ - "\u0000r\u0316\u0001\u0000\u0000\u0000t\u0319\u0001\u0000\u0000\u0000v"+ - "\u031c\u0001\u0000\u0000\u0000x\u0321\u0001\u0000\u0000\u0000z\u0326\u0001"+ - "\u0000\u0000\u0000|\u0328\u0001\u0000\u0000\u0000~\u032c\u0001\u0000\u0000"+ - "\u0000\u0080\u0331\u0001\u0000\u0000\u0000\u0082\u0337\u0001\u0000\u0000"+ - "\u0000\u0084\u033a\u0001\u0000\u0000\u0000\u0086\u033c\u0001\u0000\u0000"+ - "\u0000\u0088\u0342\u0001\u0000\u0000\u0000\u008a\u0344\u0001\u0000\u0000"+ - "\u0000\u008c\u0349\u0001\u0000\u0000\u0000\u008e\u034c\u0001\u0000\u0000"+ - "\u0000\u0090\u034f\u0001\u0000\u0000\u0000\u0092\u0352\u0001\u0000\u0000"+ - "\u0000\u0094\u0354\u0001\u0000\u0000\u0000\u0096\u0357\u0001\u0000\u0000"+ - "\u0000\u0098\u0359\u0001\u0000\u0000\u0000\u009a\u035c\u0001\u0000\u0000"+ - "\u0000\u009c\u035e\u0001\u0000\u0000\u0000\u009e\u0360\u0001\u0000\u0000"+ - "\u0000\u00a0\u0362\u0001\u0000\u0000\u0000\u00a2\u0364\u0001\u0000\u0000"+ - "\u0000\u00a4\u0366\u0001\u0000\u0000\u0000\u00a6\u037c\u0001\u0000\u0000"+ - "\u0000\u00a8\u037e\u0001\u0000\u0000\u0000\u00aa\u0383\u0001\u0000\u0000"+ - "\u0000\u00ac\u0398\u0001\u0000\u0000\u0000\u00ae\u039a\u0001\u0000\u0000"+ - "\u0000\u00b0\u03a2\u0001\u0000\u0000\u0000\u00b2\u03a4\u0001\u0000\u0000"+ - "\u0000\u00b4\u03a8\u0001\u0000\u0000\u0000\u00b6\u03ac\u0001\u0000\u0000"+ - "\u0000\u00b8\u03b0\u0001\u0000\u0000\u0000\u00ba\u03b5\u0001\u0000\u0000"+ - "\u0000\u00bc\u03ba\u0001\u0000\u0000\u0000\u00be\u03be\u0001\u0000\u0000"+ - "\u0000\u00c0\u03c2\u0001\u0000\u0000\u0000\u00c2\u03c6\u0001\u0000\u0000"+ - "\u0000\u00c4\u03cb\u0001\u0000\u0000\u0000\u00c6\u03cf\u0001\u0000\u0000"+ - "\u0000\u00c8\u03d3\u0001\u0000\u0000\u0000\u00ca\u03d7\u0001\u0000\u0000"+ - "\u0000\u00cc\u03db\u0001\u0000\u0000\u0000\u00ce\u03df\u0001\u0000\u0000"+ - "\u0000\u00d0\u03eb\u0001\u0000\u0000\u0000\u00d2\u03ee\u0001\u0000\u0000"+ - "\u0000\u00d4\u03f2\u0001\u0000\u0000\u0000\u00d6\u03f6\u0001\u0000\u0000"+ - "\u0000\u00d8\u03fa\u0001\u0000\u0000\u0000\u00da\u03fe\u0001\u0000\u0000"+ - "\u0000\u00dc\u0402\u0001\u0000\u0000\u0000\u00de\u0406\u0001\u0000\u0000"+ - "\u0000\u00e0\u040b\u0001\u0000\u0000\u0000\u00e2\u040f\u0001\u0000\u0000"+ - "\u0000\u00e4\u0417\u0001\u0000\u0000\u0000\u00e6\u042c\u0001\u0000\u0000"+ - "\u0000\u00e8\u0430\u0001\u0000\u0000\u0000\u00ea\u0434\u0001\u0000\u0000"+ - "\u0000\u00ec\u0438\u0001\u0000\u0000\u0000\u00ee\u043c\u0001\u0000\u0000"+ - "\u0000\u00f0\u0440\u0001\u0000\u0000\u0000\u00f2\u0445\u0001\u0000\u0000"+ - "\u0000\u00f4\u0449\u0001\u0000\u0000\u0000\u00f6\u044d\u0001\u0000\u0000"+ - "\u0000\u00f8\u0451\u0001\u0000\u0000\u0000\u00fa\u0454\u0001\u0000\u0000"+ - "\u0000\u00fc\u0458\u0001\u0000\u0000\u0000\u00fe\u045c\u0001\u0000\u0000"+ - "\u0000\u0100\u0460\u0001\u0000\u0000\u0000\u0102\u0464\u0001\u0000\u0000"+ - "\u0000\u0104\u0469\u0001\u0000\u0000\u0000\u0106\u046e\u0001\u0000\u0000"+ - "\u0000\u0108\u0473\u0001\u0000\u0000\u0000\u010a\u047a\u0001\u0000\u0000"+ - "\u0000\u010c\u0483\u0001\u0000\u0000\u0000\u010e\u048a\u0001\u0000\u0000"+ - "\u0000\u0110\u048e\u0001\u0000\u0000\u0000\u0112\u0492\u0001\u0000\u0000"+ - "\u0000\u0114\u0496\u0001\u0000\u0000\u0000\u0116\u049a\u0001\u0000\u0000"+ - "\u0000\u0118\u04a0\u0001\u0000\u0000\u0000\u011a\u04a4\u0001\u0000\u0000"+ - "\u0000\u011c\u04a8\u0001\u0000\u0000\u0000\u011e\u04ac\u0001\u0000\u0000"+ - "\u0000\u0120\u04b0\u0001\u0000\u0000\u0000\u0122\u04b4\u0001\u0000\u0000"+ - "\u0000\u0124\u04b8\u0001\u0000\u0000\u0000\u0126\u04bc\u0001\u0000\u0000"+ - "\u0000\u0128\u04c0\u0001\u0000\u0000\u0000\u012a\u04c4\u0001\u0000\u0000"+ - "\u0000\u012c\u04c9\u0001\u0000\u0000\u0000\u012e\u04cd\u0001\u0000\u0000"+ - "\u0000\u0130\u04d1\u0001\u0000\u0000\u0000\u0132\u04d5\u0001\u0000\u0000"+ - "\u0000\u0134\u04d9\u0001\u0000\u0000\u0000\u0136\u04dd\u0001\u0000\u0000"+ - "\u0000\u0138\u04e1\u0001\u0000\u0000\u0000\u013a\u04e6\u0001\u0000\u0000"+ - "\u0000\u013c\u04eb\u0001\u0000\u0000\u0000\u013e\u04ef\u0001\u0000\u0000"+ - "\u0000\u0140\u04f3\u0001\u0000\u0000\u0000\u0142\u04f7\u0001\u0000\u0000"+ - "\u0000\u0144\u04fc\u0001\u0000\u0000\u0000\u0146\u0506\u0001\u0000\u0000"+ - "\u0000\u0148\u050a\u0001\u0000\u0000\u0000\u014a\u050e\u0001\u0000\u0000"+ - "\u0000\u014c\u0512\u0001\u0000\u0000\u0000\u014e\u0517\u0001\u0000\u0000"+ - "\u0000\u0150\u051e\u0001\u0000\u0000\u0000\u0152\u0522\u0001\u0000\u0000"+ - "\u0000\u0154\u0526\u0001\u0000\u0000\u0000\u0156\u052a\u0001\u0000\u0000"+ - "\u0000\u0158\u052e\u0001\u0000\u0000\u0000\u015a\u0533\u0001\u0000\u0000"+ - "\u0000\u015c\u0537\u0001\u0000\u0000\u0000\u015e\u053b\u0001\u0000\u0000"+ - "\u0000\u0160\u053f\u0001\u0000\u0000\u0000\u0162\u0544\u0001\u0000\u0000"+ - "\u0000\u0164\u0548\u0001\u0000\u0000\u0000\u0166\u054c\u0001\u0000\u0000"+ - "\u0000\u0168\u0550\u0001\u0000\u0000\u0000\u016a\u0554\u0001\u0000\u0000"+ - "\u0000\u016c\u0558\u0001\u0000\u0000\u0000\u016e\u055e\u0001\u0000\u0000"+ - "\u0000\u0170\u0562\u0001\u0000\u0000\u0000\u0172\u0566\u0001\u0000\u0000"+ - "\u0000\u0174\u056a\u0001\u0000\u0000\u0000\u0176\u056e\u0001\u0000\u0000"+ - "\u0000\u0178\u0572\u0001\u0000\u0000\u0000\u017a\u0576\u0001\u0000\u0000"+ - "\u0000\u017c\u057b\u0001\u0000\u0000\u0000\u017e\u0581\u0001\u0000\u0000"+ - "\u0000\u0180\u0587\u0001\u0000\u0000\u0000\u0182\u058b\u0001\u0000\u0000"+ - "\u0000\u0184\u058f\u0001\u0000\u0000\u0000\u0186\u0593\u0001\u0000\u0000"+ - "\u0000\u0188\u0599\u0001\u0000\u0000\u0000\u018a\u059f\u0001\u0000\u0000"+ - "\u0000\u018c\u05a3\u0001\u0000\u0000\u0000\u018e\u05a7\u0001\u0000\u0000"+ - "\u0000\u0190\u05ab\u0001\u0000\u0000\u0000\u0192\u05b1\u0001\u0000\u0000"+ - "\u0000\u0194\u05b7\u0001\u0000\u0000\u0000\u0196\u05bd\u0001\u0000\u0000"+ - "\u0000\u0198\u0199\u0007\u0000\u0000\u0000\u0199\u019a\u0007\u0001\u0000"+ - "\u0000\u019a\u019b\u0007\u0002\u0000\u0000\u019b\u019c\u0007\u0002\u0000"+ - "\u0000\u019c\u019d\u0007\u0003\u0000\u0000\u019d\u019e\u0007\u0004\u0000"+ - "\u0000\u019e\u019f\u0007\u0005\u0000\u0000\u019f\u01a0\u0001\u0000\u0000"+ - "\u0000\u01a0\u01a1\u0006\u0000\u0000\u0000\u01a1\u0011\u0001\u0000\u0000"+ - "\u0000\u01a2\u01a3\u0007\u0000\u0000\u0000\u01a3\u01a4\u0007\u0006\u0000"+ - "\u0000\u01a4\u01a5\u0007\u0007\u0000\u0000\u01a5\u01a6\u0007\b\u0000\u0000"+ - "\u01a6\u01a7\u0001\u0000\u0000\u0000\u01a7\u01a8\u0006\u0001\u0001\u0000"+ - "\u01a8\u0013\u0001\u0000\u0000\u0000\u01a9\u01aa\u0007\u0003\u0000\u0000"+ - "\u01aa\u01ab\u0007\t\u0000\u0000\u01ab\u01ac\u0007\u0006\u0000\u0000\u01ac"+ - "\u01ad\u0007\u0001\u0000\u0000\u01ad\u01ae\u0007\u0004\u0000\u0000\u01ae"+ - "\u01af\u0007\n\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0\u01b1"+ - "\u0006\u0002\u0002\u0000\u01b1\u0015\u0001\u0000\u0000\u0000\u01b2\u01b3"+ - "\u0007\u0003\u0000\u0000\u01b3\u01b4\u0007\u000b\u0000\u0000\u01b4\u01b5"+ - "\u0007\f\u0000\u0000\u01b5\u01b6\u0007\r\u0000\u0000\u01b6\u01b7\u0001"+ - "\u0000\u0000\u0000\u01b7\u01b8\u0006\u0003\u0000\u0000\u01b8\u0017\u0001"+ - "\u0000\u0000\u0000\u01b9\u01ba\u0007\u0003\u0000\u0000\u01ba\u01bb\u0007"+ - "\u000e\u0000\u0000\u01bb\u01bc\u0007\b\u0000\u0000\u01bc\u01bd\u0007\r"+ - "\u0000\u0000\u01bd\u01be\u0007\f\u0000\u0000\u01be\u01bf\u0007\u0001\u0000"+ - "\u0000\u01bf\u01c0\u0007\t\u0000\u0000\u01c0\u01c1\u0001\u0000\u0000\u0000"+ - "\u01c1\u01c2\u0006\u0004\u0003\u0000\u01c2\u0019\u0001\u0000\u0000\u0000"+ - "\u01c3\u01c4\u0007\u000f\u0000\u0000\u01c4\u01c5\u0007\u0006\u0000\u0000"+ - "\u01c5\u01c6\u0007\u0007\u0000\u0000\u01c6\u01c7\u0007\u0010\u0000\u0000"+ - "\u01c7\u01c8\u0001\u0000\u0000\u0000\u01c8\u01c9\u0006\u0005\u0004\u0000"+ - "\u01c9\u001b\u0001\u0000\u0000\u0000\u01ca\u01cb\u0007\u0011\u0000\u0000"+ - "\u01cb\u01cc\u0007\u0006\u0000\u0000\u01cc\u01cd\u0007\u0007\u0000\u0000"+ - "\u01cd\u01ce\u0007\u0012\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000"+ - "\u01cf\u01d0\u0006\u0006\u0000\u0000\u01d0\u001d\u0001\u0000\u0000\u0000"+ - "\u01d1\u01d2\u0007\u0012\u0000\u0000\u01d2\u01d3\u0007\u0003\u0000\u0000"+ - "\u01d3\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5\u0007\b\u0000\u0000\u01d5"+ - "\u01d6\u0001\u0000\u0000\u0000\u01d6\u01d7\u0006\u0007\u0001\u0000\u01d7"+ - "\u001f\u0001\u0000\u0000\u0000\u01d8\u01d9\u0007\r\u0000\u0000\u01d9\u01da"+ - "\u0007\u0001\u0000\u0000\u01da\u01db\u0007\u0010\u0000\u0000\u01db\u01dc"+ - "\u0007\u0001\u0000\u0000\u01dc\u01dd\u0007\u0005\u0000\u0000\u01dd\u01de"+ - "\u0001\u0000\u0000\u0000\u01de\u01df\u0006\b\u0000\u0000\u01df!\u0001"+ - "\u0000\u0000\u0000\u01e0\u01e1\u0007\u0010\u0000\u0000\u01e1\u01e2\u0007"+ - "\u0003\u0000\u0000\u01e2\u01e3\u0007\u0005\u0000\u0000\u01e3\u01e4\u0007"+ - "\f\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5\u01e6\u0006\t"+ - "\u0005\u0000\u01e6#\u0001\u0000\u0000\u0000\u01e7\u01e8\u0007\u0010\u0000"+ - "\u0000\u01e8\u01e9\u0007\u000b\u0000\u0000\u01e9\u01ea\u0005_\u0000\u0000"+ - "\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007\u000e\u0000\u0000"+ - "\u01ec\u01ed\u0007\b\u0000\u0000\u01ed\u01ee\u0007\f\u0000\u0000\u01ee"+ - "\u01ef\u0007\t\u0000\u0000\u01ef\u01f0\u0007\u0000\u0000\u0000\u01f0\u01f1"+ - "\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\n\u0006\u0000\u01f2%\u0001"+ - "\u0000\u0000\u0000\u01f3\u01f4\u0007\u0006\u0000\u0000\u01f4\u01f5\u0007"+ - "\u0003\u0000\u0000\u01f5\u01f6\u0007\t\u0000\u0000\u01f6\u01f7\u0007\f"+ - "\u0000\u0000\u01f7\u01f8\u0007\u0010\u0000\u0000\u01f8\u01f9\u0007\u0003"+ - "\u0000\u0000\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u000b"+ - "\u0007\u0000\u01fb\'\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0006\u0000"+ - "\u0000\u01fd\u01fe\u0007\u0007\u0000\u0000\u01fe\u01ff\u0007\u0013\u0000"+ - "\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\f\u0000\u0000"+ - "\u0201)\u0001\u0000\u0000\u0000\u0202\u0203\u0007\u0002\u0000\u0000\u0203"+ - "\u0204\u0007\n\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205\u0206"+ - "\u0007\u0013\u0000\u0000\u0206\u0207\u0001\u0000\u0000\u0000\u0207\u0208"+ - "\u0006\r\b\u0000\u0208+\u0001\u0000\u0000\u0000\u0209\u020a\u0007\u0002"+ - "\u0000\u0000\u020a\u020b\u0007\u0007\u0000\u0000\u020b\u020c\u0007\u0006"+ - "\u0000\u0000\u020c\u020d\u0007\u0005\u0000\u0000\u020d\u020e\u0001\u0000"+ - "\u0000\u0000\u020e\u020f\u0006\u000e\u0000\u0000\u020f-\u0001\u0000\u0000"+ - "\u0000\u0210\u0211\u0007\u0002\u0000\u0000\u0211\u0212\u0007\u0005\u0000"+ - "\u0000\u0212\u0213\u0007\f\u0000\u0000\u0213\u0214\u0007\u0005\u0000\u0000"+ - "\u0214\u0215\u0007\u0002\u0000\u0000\u0215\u0216\u0001\u0000\u0000\u0000"+ - "\u0216\u0217\u0006\u000f\u0000\u0000\u0217/\u0001\u0000\u0000\u0000\u0218"+ - "\u0219\u0007\u0013\u0000\u0000\u0219\u021a\u0007\n\u0000\u0000\u021a\u021b"+ - "\u0007\u0003\u0000\u0000\u021b\u021c\u0007\u0006\u0000\u0000\u021c\u021d"+ - "\u0007\u0003\u0000\u0000\u021d\u021e\u0001\u0000\u0000\u0000\u021e\u021f"+ - "\u0006\u0010\u0000\u0000\u021f1\u0001\u0000\u0000\u0000\u0220\u0221\u0004"+ - "\u0011\u0000\u0000\u0221\u0222\u0007\u0001\u0000\u0000\u0222\u0223\u0007"+ - "\t\u0000\u0000\u0223\u0224\u0007\r\u0000\u0000\u0224\u0225\u0007\u0001"+ - "\u0000\u0000\u0225\u0226\u0007\t\u0000\u0000\u0226\u0227\u0007\u0003\u0000"+ - "\u0000\u0227\u0228\u0007\u0002\u0000\u0000\u0228\u0229\u0007\u0005\u0000"+ - "\u0000\u0229\u022a\u0007\f\u0000\u0000\u022a\u022b\u0007\u0005\u0000\u0000"+ - "\u022b\u022c\u0007\u0002\u0000\u0000\u022c\u022d\u0001\u0000\u0000\u0000"+ - "\u022d\u022e\u0006\u0011\u0000\u0000\u022e3\u0001\u0000\u0000\u0000\u022f"+ - "\u0230\u0004\u0012\u0001\u0000\u0230\u0231\u0007\r\u0000\u0000\u0231\u0232"+ - "\u0007\u0007\u0000\u0000\u0232\u0233\u0007\u0007\u0000\u0000\u0233\u0234"+ - "\u0007\u0012\u0000\u0000\u0234\u0235\u0007\u0014\u0000\u0000\u0235\u0236"+ - "\u0007\b\u0000\u0000\u0236\u0237\u0001\u0000\u0000\u0000\u0237\u0238\u0006"+ - "\u0012\t\u0000\u02385\u0001\u0000\u0000\u0000\u0239\u023a\u0004\u0013"+ - "\u0002\u0000\u023a\u023b\u0007\u0010\u0000\u0000\u023b\u023c\u0007\f\u0000"+ - "\u0000\u023c\u023d\u0007\u0005\u0000\u0000\u023d\u023e\u0007\u0004\u0000"+ - "\u0000\u023e\u023f\u0007\n\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000"+ - "\u0240\u0241\u0006\u0013\u0000\u0000\u02417\u0001\u0000\u0000\u0000\u0242"+ - "\u0243\u0004\u0014\u0003\u0000\u0243\u0244\u0007\u0010\u0000\u0000\u0244"+ - "\u0245\u0007\u0003\u0000\u0000\u0245\u0246\u0007\u0005\u0000\u0000\u0246"+ - "\u0247\u0007\u0006\u0000\u0000\u0247\u0248\u0007\u0001\u0000\u0000\u0248"+ - "\u0249\u0007\u0004\u0000\u0000\u0249\u024a\u0007\u0002\u0000\u0000\u024a"+ - "\u024b\u0001\u0000\u0000\u0000\u024b\u024c\u0006\u0014\n\u0000\u024c9"+ - "\u0001\u0000\u0000\u0000\u024d\u024f\b\u0015\u0000\u0000\u024e\u024d\u0001"+ - "\u0000\u0000\u0000\u024f\u0250\u0001\u0000\u0000\u0000\u0250\u024e\u0001"+ - "\u0000\u0000\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0252\u0001"+ - "\u0000\u0000\u0000\u0252\u0253\u0006\u0015\u0000\u0000\u0253;\u0001\u0000"+ - "\u0000\u0000\u0254\u0255\u0005/\u0000\u0000\u0255\u0256\u0005/\u0000\u0000"+ - "\u0256\u025a\u0001\u0000\u0000\u0000\u0257\u0259\b\u0016\u0000\u0000\u0258"+ - "\u0257\u0001\u0000\u0000\u0000\u0259\u025c\u0001\u0000\u0000\u0000\u025a"+ - "\u0258\u0001\u0000\u0000\u0000\u025a\u025b\u0001\u0000\u0000\u0000\u025b"+ - "\u025e\u0001\u0000\u0000\u0000\u025c\u025a\u0001\u0000\u0000\u0000\u025d"+ - "\u025f\u0005\r\u0000\u0000\u025e\u025d\u0001\u0000\u0000\u0000\u025e\u025f"+ - "\u0001\u0000\u0000\u0000\u025f\u0261\u0001\u0000\u0000\u0000\u0260\u0262"+ - "\u0005\n\u0000\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0261\u0262\u0001"+ - "\u0000\u0000\u0000\u0262\u0263\u0001\u0000\u0000\u0000\u0263\u0264\u0006"+ - "\u0016\u000b\u0000\u0264=\u0001\u0000\u0000\u0000\u0265\u0266\u0005/\u0000"+ - "\u0000\u0266\u0267\u0005*\u0000\u0000\u0267\u026c\u0001\u0000\u0000\u0000"+ - "\u0268\u026b\u0003>\u0017\u0000\u0269\u026b\t\u0000\u0000\u0000\u026a"+ - "\u0268\u0001\u0000\u0000\u0000\u026a\u0269\u0001\u0000\u0000\u0000\u026b"+ - "\u026e\u0001\u0000\u0000\u0000\u026c\u026d\u0001\u0000\u0000\u0000\u026c"+ - "\u026a\u0001\u0000\u0000\u0000\u026d\u026f\u0001\u0000\u0000\u0000\u026e"+ - "\u026c\u0001\u0000\u0000\u0000\u026f\u0270\u0005*\u0000\u0000\u0270\u0271"+ - "\u0005/\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273\u0006"+ - "\u0017\u000b\u0000\u0273?\u0001\u0000\u0000\u0000\u0274\u0276\u0007\u0017"+ - "\u0000\u0000\u0275\u0274\u0001\u0000\u0000\u0000\u0276\u0277\u0001\u0000"+ - "\u0000\u0000\u0277\u0275\u0001\u0000\u0000\u0000\u0277\u0278\u0001\u0000"+ - "\u0000\u0000\u0278\u0279\u0001\u0000\u0000\u0000\u0279\u027a\u0006\u0018"+ - "\u000b\u0000\u027aA\u0001\u0000\u0000\u0000\u027b\u027c\u0005|\u0000\u0000"+ - "\u027c\u027d\u0001\u0000\u0000\u0000\u027d\u027e\u0006\u0019\f\u0000\u027e"+ - "C\u0001\u0000\u0000\u0000\u027f\u0280\u0007\u0018\u0000\u0000\u0280E\u0001"+ - "\u0000\u0000\u0000\u0281\u0282\u0007\u0019\u0000\u0000\u0282G\u0001\u0000"+ - "\u0000\u0000\u0283\u0284\u0005\\\u0000\u0000\u0284\u0285\u0007\u001a\u0000"+ - "\u0000\u0285I\u0001\u0000\u0000\u0000\u0286\u0287\b\u001b\u0000\u0000"+ - "\u0287K\u0001\u0000\u0000\u0000\u0288\u028a\u0007\u0003\u0000\u0000\u0289"+ - "\u028b\u0007\u001c\u0000\u0000\u028a\u0289\u0001\u0000\u0000\u0000\u028a"+ - "\u028b\u0001\u0000\u0000\u0000\u028b\u028d\u0001\u0000\u0000\u0000\u028c"+ - "\u028e\u0003D\u001a\u0000\u028d\u028c\u0001\u0000\u0000\u0000\u028e\u028f"+ - "\u0001\u0000\u0000\u0000\u028f\u028d\u0001\u0000\u0000\u0000\u028f\u0290"+ - "\u0001\u0000\u0000\u0000\u0290M\u0001\u0000\u0000\u0000\u0291\u0292\u0005"+ - "@\u0000\u0000\u0292O\u0001\u0000\u0000\u0000\u0293\u0294\u0005`\u0000"+ - "\u0000\u0294Q\u0001\u0000\u0000\u0000\u0295\u0299\b\u001d\u0000\u0000"+ - "\u0296\u0297\u0005`\u0000\u0000\u0297\u0299\u0005`\u0000\u0000\u0298\u0295"+ - "\u0001\u0000\u0000\u0000\u0298\u0296\u0001\u0000\u0000\u0000\u0299S\u0001"+ - "\u0000\u0000\u0000\u029a\u029b\u0005_\u0000\u0000\u029bU\u0001\u0000\u0000"+ - "\u0000\u029c\u02a0\u0003F\u001b\u0000\u029d\u02a0\u0003D\u001a\u0000\u029e"+ - "\u02a0\u0003T\"\u0000\u029f\u029c\u0001\u0000\u0000\u0000\u029f\u029d"+ - "\u0001\u0000\u0000\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u02a0W\u0001"+ - "\u0000\u0000\u0000\u02a1\u02a6\u0005\"\u0000\u0000\u02a2\u02a5\u0003H"+ - "\u001c\u0000\u02a3\u02a5\u0003J\u001d\u0000\u02a4\u02a2\u0001\u0000\u0000"+ - "\u0000\u02a4\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a8\u0001\u0000\u0000"+ - "\u0000\u02a6\u02a4\u0001\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000"+ - "\u0000\u02a7\u02a9\u0001\u0000\u0000\u0000\u02a8\u02a6\u0001\u0000\u0000"+ - "\u0000\u02a9\u02bf\u0005\"\u0000\u0000\u02aa\u02ab\u0005\"\u0000\u0000"+ - "\u02ab\u02ac\u0005\"\u0000\u0000\u02ac\u02ad\u0005\"\u0000\u0000\u02ad"+ - "\u02b1\u0001\u0000\u0000\u0000\u02ae\u02b0\b\u0016\u0000\u0000\u02af\u02ae"+ - "\u0001\u0000\u0000\u0000\u02b0\u02b3\u0001\u0000\u0000\u0000\u02b1\u02b2"+ - "\u0001\u0000\u0000\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b4"+ - "\u0001\u0000\u0000\u0000\u02b3\u02b1\u0001\u0000\u0000\u0000\u02b4\u02b5"+ - "\u0005\"\u0000\u0000\u02b5\u02b6\u0005\"\u0000\u0000\u02b6\u02b7\u0005"+ - "\"\u0000\u0000\u02b7\u02b9\u0001\u0000\u0000\u0000\u02b8\u02ba\u0005\""+ - "\u0000\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000"+ - "\u0000\u0000\u02ba\u02bc\u0001\u0000\u0000\u0000\u02bb\u02bd\u0005\"\u0000"+ - "\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd\u0001\u0000\u0000"+ - "\u0000\u02bd\u02bf\u0001\u0000\u0000\u0000\u02be\u02a1\u0001\u0000\u0000"+ - "\u0000\u02be\u02aa\u0001\u0000\u0000\u0000\u02bfY\u0001\u0000\u0000\u0000"+ - "\u02c0\u02c2\u0003D\u001a\u0000\u02c1\u02c0\u0001\u0000\u0000\u0000\u02c2"+ - "\u02c3\u0001\u0000\u0000\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c3"+ - "\u02c4\u0001\u0000\u0000\u0000\u02c4[\u0001\u0000\u0000\u0000\u02c5\u02c7"+ - "\u0003D\u001a\u0000\u02c6\u02c5\u0001\u0000\u0000\u0000\u02c7\u02c8\u0001"+ - "\u0000\u0000\u0000\u02c8\u02c6\u0001\u0000\u0000\u0000\u02c8\u02c9\u0001"+ - "\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca\u02ce\u0003"+ - "l.\u0000\u02cb\u02cd\u0003D\u001a\u0000\u02cc\u02cb\u0001\u0000\u0000"+ - "\u0000\u02cd\u02d0\u0001\u0000\u0000\u0000\u02ce\u02cc\u0001\u0000\u0000"+ - "\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02f0\u0001\u0000\u0000"+ - "\u0000\u02d0\u02ce\u0001\u0000\u0000\u0000\u02d1\u02d3\u0003l.\u0000\u02d2"+ - "\u02d4\u0003D\u001a\u0000\u02d3\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d5"+ - "\u0001\u0000\u0000\u0000\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d6"+ - "\u0001\u0000\u0000\u0000\u02d6\u02f0\u0001\u0000\u0000\u0000\u02d7\u02d9"+ - "\u0003D\u001a\u0000\u02d8\u02d7\u0001\u0000\u0000\u0000\u02d9\u02da\u0001"+ - "\u0000\u0000\u0000\u02da\u02d8\u0001\u0000\u0000\u0000\u02da\u02db\u0001"+ - "\u0000\u0000\u0000\u02db\u02e3\u0001\u0000\u0000\u0000\u02dc\u02e0\u0003"+ - "l.\u0000\u02dd\u02df\u0003D\u001a\u0000\u02de\u02dd\u0001\u0000\u0000"+ - "\u0000\u02df\u02e2\u0001\u0000\u0000\u0000\u02e0\u02de\u0001\u0000\u0000"+ - "\u0000\u02e0\u02e1\u0001\u0000\u0000\u0000\u02e1\u02e4\u0001\u0000\u0000"+ - "\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000\u02e3\u02dc\u0001\u0000\u0000"+ - "\u0000\u02e3\u02e4\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000"+ - "\u0000\u02e5\u02e6\u0003L\u001e\u0000\u02e6\u02f0\u0001\u0000\u0000\u0000"+ - "\u02e7\u02e9\u0003l.\u0000\u02e8\u02ea\u0003D\u001a\u0000\u02e9\u02e8"+ - "\u0001\u0000\u0000\u0000\u02ea\u02eb\u0001\u0000\u0000\u0000\u02eb\u02e9"+ - "\u0001\u0000\u0000\u0000\u02eb\u02ec\u0001\u0000\u0000\u0000\u02ec\u02ed"+ - "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0003L\u001e\u0000\u02ee\u02f0\u0001"+ - "\u0000\u0000\u0000\u02ef\u02c6\u0001\u0000\u0000\u0000\u02ef\u02d1\u0001"+ - "\u0000\u0000\u0000\u02ef\u02d8\u0001\u0000\u0000\u0000\u02ef\u02e7\u0001"+ - "\u0000\u0000\u0000\u02f0]\u0001\u0000\u0000\u0000\u02f1\u02f2\u0007\u001e"+ - "\u0000\u0000\u02f2\u02f3\u0007\u001f\u0000\u0000\u02f3_\u0001\u0000\u0000"+ - "\u0000\u02f4\u02f5\u0007\f\u0000\u0000\u02f5\u02f6\u0007\t\u0000\u0000"+ - "\u02f6\u02f7\u0007\u0000\u0000\u0000\u02f7a\u0001\u0000\u0000\u0000\u02f8"+ - "\u02f9\u0007\f\u0000\u0000\u02f9\u02fa\u0007\u0002\u0000\u0000\u02fa\u02fb"+ - "\u0007\u0004\u0000\u0000\u02fbc\u0001\u0000\u0000\u0000\u02fc\u02fd\u0005"+ - "=\u0000\u0000\u02fde\u0001\u0000\u0000\u0000\u02fe\u02ff\u0005:\u0000"+ - "\u0000\u02ff\u0300\u0005:\u0000\u0000\u0300g\u0001\u0000\u0000\u0000\u0301"+ - "\u0302\u0005,\u0000\u0000\u0302i\u0001\u0000\u0000\u0000\u0303\u0304\u0007"+ - "\u0000\u0000\u0000\u0304\u0305\u0007\u0003\u0000\u0000\u0305\u0306\u0007"+ - "\u0002\u0000\u0000\u0306\u0307\u0007\u0004\u0000\u0000\u0307k\u0001\u0000"+ - "\u0000\u0000\u0308\u0309\u0005.\u0000\u0000\u0309m\u0001\u0000\u0000\u0000"+ - "\u030a\u030b\u0007\u000f\u0000\u0000\u030b\u030c\u0007\f\u0000\u0000\u030c"+ - "\u030d\u0007\r\u0000\u0000\u030d\u030e\u0007\u0002\u0000\u0000\u030e\u030f"+ - "\u0007\u0003\u0000\u0000\u030fo\u0001\u0000\u0000\u0000\u0310\u0311\u0007"+ - "\u000f\u0000\u0000\u0311\u0312\u0007\u0001\u0000\u0000\u0312\u0313\u0007"+ - "\u0006\u0000\u0000\u0313\u0314\u0007\u0002\u0000\u0000\u0314\u0315\u0007"+ - "\u0005\u0000\u0000\u0315q\u0001\u0000\u0000\u0000\u0316\u0317\u0007\u0001"+ - "\u0000\u0000\u0317\u0318\u0007\t\u0000\u0000\u0318s\u0001\u0000\u0000"+ - "\u0000\u0319\u031a\u0007\u0001\u0000\u0000\u031a\u031b\u0007\u0002\u0000"+ - "\u0000\u031bu\u0001\u0000\u0000\u0000\u031c\u031d\u0007\r\u0000\u0000"+ - "\u031d\u031e\u0007\f\u0000\u0000\u031e\u031f\u0007\u0002\u0000\u0000\u031f"+ - "\u0320\u0007\u0005\u0000\u0000\u0320w\u0001\u0000\u0000\u0000\u0321\u0322"+ - "\u0007\r\u0000\u0000\u0322\u0323\u0007\u0001\u0000\u0000\u0323\u0324\u0007"+ - "\u0012\u0000\u0000\u0324\u0325\u0007\u0003\u0000\u0000\u0325y\u0001\u0000"+ - "\u0000\u0000\u0326\u0327\u0005(\u0000\u0000\u0327{\u0001\u0000\u0000\u0000"+ - "\u0328\u0329\u0007\t\u0000\u0000\u0329\u032a\u0007\u0007\u0000\u0000\u032a"+ - "\u032b\u0007\u0005\u0000\u0000\u032b}\u0001\u0000\u0000\u0000\u032c\u032d"+ - "\u0007\t\u0000\u0000\u032d\u032e\u0007\u0014\u0000\u0000\u032e\u032f\u0007"+ - "\r\u0000\u0000\u032f\u0330\u0007\r\u0000\u0000\u0330\u007f\u0001\u0000"+ - "\u0000\u0000\u0331\u0332\u0007\t\u0000\u0000\u0332\u0333\u0007\u0014\u0000"+ - "\u0000\u0333\u0334\u0007\r\u0000\u0000\u0334\u0335\u0007\r\u0000\u0000"+ - "\u0335\u0336\u0007\u0002\u0000\u0000\u0336\u0081\u0001\u0000\u0000\u0000"+ - "\u0337\u0338\u0007\u0007\u0000\u0000\u0338\u0339\u0007\u0006\u0000\u0000"+ - "\u0339\u0083\u0001\u0000\u0000\u0000\u033a\u033b\u0005?\u0000\u0000\u033b"+ - "\u0085\u0001\u0000\u0000\u0000\u033c\u033d\u0007\u0006\u0000\u0000\u033d"+ - "\u033e\u0007\r\u0000\u0000\u033e\u033f\u0007\u0001\u0000\u0000\u033f\u0340"+ - "\u0007\u0012\u0000\u0000\u0340\u0341\u0007\u0003\u0000\u0000\u0341\u0087"+ - "\u0001\u0000\u0000\u0000\u0342\u0343\u0005)\u0000\u0000\u0343\u0089\u0001"+ - "\u0000\u0000\u0000\u0344\u0345\u0007\u0005\u0000\u0000\u0345\u0346\u0007"+ - "\u0006\u0000\u0000\u0346\u0347\u0007\u0014\u0000\u0000\u0347\u0348\u0007"+ - "\u0003\u0000\u0000\u0348\u008b\u0001\u0000\u0000\u0000\u0349\u034a\u0005"+ - "=\u0000\u0000\u034a\u034b\u0005=\u0000\u0000\u034b\u008d\u0001\u0000\u0000"+ - "\u0000\u034c\u034d\u0005=\u0000\u0000\u034d\u034e\u0005~\u0000\u0000\u034e"+ - "\u008f\u0001\u0000\u0000\u0000\u034f\u0350\u0005!\u0000\u0000\u0350\u0351"+ - "\u0005=\u0000\u0000\u0351\u0091\u0001\u0000\u0000\u0000\u0352\u0353\u0005"+ - "<\u0000\u0000\u0353\u0093\u0001\u0000\u0000\u0000\u0354\u0355\u0005<\u0000"+ - "\u0000\u0355\u0356\u0005=\u0000\u0000\u0356\u0095\u0001\u0000\u0000\u0000"+ - "\u0357\u0358\u0005>\u0000\u0000\u0358\u0097\u0001\u0000\u0000\u0000\u0359"+ - "\u035a\u0005>\u0000\u0000\u035a\u035b\u0005=\u0000\u0000\u035b\u0099\u0001"+ - "\u0000\u0000\u0000\u035c\u035d\u0005+\u0000\u0000\u035d\u009b\u0001\u0000"+ - "\u0000\u0000\u035e\u035f\u0005-\u0000\u0000\u035f\u009d\u0001\u0000\u0000"+ - "\u0000\u0360\u0361\u0005*\u0000\u0000\u0361\u009f\u0001\u0000\u0000\u0000"+ - "\u0362\u0363\u0005/\u0000\u0000\u0363\u00a1\u0001\u0000\u0000\u0000\u0364"+ - "\u0365\u0005%\u0000\u0000\u0365\u00a3\u0001\u0000\u0000\u0000\u0366\u0367"+ - "\u0004J\u0004\u0000\u0367\u0368\u00036\u0013\u0000\u0368\u0369\u0001\u0000"+ - "\u0000\u0000\u0369\u036a\u0006J\r\u0000\u036a\u00a5\u0001\u0000\u0000"+ - "\u0000\u036b\u036e\u0003\u0084:\u0000\u036c\u036f\u0003F\u001b\u0000\u036d"+ - "\u036f\u0003T\"\u0000\u036e\u036c\u0001\u0000\u0000\u0000\u036e\u036d"+ - "\u0001\u0000\u0000\u0000\u036f\u0373\u0001\u0000\u0000\u0000\u0370\u0372"+ - "\u0003V#\u0000\u0371\u0370\u0001\u0000\u0000\u0000\u0372\u0375\u0001\u0000"+ - "\u0000\u0000\u0373\u0371\u0001\u0000\u0000\u0000\u0373\u0374\u0001\u0000"+ - "\u0000\u0000\u0374\u037d\u0001\u0000\u0000\u0000\u0375\u0373\u0001\u0000"+ - "\u0000\u0000\u0376\u0378\u0003\u0084:\u0000\u0377\u0379\u0003D\u001a\u0000"+ - "\u0378\u0377\u0001\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000"+ - "\u037a\u0378\u0001\u0000\u0000\u0000\u037a\u037b\u0001\u0000\u0000\u0000"+ - "\u037b\u037d\u0001\u0000\u0000\u0000\u037c\u036b\u0001\u0000\u0000\u0000"+ - "\u037c\u0376\u0001\u0000\u0000\u0000\u037d\u00a7\u0001\u0000\u0000\u0000"+ - "\u037e\u037f\u0005[\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380"+ - "\u0381\u0006L\u0000\u0000\u0381\u0382\u0006L\u0000\u0000\u0382\u00a9\u0001"+ - "\u0000\u0000\u0000\u0383\u0384\u0005]\u0000\u0000\u0384\u0385\u0001\u0000"+ - "\u0000\u0000\u0385\u0386\u0006M\f\u0000\u0386\u0387\u0006M\f\u0000\u0387"+ - "\u00ab\u0001\u0000\u0000\u0000\u0388\u038c\u0003F\u001b\u0000\u0389\u038b"+ - "\u0003V#\u0000\u038a\u0389\u0001\u0000\u0000\u0000\u038b\u038e\u0001\u0000"+ - "\u0000\u0000\u038c\u038a\u0001\u0000\u0000\u0000\u038c\u038d\u0001\u0000"+ - "\u0000\u0000\u038d\u0399\u0001\u0000\u0000\u0000\u038e\u038c\u0001\u0000"+ - "\u0000\u0000\u038f\u0392\u0003T\"\u0000\u0390\u0392\u0003N\u001f\u0000"+ - "\u0391\u038f\u0001\u0000\u0000\u0000\u0391\u0390\u0001\u0000\u0000\u0000"+ - "\u0392\u0394\u0001\u0000\u0000\u0000\u0393\u0395\u0003V#\u0000\u0394\u0393"+ - "\u0001\u0000\u0000\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u0394"+ - "\u0001\u0000\u0000\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0399"+ - "\u0001\u0000\u0000\u0000\u0398\u0388\u0001\u0000\u0000\u0000\u0398\u0391"+ - "\u0001\u0000\u0000\u0000\u0399\u00ad\u0001\u0000\u0000\u0000\u039a\u039c"+ - "\u0003P \u0000\u039b\u039d\u0003R!\u0000\u039c\u039b\u0001\u0000\u0000"+ - "\u0000\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ - "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0\u0001\u0000\u0000"+ - "\u0000\u03a0\u03a1\u0003P \u0000\u03a1\u00af\u0001\u0000\u0000\u0000\u03a2"+ - "\u03a3\u0003\u00aeO\u0000\u03a3\u00b1\u0001\u0000\u0000\u0000\u03a4\u03a5"+ - "\u0003<\u0016\u0000\u03a5\u03a6\u0001\u0000\u0000\u0000\u03a6\u03a7\u0006"+ - "Q\u000b\u0000\u03a7\u00b3\u0001\u0000\u0000\u0000\u03a8\u03a9\u0003>\u0017"+ - "\u0000\u03a9\u03aa\u0001\u0000\u0000\u0000\u03aa\u03ab\u0006R\u000b\u0000"+ - "\u03ab\u00b5\u0001\u0000\u0000\u0000\u03ac\u03ad\u0003@\u0018\u0000\u03ad"+ - "\u03ae\u0001\u0000\u0000\u0000\u03ae\u03af\u0006S\u000b\u0000\u03af\u00b7"+ - "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0003\u00a8L\u0000\u03b1\u03b2\u0001"+ - "\u0000\u0000\u0000\u03b2\u03b3\u0006T\u000e\u0000\u03b3\u03b4\u0006T\u000f"+ - "\u0000\u03b4\u00b9\u0001\u0000\u0000\u0000\u03b5\u03b6\u0003B\u0019\u0000"+ - "\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0006U\u0010\u0000\u03b8"+ - "\u03b9\u0006U\f\u0000\u03b9\u00bb\u0001\u0000\u0000\u0000\u03ba\u03bb"+ - "\u0003@\u0018\u0000\u03bb\u03bc\u0001\u0000\u0000\u0000\u03bc\u03bd\u0006"+ - "V\u000b\u0000\u03bd\u00bd\u0001\u0000\u0000\u0000\u03be\u03bf\u0003<\u0016"+ - "\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006W\u000b\u0000"+ - "\u03c1\u00bf\u0001\u0000\u0000\u0000\u03c2\u03c3\u0003>\u0017\u0000\u03c3"+ - "\u03c4\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006X\u000b\u0000\u03c5\u00c1"+ - "\u0001\u0000\u0000\u0000\u03c6\u03c7\u0003B\u0019\u0000\u03c7\u03c8\u0001"+ - "\u0000\u0000\u0000\u03c8\u03c9\u0006Y\u0010\u0000\u03c9\u03ca\u0006Y\f"+ - "\u0000\u03ca\u00c3\u0001\u0000\u0000\u0000\u03cb\u03cc\u0003\u00a8L\u0000"+ - "\u03cc\u03cd\u0001\u0000\u0000\u0000\u03cd\u03ce\u0006Z\u000e\u0000\u03ce"+ - "\u00c5\u0001\u0000\u0000\u0000\u03cf\u03d0\u0003\u00aaM\u0000\u03d0\u03d1"+ - "\u0001\u0000\u0000\u0000\u03d1\u03d2\u0006[\u0011\u0000\u03d2\u00c7\u0001"+ - "\u0000\u0000\u0000\u03d3\u03d4\u0003\u014e\u009f\u0000\u03d4\u03d5\u0001"+ - "\u0000\u0000\u0000\u03d5\u03d6\u0006\\\u0012\u0000\u03d6\u00c9\u0001\u0000"+ - "\u0000\u0000\u03d7\u03d8\u0003h,\u0000\u03d8\u03d9\u0001\u0000\u0000\u0000"+ - "\u03d9\u03da\u0006]\u0013\u0000\u03da\u00cb\u0001\u0000\u0000\u0000\u03db"+ - "\u03dc\u0003d*\u0000\u03dc\u03dd\u0001\u0000\u0000\u0000\u03dd\u03de\u0006"+ - "^\u0014\u0000\u03de\u00cd\u0001\u0000\u0000\u0000\u03df\u03e0\u0007\u0010"+ - "\u0000\u0000\u03e0\u03e1\u0007\u0003\u0000\u0000\u03e1\u03e2\u0007\u0005"+ - "\u0000\u0000\u03e2\u03e3\u0007\f\u0000\u0000\u03e3\u03e4\u0007\u0000\u0000"+ - "\u0000\u03e4\u03e5\u0007\f\u0000\u0000\u03e5\u03e6\u0007\u0005\u0000\u0000"+ - "\u03e6\u03e7\u0007\f\u0000\u0000\u03e7\u00cf\u0001\u0000\u0000\u0000\u03e8"+ - "\u03ec\b \u0000\u0000\u03e9\u03ea\u0005/\u0000\u0000\u03ea\u03ec\b!\u0000"+ - "\u0000\u03eb\u03e8\u0001\u0000\u0000\u0000\u03eb\u03e9\u0001\u0000\u0000"+ - "\u0000\u03ec\u00d1\u0001\u0000\u0000\u0000\u03ed\u03ef\u0003\u00d0`\u0000"+ - "\u03ee\u03ed\u0001\u0000\u0000\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000"+ - "\u03f0\u03ee\u0001\u0000\u0000\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000"+ - "\u03f1\u00d3\u0001\u0000\u0000\u0000\u03f2\u03f3\u0003\u00d2a\u0000\u03f3"+ - "\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006b\u0015\u0000\u03f5\u00d5"+ - "\u0001\u0000\u0000\u0000\u03f6\u03f7\u0003X$\u0000\u03f7\u03f8\u0001\u0000"+ - "\u0000\u0000\u03f8\u03f9\u0006c\u0016\u0000\u03f9\u00d7\u0001\u0000\u0000"+ - "\u0000\u03fa\u03fb\u0003<\u0016\u0000\u03fb\u03fc\u0001\u0000\u0000\u0000"+ - "\u03fc\u03fd\u0006d\u000b\u0000\u03fd\u00d9\u0001\u0000\u0000\u0000\u03fe"+ - "\u03ff\u0003>\u0017\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401"+ - "\u0006e\u000b\u0000\u0401\u00db\u0001\u0000\u0000\u0000\u0402\u0403\u0003"+ - "@\u0018\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0006f\u000b"+ - "\u0000\u0405\u00dd\u0001\u0000\u0000\u0000\u0406\u0407\u0003B\u0019\u0000"+ - "\u0407\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0006g\u0010\u0000\u0409"+ - "\u040a\u0006g\f\u0000\u040a\u00df\u0001\u0000\u0000\u0000\u040b\u040c"+ - "\u0003l.\u0000\u040c\u040d\u0001\u0000\u0000\u0000\u040d\u040e\u0006h"+ - "\u0017\u0000\u040e\u00e1\u0001\u0000\u0000\u0000\u040f\u0410\u0003h,\u0000"+ - "\u0410\u0411\u0001\u0000\u0000\u0000\u0411\u0412\u0006i\u0013\u0000\u0412"+ - "\u00e3\u0001\u0000\u0000\u0000\u0413\u0418\u0003F\u001b\u0000\u0414\u0418"+ - "\u0003D\u001a\u0000\u0415\u0418\u0003T\"\u0000\u0416\u0418\u0003\u009e"+ - "G\u0000\u0417\u0413\u0001\u0000\u0000\u0000\u0417\u0414\u0001\u0000\u0000"+ - "\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0416\u0001\u0000\u0000"+ - "\u0000\u0418\u00e5\u0001\u0000\u0000\u0000\u0419\u041c\u0003F\u001b\u0000"+ - "\u041a\u041c\u0003\u009eG\u0000\u041b\u0419\u0001\u0000\u0000\u0000\u041b"+ - "\u041a\u0001\u0000\u0000\u0000\u041c\u0420\u0001\u0000\u0000\u0000\u041d"+ - "\u041f\u0003\u00e4j\u0000\u041e\u041d\u0001\u0000\u0000\u0000\u041f\u0422"+ - "\u0001\u0000\u0000\u0000\u0420\u041e\u0001\u0000\u0000\u0000\u0420\u0421"+ - "\u0001\u0000\u0000\u0000\u0421\u042d\u0001\u0000\u0000\u0000\u0422\u0420"+ - "\u0001\u0000\u0000\u0000\u0423\u0426\u0003T\"\u0000\u0424\u0426\u0003"+ - "N\u001f\u0000\u0425\u0423\u0001\u0000\u0000\u0000\u0425\u0424\u0001\u0000"+ - "\u0000\u0000\u0426\u0428\u0001\u0000\u0000\u0000\u0427\u0429\u0003\u00e4"+ - "j\u0000\u0428\u0427\u0001\u0000\u0000\u0000\u0429\u042a\u0001\u0000\u0000"+ - "\u0000\u042a\u0428\u0001\u0000\u0000\u0000\u042a\u042b\u0001\u0000\u0000"+ - "\u0000\u042b\u042d\u0001\u0000\u0000\u0000\u042c\u041b\u0001\u0000\u0000"+ - "\u0000\u042c\u0425\u0001\u0000\u0000\u0000\u042d\u00e7\u0001\u0000\u0000"+ - "\u0000\u042e\u0431\u0003\u00e6k\u0000\u042f\u0431\u0003\u00aeO\u0000\u0430"+ - "\u042e\u0001\u0000\u0000\u0000\u0430\u042f\u0001\u0000\u0000\u0000\u0431"+ - "\u0432\u0001\u0000\u0000\u0000\u0432\u0430\u0001\u0000\u0000\u0000\u0432"+ - "\u0433\u0001\u0000\u0000\u0000\u0433\u00e9\u0001\u0000\u0000\u0000\u0434"+ - "\u0435\u0003<\u0016\u0000\u0435\u0436\u0001\u0000\u0000\u0000\u0436\u0437"+ - "\u0006m\u000b\u0000\u0437\u00eb\u0001\u0000\u0000\u0000\u0438\u0439\u0003"+ - ">\u0017\u0000\u0439\u043a\u0001\u0000\u0000\u0000\u043a\u043b\u0006n\u000b"+ - "\u0000\u043b\u00ed\u0001\u0000\u0000\u0000\u043c\u043d\u0003@\u0018\u0000"+ - "\u043d\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0006o\u000b\u0000\u043f"+ - "\u00ef\u0001\u0000\u0000\u0000\u0440\u0441\u0003B\u0019\u0000\u0441\u0442"+ - "\u0001\u0000\u0000\u0000\u0442\u0443\u0006p\u0010\u0000\u0443\u0444\u0006"+ - "p\f\u0000\u0444\u00f1\u0001\u0000\u0000\u0000\u0445\u0446\u0003d*\u0000"+ - "\u0446\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006q\u0014\u0000\u0448"+ - "\u00f3\u0001\u0000\u0000\u0000\u0449\u044a\u0003h,\u0000\u044a\u044b\u0001"+ - "\u0000\u0000\u0000\u044b\u044c\u0006r\u0013\u0000\u044c\u00f5\u0001\u0000"+ - "\u0000\u0000\u044d\u044e\u0003l.\u0000\u044e\u044f\u0001\u0000\u0000\u0000"+ - "\u044f\u0450\u0006s\u0017\u0000\u0450\u00f7\u0001\u0000\u0000\u0000\u0451"+ - "\u0452\u0007\f\u0000\u0000\u0452\u0453\u0007\u0002\u0000\u0000\u0453\u00f9"+ - "\u0001\u0000\u0000\u0000\u0454\u0455\u0003\u00e8l\u0000\u0455\u0456\u0001"+ - "\u0000\u0000\u0000\u0456\u0457\u0006u\u0018\u0000\u0457\u00fb\u0001\u0000"+ - "\u0000\u0000\u0458\u0459\u0003<\u0016\u0000\u0459\u045a\u0001\u0000\u0000"+ - "\u0000\u045a\u045b\u0006v\u000b\u0000\u045b\u00fd\u0001\u0000\u0000\u0000"+ - "\u045c\u045d\u0003>\u0017\u0000\u045d\u045e\u0001\u0000\u0000\u0000\u045e"+ - "\u045f\u0006w\u000b\u0000\u045f\u00ff\u0001\u0000\u0000\u0000\u0460\u0461"+ - "\u0003@\u0018\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463\u0006"+ - "x\u000b\u0000\u0463\u0101\u0001\u0000\u0000\u0000\u0464\u0465\u0003B\u0019"+ - "\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466\u0467\u0006y\u0010\u0000"+ - "\u0467\u0468\u0006y\f\u0000\u0468\u0103\u0001\u0000\u0000\u0000\u0469"+ - "\u046a\u0003\u00a8L\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u046c"+ - "\u0006z\u000e\u0000\u046c\u046d\u0006z\u0019\u0000\u046d\u0105\u0001\u0000"+ - "\u0000\u0000\u046e\u046f\u0007\u0007\u0000\u0000\u046f\u0470\u0007\t\u0000"+ - "\u0000\u0470\u0471\u0001\u0000\u0000\u0000\u0471\u0472\u0006{\u001a\u0000"+ - "\u0472\u0107\u0001\u0000\u0000\u0000\u0473\u0474\u0007\u0013\u0000\u0000"+ - "\u0474\u0475\u0007\u0001\u0000\u0000\u0475\u0476\u0007\u0005\u0000\u0000"+ - "\u0476\u0477\u0007\n\u0000\u0000\u0477\u0478\u0001\u0000\u0000\u0000\u0478"+ - "\u0479\u0006|\u001a\u0000\u0479\u0109\u0001\u0000\u0000\u0000\u047a\u047b"+ - "\b\"\u0000\u0000\u047b\u010b\u0001\u0000\u0000\u0000\u047c\u047e\u0003"+ - "\u010a}\u0000\u047d\u047c\u0001\u0000\u0000\u0000\u047e\u047f\u0001\u0000"+ - "\u0000\u0000\u047f\u047d\u0001\u0000\u0000\u0000\u047f\u0480\u0001\u0000"+ - "\u0000\u0000\u0480\u0481\u0001\u0000\u0000\u0000\u0481\u0482\u0003\u014e"+ - "\u009f\u0000\u0482\u0484\u0001\u0000\u0000\u0000\u0483\u047d\u0001\u0000"+ - "\u0000\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0486\u0001\u0000"+ - "\u0000\u0000\u0485\u0487\u0003\u010a}\u0000\u0486\u0485\u0001\u0000\u0000"+ - "\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0486\u0001\u0000\u0000"+ - "\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u010d\u0001\u0000\u0000"+ - "\u0000\u048a\u048b\u0003\u010c~\u0000\u048b\u048c\u0001\u0000\u0000\u0000"+ - "\u048c\u048d\u0006\u007f\u001b\u0000\u048d\u010f\u0001\u0000\u0000\u0000"+ - "\u048e\u048f\u0003<\u0016\u0000\u048f\u0490\u0001\u0000\u0000\u0000\u0490"+ - "\u0491\u0006\u0080\u000b\u0000\u0491\u0111\u0001\u0000\u0000\u0000\u0492"+ - "\u0493\u0003>\u0017\u0000\u0493\u0494\u0001\u0000\u0000\u0000\u0494\u0495"+ - "\u0006\u0081\u000b\u0000\u0495\u0113\u0001\u0000\u0000\u0000\u0496\u0497"+ - "\u0003@\u0018\u0000\u0497\u0498\u0001\u0000\u0000\u0000\u0498\u0499\u0006"+ - "\u0082\u000b\u0000\u0499\u0115\u0001\u0000\u0000\u0000\u049a\u049b\u0003"+ - "B\u0019\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049d\u0006\u0083"+ - "\u0010\u0000\u049d\u049e\u0006\u0083\f\u0000\u049e\u049f\u0006\u0083\f"+ - "\u0000\u049f\u0117\u0001\u0000\u0000\u0000\u04a0\u04a1\u0003d*\u0000\u04a1"+ - "\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3\u0006\u0084\u0014\u0000\u04a3"+ - "\u0119\u0001\u0000\u0000\u0000\u04a4\u04a5\u0003h,\u0000\u04a5\u04a6\u0001"+ - "\u0000\u0000\u0000\u04a6\u04a7\u0006\u0085\u0013\u0000\u04a7\u011b\u0001"+ - "\u0000\u0000\u0000\u04a8\u04a9\u0003l.\u0000\u04a9\u04aa\u0001\u0000\u0000"+ - "\u0000\u04aa\u04ab\u0006\u0086\u0017\u0000\u04ab\u011d\u0001\u0000\u0000"+ - "\u0000\u04ac\u04ad\u0003\u0108|\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000"+ - "\u04ae\u04af\u0006\u0087\u001c\u0000\u04af\u011f\u0001\u0000\u0000\u0000"+ - "\u04b0\u04b1\u0003\u00e8l\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2"+ - "\u04b3\u0006\u0088\u0018\u0000\u04b3\u0121\u0001\u0000\u0000\u0000\u04b4"+ - "\u04b5\u0003\u00b0P\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7"+ - "\u0006\u0089\u001d\u0000\u04b7\u0123\u0001\u0000\u0000\u0000\u04b8\u04b9"+ - "\u0003<\u0016\u0000\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006"+ - "\u008a\u000b\u0000\u04bb\u0125\u0001\u0000\u0000\u0000\u04bc\u04bd\u0003"+ - ">\u0017\u0000\u04bd\u04be\u0001\u0000\u0000\u0000\u04be\u04bf\u0006\u008b"+ - "\u000b\u0000\u04bf\u0127\u0001\u0000\u0000\u0000\u04c0\u04c1\u0003@\u0018"+ - "\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006\u008c\u000b"+ - "\u0000\u04c3\u0129\u0001\u0000\u0000\u0000\u04c4\u04c5\u0003B\u0019\u0000"+ - "\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04c7\u0006\u008d\u0010\u0000"+ - "\u04c7\u04c8\u0006\u008d\f\u0000\u04c8\u012b\u0001\u0000\u0000\u0000\u04c9"+ - "\u04ca\u0003l.\u0000\u04ca\u04cb\u0001\u0000\u0000\u0000\u04cb\u04cc\u0006"+ - "\u008e\u0017\u0000\u04cc\u012d\u0001\u0000\u0000\u0000\u04cd\u04ce\u0003"+ - "\u00b0P\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000\u04cf\u04d0\u0006\u008f"+ - "\u001d\u0000\u04d0\u012f\u0001\u0000\u0000\u0000\u04d1\u04d2\u0003\u00ac"+ - "N\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0006\u0090\u001e"+ - "\u0000\u04d4\u0131\u0001\u0000\u0000\u0000\u04d5\u04d6\u0003<\u0016\u0000"+ - "\u04d6\u04d7\u0001\u0000\u0000\u0000\u04d7\u04d8\u0006\u0091\u000b\u0000"+ - "\u04d8\u0133\u0001\u0000\u0000\u0000\u04d9\u04da\u0003>\u0017\u0000\u04da"+ - "\u04db\u0001\u0000\u0000\u0000\u04db\u04dc\u0006\u0092\u000b\u0000\u04dc"+ - "\u0135\u0001\u0000\u0000\u0000\u04dd\u04de\u0003@\u0018\u0000\u04de\u04df"+ - "\u0001\u0000\u0000\u0000\u04df\u04e0\u0006\u0093\u000b\u0000\u04e0\u0137"+ - "\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003B\u0019\u0000\u04e2\u04e3\u0001"+ - "\u0000\u0000\u0000\u04e3\u04e4\u0006\u0094\u0010\u0000\u04e4\u04e5\u0006"+ - "\u0094\f\u0000\u04e5\u0139\u0001\u0000\u0000\u0000\u04e6\u04e7\u0007\u0001"+ - "\u0000\u0000\u04e7\u04e8\u0007\t\u0000\u0000\u04e8\u04e9\u0007\u000f\u0000"+ - "\u0000\u04e9\u04ea\u0007\u0007\u0000\u0000\u04ea\u013b\u0001\u0000\u0000"+ - "\u0000\u04eb\u04ec\u0003<\u0016\u0000\u04ec\u04ed\u0001\u0000\u0000\u0000"+ - "\u04ed\u04ee\u0006\u0096\u000b\u0000\u04ee\u013d\u0001\u0000\u0000\u0000"+ - "\u04ef\u04f0\u0003>\u0017\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1"+ - "\u04f2\u0006\u0097\u000b\u0000\u04f2\u013f\u0001\u0000\u0000\u0000\u04f3"+ - "\u04f4\u0003@\u0018\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000\u04f5\u04f6"+ - "\u0006\u0098\u000b\u0000\u04f6\u0141\u0001\u0000\u0000\u0000\u04f7\u04f8"+ - "\u0003B\u0019\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u04fa\u0006"+ - "\u0099\u0010\u0000\u04fa\u04fb\u0006\u0099\f\u0000\u04fb\u0143\u0001\u0000"+ - "\u0000\u0000\u04fc\u04fd\u0007\u000f\u0000\u0000\u04fd\u04fe\u0007\u0014"+ - "\u0000\u0000\u04fe\u04ff\u0007\t\u0000\u0000\u04ff\u0500\u0007\u0004\u0000"+ - "\u0000\u0500\u0501\u0007\u0005\u0000\u0000\u0501\u0502\u0007\u0001\u0000"+ - "\u0000\u0502\u0503\u0007\u0007\u0000\u0000\u0503\u0504\u0007\t\u0000\u0000"+ - "\u0504\u0505\u0007\u0002\u0000\u0000\u0505\u0145\u0001\u0000\u0000\u0000"+ - "\u0506\u0507\u0003<\u0016\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508"+ - "\u0509\u0006\u009b\u000b\u0000\u0509\u0147\u0001\u0000\u0000\u0000\u050a"+ - "\u050b\u0003>\u0017\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c\u050d"+ - "\u0006\u009c\u000b\u0000\u050d\u0149\u0001\u0000\u0000\u0000\u050e\u050f"+ - "\u0003@\u0018\u0000\u050f\u0510\u0001\u0000\u0000\u0000\u0510\u0511\u0006"+ - "\u009d\u000b\u0000\u0511\u014b\u0001\u0000\u0000\u0000\u0512\u0513\u0003"+ - "\u00aaM\u0000\u0513\u0514\u0001\u0000\u0000\u0000\u0514\u0515\u0006\u009e"+ - "\u0011\u0000\u0515\u0516\u0006\u009e\f\u0000\u0516\u014d\u0001\u0000\u0000"+ - "\u0000\u0517\u0518\u0005:\u0000\u0000\u0518\u014f\u0001\u0000\u0000\u0000"+ - "\u0519\u051f\u0003N\u001f\u0000\u051a\u051f\u0003D\u001a\u0000\u051b\u051f"+ - "\u0003l.\u0000\u051c\u051f\u0003F\u001b\u0000\u051d\u051f\u0003T\"\u0000"+ - "\u051e\u0519\u0001\u0000\u0000\u0000\u051e\u051a\u0001\u0000\u0000\u0000"+ - "\u051e\u051b\u0001\u0000\u0000\u0000\u051e\u051c\u0001\u0000\u0000\u0000"+ - "\u051e\u051d\u0001\u0000\u0000\u0000\u051f\u0520\u0001\u0000\u0000\u0000"+ - "\u0520\u051e\u0001\u0000\u0000\u0000\u0520\u0521\u0001\u0000\u0000\u0000"+ - "\u0521\u0151\u0001\u0000\u0000\u0000\u0522\u0523\u0003<\u0016\u0000\u0523"+ - "\u0524\u0001\u0000\u0000\u0000\u0524\u0525\u0006\u00a1\u000b\u0000\u0525"+ - "\u0153\u0001\u0000\u0000\u0000\u0526\u0527\u0003>\u0017\u0000\u0527\u0528"+ - "\u0001\u0000\u0000\u0000\u0528\u0529\u0006\u00a2\u000b\u0000\u0529\u0155"+ - "\u0001\u0000\u0000\u0000\u052a\u052b\u0003@\u0018\u0000\u052b\u052c\u0001"+ - "\u0000\u0000\u0000\u052c\u052d\u0006\u00a3\u000b\u0000\u052d\u0157\u0001"+ - "\u0000\u0000\u0000\u052e\u052f\u0003B\u0019\u0000\u052f\u0530\u0001\u0000"+ - "\u0000\u0000\u0530\u0531\u0006\u00a4\u0010\u0000\u0531\u0532\u0006\u00a4"+ - "\f\u0000\u0532\u0159\u0001\u0000\u0000\u0000\u0533\u0534\u0003\u014e\u009f"+ - "\u0000\u0534\u0535\u0001\u0000\u0000\u0000\u0535\u0536\u0006\u00a5\u0012"+ - "\u0000\u0536\u015b\u0001\u0000\u0000\u0000\u0537\u0538\u0003h,\u0000\u0538"+ - "\u0539\u0001\u0000\u0000\u0000\u0539\u053a\u0006\u00a6\u0013\u0000\u053a"+ - "\u015d\u0001\u0000\u0000\u0000\u053b\u053c\u0003l.\u0000\u053c\u053d\u0001"+ - "\u0000\u0000\u0000\u053d\u053e\u0006\u00a7\u0017\u0000\u053e\u015f\u0001"+ - "\u0000\u0000\u0000\u053f\u0540\u0003\u0106{\u0000\u0540\u0541\u0001\u0000"+ - "\u0000\u0000\u0541\u0542\u0006\u00a8\u001f\u0000\u0542\u0543\u0006\u00a8"+ - " \u0000\u0543\u0161\u0001\u0000\u0000\u0000\u0544\u0545\u0003\u00d2a\u0000"+ - "\u0545\u0546\u0001\u0000\u0000\u0000\u0546\u0547\u0006\u00a9\u0015\u0000"+ - "\u0547\u0163\u0001\u0000\u0000\u0000\u0548\u0549\u0003X$\u0000\u0549\u054a"+ - "\u0001\u0000\u0000\u0000\u054a\u054b\u0006\u00aa\u0016\u0000\u054b\u0165"+ - "\u0001\u0000\u0000\u0000\u054c\u054d\u0003<\u0016\u0000\u054d\u054e\u0001"+ - "\u0000\u0000\u0000\u054e\u054f\u0006\u00ab\u000b\u0000\u054f\u0167\u0001"+ - "\u0000\u0000\u0000\u0550\u0551\u0003>\u0017\u0000\u0551\u0552\u0001\u0000"+ - "\u0000\u0000\u0552\u0553\u0006\u00ac\u000b\u0000\u0553\u0169\u0001\u0000"+ - "\u0000\u0000\u0554\u0555\u0003@\u0018\u0000\u0555\u0556\u0001\u0000\u0000"+ - "\u0000\u0556\u0557\u0006\u00ad\u000b\u0000\u0557\u016b\u0001\u0000\u0000"+ - "\u0000\u0558\u0559\u0003B\u0019\u0000\u0559\u055a\u0001\u0000\u0000\u0000"+ - "\u055a\u055b\u0006\u00ae\u0010\u0000\u055b\u055c\u0006\u00ae\f\u0000\u055c"+ - "\u055d\u0006\u00ae\f\u0000\u055d\u016d\u0001\u0000\u0000\u0000\u055e\u055f"+ - "\u0003h,\u0000\u055f\u0560\u0001\u0000\u0000\u0000\u0560\u0561\u0006\u00af"+ - "\u0013\u0000\u0561\u016f\u0001\u0000\u0000\u0000\u0562\u0563\u0003l.\u0000"+ - "\u0563\u0564\u0001\u0000\u0000\u0000\u0564\u0565\u0006\u00b0\u0017\u0000"+ - "\u0565\u0171\u0001\u0000\u0000\u0000\u0566\u0567\u0003\u00e8l\u0000\u0567"+ - "\u0568\u0001\u0000\u0000\u0000\u0568\u0569\u0006\u00b1\u0018\u0000\u0569"+ - "\u0173\u0001\u0000\u0000\u0000\u056a\u056b\u0003<\u0016\u0000\u056b\u056c"+ - "\u0001\u0000\u0000\u0000\u056c\u056d\u0006\u00b2\u000b\u0000\u056d\u0175"+ - "\u0001\u0000\u0000\u0000\u056e\u056f\u0003>\u0017\u0000\u056f\u0570\u0001"+ - "\u0000\u0000\u0000\u0570\u0571\u0006\u00b3\u000b\u0000\u0571\u0177\u0001"+ - "\u0000\u0000\u0000\u0572\u0573\u0003@\u0018\u0000\u0573\u0574\u0001\u0000"+ - "\u0000\u0000\u0574\u0575\u0006\u00b4\u000b\u0000\u0575\u0179\u0001\u0000"+ - "\u0000\u0000\u0576\u0577\u0003B\u0019\u0000\u0577\u0578\u0001\u0000\u0000"+ - "\u0000\u0578\u0579\u0006\u00b5\u0010\u0000\u0579\u057a\u0006\u00b5\f\u0000"+ - "\u057a\u017b\u0001\u0000\u0000\u0000\u057b\u057c\u0003\u00d2a\u0000\u057c"+ - "\u057d\u0001\u0000\u0000\u0000\u057d\u057e\u0006\u00b6\u0015\u0000\u057e"+ - "\u057f\u0006\u00b6\f\u0000\u057f\u0580\u0006\u00b6!\u0000\u0580\u017d"+ - "\u0001\u0000\u0000\u0000\u0581\u0582\u0003X$\u0000\u0582\u0583\u0001\u0000"+ - "\u0000\u0000\u0583\u0584\u0006\u00b7\u0016\u0000\u0584\u0585\u0006\u00b7"+ - "\f\u0000\u0585\u0586\u0006\u00b7!\u0000\u0586\u017f\u0001\u0000\u0000"+ - "\u0000\u0587\u0588\u0003<\u0016\u0000\u0588\u0589\u0001\u0000\u0000\u0000"+ - "\u0589\u058a\u0006\u00b8\u000b\u0000\u058a\u0181\u0001\u0000\u0000\u0000"+ - "\u058b\u058c\u0003>\u0017\u0000\u058c\u058d\u0001\u0000\u0000\u0000\u058d"+ - "\u058e\u0006\u00b9\u000b\u0000\u058e\u0183\u0001\u0000\u0000\u0000\u058f"+ - "\u0590\u0003@\u0018\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u0592"+ - "\u0006\u00ba\u000b\u0000\u0592\u0185\u0001\u0000\u0000\u0000\u0593\u0594"+ - "\u0003\u014e\u009f\u0000\u0594\u0595\u0001\u0000\u0000\u0000\u0595\u0596"+ - "\u0006\u00bb\u0012\u0000\u0596\u0597\u0006\u00bb\f\u0000\u0597\u0598\u0006"+ - "\u00bb\n\u0000\u0598\u0187\u0001\u0000\u0000\u0000\u0599\u059a\u0003h"+ - ",\u0000\u059a\u059b\u0001\u0000\u0000\u0000\u059b\u059c\u0006\u00bc\u0013"+ - "\u0000\u059c\u059d\u0006\u00bc\f\u0000\u059d\u059e\u0006\u00bc\n\u0000"+ - "\u059e\u0189\u0001\u0000\u0000\u0000\u059f\u05a0\u0003<\u0016\u0000\u05a0"+ - "\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2\u0006\u00bd\u000b\u0000\u05a2"+ - "\u018b\u0001\u0000\u0000\u0000\u05a3\u05a4\u0003>\u0017\u0000\u05a4\u05a5"+ - "\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00be\u000b\u0000\u05a6\u018d"+ - "\u0001\u0000\u0000\u0000\u05a7\u05a8\u0003@\u0018\u0000\u05a8\u05a9\u0001"+ - "\u0000\u0000\u0000\u05a9\u05aa\u0006\u00bf\u000b\u0000\u05aa\u018f\u0001"+ - "\u0000\u0000\u0000\u05ab\u05ac\u0003\u00b0P\u0000\u05ac\u05ad\u0001\u0000"+ - "\u0000\u0000\u05ad\u05ae\u0006\u00c0\f\u0000\u05ae\u05af\u0006\u00c0\u0000"+ - "\u0000\u05af\u05b0\u0006\u00c0\u001d\u0000\u05b0\u0191\u0001\u0000\u0000"+ - "\u0000\u05b1\u05b2\u0003\u00acN\u0000\u05b2\u05b3\u0001\u0000\u0000\u0000"+ - "\u05b3\u05b4\u0006\u00c1\f\u0000\u05b4\u05b5\u0006\u00c1\u0000\u0000\u05b5"+ - "\u05b6\u0006\u00c1\u001e\u0000\u05b6\u0193\u0001\u0000\u0000\u0000\u05b7"+ - "\u05b8\u0003^\'\u0000\u05b8\u05b9\u0001\u0000\u0000\u0000\u05b9\u05ba"+ - "\u0006\u00c2\f\u0000\u05ba\u05bb\u0006\u00c2\u0000\u0000\u05bb\u05bc\u0006"+ - "\u00c2\"\u0000\u05bc\u0195\u0001\u0000\u0000\u0000\u05bd\u05be\u0003B"+ - "\u0019\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u0006\u00c3"+ - "\u0010\u0000\u05c0\u05c1\u0006\u00c3\f\u0000\u05c1\u0197\u0001\u0000\u0000"+ - "\u0000B\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+ - "\r\u000e\u000f\u0250\u025a\u025e\u0261\u026a\u026c\u0277\u028a\u028f\u0298"+ - "\u029f\u02a4\u02a6\u02b1\u02b9\u02bc\u02be\u02c3\u02c8\u02ce\u02d5\u02da"+ - "\u02e0\u02e3\u02eb\u02ef\u036e\u0373\u037a\u037c\u038c\u0391\u0396\u0398"+ - "\u039e\u03eb\u03f0\u0417\u041b\u0420\u0425\u042a\u042c\u0430\u0432\u047f"+ - "\u0483\u0488\u051e\u0520#\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006"+ - "\u0000\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000"+ - "\u0005\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000"+ - "\u0001\u0000\u0004\u0000\u0000\u0007\u0014\u0000\u0007B\u0000\u0005\u0000"+ - "\u0000\u0007\u001a\u0000\u0007C\u0000\u0007m\u0000\u0007#\u0000\u0007"+ - "!\u0000\u0007M\u0000\u0007\u001b\u0000\u0007%\u0000\u0007Q\u0000\u0005"+ - "\u000b\u0000\u0005\u0007\u0000\u0007[\u0000\u0007Z\u0000\u0007E\u0000"+ - "\u0007D\u0000\u0007Y\u0000\u0005\r\u0000\u0005\u000f\u0000\u0007\u001e"+ - "\u0000"; + "\u0164r\u0166s\u0168t\u016a\u0000\u016c\u0000\u016e\u0000\u0170\u0000"+ + "\u0172u\u0174v\u0176w\u0178\u0000\u017a\u0000\u017c\u0000\u017ex\u0180"+ + "y\u0182z\u0184\u0000\u0186\u0000\u0188{\u018a|\u018c}\u018e\u0000\u0190"+ + "\u0000\u0192\u0000\u0194\u0000\u0010\u0000\u0001\u0002\u0003\u0004\u0005"+ + "\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f#\u0002\u0000DDdd\u0002\u0000"+ + "IIii\u0002\u0000SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002"+ + "\u0000RRrr\u0002\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000"+ + "HHhh\u0002\u0000VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002"+ + "\u0000FFff\u0002\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000"+ + "WWww\u0002\u0000UUuu\u0006\u0000\t\n\r\r //[[]]\u0002\u0000\n\n\r\r\u0003"+ + "\u0000\t\n\r\r \u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\n"+ + "nrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002"+ + "\u0000BBbb\u0002\u0000YYyy\u000b\u0000\t\n\r\r \"\",,//::==[[]]||\u0002"+ + "\u0000**//\u000b\u0000\t\n\r\r \"#,,//::<<>?\\\\||\u05d4\u0000\u0010"+ + "\u0001\u0000\u0000\u0000\u0000\u0012\u0001\u0000\u0000\u0000\u0000\u0014"+ + "\u0001\u0000\u0000\u0000\u0000\u0016\u0001\u0000\u0000\u0000\u0000\u0018"+ + "\u0001\u0000\u0000\u0000\u0000\u001a\u0001\u0000\u0000\u0000\u0000\u001c"+ + "\u0001\u0000\u0000\u0000\u0000\u001e\u0001\u0000\u0000\u0000\u0000 \u0001"+ + "\u0000\u0000\u0000\u0000\"\u0001\u0000\u0000\u0000\u0000$\u0001\u0000"+ + "\u0000\u0000\u0000&\u0001\u0000\u0000\u0000\u0000(\u0001\u0000\u0000\u0000"+ + "\u0000*\u0001\u0000\u0000\u0000\u0000,\u0001\u0000\u0000\u0000\u0000."+ + "\u0001\u0000\u0000\u0000\u00000\u0001\u0000\u0000\u0000\u00002\u0001\u0000"+ + "\u0000\u0000\u00004\u0001\u0000\u0000\u0000\u00006\u0001\u0000\u0000\u0000"+ + "\u00008\u0001\u0000\u0000\u0000\u0000:\u0001\u0000\u0000\u0000\u0000<"+ + "\u0001\u0000\u0000\u0000\u0000>\u0001\u0000\u0000\u0000\u0001@\u0001\u0000"+ + "\u0000\u0000\u0001V\u0001\u0000\u0000\u0000\u0001X\u0001\u0000\u0000\u0000"+ + "\u0001Z\u0001\u0000\u0000\u0000\u0001\\\u0001\u0000\u0000\u0000\u0001"+ + "^\u0001\u0000\u0000\u0000\u0001`\u0001\u0000\u0000\u0000\u0001b\u0001"+ + "\u0000\u0000\u0000\u0001d\u0001\u0000\u0000\u0000\u0001f\u0001\u0000\u0000"+ + "\u0000\u0001h\u0001\u0000\u0000\u0000\u0001j\u0001\u0000\u0000\u0000\u0001"+ + "l\u0001\u0000\u0000\u0000\u0001n\u0001\u0000\u0000\u0000\u0001p\u0001"+ + "\u0000\u0000\u0000\u0001r\u0001\u0000\u0000\u0000\u0001t\u0001\u0000\u0000"+ + "\u0000\u0001v\u0001\u0000\u0000\u0000\u0001x\u0001\u0000\u0000\u0000\u0001"+ + "z\u0001\u0000\u0000\u0000\u0001|\u0001\u0000\u0000\u0000\u0001~\u0001"+ + "\u0000\u0000\u0000\u0001\u0080\u0001\u0000\u0000\u0000\u0001\u0082\u0001"+ + "\u0000\u0000\u0000\u0001\u0084\u0001\u0000\u0000\u0000\u0001\u0086\u0001"+ + "\u0000\u0000\u0000\u0001\u0088\u0001\u0000\u0000\u0000\u0001\u008a\u0001"+ + "\u0000\u0000\u0000\u0001\u008c\u0001\u0000\u0000\u0000\u0001\u008e\u0001"+ + "\u0000\u0000\u0000\u0001\u0090\u0001\u0000\u0000\u0000\u0001\u0092\u0001"+ + "\u0000\u0000\u0000\u0001\u0094\u0001\u0000\u0000\u0000\u0001\u0096\u0001"+ + "\u0000\u0000\u0000\u0001\u0098\u0001\u0000\u0000\u0000\u0001\u009a\u0001"+ + "\u0000\u0000\u0000\u0001\u009c\u0001\u0000\u0000\u0000\u0001\u009e\u0001"+ + "\u0000\u0000\u0000\u0001\u00a0\u0001\u0000\u0000\u0000\u0001\u00a2\u0001"+ + "\u0000\u0000\u0000\u0001\u00a4\u0001\u0000\u0000\u0000\u0001\u00a6\u0001"+ + "\u0000\u0000\u0000\u0001\u00a8\u0001\u0000\u0000\u0000\u0001\u00aa\u0001"+ + "\u0000\u0000\u0000\u0001\u00ae\u0001\u0000\u0000\u0000\u0001\u00b0\u0001"+ + "\u0000\u0000\u0000\u0001\u00b2\u0001\u0000\u0000\u0000\u0001\u00b4\u0001"+ + "\u0000\u0000\u0000\u0002\u00b6\u0001\u0000\u0000\u0000\u0002\u00b8\u0001"+ + "\u0000\u0000\u0000\u0002\u00ba\u0001\u0000\u0000\u0000\u0002\u00bc\u0001"+ + "\u0000\u0000\u0000\u0002\u00be\u0001\u0000\u0000\u0000\u0003\u00c0\u0001"+ + "\u0000\u0000\u0000\u0003\u00c2\u0001\u0000\u0000\u0000\u0003\u00c4\u0001"+ + "\u0000\u0000\u0000\u0003\u00c6\u0001\u0000\u0000\u0000\u0003\u00c8\u0001"+ + "\u0000\u0000\u0000\u0003\u00ca\u0001\u0000\u0000\u0000\u0003\u00cc\u0001"+ + "\u0000\u0000\u0000\u0003\u00d0\u0001\u0000\u0000\u0000\u0003\u00d2\u0001"+ + "\u0000\u0000\u0000\u0003\u00d4\u0001\u0000\u0000\u0000\u0003\u00d6\u0001"+ + "\u0000\u0000\u0000\u0003\u00d8\u0001\u0000\u0000\u0000\u0003\u00da\u0001"+ + "\u0000\u0000\u0000\u0004\u00dc\u0001\u0000\u0000\u0000\u0004\u00de\u0001"+ + "\u0000\u0000\u0000\u0004\u00e0\u0001\u0000\u0000\u0000\u0004\u00e6\u0001"+ + "\u0000\u0000\u0000\u0004\u00e8\u0001\u0000\u0000\u0000\u0004\u00ea\u0001"+ + "\u0000\u0000\u0000\u0004\u00ec\u0001\u0000\u0000\u0000\u0005\u00ee\u0001"+ + "\u0000\u0000\u0000\u0005\u00f0\u0001\u0000\u0000\u0000\u0005\u00f2\u0001"+ + "\u0000\u0000\u0000\u0005\u00f4\u0001\u0000\u0000\u0000\u0005\u00f6\u0001"+ + "\u0000\u0000\u0000\u0005\u00f8\u0001\u0000\u0000\u0000\u0005\u00fa\u0001"+ + "\u0000\u0000\u0000\u0005\u00fc\u0001\u0000\u0000\u0000\u0005\u00fe\u0001"+ + "\u0000\u0000\u0000\u0006\u0100\u0001\u0000\u0000\u0000\u0006\u0102\u0001"+ + "\u0000\u0000\u0000\u0006\u0104\u0001\u0000\u0000\u0000\u0006\u0106\u0001"+ + "\u0000\u0000\u0000\u0006\u010a\u0001\u0000\u0000\u0000\u0006\u010c\u0001"+ + "\u0000\u0000\u0000\u0006\u010e\u0001\u0000\u0000\u0000\u0006\u0110\u0001"+ + "\u0000\u0000\u0000\u0006\u0112\u0001\u0000\u0000\u0000\u0007\u0114\u0001"+ + "\u0000\u0000\u0000\u0007\u0116\u0001\u0000\u0000\u0000\u0007\u0118\u0001"+ + "\u0000\u0000\u0000\u0007\u011a\u0001\u0000\u0000\u0000\u0007\u011c\u0001"+ + "\u0000\u0000\u0000\u0007\u011e\u0001\u0000\u0000\u0000\u0007\u0120\u0001"+ + "\u0000\u0000\u0000\u0007\u0122\u0001\u0000\u0000\u0000\u0007\u0124\u0001"+ + "\u0000\u0000\u0000\u0007\u0126\u0001\u0000\u0000\u0000\b\u0128\u0001\u0000"+ + "\u0000\u0000\b\u012a\u0001\u0000\u0000\u0000\b\u012c\u0001\u0000\u0000"+ + "\u0000\b\u012e\u0001\u0000\u0000\u0000\b\u0130\u0001\u0000\u0000\u0000"+ + "\b\u0132\u0001\u0000\u0000\u0000\b\u0134\u0001\u0000\u0000\u0000\t\u0136"+ + "\u0001\u0000\u0000\u0000\t\u0138\u0001\u0000\u0000\u0000\t\u013a\u0001"+ + "\u0000\u0000\u0000\t\u013c\u0001\u0000\u0000\u0000\t\u013e\u0001\u0000"+ + "\u0000\u0000\n\u0140\u0001\u0000\u0000\u0000\n\u0142\u0001\u0000\u0000"+ + "\u0000\n\u0144\u0001\u0000\u0000\u0000\n\u0146\u0001\u0000\u0000\u0000"+ + "\n\u0148\u0001\u0000\u0000\u0000\u000b\u014a\u0001\u0000\u0000\u0000\u000b"+ + "\u014c\u0001\u0000\u0000\u0000\u000b\u014e\u0001\u0000\u0000\u0000\u000b"+ + "\u0150\u0001\u0000\u0000\u0000\u000b\u0152\u0001\u0000\u0000\u0000\u000b"+ + "\u0154\u0001\u0000\u0000\u0000\f\u0156\u0001\u0000\u0000\u0000\f\u0158"+ + "\u0001\u0000\u0000\u0000\f\u015a\u0001\u0000\u0000\u0000\f\u015c\u0001"+ + "\u0000\u0000\u0000\f\u015e\u0001\u0000\u0000\u0000\f\u0160\u0001\u0000"+ + "\u0000\u0000\f\u0162\u0001\u0000\u0000\u0000\f\u0164\u0001\u0000\u0000"+ + "\u0000\f\u0166\u0001\u0000\u0000\u0000\f\u0168\u0001\u0000\u0000\u0000"+ + "\r\u016a\u0001\u0000\u0000\u0000\r\u016c\u0001\u0000\u0000\u0000\r\u016e"+ + "\u0001\u0000\u0000\u0000\r\u0170\u0001\u0000\u0000\u0000\r\u0172\u0001"+ + "\u0000\u0000\u0000\r\u0174\u0001\u0000\u0000\u0000\r\u0176\u0001\u0000"+ + "\u0000\u0000\u000e\u0178\u0001\u0000\u0000\u0000\u000e\u017a\u0001\u0000"+ + "\u0000\u0000\u000e\u017c\u0001\u0000\u0000\u0000\u000e\u017e\u0001\u0000"+ + "\u0000\u0000\u000e\u0180\u0001\u0000\u0000\u0000\u000e\u0182\u0001\u0000"+ + "\u0000\u0000\u000f\u0184\u0001\u0000\u0000\u0000\u000f\u0186\u0001\u0000"+ + "\u0000\u0000\u000f\u0188\u0001\u0000\u0000\u0000\u000f\u018a\u0001\u0000"+ + "\u0000\u0000\u000f\u018c\u0001\u0000\u0000\u0000\u000f\u018e\u0001\u0000"+ + "\u0000\u0000\u000f\u0190\u0001\u0000\u0000\u0000\u000f\u0192\u0001\u0000"+ + "\u0000\u0000\u000f\u0194\u0001\u0000\u0000\u0000\u0010\u0196\u0001\u0000"+ + "\u0000\u0000\u0012\u01a0\u0001\u0000\u0000\u0000\u0014\u01a7\u0001\u0000"+ + "\u0000\u0000\u0016\u01b0\u0001\u0000\u0000\u0000\u0018\u01b7\u0001\u0000"+ + "\u0000\u0000\u001a\u01c1\u0001\u0000\u0000\u0000\u001c\u01c8\u0001\u0000"+ + "\u0000\u0000\u001e\u01cf\u0001\u0000\u0000\u0000 \u01d6\u0001\u0000\u0000"+ + "\u0000\"\u01de\u0001\u0000\u0000\u0000$\u01e5\u0001\u0000\u0000\u0000"+ + "&\u01f1\u0001\u0000\u0000\u0000(\u01fa\u0001\u0000\u0000\u0000*\u0200"+ + "\u0001\u0000\u0000\u0000,\u0207\u0001\u0000\u0000\u0000.\u020e\u0001\u0000"+ + "\u0000\u00000\u0216\u0001\u0000\u0000\u00002\u021e\u0001\u0000\u0000\u0000"+ + "4\u022d\u0001\u0000\u0000\u00006\u0237\u0001\u0000\u0000\u00008\u0243"+ + "\u0001\u0000\u0000\u0000:\u0249\u0001\u0000\u0000\u0000<\u025a\u0001\u0000"+ + "\u0000\u0000>\u026a\u0001\u0000\u0000\u0000@\u0270\u0001\u0000\u0000\u0000"+ + "B\u0274\u0001\u0000\u0000\u0000D\u0276\u0001\u0000\u0000\u0000F\u0278"+ + "\u0001\u0000\u0000\u0000H\u027b\u0001\u0000\u0000\u0000J\u027d\u0001\u0000"+ + "\u0000\u0000L\u0286\u0001\u0000\u0000\u0000N\u0288\u0001\u0000\u0000\u0000"+ + "P\u028d\u0001\u0000\u0000\u0000R\u028f\u0001\u0000\u0000\u0000T\u0294"+ + "\u0001\u0000\u0000\u0000V\u02b3\u0001\u0000\u0000\u0000X\u02b6\u0001\u0000"+ + "\u0000\u0000Z\u02e4\u0001\u0000\u0000\u0000\\\u02e6\u0001\u0000\u0000"+ + "\u0000^\u02e9\u0001\u0000\u0000\u0000`\u02ed\u0001\u0000\u0000\u0000b"+ + "\u02f1\u0001\u0000\u0000\u0000d\u02f3\u0001\u0000\u0000\u0000f\u02f6\u0001"+ + "\u0000\u0000\u0000h\u02f8\u0001\u0000\u0000\u0000j\u02fd\u0001\u0000\u0000"+ + "\u0000l\u02ff\u0001\u0000\u0000\u0000n\u0305\u0001\u0000\u0000\u0000p"+ + "\u030b\u0001\u0000\u0000\u0000r\u030e\u0001\u0000\u0000\u0000t\u0311\u0001"+ + "\u0000\u0000\u0000v\u0316\u0001\u0000\u0000\u0000x\u031b\u0001\u0000\u0000"+ + "\u0000z\u031d\u0001\u0000\u0000\u0000|\u0321\u0001\u0000\u0000\u0000~"+ + "\u0326\u0001\u0000\u0000\u0000\u0080\u032c\u0001\u0000\u0000\u0000\u0082"+ + "\u032f\u0001\u0000\u0000\u0000\u0084\u0331\u0001\u0000\u0000\u0000\u0086"+ + "\u0337\u0001\u0000\u0000\u0000\u0088\u0339\u0001\u0000\u0000\u0000\u008a"+ + "\u033e\u0001\u0000\u0000\u0000\u008c\u0341\u0001\u0000\u0000\u0000\u008e"+ + "\u0344\u0001\u0000\u0000\u0000\u0090\u0347\u0001\u0000\u0000\u0000\u0092"+ + "\u0349\u0001\u0000\u0000\u0000\u0094\u034c\u0001\u0000\u0000\u0000\u0096"+ + "\u034e\u0001\u0000\u0000\u0000\u0098\u0351\u0001\u0000\u0000\u0000\u009a"+ + "\u0353\u0001\u0000\u0000\u0000\u009c\u0355\u0001\u0000\u0000\u0000\u009e"+ + "\u0357\u0001\u0000\u0000\u0000\u00a0\u0359\u0001\u0000\u0000\u0000\u00a2"+ + "\u035b\u0001\u0000\u0000\u0000\u00a4\u0373\u0001\u0000\u0000\u0000\u00a6"+ + "\u0375\u0001\u0000\u0000\u0000\u00a8\u037a\u0001\u0000\u0000\u0000\u00aa"+ + "\u038f\u0001\u0000\u0000\u0000\u00ac\u0391\u0001\u0000\u0000\u0000\u00ae"+ + "\u0399\u0001\u0000\u0000\u0000\u00b0\u039b\u0001\u0000\u0000\u0000\u00b2"+ + "\u039f\u0001\u0000\u0000\u0000\u00b4\u03a3\u0001\u0000\u0000\u0000\u00b6"+ + "\u03a7\u0001\u0000\u0000\u0000\u00b8\u03ac\u0001\u0000\u0000\u0000\u00ba"+ + "\u03b1\u0001\u0000\u0000\u0000\u00bc\u03b5\u0001\u0000\u0000\u0000\u00be"+ + "\u03b9\u0001\u0000\u0000\u0000\u00c0\u03bd\u0001\u0000\u0000\u0000\u00c2"+ + "\u03c2\u0001\u0000\u0000\u0000\u00c4\u03c6\u0001\u0000\u0000\u0000\u00c6"+ + "\u03ca\u0001\u0000\u0000\u0000\u00c8\u03ce\u0001\u0000\u0000\u0000\u00ca"+ + "\u03d2\u0001\u0000\u0000\u0000\u00cc\u03d6\u0001\u0000\u0000\u0000\u00ce"+ + "\u03e2\u0001\u0000\u0000\u0000\u00d0\u03e5\u0001\u0000\u0000\u0000\u00d2"+ + "\u03e9\u0001\u0000\u0000\u0000\u00d4\u03ed\u0001\u0000\u0000\u0000\u00d6"+ + "\u03f1\u0001\u0000\u0000\u0000\u00d8\u03f5\u0001\u0000\u0000\u0000\u00da"+ + "\u03f9\u0001\u0000\u0000\u0000\u00dc\u03fd\u0001\u0000\u0000\u0000\u00de"+ + "\u0402\u0001\u0000\u0000\u0000\u00e0\u0406\u0001\u0000\u0000\u0000\u00e2"+ + "\u040e\u0001\u0000\u0000\u0000\u00e4\u0423\u0001\u0000\u0000\u0000\u00e6"+ + "\u0427\u0001\u0000\u0000\u0000\u00e8\u042b\u0001\u0000\u0000\u0000\u00ea"+ + "\u042f\u0001\u0000\u0000\u0000\u00ec\u0433\u0001\u0000\u0000\u0000\u00ee"+ + "\u0437\u0001\u0000\u0000\u0000\u00f0\u043c\u0001\u0000\u0000\u0000\u00f2"+ + "\u0440\u0001\u0000\u0000\u0000\u00f4\u0444\u0001\u0000\u0000\u0000\u00f6"+ + "\u0448\u0001\u0000\u0000\u0000\u00f8\u044b\u0001\u0000\u0000\u0000\u00fa"+ + "\u044f\u0001\u0000\u0000\u0000\u00fc\u0453\u0001\u0000\u0000\u0000\u00fe"+ + "\u0457\u0001\u0000\u0000\u0000\u0100\u045b\u0001\u0000\u0000\u0000\u0102"+ + "\u0460\u0001\u0000\u0000\u0000\u0104\u0465\u0001\u0000\u0000\u0000\u0106"+ + "\u046a\u0001\u0000\u0000\u0000\u0108\u0471\u0001\u0000\u0000\u0000\u010a"+ + "\u047a\u0001\u0000\u0000\u0000\u010c\u0481\u0001\u0000\u0000\u0000\u010e"+ + "\u0485\u0001\u0000\u0000\u0000\u0110\u0489\u0001\u0000\u0000\u0000\u0112"+ + "\u048d\u0001\u0000\u0000\u0000\u0114\u0491\u0001\u0000\u0000\u0000\u0116"+ + "\u0497\u0001\u0000\u0000\u0000\u0118\u049b\u0001\u0000\u0000\u0000\u011a"+ + "\u049f\u0001\u0000\u0000\u0000\u011c\u04a3\u0001\u0000\u0000\u0000\u011e"+ + "\u04a7\u0001\u0000\u0000\u0000\u0120\u04ab\u0001\u0000\u0000\u0000\u0122"+ + "\u04af\u0001\u0000\u0000\u0000\u0124\u04b3\u0001\u0000\u0000\u0000\u0126"+ + "\u04b7\u0001\u0000\u0000\u0000\u0128\u04bb\u0001\u0000\u0000\u0000\u012a"+ + "\u04c0\u0001\u0000\u0000\u0000\u012c\u04c4\u0001\u0000\u0000\u0000\u012e"+ + "\u04c8\u0001\u0000\u0000\u0000\u0130\u04cc\u0001\u0000\u0000\u0000\u0132"+ + "\u04d0\u0001\u0000\u0000\u0000\u0134\u04d4\u0001\u0000\u0000\u0000\u0136"+ + "\u04d8\u0001\u0000\u0000\u0000\u0138\u04dd\u0001\u0000\u0000\u0000\u013a"+ + "\u04e2\u0001\u0000\u0000\u0000\u013c\u04e6\u0001\u0000\u0000\u0000\u013e"+ + "\u04ea\u0001\u0000\u0000\u0000\u0140\u04ee\u0001\u0000\u0000\u0000\u0142"+ + "\u04f3\u0001\u0000\u0000\u0000\u0144\u04fd\u0001\u0000\u0000\u0000\u0146"+ + "\u0501\u0001\u0000\u0000\u0000\u0148\u0505\u0001\u0000\u0000\u0000\u014a"+ + "\u0509\u0001\u0000\u0000\u0000\u014c\u050e\u0001\u0000\u0000\u0000\u014e"+ + "\u0515\u0001\u0000\u0000\u0000\u0150\u0519\u0001\u0000\u0000\u0000\u0152"+ + "\u051d\u0001\u0000\u0000\u0000\u0154\u0521\u0001\u0000\u0000\u0000\u0156"+ + "\u0525\u0001\u0000\u0000\u0000\u0158\u052a\u0001\u0000\u0000\u0000\u015a"+ + "\u052e\u0001\u0000\u0000\u0000\u015c\u0532\u0001\u0000\u0000\u0000\u015e"+ + "\u0536\u0001\u0000\u0000\u0000\u0160\u053b\u0001\u0000\u0000\u0000\u0162"+ + "\u053f\u0001\u0000\u0000\u0000\u0164\u0543\u0001\u0000\u0000\u0000\u0166"+ + "\u0547\u0001\u0000\u0000\u0000\u0168\u054b\u0001\u0000\u0000\u0000\u016a"+ + "\u054f\u0001\u0000\u0000\u0000\u016c\u0555\u0001\u0000\u0000\u0000\u016e"+ + "\u0559\u0001\u0000\u0000\u0000\u0170\u055d\u0001\u0000\u0000\u0000\u0172"+ + "\u0561\u0001\u0000\u0000\u0000\u0174\u0565\u0001\u0000\u0000\u0000\u0176"+ + "\u0569\u0001\u0000\u0000\u0000\u0178\u056d\u0001\u0000\u0000\u0000\u017a"+ + "\u0572\u0001\u0000\u0000\u0000\u017c\u0578\u0001\u0000\u0000\u0000\u017e"+ + "\u057e\u0001\u0000\u0000\u0000\u0180\u0582\u0001\u0000\u0000\u0000\u0182"+ + "\u0586\u0001\u0000\u0000\u0000\u0184\u058a\u0001\u0000\u0000\u0000\u0186"+ + "\u0590\u0001\u0000\u0000\u0000\u0188\u0596\u0001\u0000\u0000\u0000\u018a"+ + "\u059a\u0001\u0000\u0000\u0000\u018c\u059e\u0001\u0000\u0000\u0000\u018e"+ + "\u05a2\u0001\u0000\u0000\u0000\u0190\u05a8\u0001\u0000\u0000\u0000\u0192"+ + "\u05ae\u0001\u0000\u0000\u0000\u0194\u05b4\u0001\u0000\u0000\u0000\u0196"+ + "\u0197\u0007\u0000\u0000\u0000\u0197\u0198\u0007\u0001\u0000\u0000\u0198"+ + "\u0199\u0007\u0002\u0000\u0000\u0199\u019a\u0007\u0002\u0000\u0000\u019a"+ + "\u019b\u0007\u0003\u0000\u0000\u019b\u019c\u0007\u0004\u0000\u0000\u019c"+ + "\u019d\u0007\u0005\u0000\u0000\u019d\u019e\u0001\u0000\u0000\u0000\u019e"+ + "\u019f\u0006\u0000\u0000\u0000\u019f\u0011\u0001\u0000\u0000\u0000\u01a0"+ + "\u01a1\u0007\u0000\u0000\u0000\u01a1\u01a2\u0007\u0006\u0000\u0000\u01a2"+ + "\u01a3\u0007\u0007\u0000\u0000\u01a3\u01a4\u0007\b\u0000\u0000\u01a4\u01a5"+ + "\u0001\u0000\u0000\u0000\u01a5\u01a6\u0006\u0001\u0001\u0000\u01a6\u0013"+ + "\u0001\u0000\u0000\u0000\u01a7\u01a8\u0007\u0003\u0000\u0000\u01a8\u01a9"+ + "\u0007\t\u0000\u0000\u01a9\u01aa\u0007\u0006\u0000\u0000\u01aa\u01ab\u0007"+ + "\u0001\u0000\u0000\u01ab\u01ac\u0007\u0004\u0000\u0000\u01ac\u01ad\u0007"+ + "\n\u0000\u0000\u01ad\u01ae\u0001\u0000\u0000\u0000\u01ae\u01af\u0006\u0002"+ + "\u0002\u0000\u01af\u0015\u0001\u0000\u0000\u0000\u01b0\u01b1\u0007\u0003"+ + "\u0000\u0000\u01b1\u01b2\u0007\u000b\u0000\u0000\u01b2\u01b3\u0007\f\u0000"+ + "\u0000\u01b3\u01b4\u0007\r\u0000\u0000\u01b4\u01b5\u0001\u0000\u0000\u0000"+ + "\u01b5\u01b6\u0006\u0003\u0000\u0000\u01b6\u0017\u0001\u0000\u0000\u0000"+ + "\u01b7\u01b8\u0007\u0003\u0000\u0000\u01b8\u01b9\u0007\u000e\u0000\u0000"+ + "\u01b9\u01ba\u0007\b\u0000\u0000\u01ba\u01bb\u0007\r\u0000\u0000\u01bb"+ + "\u01bc\u0007\f\u0000\u0000\u01bc\u01bd\u0007\u0001\u0000\u0000\u01bd\u01be"+ + "\u0007\t\u0000\u0000\u01be\u01bf\u0001\u0000\u0000\u0000\u01bf\u01c0\u0006"+ + "\u0004\u0003\u0000\u01c0\u0019\u0001\u0000\u0000\u0000\u01c1\u01c2\u0007"+ + "\u000f\u0000\u0000\u01c2\u01c3\u0007\u0006\u0000\u0000\u01c3\u01c4\u0007"+ + "\u0007\u0000\u0000\u01c4\u01c5\u0007\u0010\u0000\u0000\u01c5\u01c6\u0001"+ + "\u0000\u0000\u0000\u01c6\u01c7\u0006\u0005\u0004\u0000\u01c7\u001b\u0001"+ + "\u0000\u0000\u0000\u01c8\u01c9\u0007\u0011\u0000\u0000\u01c9\u01ca\u0007"+ + "\u0006\u0000\u0000\u01ca\u01cb\u0007\u0007\u0000\u0000\u01cb\u01cc\u0007"+ + "\u0012\u0000\u0000\u01cc\u01cd\u0001\u0000\u0000\u0000\u01cd\u01ce\u0006"+ + "\u0006\u0000\u0000\u01ce\u001d\u0001\u0000\u0000\u0000\u01cf\u01d0\u0007"+ + "\u0012\u0000\u0000\u01d0\u01d1\u0007\u0003\u0000\u0000\u01d1\u01d2\u0007"+ + "\u0003\u0000\u0000\u01d2\u01d3\u0007\b\u0000\u0000\u01d3\u01d4\u0001\u0000"+ + "\u0000\u0000\u01d4\u01d5\u0006\u0007\u0001\u0000\u01d5\u001f\u0001\u0000"+ + "\u0000\u0000\u01d6\u01d7\u0007\r\u0000\u0000\u01d7\u01d8\u0007\u0001\u0000"+ + "\u0000\u01d8\u01d9\u0007\u0010\u0000\u0000\u01d9\u01da\u0007\u0001\u0000"+ + "\u0000\u01da\u01db\u0007\u0005\u0000\u0000\u01db\u01dc\u0001\u0000\u0000"+ + "\u0000\u01dc\u01dd\u0006\b\u0000\u0000\u01dd!\u0001\u0000\u0000\u0000"+ + "\u01de\u01df\u0007\u0010\u0000\u0000\u01df\u01e0\u0007\u0003\u0000\u0000"+ + "\u01e0\u01e1\u0007\u0005\u0000\u0000\u01e1\u01e2\u0007\f\u0000\u0000\u01e2"+ + "\u01e3\u0001\u0000\u0000\u0000\u01e3\u01e4\u0006\t\u0005\u0000\u01e4#"+ + "\u0001\u0000\u0000\u0000\u01e5\u01e6\u0007\u0010\u0000\u0000\u01e6\u01e7"+ + "\u0007\u000b\u0000\u0000\u01e7\u01e8\u0005_\u0000\u0000\u01e8\u01e9\u0007"+ + "\u0003\u0000\u0000\u01e9\u01ea\u0007\u000e\u0000\u0000\u01ea\u01eb\u0007"+ + "\b\u0000\u0000\u01eb\u01ec\u0007\f\u0000\u0000\u01ec\u01ed\u0007\t\u0000"+ + "\u0000\u01ed\u01ee\u0007\u0000\u0000\u0000\u01ee\u01ef\u0001\u0000\u0000"+ + "\u0000\u01ef\u01f0\u0006\n\u0006\u0000\u01f0%\u0001\u0000\u0000\u0000"+ + "\u01f1\u01f2\u0007\u0006\u0000\u0000\u01f2\u01f3\u0007\u0003\u0000\u0000"+ + "\u01f3\u01f4\u0007\t\u0000\u0000\u01f4\u01f5\u0007\f\u0000\u0000\u01f5"+ + "\u01f6\u0007\u0010\u0000\u0000\u01f6\u01f7\u0007\u0003\u0000\u0000\u01f7"+ + "\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0006\u000b\u0007\u0000\u01f9"+ + "\'\u0001\u0000\u0000\u0000\u01fa\u01fb\u0007\u0006\u0000\u0000\u01fb\u01fc"+ + "\u0007\u0007\u0000\u0000\u01fc\u01fd\u0007\u0013\u0000\u0000\u01fd\u01fe"+ + "\u0001\u0000\u0000\u0000\u01fe\u01ff\u0006\f\u0000\u0000\u01ff)\u0001"+ + "\u0000\u0000\u0000\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202\u0007"+ + "\n\u0000\u0000\u0202\u0203\u0007\u0007\u0000\u0000\u0203\u0204\u0007\u0013"+ + "\u0000\u0000\u0204\u0205\u0001\u0000\u0000\u0000\u0205\u0206\u0006\r\b"+ + "\u0000\u0206+\u0001\u0000\u0000\u0000\u0207\u0208\u0007\u0002\u0000\u0000"+ + "\u0208\u0209\u0007\u0007\u0000\u0000\u0209\u020a\u0007\u0006\u0000\u0000"+ + "\u020a\u020b\u0007\u0005\u0000\u0000\u020b\u020c\u0001\u0000\u0000\u0000"+ + "\u020c\u020d\u0006\u000e\u0000\u0000\u020d-\u0001\u0000\u0000\u0000\u020e"+ + "\u020f\u0007\u0002\u0000\u0000\u020f\u0210\u0007\u0005\u0000\u0000\u0210"+ + "\u0211\u0007\f\u0000\u0000\u0211\u0212\u0007\u0005\u0000\u0000\u0212\u0213"+ + "\u0007\u0002\u0000\u0000\u0213\u0214\u0001\u0000\u0000\u0000\u0214\u0215"+ + "\u0006\u000f\u0000\u0000\u0215/\u0001\u0000\u0000\u0000\u0216\u0217\u0007"+ + "\u0013\u0000\u0000\u0217\u0218\u0007\n\u0000\u0000\u0218\u0219\u0007\u0003"+ + "\u0000\u0000\u0219\u021a\u0007\u0006\u0000\u0000\u021a\u021b\u0007\u0003"+ + "\u0000\u0000\u021b\u021c\u0001\u0000\u0000\u0000\u021c\u021d\u0006\u0010"+ + "\u0000\u0000\u021d1\u0001\u0000\u0000\u0000\u021e\u021f\u0004\u0011\u0000"+ + "\u0000\u021f\u0220\u0007\u0001\u0000\u0000\u0220\u0221\u0007\t\u0000\u0000"+ + "\u0221\u0222\u0007\r\u0000\u0000\u0222\u0223\u0007\u0001\u0000\u0000\u0223"+ + "\u0224\u0007\t\u0000\u0000\u0224\u0225\u0007\u0003\u0000\u0000\u0225\u0226"+ + "\u0007\u0002\u0000\u0000\u0226\u0227\u0007\u0005\u0000\u0000\u0227\u0228"+ + "\u0007\f\u0000\u0000\u0228\u0229\u0007\u0005\u0000\u0000\u0229\u022a\u0007"+ + "\u0002\u0000\u0000\u022a\u022b\u0001\u0000\u0000\u0000\u022b\u022c\u0006"+ + "\u0011\u0000\u0000\u022c3\u0001\u0000\u0000\u0000\u022d\u022e\u0004\u0012"+ + "\u0001\u0000\u022e\u022f\u0007\r\u0000\u0000\u022f\u0230\u0007\u0007\u0000"+ + "\u0000\u0230\u0231\u0007\u0007\u0000\u0000\u0231\u0232\u0007\u0012\u0000"+ + "\u0000\u0232\u0233\u0007\u0014\u0000\u0000\u0233\u0234\u0007\b\u0000\u0000"+ + "\u0234\u0235\u0001\u0000\u0000\u0000\u0235\u0236\u0006\u0012\t\u0000\u0236"+ + "5\u0001\u0000\u0000\u0000\u0237\u0238\u0004\u0013\u0002\u0000\u0238\u0239"+ + "\u0007\u0010\u0000\u0000\u0239\u023a\u0007\u0003\u0000\u0000\u023a\u023b"+ + "\u0007\u0005\u0000\u0000\u023b\u023c\u0007\u0006\u0000\u0000\u023c\u023d"+ + "\u0007\u0001\u0000\u0000\u023d\u023e\u0007\u0004\u0000\u0000\u023e\u023f"+ + "\u0007\u0002\u0000\u0000\u023f\u0240\u0001\u0000\u0000\u0000\u0240\u0241"+ + "\u0006\u0013\n\u0000\u02417\u0001\u0000\u0000\u0000\u0242\u0244\b\u0015"+ + "\u0000\u0000\u0243\u0242\u0001\u0000\u0000\u0000\u0244\u0245\u0001\u0000"+ + "\u0000\u0000\u0245\u0243\u0001\u0000\u0000\u0000\u0245\u0246\u0001\u0000"+ + "\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0006\u0014"+ + "\u0000\u0000\u02489\u0001\u0000\u0000\u0000\u0249\u024a\u0005/\u0000\u0000"+ + "\u024a\u024b\u0005/\u0000\u0000\u024b\u024f\u0001\u0000\u0000\u0000\u024c"+ + "\u024e\b\u0016\u0000\u0000\u024d\u024c\u0001\u0000\u0000\u0000\u024e\u0251"+ + "\u0001\u0000\u0000\u0000\u024f\u024d\u0001\u0000\u0000\u0000\u024f\u0250"+ + "\u0001\u0000\u0000\u0000\u0250\u0253\u0001\u0000\u0000\u0000\u0251\u024f"+ + "\u0001\u0000\u0000\u0000\u0252\u0254\u0005\r\u0000\u0000\u0253\u0252\u0001"+ + "\u0000\u0000\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0256\u0001"+ + "\u0000\u0000\u0000\u0255\u0257\u0005\n\u0000\u0000\u0256\u0255\u0001\u0000"+ + "\u0000\u0000\u0256\u0257\u0001\u0000\u0000\u0000\u0257\u0258\u0001\u0000"+ + "\u0000\u0000\u0258\u0259\u0006\u0015\u000b\u0000\u0259;\u0001\u0000\u0000"+ + "\u0000\u025a\u025b\u0005/\u0000\u0000\u025b\u025c\u0005*\u0000\u0000\u025c"+ + "\u0261\u0001\u0000\u0000\u0000\u025d\u0260\u0003<\u0016\u0000\u025e\u0260"+ + "\t\u0000\u0000\u0000\u025f\u025d\u0001\u0000\u0000\u0000\u025f\u025e\u0001"+ + "\u0000\u0000\u0000\u0260\u0263\u0001\u0000\u0000\u0000\u0261\u0262\u0001"+ + "\u0000\u0000\u0000\u0261\u025f\u0001\u0000\u0000\u0000\u0262\u0264\u0001"+ + "\u0000\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0264\u0265\u0005"+ + "*\u0000\u0000\u0265\u0266\u0005/\u0000\u0000\u0266\u0267\u0001\u0000\u0000"+ + "\u0000\u0267\u0268\u0006\u0016\u000b\u0000\u0268=\u0001\u0000\u0000\u0000"+ + "\u0269\u026b\u0007\u0017\u0000\u0000\u026a\u0269\u0001\u0000\u0000\u0000"+ + "\u026b\u026c\u0001\u0000\u0000\u0000\u026c\u026a\u0001\u0000\u0000\u0000"+ + "\u026c\u026d\u0001\u0000\u0000\u0000\u026d\u026e\u0001\u0000\u0000\u0000"+ + "\u026e\u026f\u0006\u0017\u000b\u0000\u026f?\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0005|\u0000\u0000\u0271\u0272\u0001\u0000\u0000\u0000\u0272\u0273"+ + "\u0006\u0018\f\u0000\u0273A\u0001\u0000\u0000\u0000\u0274\u0275\u0007"+ + "\u0018\u0000\u0000\u0275C\u0001\u0000\u0000\u0000\u0276\u0277\u0007\u0019"+ + "\u0000\u0000\u0277E\u0001\u0000\u0000\u0000\u0278\u0279\u0005\\\u0000"+ + "\u0000\u0279\u027a\u0007\u001a\u0000\u0000\u027aG\u0001\u0000\u0000\u0000"+ + "\u027b\u027c\b\u001b\u0000\u0000\u027cI\u0001\u0000\u0000\u0000\u027d"+ + "\u027f\u0007\u0003\u0000\u0000\u027e\u0280\u0007\u001c\u0000\u0000\u027f"+ + "\u027e\u0001\u0000\u0000\u0000\u027f\u0280\u0001\u0000\u0000\u0000\u0280"+ + "\u0282\u0001\u0000\u0000\u0000\u0281\u0283\u0003B\u0019\u0000\u0282\u0281"+ + "\u0001\u0000\u0000\u0000\u0283\u0284\u0001\u0000\u0000\u0000\u0284\u0282"+ + "\u0001\u0000\u0000\u0000\u0284\u0285\u0001\u0000\u0000\u0000\u0285K\u0001"+ + "\u0000\u0000\u0000\u0286\u0287\u0005@\u0000\u0000\u0287M\u0001\u0000\u0000"+ + "\u0000\u0288\u0289\u0005`\u0000\u0000\u0289O\u0001\u0000\u0000\u0000\u028a"+ + "\u028e\b\u001d\u0000\u0000\u028b\u028c\u0005`\u0000\u0000\u028c\u028e"+ + "\u0005`\u0000\u0000\u028d\u028a\u0001\u0000\u0000\u0000\u028d\u028b\u0001"+ + "\u0000\u0000\u0000\u028eQ\u0001\u0000\u0000\u0000\u028f\u0290\u0005_\u0000"+ + "\u0000\u0290S\u0001\u0000\u0000\u0000\u0291\u0295\u0003D\u001a\u0000\u0292"+ + "\u0295\u0003B\u0019\u0000\u0293\u0295\u0003R!\u0000\u0294\u0291\u0001"+ + "\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000\u0294\u0293\u0001"+ + "\u0000\u0000\u0000\u0295U\u0001\u0000\u0000\u0000\u0296\u029b\u0005\""+ + "\u0000\u0000\u0297\u029a\u0003F\u001b\u0000\u0298\u029a\u0003H\u001c\u0000"+ + "\u0299\u0297\u0001\u0000\u0000\u0000\u0299\u0298\u0001\u0000\u0000\u0000"+ + "\u029a\u029d\u0001\u0000\u0000\u0000\u029b\u0299\u0001\u0000\u0000\u0000"+ + "\u029b\u029c\u0001\u0000\u0000\u0000\u029c\u029e\u0001\u0000\u0000\u0000"+ + "\u029d\u029b\u0001\u0000\u0000\u0000\u029e\u02b4\u0005\"\u0000\u0000\u029f"+ + "\u02a0\u0005\"\u0000\u0000\u02a0\u02a1\u0005\"\u0000\u0000\u02a1\u02a2"+ + "\u0005\"\u0000\u0000\u02a2\u02a6\u0001\u0000\u0000\u0000\u02a3\u02a5\b"+ + "\u0016\u0000\u0000\u02a4\u02a3\u0001\u0000\u0000\u0000\u02a5\u02a8\u0001"+ + "\u0000\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a6\u02a4\u0001"+ + "\u0000\u0000\u0000\u02a7\u02a9\u0001\u0000\u0000\u0000\u02a8\u02a6\u0001"+ + "\u0000\u0000\u0000\u02a9\u02aa\u0005\"\u0000\u0000\u02aa\u02ab\u0005\""+ + "\u0000\u0000\u02ab\u02ac\u0005\"\u0000\u0000\u02ac\u02ae\u0001\u0000\u0000"+ + "\u0000\u02ad\u02af\u0005\"\u0000\u0000\u02ae\u02ad\u0001\u0000\u0000\u0000"+ + "\u02ae\u02af\u0001\u0000\u0000\u0000\u02af\u02b1\u0001\u0000\u0000\u0000"+ + "\u02b0\u02b2\u0005\"\u0000\u0000\u02b1\u02b0\u0001\u0000\u0000\u0000\u02b1"+ + "\u02b2\u0001\u0000\u0000\u0000\u02b2\u02b4\u0001\u0000\u0000\u0000\u02b3"+ + "\u0296\u0001\u0000\u0000\u0000\u02b3\u029f\u0001\u0000\u0000\u0000\u02b4"+ + "W\u0001\u0000\u0000\u0000\u02b5\u02b7\u0003B\u0019\u0000\u02b6\u02b5\u0001"+ + "\u0000\u0000\u0000\u02b7\u02b8\u0001\u0000\u0000\u0000\u02b8\u02b6\u0001"+ + "\u0000\u0000\u0000\u02b8\u02b9\u0001\u0000\u0000\u0000\u02b9Y\u0001\u0000"+ + "\u0000\u0000\u02ba\u02bc\u0003B\u0019\u0000\u02bb\u02ba\u0001\u0000\u0000"+ + "\u0000\u02bc\u02bd\u0001\u0000\u0000\u0000\u02bd\u02bb\u0001\u0000\u0000"+ + "\u0000\u02bd\u02be\u0001\u0000\u0000\u0000\u02be\u02bf\u0001\u0000\u0000"+ + "\u0000\u02bf\u02c3\u0003j-\u0000\u02c0\u02c2\u0003B\u0019\u0000\u02c1"+ + "\u02c0\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000\u0000\u02c3"+ + "\u02c1\u0001\u0000\u0000\u0000\u02c3\u02c4\u0001\u0000\u0000\u0000\u02c4"+ + "\u02e5\u0001\u0000\u0000\u0000\u02c5\u02c3\u0001\u0000\u0000\u0000\u02c6"+ + "\u02c8\u0003j-\u0000\u02c7\u02c9\u0003B\u0019\u0000\u02c8\u02c7\u0001"+ + "\u0000\u0000\u0000\u02c9\u02ca\u0001\u0000\u0000\u0000\u02ca\u02c8\u0001"+ + "\u0000\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb\u02e5\u0001"+ + "\u0000\u0000\u0000\u02cc\u02ce\u0003B\u0019\u0000\u02cd\u02cc\u0001\u0000"+ + "\u0000\u0000\u02ce\u02cf\u0001\u0000\u0000\u0000\u02cf\u02cd\u0001\u0000"+ + "\u0000\u0000\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0\u02d8\u0001\u0000"+ + "\u0000\u0000\u02d1\u02d5\u0003j-\u0000\u02d2\u02d4\u0003B\u0019\u0000"+ + "\u02d3\u02d2\u0001\u0000\u0000\u0000\u02d4\u02d7\u0001\u0000\u0000\u0000"+ + "\u02d5\u02d3\u0001\u0000\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000"+ + "\u02d6\u02d9\u0001\u0000\u0000\u0000\u02d7\u02d5\u0001\u0000\u0000\u0000"+ + "\u02d8\u02d1\u0001\u0000\u0000\u0000\u02d8\u02d9\u0001\u0000\u0000\u0000"+ + "\u02d9\u02da\u0001\u0000\u0000\u0000\u02da\u02db\u0003J\u001d\u0000\u02db"+ + "\u02e5\u0001\u0000\u0000\u0000\u02dc\u02de\u0003j-\u0000\u02dd\u02df\u0003"+ + "B\u0019\u0000\u02de\u02dd\u0001\u0000\u0000\u0000\u02df\u02e0\u0001\u0000"+ + "\u0000\u0000\u02e0\u02de\u0001\u0000\u0000\u0000\u02e0\u02e1\u0001\u0000"+ + "\u0000\u0000\u02e1\u02e2\u0001\u0000\u0000\u0000\u02e2\u02e3\u0003J\u001d"+ + "\u0000\u02e3\u02e5\u0001\u0000\u0000\u0000\u02e4\u02bb\u0001\u0000\u0000"+ + "\u0000\u02e4\u02c6\u0001\u0000\u0000\u0000\u02e4\u02cd\u0001\u0000\u0000"+ + "\u0000\u02e4\u02dc\u0001\u0000\u0000\u0000\u02e5[\u0001\u0000\u0000\u0000"+ + "\u02e6\u02e7\u0007\u001e\u0000\u0000\u02e7\u02e8\u0007\u001f\u0000\u0000"+ + "\u02e8]\u0001\u0000\u0000\u0000\u02e9\u02ea\u0007\f\u0000\u0000\u02ea"+ + "\u02eb\u0007\t\u0000\u0000\u02eb\u02ec\u0007\u0000\u0000\u0000\u02ec_"+ + "\u0001\u0000\u0000\u0000\u02ed\u02ee\u0007\f\u0000\u0000\u02ee\u02ef\u0007"+ + "\u0002\u0000\u0000\u02ef\u02f0\u0007\u0004\u0000\u0000\u02f0a\u0001\u0000"+ + "\u0000\u0000\u02f1\u02f2\u0005=\u0000\u0000\u02f2c\u0001\u0000\u0000\u0000"+ + "\u02f3\u02f4\u0005:\u0000\u0000\u02f4\u02f5\u0005:\u0000\u0000\u02f5e"+ + "\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005,\u0000\u0000\u02f7g\u0001\u0000"+ + "\u0000\u0000\u02f8\u02f9\u0007\u0000\u0000\u0000\u02f9\u02fa\u0007\u0003"+ + "\u0000\u0000\u02fa\u02fb\u0007\u0002\u0000\u0000\u02fb\u02fc\u0007\u0004"+ + "\u0000\u0000\u02fci\u0001\u0000\u0000\u0000\u02fd\u02fe\u0005.\u0000\u0000"+ + "\u02fek\u0001\u0000\u0000\u0000\u02ff\u0300\u0007\u000f\u0000\u0000\u0300"+ + "\u0301\u0007\f\u0000\u0000\u0301\u0302\u0007\r\u0000\u0000\u0302\u0303"+ + "\u0007\u0002\u0000\u0000\u0303\u0304\u0007\u0003\u0000\u0000\u0304m\u0001"+ + "\u0000\u0000\u0000\u0305\u0306\u0007\u000f\u0000\u0000\u0306\u0307\u0007"+ + "\u0001\u0000\u0000\u0307\u0308\u0007\u0006\u0000\u0000\u0308\u0309\u0007"+ + "\u0002\u0000\u0000\u0309\u030a\u0007\u0005\u0000\u0000\u030ao\u0001\u0000"+ + "\u0000\u0000\u030b\u030c\u0007\u0001\u0000\u0000\u030c\u030d\u0007\t\u0000"+ + "\u0000\u030dq\u0001\u0000\u0000\u0000\u030e\u030f\u0007\u0001\u0000\u0000"+ + "\u030f\u0310\u0007\u0002\u0000\u0000\u0310s\u0001\u0000\u0000\u0000\u0311"+ + "\u0312\u0007\r\u0000\u0000\u0312\u0313\u0007\f\u0000\u0000\u0313\u0314"+ + "\u0007\u0002\u0000\u0000\u0314\u0315\u0007\u0005\u0000\u0000\u0315u\u0001"+ + "\u0000\u0000\u0000\u0316\u0317\u0007\r\u0000\u0000\u0317\u0318\u0007\u0001"+ + "\u0000\u0000\u0318\u0319\u0007\u0012\u0000\u0000\u0319\u031a\u0007\u0003"+ + "\u0000\u0000\u031aw\u0001\u0000\u0000\u0000\u031b\u031c\u0005(\u0000\u0000"+ + "\u031cy\u0001\u0000\u0000\u0000\u031d\u031e\u0007\t\u0000\u0000\u031e"+ + "\u031f\u0007\u0007\u0000\u0000\u031f\u0320\u0007\u0005\u0000\u0000\u0320"+ + "{\u0001\u0000\u0000\u0000\u0321\u0322\u0007\t\u0000\u0000\u0322\u0323"+ + "\u0007\u0014\u0000\u0000\u0323\u0324\u0007\r\u0000\u0000\u0324\u0325\u0007"+ + "\r\u0000\u0000\u0325}\u0001\u0000\u0000\u0000\u0326\u0327\u0007\t\u0000"+ + "\u0000\u0327\u0328\u0007\u0014\u0000\u0000\u0328\u0329\u0007\r\u0000\u0000"+ + "\u0329\u032a\u0007\r\u0000\u0000\u032a\u032b\u0007\u0002\u0000\u0000\u032b"+ + "\u007f\u0001\u0000\u0000\u0000\u032c\u032d\u0007\u0007\u0000\u0000\u032d"+ + "\u032e\u0007\u0006\u0000\u0000\u032e\u0081\u0001\u0000\u0000\u0000\u032f"+ + "\u0330\u0005?\u0000\u0000\u0330\u0083\u0001\u0000\u0000\u0000\u0331\u0332"+ + "\u0007\u0006\u0000\u0000\u0332\u0333\u0007\r\u0000\u0000\u0333\u0334\u0007"+ + "\u0001\u0000\u0000\u0334\u0335\u0007\u0012\u0000\u0000\u0335\u0336\u0007"+ + "\u0003\u0000\u0000\u0336\u0085\u0001\u0000\u0000\u0000\u0337\u0338\u0005"+ + ")\u0000\u0000\u0338\u0087\u0001\u0000\u0000\u0000\u0339\u033a\u0007\u0005"+ + "\u0000\u0000\u033a\u033b\u0007\u0006\u0000\u0000\u033b\u033c\u0007\u0014"+ + "\u0000\u0000\u033c\u033d\u0007\u0003\u0000\u0000\u033d\u0089\u0001\u0000"+ + "\u0000\u0000\u033e\u033f\u0005=\u0000\u0000\u033f\u0340\u0005=\u0000\u0000"+ + "\u0340\u008b\u0001\u0000\u0000\u0000\u0341\u0342\u0005=\u0000\u0000\u0342"+ + "\u0343\u0005~\u0000\u0000\u0343\u008d\u0001\u0000\u0000\u0000\u0344\u0345"+ + "\u0005!\u0000\u0000\u0345\u0346\u0005=\u0000\u0000\u0346\u008f\u0001\u0000"+ + "\u0000\u0000\u0347\u0348\u0005<\u0000\u0000\u0348\u0091\u0001\u0000\u0000"+ + "\u0000\u0349\u034a\u0005<\u0000\u0000\u034a\u034b\u0005=\u0000\u0000\u034b"+ + "\u0093\u0001\u0000\u0000\u0000\u034c\u034d\u0005>\u0000\u0000\u034d\u0095"+ + "\u0001\u0000\u0000\u0000\u034e\u034f\u0005>\u0000\u0000\u034f\u0350\u0005"+ + "=\u0000\u0000\u0350\u0097\u0001\u0000\u0000\u0000\u0351\u0352\u0005+\u0000"+ + "\u0000\u0352\u0099\u0001\u0000\u0000\u0000\u0353\u0354\u0005-\u0000\u0000"+ + "\u0354\u009b\u0001\u0000\u0000\u0000\u0355\u0356\u0005*\u0000\u0000\u0356"+ + "\u009d\u0001\u0000\u0000\u0000\u0357\u0358\u0005/\u0000\u0000\u0358\u009f"+ + "\u0001\u0000\u0000\u0000\u0359\u035a\u0005%\u0000\u0000\u035a\u00a1\u0001"+ + "\u0000\u0000\u0000\u035b\u035c\u0004I\u0003\u0000\u035c\u035d\u0007\u0010"+ + "\u0000\u0000\u035d\u035e\u0007\f\u0000\u0000\u035e\u035f\u0007\u0005\u0000"+ + "\u0000\u035f\u0360\u0007\u0004\u0000\u0000\u0360\u0361\u0007\n\u0000\u0000"+ + "\u0361\u00a3\u0001\u0000\u0000\u0000\u0362\u0365\u0003\u00829\u0000\u0363"+ + "\u0366\u0003D\u001a\u0000\u0364\u0366\u0003R!\u0000\u0365\u0363\u0001"+ + "\u0000\u0000\u0000\u0365\u0364\u0001\u0000\u0000\u0000\u0366\u036a\u0001"+ + "\u0000\u0000\u0000\u0367\u0369\u0003T\"\u0000\u0368\u0367\u0001\u0000"+ + "\u0000\u0000\u0369\u036c\u0001\u0000\u0000\u0000\u036a\u0368\u0001\u0000"+ + "\u0000\u0000\u036a\u036b\u0001\u0000\u0000\u0000\u036b\u0374\u0001\u0000"+ + "\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036d\u036f\u0003\u0082"+ + "9\u0000\u036e\u0370\u0003B\u0019\u0000\u036f\u036e\u0001\u0000\u0000\u0000"+ + "\u0370\u0371\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000\u0000"+ + "\u0371\u0372\u0001\u0000\u0000\u0000\u0372\u0374\u0001\u0000\u0000\u0000"+ + "\u0373\u0362\u0001\u0000\u0000\u0000\u0373\u036d\u0001\u0000\u0000\u0000"+ + "\u0374\u00a5\u0001\u0000\u0000\u0000\u0375\u0376\u0005[\u0000\u0000\u0376"+ + "\u0377\u0001\u0000\u0000\u0000\u0377\u0378\u0006K\u0000\u0000\u0378\u0379"+ + "\u0006K\u0000\u0000\u0379\u00a7\u0001\u0000\u0000\u0000\u037a\u037b\u0005"+ + "]\u0000\u0000\u037b\u037c\u0001\u0000\u0000\u0000\u037c\u037d\u0006L\f"+ + "\u0000\u037d\u037e\u0006L\f\u0000\u037e\u00a9\u0001\u0000\u0000\u0000"+ + "\u037f\u0383\u0003D\u001a\u0000\u0380\u0382\u0003T\"\u0000\u0381\u0380"+ + "\u0001\u0000\u0000\u0000\u0382\u0385\u0001\u0000\u0000\u0000\u0383\u0381"+ + "\u0001\u0000\u0000\u0000\u0383\u0384\u0001\u0000\u0000\u0000\u0384\u0390"+ + "\u0001\u0000\u0000\u0000\u0385\u0383\u0001\u0000\u0000\u0000\u0386\u0389"+ + "\u0003R!\u0000\u0387\u0389\u0003L\u001e\u0000\u0388\u0386\u0001\u0000"+ + "\u0000\u0000\u0388\u0387\u0001\u0000\u0000\u0000\u0389\u038b\u0001\u0000"+ + "\u0000\u0000\u038a\u038c\u0003T\"\u0000\u038b\u038a\u0001\u0000\u0000"+ + "\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038b\u0001\u0000\u0000"+ + "\u0000\u038d\u038e\u0001\u0000\u0000\u0000\u038e\u0390\u0001\u0000\u0000"+ + "\u0000\u038f\u037f\u0001\u0000\u0000\u0000\u038f\u0388\u0001\u0000\u0000"+ + "\u0000\u0390\u00ab\u0001\u0000\u0000\u0000\u0391\u0393\u0003N\u001f\u0000"+ + "\u0392\u0394\u0003P \u0000\u0393\u0392\u0001\u0000\u0000\u0000\u0394\u0395"+ + "\u0001\u0000\u0000\u0000\u0395\u0393\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0001\u0000\u0000\u0000\u0396\u0397\u0001\u0000\u0000\u0000\u0397\u0398"+ + "\u0003N\u001f\u0000\u0398\u00ad\u0001\u0000\u0000\u0000\u0399\u039a\u0003"+ + "\u00acN\u0000\u039a\u00af\u0001\u0000\u0000\u0000\u039b\u039c\u0003:\u0015"+ + "\u0000\u039c\u039d\u0001\u0000\u0000\u0000\u039d\u039e\u0006P\u000b\u0000"+ + "\u039e\u00b1\u0001\u0000\u0000\u0000\u039f\u03a0\u0003<\u0016\u0000\u03a0"+ + "\u03a1\u0001\u0000\u0000\u0000\u03a1\u03a2\u0006Q\u000b\u0000\u03a2\u00b3"+ + "\u0001\u0000\u0000\u0000\u03a3\u03a4\u0003>\u0017\u0000\u03a4\u03a5\u0001"+ + "\u0000\u0000\u0000\u03a5\u03a6\u0006R\u000b\u0000\u03a6\u00b5\u0001\u0000"+ + "\u0000\u0000\u03a7\u03a8\u0003\u00a6K\u0000\u03a8\u03a9\u0001\u0000\u0000"+ + "\u0000\u03a9\u03aa\u0006S\r\u0000\u03aa\u03ab\u0006S\u000e\u0000\u03ab"+ + "\u00b7\u0001\u0000\u0000\u0000\u03ac\u03ad\u0003@\u0018\u0000\u03ad\u03ae"+ + "\u0001\u0000\u0000\u0000\u03ae\u03af\u0006T\u000f\u0000\u03af\u03b0\u0006"+ + "T\f\u0000\u03b0\u00b9\u0001\u0000\u0000\u0000\u03b1\u03b2\u0003>\u0017"+ + "\u0000\u03b2\u03b3\u0001\u0000\u0000\u0000\u03b3\u03b4\u0006U\u000b\u0000"+ + "\u03b4\u00bb\u0001\u0000\u0000\u0000\u03b5\u03b6\u0003:\u0015\u0000\u03b6"+ + "\u03b7\u0001\u0000\u0000\u0000\u03b7\u03b8\u0006V\u000b\u0000\u03b8\u00bd"+ + "\u0001\u0000\u0000\u0000\u03b9\u03ba\u0003<\u0016\u0000\u03ba\u03bb\u0001"+ + "\u0000\u0000\u0000\u03bb\u03bc\u0006W\u000b\u0000\u03bc\u00bf\u0001\u0000"+ + "\u0000\u0000\u03bd\u03be\u0003@\u0018\u0000\u03be\u03bf\u0001\u0000\u0000"+ + "\u0000\u03bf\u03c0\u0006X\u000f\u0000\u03c0\u03c1\u0006X\f\u0000\u03c1"+ + "\u00c1\u0001\u0000\u0000\u0000\u03c2\u03c3\u0003\u00a6K\u0000\u03c3\u03c4"+ + "\u0001\u0000\u0000\u0000\u03c4\u03c5\u0006Y\r\u0000\u03c5\u00c3\u0001"+ + "\u0000\u0000\u0000\u03c6\u03c7\u0003\u00a8L\u0000\u03c7\u03c8\u0001\u0000"+ + "\u0000\u0000\u03c8\u03c9\u0006Z\u0010\u0000\u03c9\u00c5\u0001\u0000\u0000"+ + "\u0000\u03ca\u03cb\u0003\u014c\u009e\u0000\u03cb\u03cc\u0001\u0000\u0000"+ + "\u0000\u03cc\u03cd\u0006[\u0011\u0000\u03cd\u00c7\u0001\u0000\u0000\u0000"+ + "\u03ce\u03cf\u0003f+\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000\u03d0\u03d1"+ + "\u0006\\\u0012\u0000\u03d1\u00c9\u0001\u0000\u0000\u0000\u03d2\u03d3\u0003"+ + "b)\u0000\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006]\u0013"+ + "\u0000\u03d5\u00cb\u0001\u0000\u0000\u0000\u03d6\u03d7\u0007\u0010\u0000"+ + "\u0000\u03d7\u03d8\u0007\u0003\u0000\u0000\u03d8\u03d9\u0007\u0005\u0000"+ + "\u0000\u03d9\u03da\u0007\f\u0000\u0000\u03da\u03db\u0007\u0000\u0000\u0000"+ + "\u03db\u03dc\u0007\f\u0000\u0000\u03dc\u03dd\u0007\u0005\u0000\u0000\u03dd"+ + "\u03de\u0007\f\u0000\u0000\u03de\u00cd\u0001\u0000\u0000\u0000\u03df\u03e3"+ + "\b \u0000\u0000\u03e0\u03e1\u0005/\u0000\u0000\u03e1\u03e3\b!\u0000\u0000"+ + "\u03e2\u03df\u0001\u0000\u0000\u0000\u03e2\u03e0\u0001\u0000\u0000\u0000"+ + "\u03e3\u00cf\u0001\u0000\u0000\u0000\u03e4\u03e6\u0003\u00ce_\u0000\u03e5"+ + "\u03e4\u0001\u0000\u0000\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7"+ + "\u03e5\u0001\u0000\u0000\u0000\u03e7\u03e8\u0001\u0000\u0000\u0000\u03e8"+ + "\u00d1\u0001\u0000\u0000\u0000\u03e9\u03ea\u0003\u00d0`\u0000\u03ea\u03eb"+ + "\u0001\u0000\u0000\u0000\u03eb\u03ec\u0006a\u0014\u0000\u03ec\u00d3\u0001"+ + "\u0000\u0000\u0000\u03ed\u03ee\u0003V#\u0000\u03ee\u03ef\u0001\u0000\u0000"+ + "\u0000\u03ef\u03f0\u0006b\u0015\u0000\u03f0\u00d5\u0001\u0000\u0000\u0000"+ + "\u03f1\u03f2\u0003:\u0015\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3"+ + "\u03f4\u0006c\u000b\u0000\u03f4\u00d7\u0001\u0000\u0000\u0000\u03f5\u03f6"+ + "\u0003<\u0016\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006"+ + "d\u000b\u0000\u03f8\u00d9\u0001\u0000\u0000\u0000\u03f9\u03fa\u0003>\u0017"+ + "\u0000\u03fa\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006e\u000b\u0000"+ + "\u03fc\u00db\u0001\u0000\u0000\u0000\u03fd\u03fe\u0003@\u0018\u0000\u03fe"+ + "\u03ff\u0001\u0000\u0000\u0000\u03ff\u0400\u0006f\u000f\u0000\u0400\u0401"+ + "\u0006f\f\u0000\u0401\u00dd\u0001\u0000\u0000\u0000\u0402\u0403\u0003"+ + "j-\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0006g\u0016"+ + "\u0000\u0405\u00df\u0001\u0000\u0000\u0000\u0406\u0407\u0003f+\u0000\u0407"+ + "\u0408\u0001\u0000\u0000\u0000\u0408\u0409\u0006h\u0012\u0000\u0409\u00e1"+ + "\u0001\u0000\u0000\u0000\u040a\u040f\u0003D\u001a\u0000\u040b\u040f\u0003"+ + "B\u0019\u0000\u040c\u040f\u0003R!\u0000\u040d\u040f\u0003\u009cF\u0000"+ + "\u040e\u040a\u0001\u0000\u0000\u0000\u040e\u040b\u0001\u0000\u0000\u0000"+ + "\u040e\u040c\u0001\u0000\u0000\u0000\u040e\u040d\u0001\u0000\u0000\u0000"+ + "\u040f\u00e3\u0001\u0000\u0000\u0000\u0410\u0413\u0003D\u001a\u0000\u0411"+ + "\u0413\u0003\u009cF\u0000\u0412\u0410\u0001\u0000\u0000\u0000\u0412\u0411"+ + "\u0001\u0000\u0000\u0000\u0413\u0417\u0001\u0000\u0000\u0000\u0414\u0416"+ + "\u0003\u00e2i\u0000\u0415\u0414\u0001\u0000\u0000\u0000\u0416\u0419\u0001"+ + "\u0000\u0000\u0000\u0417\u0415\u0001\u0000\u0000\u0000\u0417\u0418\u0001"+ + "\u0000\u0000\u0000\u0418\u0424\u0001\u0000\u0000\u0000\u0419\u0417\u0001"+ + "\u0000\u0000\u0000\u041a\u041d\u0003R!\u0000\u041b\u041d\u0003L\u001e"+ + "\u0000\u041c\u041a\u0001\u0000\u0000\u0000\u041c\u041b\u0001\u0000\u0000"+ + "\u0000\u041d\u041f\u0001\u0000\u0000\u0000\u041e\u0420\u0003\u00e2i\u0000"+ + "\u041f\u041e\u0001\u0000\u0000\u0000\u0420\u0421\u0001\u0000\u0000\u0000"+ + "\u0421\u041f\u0001\u0000\u0000\u0000\u0421\u0422\u0001\u0000\u0000\u0000"+ + "\u0422\u0424\u0001\u0000\u0000\u0000\u0423\u0412\u0001\u0000\u0000\u0000"+ + "\u0423\u041c\u0001\u0000\u0000\u0000\u0424\u00e5\u0001\u0000\u0000\u0000"+ + "\u0425\u0428\u0003\u00e4j\u0000\u0426\u0428\u0003\u00acN\u0000\u0427\u0425"+ + "\u0001\u0000\u0000\u0000\u0427\u0426\u0001\u0000\u0000\u0000\u0428\u0429"+ + "\u0001\u0000\u0000\u0000\u0429\u0427\u0001\u0000\u0000\u0000\u0429\u042a"+ + "\u0001\u0000\u0000\u0000\u042a\u00e7\u0001\u0000\u0000\u0000\u042b\u042c"+ + "\u0003:\u0015\u0000\u042c\u042d\u0001\u0000\u0000\u0000\u042d\u042e\u0006"+ + "l\u000b\u0000\u042e\u00e9\u0001\u0000\u0000\u0000\u042f\u0430\u0003<\u0016"+ + "\u0000\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0006m\u000b\u0000"+ + "\u0432\u00eb\u0001\u0000\u0000\u0000\u0433\u0434\u0003>\u0017\u0000\u0434"+ + "\u0435\u0001\u0000\u0000\u0000\u0435\u0436\u0006n\u000b\u0000\u0436\u00ed"+ + "\u0001\u0000\u0000\u0000\u0437\u0438\u0003@\u0018\u0000\u0438\u0439\u0001"+ + "\u0000\u0000\u0000\u0439\u043a\u0006o\u000f\u0000\u043a\u043b\u0006o\f"+ + "\u0000\u043b\u00ef\u0001\u0000\u0000\u0000\u043c\u043d\u0003b)\u0000\u043d"+ + "\u043e\u0001\u0000\u0000\u0000\u043e\u043f\u0006p\u0013\u0000\u043f\u00f1"+ + "\u0001\u0000\u0000\u0000\u0440\u0441\u0003f+\u0000\u0441\u0442\u0001\u0000"+ + "\u0000\u0000\u0442\u0443\u0006q\u0012\u0000\u0443\u00f3\u0001\u0000\u0000"+ + "\u0000\u0444\u0445\u0003j-\u0000\u0445\u0446\u0001\u0000\u0000\u0000\u0446"+ + "\u0447\u0006r\u0016\u0000\u0447\u00f5\u0001\u0000\u0000\u0000\u0448\u0449"+ + "\u0007\f\u0000\u0000\u0449\u044a\u0007\u0002\u0000\u0000\u044a\u00f7\u0001"+ + "\u0000\u0000\u0000\u044b\u044c\u0003\u00e6k\u0000\u044c\u044d\u0001\u0000"+ + "\u0000\u0000\u044d\u044e\u0006t\u0017\u0000\u044e\u00f9\u0001\u0000\u0000"+ + "\u0000\u044f\u0450\u0003:\u0015\u0000\u0450\u0451\u0001\u0000\u0000\u0000"+ + "\u0451\u0452\u0006u\u000b\u0000\u0452\u00fb\u0001\u0000\u0000\u0000\u0453"+ + "\u0454\u0003<\u0016\u0000\u0454\u0455\u0001\u0000\u0000\u0000\u0455\u0456"+ + "\u0006v\u000b\u0000\u0456\u00fd\u0001\u0000\u0000\u0000\u0457\u0458\u0003"+ + ">\u0017\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006w\u000b"+ + "\u0000\u045a\u00ff\u0001\u0000\u0000\u0000\u045b\u045c\u0003@\u0018\u0000"+ + "\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006x\u000f\u0000\u045e"+ + "\u045f\u0006x\f\u0000\u045f\u0101\u0001\u0000\u0000\u0000\u0460\u0461"+ + "\u0003\u00a6K\u0000\u0461\u0462\u0001\u0000\u0000\u0000\u0462\u0463\u0006"+ + "y\r\u0000\u0463\u0464\u0006y\u0018\u0000\u0464\u0103\u0001\u0000\u0000"+ + "\u0000\u0465\u0466\u0007\u0007\u0000\u0000\u0466\u0467\u0007\t\u0000\u0000"+ + "\u0467\u0468\u0001\u0000\u0000\u0000\u0468\u0469\u0006z\u0019\u0000\u0469"+ + "\u0105\u0001\u0000\u0000\u0000\u046a\u046b\u0007\u0013\u0000\u0000\u046b"+ + "\u046c\u0007\u0001\u0000\u0000\u046c\u046d\u0007\u0005\u0000\u0000\u046d"+ + "\u046e\u0007\n\u0000\u0000\u046e\u046f\u0001\u0000\u0000\u0000\u046f\u0470"+ + "\u0006{\u0019\u0000\u0470\u0107\u0001\u0000\u0000\u0000\u0471\u0472\b"+ + "\"\u0000\u0000\u0472\u0109\u0001\u0000\u0000\u0000\u0473\u0475\u0003\u0108"+ + "|\u0000\u0474\u0473\u0001\u0000\u0000\u0000\u0475\u0476\u0001\u0000\u0000"+ + "\u0000\u0476\u0474\u0001\u0000\u0000\u0000\u0476\u0477\u0001\u0000\u0000"+ + "\u0000\u0477\u0478\u0001\u0000\u0000\u0000\u0478\u0479\u0003\u014c\u009e"+ + "\u0000\u0479\u047b\u0001\u0000\u0000\u0000\u047a\u0474\u0001\u0000\u0000"+ + "\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047d\u0001\u0000\u0000"+ + "\u0000\u047c\u047e\u0003\u0108|\u0000\u047d\u047c\u0001\u0000\u0000\u0000"+ + "\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u047d\u0001\u0000\u0000\u0000"+ + "\u047f\u0480\u0001\u0000\u0000\u0000\u0480\u010b\u0001\u0000\u0000\u0000"+ + "\u0481\u0482\u0003\u010a}\u0000\u0482\u0483\u0001\u0000\u0000\u0000\u0483"+ + "\u0484\u0006~\u001a\u0000\u0484\u010d\u0001\u0000\u0000\u0000\u0485\u0486"+ + "\u0003:\u0015\u0000\u0486\u0487\u0001\u0000\u0000\u0000\u0487\u0488\u0006"+ + "\u007f\u000b\u0000\u0488\u010f\u0001\u0000\u0000\u0000\u0489\u048a\u0003"+ + "<\u0016\u0000\u048a\u048b\u0001\u0000\u0000\u0000\u048b\u048c\u0006\u0080"+ + "\u000b\u0000\u048c\u0111\u0001\u0000\u0000\u0000\u048d\u048e\u0003>\u0017"+ + "\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0006\u0081\u000b"+ + "\u0000\u0490\u0113\u0001\u0000\u0000\u0000\u0491\u0492\u0003@\u0018\u0000"+ + "\u0492\u0493\u0001\u0000\u0000\u0000\u0493\u0494\u0006\u0082\u000f\u0000"+ + "\u0494\u0495\u0006\u0082\f\u0000\u0495\u0496\u0006\u0082\f\u0000\u0496"+ + "\u0115\u0001\u0000\u0000\u0000\u0497\u0498\u0003b)\u0000\u0498\u0499\u0001"+ + "\u0000\u0000\u0000\u0499\u049a\u0006\u0083\u0013\u0000\u049a\u0117\u0001"+ + "\u0000\u0000\u0000\u049b\u049c\u0003f+\u0000\u049c\u049d\u0001\u0000\u0000"+ + "\u0000\u049d\u049e\u0006\u0084\u0012\u0000\u049e\u0119\u0001\u0000\u0000"+ + "\u0000\u049f\u04a0\u0003j-\u0000\u04a0\u04a1\u0001\u0000\u0000\u0000\u04a1"+ + "\u04a2\u0006\u0085\u0016\u0000\u04a2\u011b\u0001\u0000\u0000\u0000\u04a3"+ + "\u04a4\u0003\u0106{\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5\u04a6"+ + "\u0006\u0086\u001b\u0000\u04a6\u011d\u0001\u0000\u0000\u0000\u04a7\u04a8"+ + "\u0003\u00e6k\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0006"+ + "\u0087\u0017\u0000\u04aa\u011f\u0001\u0000\u0000\u0000\u04ab\u04ac\u0003"+ + "\u00aeO\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000\u04ad\u04ae\u0006\u0088"+ + "\u001c\u0000\u04ae\u0121\u0001\u0000\u0000\u0000\u04af\u04b0\u0003:\u0015"+ + "\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0006\u0089\u000b"+ + "\u0000\u04b2\u0123\u0001\u0000\u0000\u0000\u04b3\u04b4\u0003<\u0016\u0000"+ + "\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u0006\u008a\u000b\u0000"+ + "\u04b6\u0125\u0001\u0000\u0000\u0000\u04b7\u04b8\u0003>\u0017\u0000\u04b8"+ + "\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006\u008b\u000b\u0000\u04ba"+ + "\u0127\u0001\u0000\u0000\u0000\u04bb\u04bc\u0003@\u0018\u0000\u04bc\u04bd"+ + "\u0001\u0000\u0000\u0000\u04bd\u04be\u0006\u008c\u000f\u0000\u04be\u04bf"+ + "\u0006\u008c\f\u0000\u04bf\u0129\u0001\u0000\u0000\u0000\u04c0\u04c1\u0003"+ + "j-\u0000\u04c1\u04c2\u0001\u0000\u0000\u0000\u04c2\u04c3\u0006\u008d\u0016"+ + "\u0000\u04c3\u012b\u0001\u0000\u0000\u0000\u04c4\u04c5\u0003\u00aeO\u0000"+ + "\u04c5\u04c6\u0001\u0000\u0000\u0000\u04c6\u04c7\u0006\u008e\u001c\u0000"+ + "\u04c7\u012d\u0001\u0000\u0000\u0000\u04c8\u04c9\u0003\u00aaM\u0000\u04c9"+ + "\u04ca\u0001\u0000\u0000\u0000\u04ca\u04cb\u0006\u008f\u001d\u0000\u04cb"+ + "\u012f\u0001\u0000\u0000\u0000\u04cc\u04cd\u0003:\u0015\u0000\u04cd\u04ce"+ + "\u0001\u0000\u0000\u0000\u04ce\u04cf\u0006\u0090\u000b\u0000\u04cf\u0131"+ + "\u0001\u0000\u0000\u0000\u04d0\u04d1\u0003<\u0016\u0000\u04d1\u04d2\u0001"+ + "\u0000\u0000\u0000\u04d2\u04d3\u0006\u0091\u000b\u0000\u04d3\u0133\u0001"+ + "\u0000\u0000\u0000\u04d4\u04d5\u0003>\u0017\u0000\u04d5\u04d6\u0001\u0000"+ + "\u0000\u0000\u04d6\u04d7\u0006\u0092\u000b\u0000\u04d7\u0135\u0001\u0000"+ + "\u0000\u0000\u04d8\u04d9\u0003@\u0018\u0000\u04d9\u04da\u0001\u0000\u0000"+ + "\u0000\u04da\u04db\u0006\u0093\u000f\u0000\u04db\u04dc\u0006\u0093\f\u0000"+ + "\u04dc\u0137\u0001\u0000\u0000\u0000\u04dd\u04de\u0007\u0001\u0000\u0000"+ + "\u04de\u04df\u0007\t\u0000\u0000\u04df\u04e0\u0007\u000f\u0000\u0000\u04e0"+ + "\u04e1\u0007\u0007\u0000\u0000\u04e1\u0139\u0001\u0000\u0000\u0000\u04e2"+ + "\u04e3\u0003:\u0015\u0000\u04e3\u04e4\u0001\u0000\u0000\u0000\u04e4\u04e5"+ + "\u0006\u0095\u000b\u0000\u04e5\u013b\u0001\u0000\u0000\u0000\u04e6\u04e7"+ + "\u0003<\u0016\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8\u04e9\u0006"+ + "\u0096\u000b\u0000\u04e9\u013d\u0001\u0000\u0000\u0000\u04ea\u04eb\u0003"+ + ">\u0017\u0000\u04eb\u04ec\u0001\u0000\u0000\u0000\u04ec\u04ed\u0006\u0097"+ + "\u000b\u0000\u04ed\u013f\u0001\u0000\u0000\u0000\u04ee\u04ef\u0003@\u0018"+ + "\u0000\u04ef\u04f0\u0001\u0000\u0000\u0000\u04f0\u04f1\u0006\u0098\u000f"+ + "\u0000\u04f1\u04f2\u0006\u0098\f\u0000\u04f2\u0141\u0001\u0000\u0000\u0000"+ + "\u04f3\u04f4\u0007\u000f\u0000\u0000\u04f4\u04f5\u0007\u0014\u0000\u0000"+ + "\u04f5\u04f6\u0007\t\u0000\u0000\u04f6\u04f7\u0007\u0004\u0000\u0000\u04f7"+ + "\u04f8\u0007\u0005\u0000\u0000\u04f8\u04f9\u0007\u0001\u0000\u0000\u04f9"+ + "\u04fa\u0007\u0007\u0000\u0000\u04fa\u04fb\u0007\t\u0000\u0000\u04fb\u04fc"+ + "\u0007\u0002\u0000\u0000\u04fc\u0143\u0001\u0000\u0000\u0000\u04fd\u04fe"+ + "\u0003:\u0015\u0000\u04fe\u04ff\u0001\u0000\u0000\u0000\u04ff\u0500\u0006"+ + "\u009a\u000b\u0000\u0500\u0145\u0001\u0000\u0000\u0000\u0501\u0502\u0003"+ + "<\u0016\u0000\u0502\u0503\u0001\u0000\u0000\u0000\u0503\u0504\u0006\u009b"+ + "\u000b\u0000\u0504\u0147\u0001\u0000\u0000\u0000\u0505\u0506\u0003>\u0017"+ + "\u0000\u0506\u0507\u0001\u0000\u0000\u0000\u0507\u0508\u0006\u009c\u000b"+ + "\u0000\u0508\u0149\u0001\u0000\u0000\u0000\u0509\u050a\u0003\u00a8L\u0000"+ + "\u050a\u050b\u0001\u0000\u0000\u0000\u050b\u050c\u0006\u009d\u0010\u0000"+ + "\u050c\u050d\u0006\u009d\f\u0000\u050d\u014b\u0001\u0000\u0000\u0000\u050e"+ + "\u050f\u0005:\u0000\u0000\u050f\u014d\u0001\u0000\u0000\u0000\u0510\u0516"+ + "\u0003L\u001e\u0000\u0511\u0516\u0003B\u0019\u0000\u0512\u0516\u0003j"+ + "-\u0000\u0513\u0516\u0003D\u001a\u0000\u0514\u0516\u0003R!\u0000\u0515"+ + "\u0510\u0001\u0000\u0000\u0000\u0515\u0511\u0001\u0000\u0000\u0000\u0515"+ + "\u0512\u0001\u0000\u0000\u0000\u0515\u0513\u0001\u0000\u0000\u0000\u0515"+ + "\u0514\u0001\u0000\u0000\u0000\u0516\u0517\u0001\u0000\u0000\u0000\u0517"+ + "\u0515\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000\u0000\u0518"+ + "\u014f\u0001\u0000\u0000\u0000\u0519\u051a\u0003:\u0015\u0000\u051a\u051b"+ + "\u0001\u0000\u0000\u0000\u051b\u051c\u0006\u00a0\u000b\u0000\u051c\u0151"+ + "\u0001\u0000\u0000\u0000\u051d\u051e\u0003<\u0016\u0000\u051e\u051f\u0001"+ + "\u0000\u0000\u0000\u051f\u0520\u0006\u00a1\u000b\u0000\u0520\u0153\u0001"+ + "\u0000\u0000\u0000\u0521\u0522\u0003>\u0017\u0000\u0522\u0523\u0001\u0000"+ + "\u0000\u0000\u0523\u0524\u0006\u00a2\u000b\u0000\u0524\u0155\u0001\u0000"+ + "\u0000\u0000\u0525\u0526\u0003@\u0018\u0000\u0526\u0527\u0001\u0000\u0000"+ + "\u0000\u0527\u0528\u0006\u00a3\u000f\u0000\u0528\u0529\u0006\u00a3\f\u0000"+ + "\u0529\u0157\u0001\u0000\u0000\u0000\u052a\u052b\u0003\u014c\u009e\u0000"+ + "\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0006\u00a4\u0011\u0000"+ + "\u052d\u0159\u0001\u0000\u0000\u0000\u052e\u052f\u0003f+\u0000\u052f\u0530"+ + "\u0001\u0000\u0000\u0000\u0530\u0531\u0006\u00a5\u0012\u0000\u0531\u015b"+ + "\u0001\u0000\u0000\u0000\u0532\u0533\u0003j-\u0000\u0533\u0534\u0001\u0000"+ + "\u0000\u0000\u0534\u0535\u0006\u00a6\u0016\u0000\u0535\u015d\u0001\u0000"+ + "\u0000\u0000\u0536\u0537\u0003\u0104z\u0000\u0537\u0538\u0001\u0000\u0000"+ + "\u0000\u0538\u0539\u0006\u00a7\u001e\u0000\u0539\u053a\u0006\u00a7\u001f"+ + "\u0000\u053a\u015f\u0001\u0000\u0000\u0000\u053b\u053c\u0003\u00d0`\u0000"+ + "\u053c\u053d\u0001\u0000\u0000\u0000\u053d\u053e\u0006\u00a8\u0014\u0000"+ + "\u053e\u0161\u0001\u0000\u0000\u0000\u053f\u0540\u0003V#\u0000\u0540\u0541"+ + "\u0001\u0000\u0000\u0000\u0541\u0542\u0006\u00a9\u0015\u0000\u0542\u0163"+ + "\u0001\u0000\u0000\u0000\u0543\u0544\u0003:\u0015\u0000\u0544\u0545\u0001"+ + "\u0000\u0000\u0000\u0545\u0546\u0006\u00aa\u000b\u0000\u0546\u0165\u0001"+ + "\u0000\u0000\u0000\u0547\u0548\u0003<\u0016\u0000\u0548\u0549\u0001\u0000"+ + "\u0000\u0000\u0549\u054a\u0006\u00ab\u000b\u0000\u054a\u0167\u0001\u0000"+ + "\u0000\u0000\u054b\u054c\u0003>\u0017\u0000\u054c\u054d\u0001\u0000\u0000"+ + "\u0000\u054d\u054e\u0006\u00ac\u000b\u0000\u054e\u0169\u0001\u0000\u0000"+ + "\u0000\u054f\u0550\u0003@\u0018\u0000\u0550\u0551\u0001\u0000\u0000\u0000"+ + "\u0551\u0552\u0006\u00ad\u000f\u0000\u0552\u0553\u0006\u00ad\f\u0000\u0553"+ + "\u0554\u0006\u00ad\f\u0000\u0554\u016b\u0001\u0000\u0000\u0000\u0555\u0556"+ + "\u0003f+\u0000\u0556\u0557\u0001\u0000\u0000\u0000\u0557\u0558\u0006\u00ae"+ + "\u0012\u0000\u0558\u016d\u0001\u0000\u0000\u0000\u0559\u055a\u0003j-\u0000"+ + "\u055a\u055b\u0001\u0000\u0000\u0000\u055b\u055c\u0006\u00af\u0016\u0000"+ + "\u055c\u016f\u0001\u0000\u0000\u0000\u055d\u055e\u0003\u00e6k\u0000\u055e"+ + "\u055f\u0001\u0000\u0000\u0000\u055f\u0560\u0006\u00b0\u0017\u0000\u0560"+ + "\u0171\u0001\u0000\u0000\u0000\u0561\u0562\u0003:\u0015\u0000\u0562\u0563"+ + "\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u00b1\u000b\u0000\u0564\u0173"+ + "\u0001\u0000\u0000\u0000\u0565\u0566\u0003<\u0016\u0000\u0566\u0567\u0001"+ + "\u0000\u0000\u0000\u0567\u0568\u0006\u00b2\u000b\u0000\u0568\u0175\u0001"+ + "\u0000\u0000\u0000\u0569\u056a\u0003>\u0017\u0000\u056a\u056b\u0001\u0000"+ + "\u0000\u0000\u056b\u056c\u0006\u00b3\u000b\u0000\u056c\u0177\u0001\u0000"+ + "\u0000\u0000\u056d\u056e\u0003@\u0018\u0000\u056e\u056f\u0001\u0000\u0000"+ + "\u0000\u056f\u0570\u0006\u00b4\u000f\u0000\u0570\u0571\u0006\u00b4\f\u0000"+ + "\u0571\u0179\u0001\u0000\u0000\u0000\u0572\u0573\u0003\u00d0`\u0000\u0573"+ + "\u0574\u0001\u0000\u0000\u0000\u0574\u0575\u0006\u00b5\u0014\u0000\u0575"+ + "\u0576\u0006\u00b5\f\u0000\u0576\u0577\u0006\u00b5 \u0000\u0577\u017b"+ + "\u0001\u0000\u0000\u0000\u0578\u0579\u0003V#\u0000\u0579\u057a\u0001\u0000"+ + "\u0000\u0000\u057a\u057b\u0006\u00b6\u0015\u0000\u057b\u057c\u0006\u00b6"+ + "\f\u0000\u057c\u057d\u0006\u00b6 \u0000\u057d\u017d\u0001\u0000\u0000"+ + "\u0000\u057e\u057f\u0003:\u0015\u0000\u057f\u0580\u0001\u0000\u0000\u0000"+ + "\u0580\u0581\u0006\u00b7\u000b\u0000\u0581\u017f\u0001\u0000\u0000\u0000"+ + "\u0582\u0583\u0003<\u0016\u0000\u0583\u0584\u0001\u0000\u0000\u0000\u0584"+ + "\u0585\u0006\u00b8\u000b\u0000\u0585\u0181\u0001\u0000\u0000\u0000\u0586"+ + "\u0587\u0003>\u0017\u0000\u0587\u0588\u0001\u0000\u0000\u0000\u0588\u0589"+ + "\u0006\u00b9\u000b\u0000\u0589\u0183\u0001\u0000\u0000\u0000\u058a\u058b"+ + "\u0003\u014c\u009e\u0000\u058b\u058c\u0001\u0000\u0000\u0000\u058c\u058d"+ + "\u0006\u00ba\u0011\u0000\u058d\u058e\u0006\u00ba\f\u0000\u058e\u058f\u0006"+ + "\u00ba\n\u0000\u058f\u0185\u0001\u0000\u0000\u0000\u0590\u0591\u0003f"+ + "+\u0000\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0593\u0006\u00bb\u0012"+ + "\u0000\u0593\u0594\u0006\u00bb\f\u0000\u0594\u0595\u0006\u00bb\n\u0000"+ + "\u0595\u0187\u0001\u0000\u0000\u0000\u0596\u0597\u0003:\u0015\u0000\u0597"+ + "\u0598\u0001\u0000\u0000\u0000\u0598\u0599\u0006\u00bc\u000b\u0000\u0599"+ + "\u0189\u0001\u0000\u0000\u0000\u059a\u059b\u0003<\u0016\u0000\u059b\u059c"+ + "\u0001\u0000\u0000\u0000\u059c\u059d\u0006\u00bd\u000b\u0000\u059d\u018b"+ + "\u0001\u0000\u0000\u0000\u059e\u059f\u0003>\u0017\u0000\u059f\u05a0\u0001"+ + "\u0000\u0000\u0000\u05a0\u05a1\u0006\u00be\u000b\u0000\u05a1\u018d\u0001"+ + "\u0000\u0000\u0000\u05a2\u05a3\u0003\u00aeO\u0000\u05a3\u05a4\u0001\u0000"+ + "\u0000\u0000\u05a4\u05a5\u0006\u00bf\f\u0000\u05a5\u05a6\u0006\u00bf\u0000"+ + "\u0000\u05a6\u05a7\u0006\u00bf\u001c\u0000\u05a7\u018f\u0001\u0000\u0000"+ + "\u0000\u05a8\u05a9\u0003\u00aaM\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000"+ + "\u05aa\u05ab\u0006\u00c0\f\u0000\u05ab\u05ac\u0006\u00c0\u0000\u0000\u05ac"+ + "\u05ad\u0006\u00c0\u001d\u0000\u05ad\u0191\u0001\u0000\u0000\u0000\u05ae"+ + "\u05af\u0003\\&\u0000\u05af\u05b0\u0001\u0000\u0000\u0000\u05b0\u05b1"+ + "\u0006\u00c1\f\u0000\u05b1\u05b2\u0006\u00c1\u0000\u0000\u05b2\u05b3\u0006"+ + "\u00c1!\u0000\u05b3\u0193\u0001\u0000\u0000\u0000\u05b4\u05b5\u0003@\u0018"+ + "\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7\u0006\u00c2\u000f"+ + "\u0000\u05b7\u05b8\u0006\u00c2\f\u0000\u05b8\u0195\u0001\u0000\u0000\u0000"+ + "B\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+ + "\u000f\u0245\u024f\u0253\u0256\u025f\u0261\u026c\u027f\u0284\u028d\u0294"+ + "\u0299\u029b\u02a6\u02ae\u02b1\u02b3\u02b8\u02bd\u02c3\u02ca\u02cf\u02d5"+ + "\u02d8\u02e0\u02e4\u0365\u036a\u0371\u0373\u0383\u0388\u038d\u038f\u0395"+ + "\u03e2\u03e7\u040e\u0412\u0417\u041c\u0421\u0423\u0427\u0429\u0476\u047a"+ + "\u047f\u0515\u0517\"\u0005\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000"+ + "\u0005\u0002\u0000\u0005\u0003\u0000\u0005\n\u0000\u0005\b\u0000\u0005"+ + "\u0005\u0000\u0005\t\u0000\u0005\f\u0000\u0005\u000e\u0000\u0000\u0001"+ + "\u0000\u0004\u0000\u0000\u0007B\u0000\u0005\u0000\u0000\u0007\u0019\u0000"+ + "\u0007C\u0000\u0007m\u0000\u0007\"\u0000\u0007 \u0000\u0007M\u0000\u0007"+ + "\u001a\u0000\u0007$\u0000\u0007Q\u0000\u0005\u000b\u0000\u0005\u0007\u0000"+ + "\u0007[\u0000\u0007Z\u0000\u0007E\u0000\u0007D\u0000\u0007Y\u0000\u0005"+ + "\r\u0000\u0005\u000f\u0000\u0007\u001d\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index 08418ae4e5e1c..09252e3028fcf 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -24,7 +24,6 @@ null null null null -null '|' null null @@ -66,6 +65,7 @@ null '%' null null +null ']' null null @@ -147,7 +147,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -192,6 +191,7 @@ MINUS ASTERISK SLASH PERCENT +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -318,4 +318,4 @@ inlinestatsCommand atn: -[4, 1, 125, 585, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 142, 8, 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, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 179, 8, 5, 10, 5, 12, 5, 182, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 203, 8, 5, 10, 5, 12, 5, 206, 9, 5, 1, 6, 1, 6, 3, 6, 210, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 222, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 233, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 239, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 247, 8, 9, 10, 9, 12, 9, 250, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 3, 11, 281, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 288, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 298, 8, 15, 10, 15, 12, 15, 301, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 308, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 314, 8, 17, 10, 17, 12, 17, 317, 9, 17, 1, 17, 3, 17, 320, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 327, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 335, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 341, 8, 22, 10, 22, 12, 22, 344, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 354, 8, 24, 10, 24, 12, 24, 357, 9, 24, 1, 24, 3, 24, 360, 8, 24, 1, 24, 1, 24, 3, 24, 364, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 371, 8, 26, 1, 26, 1, 26, 3, 26, 375, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 380, 8, 27, 10, 27, 12, 27, 383, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 388, 8, 28, 10, 28, 12, 28, 391, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 396, 8, 29, 10, 29, 12, 29, 399, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 418, 8, 32, 10, 32, 12, 32, 421, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 429, 8, 32, 10, 32, 12, 32, 432, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 440, 8, 32, 10, 32, 12, 32, 443, 9, 32, 1, 32, 1, 32, 3, 32, 447, 8, 32, 1, 33, 1, 33, 3, 33, 451, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 460, 8, 35, 10, 35, 12, 35, 463, 9, 35, 1, 36, 1, 36, 3, 36, 467, 8, 36, 1, 36, 1, 36, 3, 36, 471, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 483, 8, 39, 10, 39, 12, 39, 486, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 496, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 508, 8, 44, 10, 44, 12, 44, 511, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 521, 8, 47, 1, 48, 3, 48, 524, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 529, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 554, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 560, 8, 56, 10, 56, 12, 56, 563, 9, 56, 3, 56, 565, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 583, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 60, 61, 1, 0, 62, 64, 2, 0, 27, 27, 77, 77, 1, 0, 68, 69, 2, 0, 32, 32, 36, 36, 2, 0, 39, 39, 42, 42, 2, 0, 38, 38, 52, 52, 2, 0, 53, 53, 55, 59, 610, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 141, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 221, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 287, 1, 0, 0, 0, 26, 289, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 294, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 309, 1, 0, 0, 0, 36, 326, 1, 0, 0, 0, 38, 328, 1, 0, 0, 0, 40, 330, 1, 0, 0, 0, 42, 334, 1, 0, 0, 0, 44, 336, 1, 0, 0, 0, 46, 345, 1, 0, 0, 0, 48, 349, 1, 0, 0, 0, 50, 365, 1, 0, 0, 0, 52, 368, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 384, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 400, 1, 0, 0, 0, 62, 402, 1, 0, 0, 0, 64, 446, 1, 0, 0, 0, 66, 450, 1, 0, 0, 0, 68, 452, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 464, 1, 0, 0, 0, 74, 472, 1, 0, 0, 0, 76, 475, 1, 0, 0, 0, 78, 478, 1, 0, 0, 0, 80, 487, 1, 0, 0, 0, 82, 491, 1, 0, 0, 0, 84, 497, 1, 0, 0, 0, 86, 501, 1, 0, 0, 0, 88, 504, 1, 0, 0, 0, 90, 512, 1, 0, 0, 0, 92, 516, 1, 0, 0, 0, 94, 520, 1, 0, 0, 0, 96, 523, 1, 0, 0, 0, 98, 528, 1, 0, 0, 0, 100, 532, 1, 0, 0, 0, 102, 534, 1, 0, 0, 0, 104, 536, 1, 0, 0, 0, 106, 539, 1, 0, 0, 0, 108, 543, 1, 0, 0, 0, 110, 546, 1, 0, 0, 0, 112, 549, 1, 0, 0, 0, 114, 569, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 578, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 26, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 142, 3, 104, 52, 0, 135, 142, 3, 34, 17, 0, 136, 142, 3, 110, 55, 0, 137, 142, 3, 28, 14, 0, 138, 142, 3, 108, 54, 0, 139, 140, 4, 2, 1, 0, 140, 142, 3, 48, 24, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 5, 1, 0, 0, 0, 143, 160, 3, 50, 25, 0, 144, 160, 3, 8, 4, 0, 145, 160, 3, 74, 37, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 52, 26, 0, 148, 160, 3, 70, 35, 0, 149, 160, 3, 76, 38, 0, 150, 160, 3, 78, 39, 0, 151, 160, 3, 82, 41, 0, 152, 160, 3, 84, 42, 0, 153, 160, 3, 112, 56, 0, 154, 160, 3, 86, 43, 0, 155, 156, 4, 3, 2, 0, 156, 160, 3, 118, 59, 0, 157, 158, 4, 3, 3, 0, 158, 160, 3, 116, 58, 0, 159, 143, 1, 0, 0, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 17, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 45, 0, 0, 166, 195, 3, 10, 5, 8, 167, 195, 3, 16, 8, 0, 168, 195, 3, 12, 6, 0, 169, 171, 3, 16, 8, 0, 170, 172, 5, 45, 0, 0, 171, 170, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 5, 40, 0, 0, 174, 175, 5, 44, 0, 0, 175, 180, 3, 16, 8, 0, 176, 177, 5, 35, 0, 0, 177, 179, 3, 16, 8, 0, 178, 176, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 51, 0, 0, 184, 195, 1, 0, 0, 0, 185, 186, 3, 16, 8, 0, 186, 188, 5, 41, 0, 0, 187, 189, 5, 45, 0, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 5, 46, 0, 0, 191, 195, 1, 0, 0, 0, 192, 193, 4, 5, 4, 0, 193, 195, 3, 14, 7, 0, 194, 164, 1, 0, 0, 0, 194, 167, 1, 0, 0, 0, 194, 168, 1, 0, 0, 0, 194, 169, 1, 0, 0, 0, 194, 185, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 204, 1, 0, 0, 0, 196, 197, 10, 5, 0, 0, 197, 198, 5, 31, 0, 0, 198, 203, 3, 10, 5, 6, 199, 200, 10, 4, 0, 0, 200, 201, 5, 48, 0, 0, 201, 203, 3, 10, 5, 5, 202, 196, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 209, 3, 16, 8, 0, 208, 210, 5, 45, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 5, 43, 0, 0, 212, 213, 3, 100, 50, 0, 213, 222, 1, 0, 0, 0, 214, 216, 3, 16, 8, 0, 215, 217, 5, 45, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 50, 0, 0, 219, 220, 3, 100, 50, 0, 220, 222, 1, 0, 0, 0, 221, 207, 1, 0, 0, 0, 221, 214, 1, 0, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 3, 16, 8, 0, 224, 225, 5, 20, 0, 0, 225, 226, 3, 100, 50, 0, 226, 15, 1, 0, 0, 0, 227, 233, 3, 18, 9, 0, 228, 229, 3, 18, 9, 0, 229, 230, 3, 102, 51, 0, 230, 231, 3, 18, 9, 0, 231, 233, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 17, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 239, 3, 20, 10, 0, 236, 237, 7, 0, 0, 0, 237, 239, 3, 18, 9, 3, 238, 234, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 1, 0, 0, 0, 240, 241, 10, 2, 0, 0, 241, 242, 7, 1, 0, 0, 242, 247, 3, 18, 9, 3, 243, 244, 10, 1, 0, 0, 244, 245, 7, 0, 0, 0, 245, 247, 3, 18, 9, 2, 246, 240, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 19, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 6, 10, -1, 0, 252, 260, 3, 64, 32, 0, 253, 260, 3, 54, 27, 0, 254, 260, 3, 22, 11, 0, 255, 256, 5, 44, 0, 0, 256, 257, 3, 10, 5, 0, 257, 258, 5, 51, 0, 0, 258, 260, 1, 0, 0, 0, 259, 251, 1, 0, 0, 0, 259, 253, 1, 0, 0, 0, 259, 254, 1, 0, 0, 0, 259, 255, 1, 0, 0, 0, 260, 266, 1, 0, 0, 0, 261, 262, 10, 1, 0, 0, 262, 263, 5, 34, 0, 0, 263, 265, 3, 26, 13, 0, 264, 261, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 3, 24, 12, 0, 270, 280, 5, 44, 0, 0, 271, 281, 5, 62, 0, 0, 272, 277, 3, 10, 5, 0, 273, 274, 5, 35, 0, 0, 274, 276, 3, 10, 5, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 271, 1, 0, 0, 0, 280, 272, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 5, 51, 0, 0, 283, 23, 1, 0, 0, 0, 284, 285, 4, 12, 10, 0, 285, 288, 5, 20, 0, 0, 286, 288, 3, 60, 30, 0, 287, 284, 1, 0, 0, 0, 287, 286, 1, 0, 0, 0, 288, 25, 1, 0, 0, 0, 289, 290, 3, 60, 30, 0, 290, 27, 1, 0, 0, 0, 291, 292, 5, 13, 0, 0, 292, 293, 3, 30, 15, 0, 293, 29, 1, 0, 0, 0, 294, 299, 3, 32, 16, 0, 295, 296, 5, 35, 0, 0, 296, 298, 3, 32, 16, 0, 297, 295, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 31, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 308, 3, 10, 5, 0, 303, 304, 3, 54, 27, 0, 304, 305, 5, 33, 0, 0, 305, 306, 3, 10, 5, 0, 306, 308, 1, 0, 0, 0, 307, 302, 1, 0, 0, 0, 307, 303, 1, 0, 0, 0, 308, 33, 1, 0, 0, 0, 309, 310, 5, 6, 0, 0, 310, 315, 3, 36, 18, 0, 311, 312, 5, 35, 0, 0, 312, 314, 3, 36, 18, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 320, 3, 42, 21, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 35, 1, 0, 0, 0, 321, 322, 3, 38, 19, 0, 322, 323, 5, 109, 0, 0, 323, 324, 3, 40, 20, 0, 324, 327, 1, 0, 0, 0, 325, 327, 3, 40, 20, 0, 326, 321, 1, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 37, 1, 0, 0, 0, 328, 329, 5, 77, 0, 0, 329, 39, 1, 0, 0, 0, 330, 331, 7, 2, 0, 0, 331, 41, 1, 0, 0, 0, 332, 335, 3, 44, 22, 0, 333, 335, 3, 46, 23, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, 0, 335, 43, 1, 0, 0, 0, 336, 337, 5, 76, 0, 0, 337, 342, 5, 77, 0, 0, 338, 339, 5, 35, 0, 0, 339, 341, 5, 77, 0, 0, 340, 338, 1, 0, 0, 0, 341, 344, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 45, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 345, 346, 5, 66, 0, 0, 346, 347, 3, 44, 22, 0, 347, 348, 5, 67, 0, 0, 348, 47, 1, 0, 0, 0, 349, 350, 5, 21, 0, 0, 350, 355, 3, 36, 18, 0, 351, 352, 5, 35, 0, 0, 352, 354, 3, 36, 18, 0, 353, 351, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 358, 360, 3, 30, 15, 0, 359, 358, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 362, 5, 30, 0, 0, 362, 364, 3, 30, 15, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 49, 1, 0, 0, 0, 365, 366, 5, 4, 0, 0, 366, 367, 3, 30, 15, 0, 367, 51, 1, 0, 0, 0, 368, 370, 5, 16, 0, 0, 369, 371, 3, 30, 15, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 373, 5, 30, 0, 0, 373, 375, 3, 30, 15, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 381, 3, 60, 30, 0, 377, 378, 5, 37, 0, 0, 378, 380, 3, 60, 30, 0, 379, 377, 1, 0, 0, 0, 380, 383, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 55, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 384, 389, 3, 62, 31, 0, 385, 386, 5, 37, 0, 0, 386, 388, 3, 62, 31, 0, 387, 385, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 397, 3, 56, 28, 0, 393, 394, 5, 35, 0, 0, 394, 396, 3, 56, 28, 0, 395, 393, 1, 0, 0, 0, 396, 399, 1, 0, 0, 0, 397, 395, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 59, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 401, 7, 3, 0, 0, 401, 61, 1, 0, 0, 0, 402, 403, 5, 81, 0, 0, 403, 63, 1, 0, 0, 0, 404, 447, 5, 46, 0, 0, 405, 406, 3, 98, 49, 0, 406, 407, 5, 68, 0, 0, 407, 447, 1, 0, 0, 0, 408, 447, 3, 96, 48, 0, 409, 447, 3, 98, 49, 0, 410, 447, 3, 92, 46, 0, 411, 447, 3, 66, 33, 0, 412, 447, 3, 100, 50, 0, 413, 414, 5, 66, 0, 0, 414, 419, 3, 94, 47, 0, 415, 416, 5, 35, 0, 0, 416, 418, 3, 94, 47, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 67, 0, 0, 423, 447, 1, 0, 0, 0, 424, 425, 5, 66, 0, 0, 425, 430, 3, 92, 46, 0, 426, 427, 5, 35, 0, 0, 427, 429, 3, 92, 46, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 434, 5, 67, 0, 0, 434, 447, 1, 0, 0, 0, 435, 436, 5, 66, 0, 0, 436, 441, 3, 100, 50, 0, 437, 438, 5, 35, 0, 0, 438, 440, 3, 100, 50, 0, 439, 437, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 5, 67, 0, 0, 445, 447, 1, 0, 0, 0, 446, 404, 1, 0, 0, 0, 446, 405, 1, 0, 0, 0, 446, 408, 1, 0, 0, 0, 446, 409, 1, 0, 0, 0, 446, 410, 1, 0, 0, 0, 446, 411, 1, 0, 0, 0, 446, 412, 1, 0, 0, 0, 446, 413, 1, 0, 0, 0, 446, 424, 1, 0, 0, 0, 446, 435, 1, 0, 0, 0, 447, 65, 1, 0, 0, 0, 448, 451, 5, 49, 0, 0, 449, 451, 5, 65, 0, 0, 450, 448, 1, 0, 0, 0, 450, 449, 1, 0, 0, 0, 451, 67, 1, 0, 0, 0, 452, 453, 5, 9, 0, 0, 453, 454, 5, 28, 0, 0, 454, 69, 1, 0, 0, 0, 455, 456, 5, 15, 0, 0, 456, 461, 3, 72, 36, 0, 457, 458, 5, 35, 0, 0, 458, 460, 3, 72, 36, 0, 459, 457, 1, 0, 0, 0, 460, 463, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 71, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 466, 3, 10, 5, 0, 465, 467, 7, 4, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 47, 0, 0, 469, 471, 7, 5, 0, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 73, 1, 0, 0, 0, 472, 473, 5, 8, 0, 0, 473, 474, 3, 58, 29, 0, 474, 75, 1, 0, 0, 0, 475, 476, 5, 2, 0, 0, 476, 477, 3, 58, 29, 0, 477, 77, 1, 0, 0, 0, 478, 479, 5, 12, 0, 0, 479, 484, 3, 80, 40, 0, 480, 481, 5, 35, 0, 0, 481, 483, 3, 80, 40, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 79, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 3, 56, 28, 0, 488, 489, 5, 85, 0, 0, 489, 490, 3, 56, 28, 0, 490, 81, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 493, 3, 20, 10, 0, 493, 495, 3, 100, 50, 0, 494, 496, 3, 88, 44, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 83, 1, 0, 0, 0, 497, 498, 5, 7, 0, 0, 498, 499, 3, 20, 10, 0, 499, 500, 3, 100, 50, 0, 500, 85, 1, 0, 0, 0, 501, 502, 5, 11, 0, 0, 502, 503, 3, 54, 27, 0, 503, 87, 1, 0, 0, 0, 504, 509, 3, 90, 45, 0, 505, 506, 5, 35, 0, 0, 506, 508, 3, 90, 45, 0, 507, 505, 1, 0, 0, 0, 508, 511, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 89, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 514, 5, 33, 0, 0, 514, 515, 3, 64, 32, 0, 515, 91, 1, 0, 0, 0, 516, 517, 7, 6, 0, 0, 517, 93, 1, 0, 0, 0, 518, 521, 3, 96, 48, 0, 519, 521, 3, 98, 49, 0, 520, 518, 1, 0, 0, 0, 520, 519, 1, 0, 0, 0, 521, 95, 1, 0, 0, 0, 522, 524, 7, 0, 0, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 29, 0, 0, 526, 97, 1, 0, 0, 0, 527, 529, 7, 0, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 28, 0, 0, 531, 99, 1, 0, 0, 0, 532, 533, 5, 27, 0, 0, 533, 101, 1, 0, 0, 0, 534, 535, 7, 7, 0, 0, 535, 103, 1, 0, 0, 0, 536, 537, 5, 5, 0, 0, 537, 538, 3, 106, 53, 0, 538, 105, 1, 0, 0, 0, 539, 540, 5, 66, 0, 0, 540, 541, 3, 2, 1, 0, 541, 542, 5, 67, 0, 0, 542, 107, 1, 0, 0, 0, 543, 544, 5, 14, 0, 0, 544, 545, 5, 101, 0, 0, 545, 109, 1, 0, 0, 0, 546, 547, 5, 10, 0, 0, 547, 548, 5, 105, 0, 0, 548, 111, 1, 0, 0, 0, 549, 550, 5, 3, 0, 0, 550, 553, 5, 91, 0, 0, 551, 552, 5, 89, 0, 0, 552, 554, 3, 56, 28, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 564, 1, 0, 0, 0, 555, 556, 5, 90, 0, 0, 556, 561, 3, 114, 57, 0, 557, 558, 5, 35, 0, 0, 558, 560, 3, 114, 57, 0, 559, 557, 1, 0, 0, 0, 560, 563, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 565, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 564, 555, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 113, 1, 0, 0, 0, 566, 567, 3, 56, 28, 0, 567, 568, 5, 33, 0, 0, 568, 570, 1, 0, 0, 0, 569, 566, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 3, 56, 28, 0, 572, 115, 1, 0, 0, 0, 573, 574, 5, 19, 0, 0, 574, 575, 3, 36, 18, 0, 575, 576, 5, 89, 0, 0, 576, 577, 3, 58, 29, 0, 577, 117, 1, 0, 0, 0, 578, 579, 5, 18, 0, 0, 579, 582, 3, 30, 15, 0, 580, 581, 5, 30, 0, 0, 581, 583, 3, 30, 15, 0, 582, 580, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 119, 1, 0, 0, 0, 55, 131, 141, 159, 171, 180, 188, 194, 202, 204, 209, 216, 221, 232, 238, 246, 248, 259, 266, 277, 280, 287, 299, 307, 315, 319, 326, 334, 342, 355, 359, 363, 370, 374, 381, 389, 397, 419, 430, 441, 446, 450, 461, 466, 470, 484, 495, 509, 520, 523, 528, 553, 561, 564, 569, 582] \ No newline at end of file +[4, 1, 125, 585, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 142, 8, 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, 3, 3, 160, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 172, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 179, 8, 5, 10, 5, 12, 5, 182, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 189, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 195, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 203, 8, 5, 10, 5, 12, 5, 206, 9, 5, 1, 6, 1, 6, 3, 6, 210, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 222, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 233, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 239, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 247, 8, 9, 10, 9, 12, 9, 250, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 3, 11, 281, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 288, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 298, 8, 15, 10, 15, 12, 15, 301, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 308, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 314, 8, 17, 10, 17, 12, 17, 317, 9, 17, 1, 17, 3, 17, 320, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 327, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 335, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 341, 8, 22, 10, 22, 12, 22, 344, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 354, 8, 24, 10, 24, 12, 24, 357, 9, 24, 1, 24, 3, 24, 360, 8, 24, 1, 24, 1, 24, 3, 24, 364, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 371, 8, 26, 1, 26, 1, 26, 3, 26, 375, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 380, 8, 27, 10, 27, 12, 27, 383, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 388, 8, 28, 10, 28, 12, 28, 391, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 396, 8, 29, 10, 29, 12, 29, 399, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 418, 8, 32, 10, 32, 12, 32, 421, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 429, 8, 32, 10, 32, 12, 32, 432, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 440, 8, 32, 10, 32, 12, 32, 443, 9, 32, 1, 32, 1, 32, 3, 32, 447, 8, 32, 1, 33, 1, 33, 3, 33, 451, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 460, 8, 35, 10, 35, 12, 35, 463, 9, 35, 1, 36, 1, 36, 3, 36, 467, 8, 36, 1, 36, 1, 36, 3, 36, 471, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 483, 8, 39, 10, 39, 12, 39, 486, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 496, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 508, 8, 44, 10, 44, 12, 44, 511, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 521, 8, 47, 1, 48, 3, 48, 524, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 529, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 554, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 560, 8, 56, 10, 56, 12, 56, 563, 9, 56, 3, 56, 565, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 583, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 59, 60, 1, 0, 61, 63, 2, 0, 26, 26, 77, 77, 1, 0, 68, 69, 2, 0, 31, 31, 35, 35, 2, 0, 38, 38, 41, 41, 2, 0, 37, 37, 51, 51, 2, 0, 52, 52, 54, 58, 610, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 141, 1, 0, 0, 0, 6, 159, 1, 0, 0, 0, 8, 161, 1, 0, 0, 0, 10, 194, 1, 0, 0, 0, 12, 221, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 238, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 287, 1, 0, 0, 0, 26, 289, 1, 0, 0, 0, 28, 291, 1, 0, 0, 0, 30, 294, 1, 0, 0, 0, 32, 307, 1, 0, 0, 0, 34, 309, 1, 0, 0, 0, 36, 326, 1, 0, 0, 0, 38, 328, 1, 0, 0, 0, 40, 330, 1, 0, 0, 0, 42, 334, 1, 0, 0, 0, 44, 336, 1, 0, 0, 0, 46, 345, 1, 0, 0, 0, 48, 349, 1, 0, 0, 0, 50, 365, 1, 0, 0, 0, 52, 368, 1, 0, 0, 0, 54, 376, 1, 0, 0, 0, 56, 384, 1, 0, 0, 0, 58, 392, 1, 0, 0, 0, 60, 400, 1, 0, 0, 0, 62, 402, 1, 0, 0, 0, 64, 446, 1, 0, 0, 0, 66, 450, 1, 0, 0, 0, 68, 452, 1, 0, 0, 0, 70, 455, 1, 0, 0, 0, 72, 464, 1, 0, 0, 0, 74, 472, 1, 0, 0, 0, 76, 475, 1, 0, 0, 0, 78, 478, 1, 0, 0, 0, 80, 487, 1, 0, 0, 0, 82, 491, 1, 0, 0, 0, 84, 497, 1, 0, 0, 0, 86, 501, 1, 0, 0, 0, 88, 504, 1, 0, 0, 0, 90, 512, 1, 0, 0, 0, 92, 516, 1, 0, 0, 0, 94, 520, 1, 0, 0, 0, 96, 523, 1, 0, 0, 0, 98, 528, 1, 0, 0, 0, 100, 532, 1, 0, 0, 0, 102, 534, 1, 0, 0, 0, 104, 536, 1, 0, 0, 0, 106, 539, 1, 0, 0, 0, 108, 543, 1, 0, 0, 0, 110, 546, 1, 0, 0, 0, 112, 549, 1, 0, 0, 0, 114, 569, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 578, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 25, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 142, 3, 104, 52, 0, 135, 142, 3, 34, 17, 0, 136, 142, 3, 110, 55, 0, 137, 142, 3, 28, 14, 0, 138, 142, 3, 108, 54, 0, 139, 140, 4, 2, 1, 0, 140, 142, 3, 48, 24, 0, 141, 134, 1, 0, 0, 0, 141, 135, 1, 0, 0, 0, 141, 136, 1, 0, 0, 0, 141, 137, 1, 0, 0, 0, 141, 138, 1, 0, 0, 0, 141, 139, 1, 0, 0, 0, 142, 5, 1, 0, 0, 0, 143, 160, 3, 50, 25, 0, 144, 160, 3, 8, 4, 0, 145, 160, 3, 74, 37, 0, 146, 160, 3, 68, 34, 0, 147, 160, 3, 52, 26, 0, 148, 160, 3, 70, 35, 0, 149, 160, 3, 76, 38, 0, 150, 160, 3, 78, 39, 0, 151, 160, 3, 82, 41, 0, 152, 160, 3, 84, 42, 0, 153, 160, 3, 112, 56, 0, 154, 160, 3, 86, 43, 0, 155, 156, 4, 3, 2, 0, 156, 160, 3, 118, 59, 0, 157, 158, 4, 3, 3, 0, 158, 160, 3, 116, 58, 0, 159, 143, 1, 0, 0, 0, 159, 144, 1, 0, 0, 0, 159, 145, 1, 0, 0, 0, 159, 146, 1, 0, 0, 0, 159, 147, 1, 0, 0, 0, 159, 148, 1, 0, 0, 0, 159, 149, 1, 0, 0, 0, 159, 150, 1, 0, 0, 0, 159, 151, 1, 0, 0, 0, 159, 152, 1, 0, 0, 0, 159, 153, 1, 0, 0, 0, 159, 154, 1, 0, 0, 0, 159, 155, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 160, 7, 1, 0, 0, 0, 161, 162, 5, 17, 0, 0, 162, 163, 3, 10, 5, 0, 163, 9, 1, 0, 0, 0, 164, 165, 6, 5, -1, 0, 165, 166, 5, 44, 0, 0, 166, 195, 3, 10, 5, 8, 167, 195, 3, 16, 8, 0, 168, 195, 3, 12, 6, 0, 169, 171, 3, 16, 8, 0, 170, 172, 5, 44, 0, 0, 171, 170, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 1, 0, 0, 0, 173, 174, 5, 39, 0, 0, 174, 175, 5, 43, 0, 0, 175, 180, 3, 16, 8, 0, 176, 177, 5, 34, 0, 0, 177, 179, 3, 16, 8, 0, 178, 176, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 50, 0, 0, 184, 195, 1, 0, 0, 0, 185, 186, 3, 16, 8, 0, 186, 188, 5, 40, 0, 0, 187, 189, 5, 44, 0, 0, 188, 187, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 5, 45, 0, 0, 191, 195, 1, 0, 0, 0, 192, 193, 4, 5, 4, 0, 193, 195, 3, 14, 7, 0, 194, 164, 1, 0, 0, 0, 194, 167, 1, 0, 0, 0, 194, 168, 1, 0, 0, 0, 194, 169, 1, 0, 0, 0, 194, 185, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 204, 1, 0, 0, 0, 196, 197, 10, 5, 0, 0, 197, 198, 5, 30, 0, 0, 198, 203, 3, 10, 5, 6, 199, 200, 10, 4, 0, 0, 200, 201, 5, 47, 0, 0, 201, 203, 3, 10, 5, 5, 202, 196, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 209, 3, 16, 8, 0, 208, 210, 5, 44, 0, 0, 209, 208, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 212, 5, 42, 0, 0, 212, 213, 3, 100, 50, 0, 213, 222, 1, 0, 0, 0, 214, 216, 3, 16, 8, 0, 215, 217, 5, 44, 0, 0, 216, 215, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 219, 5, 49, 0, 0, 219, 220, 3, 100, 50, 0, 220, 222, 1, 0, 0, 0, 221, 207, 1, 0, 0, 0, 221, 214, 1, 0, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 3, 16, 8, 0, 224, 225, 5, 64, 0, 0, 225, 226, 3, 100, 50, 0, 226, 15, 1, 0, 0, 0, 227, 233, 3, 18, 9, 0, 228, 229, 3, 18, 9, 0, 229, 230, 3, 102, 51, 0, 230, 231, 3, 18, 9, 0, 231, 233, 1, 0, 0, 0, 232, 227, 1, 0, 0, 0, 232, 228, 1, 0, 0, 0, 233, 17, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 239, 3, 20, 10, 0, 236, 237, 7, 0, 0, 0, 237, 239, 3, 18, 9, 3, 238, 234, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 248, 1, 0, 0, 0, 240, 241, 10, 2, 0, 0, 241, 242, 7, 1, 0, 0, 242, 247, 3, 18, 9, 3, 243, 244, 10, 1, 0, 0, 244, 245, 7, 0, 0, 0, 245, 247, 3, 18, 9, 2, 246, 240, 1, 0, 0, 0, 246, 243, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 19, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 252, 6, 10, -1, 0, 252, 260, 3, 64, 32, 0, 253, 260, 3, 54, 27, 0, 254, 260, 3, 22, 11, 0, 255, 256, 5, 43, 0, 0, 256, 257, 3, 10, 5, 0, 257, 258, 5, 50, 0, 0, 258, 260, 1, 0, 0, 0, 259, 251, 1, 0, 0, 0, 259, 253, 1, 0, 0, 0, 259, 254, 1, 0, 0, 0, 259, 255, 1, 0, 0, 0, 260, 266, 1, 0, 0, 0, 261, 262, 10, 1, 0, 0, 262, 263, 5, 33, 0, 0, 263, 265, 3, 26, 13, 0, 264, 261, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 3, 24, 12, 0, 270, 280, 5, 43, 0, 0, 271, 281, 5, 61, 0, 0, 272, 277, 3, 10, 5, 0, 273, 274, 5, 34, 0, 0, 274, 276, 3, 10, 5, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 271, 1, 0, 0, 0, 280, 272, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 5, 50, 0, 0, 283, 23, 1, 0, 0, 0, 284, 285, 4, 12, 10, 0, 285, 288, 5, 64, 0, 0, 286, 288, 3, 60, 30, 0, 287, 284, 1, 0, 0, 0, 287, 286, 1, 0, 0, 0, 288, 25, 1, 0, 0, 0, 289, 290, 3, 60, 30, 0, 290, 27, 1, 0, 0, 0, 291, 292, 5, 13, 0, 0, 292, 293, 3, 30, 15, 0, 293, 29, 1, 0, 0, 0, 294, 299, 3, 32, 16, 0, 295, 296, 5, 34, 0, 0, 296, 298, 3, 32, 16, 0, 297, 295, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 31, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 308, 3, 10, 5, 0, 303, 304, 3, 54, 27, 0, 304, 305, 5, 32, 0, 0, 305, 306, 3, 10, 5, 0, 306, 308, 1, 0, 0, 0, 307, 302, 1, 0, 0, 0, 307, 303, 1, 0, 0, 0, 308, 33, 1, 0, 0, 0, 309, 310, 5, 6, 0, 0, 310, 315, 3, 36, 18, 0, 311, 312, 5, 34, 0, 0, 312, 314, 3, 36, 18, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 320, 3, 42, 21, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 35, 1, 0, 0, 0, 321, 322, 3, 38, 19, 0, 322, 323, 5, 109, 0, 0, 323, 324, 3, 40, 20, 0, 324, 327, 1, 0, 0, 0, 325, 327, 3, 40, 20, 0, 326, 321, 1, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 37, 1, 0, 0, 0, 328, 329, 5, 77, 0, 0, 329, 39, 1, 0, 0, 0, 330, 331, 7, 2, 0, 0, 331, 41, 1, 0, 0, 0, 332, 335, 3, 44, 22, 0, 333, 335, 3, 46, 23, 0, 334, 332, 1, 0, 0, 0, 334, 333, 1, 0, 0, 0, 335, 43, 1, 0, 0, 0, 336, 337, 5, 76, 0, 0, 337, 342, 5, 77, 0, 0, 338, 339, 5, 34, 0, 0, 339, 341, 5, 77, 0, 0, 340, 338, 1, 0, 0, 0, 341, 344, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 45, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 345, 346, 5, 66, 0, 0, 346, 347, 3, 44, 22, 0, 347, 348, 5, 67, 0, 0, 348, 47, 1, 0, 0, 0, 349, 350, 5, 20, 0, 0, 350, 355, 3, 36, 18, 0, 351, 352, 5, 34, 0, 0, 352, 354, 3, 36, 18, 0, 353, 351, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 359, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 358, 360, 3, 30, 15, 0, 359, 358, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 363, 1, 0, 0, 0, 361, 362, 5, 29, 0, 0, 362, 364, 3, 30, 15, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 49, 1, 0, 0, 0, 365, 366, 5, 4, 0, 0, 366, 367, 3, 30, 15, 0, 367, 51, 1, 0, 0, 0, 368, 370, 5, 16, 0, 0, 369, 371, 3, 30, 15, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 373, 5, 29, 0, 0, 373, 375, 3, 30, 15, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 53, 1, 0, 0, 0, 376, 381, 3, 60, 30, 0, 377, 378, 5, 36, 0, 0, 378, 380, 3, 60, 30, 0, 379, 377, 1, 0, 0, 0, 380, 383, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 55, 1, 0, 0, 0, 383, 381, 1, 0, 0, 0, 384, 389, 3, 62, 31, 0, 385, 386, 5, 36, 0, 0, 386, 388, 3, 62, 31, 0, 387, 385, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 57, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 397, 3, 56, 28, 0, 393, 394, 5, 34, 0, 0, 394, 396, 3, 56, 28, 0, 395, 393, 1, 0, 0, 0, 396, 399, 1, 0, 0, 0, 397, 395, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 59, 1, 0, 0, 0, 399, 397, 1, 0, 0, 0, 400, 401, 7, 3, 0, 0, 401, 61, 1, 0, 0, 0, 402, 403, 5, 81, 0, 0, 403, 63, 1, 0, 0, 0, 404, 447, 5, 45, 0, 0, 405, 406, 3, 98, 49, 0, 406, 407, 5, 68, 0, 0, 407, 447, 1, 0, 0, 0, 408, 447, 3, 96, 48, 0, 409, 447, 3, 98, 49, 0, 410, 447, 3, 92, 46, 0, 411, 447, 3, 66, 33, 0, 412, 447, 3, 100, 50, 0, 413, 414, 5, 66, 0, 0, 414, 419, 3, 94, 47, 0, 415, 416, 5, 34, 0, 0, 416, 418, 3, 94, 47, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 67, 0, 0, 423, 447, 1, 0, 0, 0, 424, 425, 5, 66, 0, 0, 425, 430, 3, 92, 46, 0, 426, 427, 5, 34, 0, 0, 427, 429, 3, 92, 46, 0, 428, 426, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 433, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 433, 434, 5, 67, 0, 0, 434, 447, 1, 0, 0, 0, 435, 436, 5, 66, 0, 0, 436, 441, 3, 100, 50, 0, 437, 438, 5, 34, 0, 0, 438, 440, 3, 100, 50, 0, 439, 437, 1, 0, 0, 0, 440, 443, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 444, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 444, 445, 5, 67, 0, 0, 445, 447, 1, 0, 0, 0, 446, 404, 1, 0, 0, 0, 446, 405, 1, 0, 0, 0, 446, 408, 1, 0, 0, 0, 446, 409, 1, 0, 0, 0, 446, 410, 1, 0, 0, 0, 446, 411, 1, 0, 0, 0, 446, 412, 1, 0, 0, 0, 446, 413, 1, 0, 0, 0, 446, 424, 1, 0, 0, 0, 446, 435, 1, 0, 0, 0, 447, 65, 1, 0, 0, 0, 448, 451, 5, 48, 0, 0, 449, 451, 5, 65, 0, 0, 450, 448, 1, 0, 0, 0, 450, 449, 1, 0, 0, 0, 451, 67, 1, 0, 0, 0, 452, 453, 5, 9, 0, 0, 453, 454, 5, 27, 0, 0, 454, 69, 1, 0, 0, 0, 455, 456, 5, 15, 0, 0, 456, 461, 3, 72, 36, 0, 457, 458, 5, 34, 0, 0, 458, 460, 3, 72, 36, 0, 459, 457, 1, 0, 0, 0, 460, 463, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 71, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 466, 3, 10, 5, 0, 465, 467, 7, 4, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 46, 0, 0, 469, 471, 7, 5, 0, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 73, 1, 0, 0, 0, 472, 473, 5, 8, 0, 0, 473, 474, 3, 58, 29, 0, 474, 75, 1, 0, 0, 0, 475, 476, 5, 2, 0, 0, 476, 477, 3, 58, 29, 0, 477, 77, 1, 0, 0, 0, 478, 479, 5, 12, 0, 0, 479, 484, 3, 80, 40, 0, 480, 481, 5, 34, 0, 0, 481, 483, 3, 80, 40, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 79, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 3, 56, 28, 0, 488, 489, 5, 85, 0, 0, 489, 490, 3, 56, 28, 0, 490, 81, 1, 0, 0, 0, 491, 492, 5, 1, 0, 0, 492, 493, 3, 20, 10, 0, 493, 495, 3, 100, 50, 0, 494, 496, 3, 88, 44, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 83, 1, 0, 0, 0, 497, 498, 5, 7, 0, 0, 498, 499, 3, 20, 10, 0, 499, 500, 3, 100, 50, 0, 500, 85, 1, 0, 0, 0, 501, 502, 5, 11, 0, 0, 502, 503, 3, 54, 27, 0, 503, 87, 1, 0, 0, 0, 504, 509, 3, 90, 45, 0, 505, 506, 5, 34, 0, 0, 506, 508, 3, 90, 45, 0, 507, 505, 1, 0, 0, 0, 508, 511, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 89, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 512, 513, 3, 60, 30, 0, 513, 514, 5, 32, 0, 0, 514, 515, 3, 64, 32, 0, 515, 91, 1, 0, 0, 0, 516, 517, 7, 6, 0, 0, 517, 93, 1, 0, 0, 0, 518, 521, 3, 96, 48, 0, 519, 521, 3, 98, 49, 0, 520, 518, 1, 0, 0, 0, 520, 519, 1, 0, 0, 0, 521, 95, 1, 0, 0, 0, 522, 524, 7, 0, 0, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 5, 28, 0, 0, 526, 97, 1, 0, 0, 0, 527, 529, 7, 0, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 27, 0, 0, 531, 99, 1, 0, 0, 0, 532, 533, 5, 26, 0, 0, 533, 101, 1, 0, 0, 0, 534, 535, 7, 7, 0, 0, 535, 103, 1, 0, 0, 0, 536, 537, 5, 5, 0, 0, 537, 538, 3, 106, 53, 0, 538, 105, 1, 0, 0, 0, 539, 540, 5, 66, 0, 0, 540, 541, 3, 2, 1, 0, 541, 542, 5, 67, 0, 0, 542, 107, 1, 0, 0, 0, 543, 544, 5, 14, 0, 0, 544, 545, 5, 101, 0, 0, 545, 109, 1, 0, 0, 0, 546, 547, 5, 10, 0, 0, 547, 548, 5, 105, 0, 0, 548, 111, 1, 0, 0, 0, 549, 550, 5, 3, 0, 0, 550, 553, 5, 91, 0, 0, 551, 552, 5, 89, 0, 0, 552, 554, 3, 56, 28, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 564, 1, 0, 0, 0, 555, 556, 5, 90, 0, 0, 556, 561, 3, 114, 57, 0, 557, 558, 5, 34, 0, 0, 558, 560, 3, 114, 57, 0, 559, 557, 1, 0, 0, 0, 560, 563, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 565, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 564, 555, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 113, 1, 0, 0, 0, 566, 567, 3, 56, 28, 0, 567, 568, 5, 32, 0, 0, 568, 570, 1, 0, 0, 0, 569, 566, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 3, 56, 28, 0, 572, 115, 1, 0, 0, 0, 573, 574, 5, 19, 0, 0, 574, 575, 3, 36, 18, 0, 575, 576, 5, 89, 0, 0, 576, 577, 3, 58, 29, 0, 577, 117, 1, 0, 0, 0, 578, 579, 5, 18, 0, 0, 579, 582, 3, 30, 15, 0, 580, 581, 5, 29, 0, 0, 581, 583, 3, 30, 15, 0, 582, 580, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 119, 1, 0, 0, 0, 55, 131, 141, 159, 171, 180, 188, 194, 202, 204, 209, 216, 221, 232, 238, 246, 248, 259, 266, 277, 280, 287, 299, 307, 315, 319, 326, 334, 342, 355, 359, 363, 370, 374, 381, 389, 397, 419, 430, 441, 446, 450, 461, 466, 470, 484, 495, 509, 520, 523, 528, 553, 561, 564, 569, 582] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index 3debcd072670b..82e892638762d 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -39,13 +39,13 @@ public class EsqlBaseParser extends ParserConfig { public static final int DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, LIMIT=9, META=10, MV_EXPAND=11, RENAME=12, ROW=13, SHOW=14, SORT=15, STATS=16, - WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_MATCH=20, DEV_METRICS=21, - UNKNOWN_CMD=22, LINE_COMMENT=23, MULTILINE_COMMENT=24, WS=25, PIPE=26, - QUOTED_STRING=27, INTEGER_LITERAL=28, DECIMAL_LITERAL=29, BY=30, AND=31, - ASC=32, ASSIGN=33, CAST_OP=34, COMMA=35, DESC=36, DOT=37, FALSE=38, FIRST=39, - IN=40, IS=41, LAST=42, LIKE=43, LP=44, NOT=45, NULL=46, NULLS=47, OR=48, - PARAM=49, RLIKE=50, RP=51, TRUE=52, EQ=53, CIEQ=54, NEQ=55, LT=56, LTE=57, - GT=58, GTE=59, PLUS=60, MINUS=61, ASTERISK=62, SLASH=63, PERCENT=64, NAMED_OR_POSITIONAL_PARAM=65, + WHERE=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_METRICS=20, UNKNOWN_CMD=21, + LINE_COMMENT=22, MULTILINE_COMMENT=23, WS=24, PIPE=25, QUOTED_STRING=26, + INTEGER_LITERAL=27, DECIMAL_LITERAL=28, BY=29, AND=30, ASC=31, ASSIGN=32, + CAST_OP=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, IN=39, IS=40, + LAST=41, LIKE=42, LP=43, NOT=44, NULL=45, NULLS=46, OR=47, PARAM=48, RLIKE=49, + RP=50, TRUE=51, EQ=52, CIEQ=53, NEQ=54, LT=55, LTE=56, GT=57, GTE=58, + PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, DEV_MATCH=64, NAMED_OR_POSITIONAL_PARAM=65, OPENING_BRACKET=66, CLOSING_BRACKET=67, UNQUOTED_IDENTIFIER=68, QUOTED_IDENTIFIER=69, EXPR_LINE_COMMENT=70, EXPR_MULTILINE_COMMENT=71, EXPR_WS=72, EXPLAIN_WS=73, EXPLAIN_LINE_COMMENT=74, EXPLAIN_MULTILINE_COMMENT=75, METADATA=76, UNQUOTED_SOURCE=77, @@ -108,15 +108,15 @@ private static String[] makeLiteralNames() { null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", "'grok'", "'keep'", "'limit'", "'meta'", "'mv_expand'", "'rename'", "'row'", "'show'", "'sort'", "'stats'", "'where'", null, null, null, null, null, - null, null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", - "'='", "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", - "'is'", "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", - "'?'", "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", - "'>'", "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", - null, null, null, null, null, null, null, null, "'metadata'", null, null, - null, null, null, null, null, null, "'as'", null, null, null, "'on'", - "'with'", null, null, null, null, null, null, null, null, null, null, - "'info'", null, null, null, "'functions'", null, null, null, "':'" + null, null, "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", + "'::'", "','", "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", + "'last'", "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", + "'rlike'", "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", + "'>='", "'+'", "'-'", "'*'", "'/'", "'%'", null, null, null, "']'", null, + null, null, null, null, null, null, null, "'metadata'", null, null, null, + null, null, null, null, null, "'as'", null, null, null, "'on'", "'with'", + null, null, null, null, null, null, null, null, null, null, "'info'", + null, null, null, "'functions'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); @@ -124,20 +124,20 @@ private static String[] makeSymbolicNames() { return new String[] { null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", "LIMIT", "META", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", - "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "STATS", "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", + "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", + "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", + "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", + "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", "FUNCTIONS", "META_LINE_COMMENT", @@ -1501,7 +1501,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE setState(241); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & 7L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843009213693952L) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -4743,7 +4743,7 @@ public final ComparisonOperatorContext comparisonOperator() throws RecognitionEx { setState(534); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 1125899906842624000L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 562949953421312000L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -5438,9 +5438,9 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde ":\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0003;\u0247"+ "\b;\u0001;\u0000\u0004\u0002\n\u0012\u0014<\u0000\u0002\u0004\u0006\b"+ "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ - "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000<=\u0001\u0000"+ - ">@\u0002\u0000\u001b\u001bMM\u0001\u0000DE\u0002\u0000 $$\u0002\u0000"+ - "\'\'**\u0002\u0000&&44\u0002\u0000557;\u0262\u0000x\u0001\u0000\u0000"+ + "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000;<\u0001\u0000"+ + "=?\u0002\u0000\u001a\u001aMM\u0001\u0000DE\u0002\u0000\u001f\u001f##\u0002"+ + "\u0000&&))\u0002\u0000%%33\u0002\u0000446:\u0262\u0000x\u0001\u0000\u0000"+ "\u0000\u0002{\u0001\u0000\u0000\u0000\u0004\u008d\u0001\u0000\u0000\u0000"+ "\u0006\u009f\u0001\u0000\u0000\u0000\b\u00a1\u0001\u0000\u0000\u0000\n"+ "\u00c2\u0001\u0000\u0000\u0000\f\u00dd\u0001\u0000\u0000\u0000\u000e\u00df"+ @@ -5470,7 +5470,7 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde "\u0001\u0000\u0000\u0000xy\u0003\u0002\u0001\u0000yz\u0005\u0000\u0000"+ "\u0001z\u0001\u0001\u0000\u0000\u0000{|\u0006\u0001\uffff\uffff\u0000"+ "|}\u0003\u0004\u0002\u0000}\u0083\u0001\u0000\u0000\u0000~\u007f\n\u0001"+ - "\u0000\u0000\u007f\u0080\u0005\u001a\u0000\u0000\u0080\u0082\u0003\u0006"+ + "\u0000\u0000\u007f\u0080\u0005\u0019\u0000\u0000\u0080\u0082\u0003\u0006"+ "\u0003\u0000\u0081~\u0001\u0000\u0000\u0000\u0082\u0085\u0001\u0000\u0000"+ "\u0000\u0083\u0081\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000"+ "\u0000\u0084\u0003\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000"+ @@ -5496,41 +5496,41 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde "\u009f\u009b\u0001\u0000\u0000\u0000\u009f\u009d\u0001\u0000\u0000\u0000"+ "\u00a0\u0007\u0001\u0000\u0000\u0000\u00a1\u00a2\u0005\u0011\u0000\u0000"+ "\u00a2\u00a3\u0003\n\u0005\u0000\u00a3\t\u0001\u0000\u0000\u0000\u00a4"+ - "\u00a5\u0006\u0005\uffff\uffff\u0000\u00a5\u00a6\u0005-\u0000\u0000\u00a6"+ + "\u00a5\u0006\u0005\uffff\uffff\u0000\u00a5\u00a6\u0005,\u0000\u0000\u00a6"+ "\u00c3\u0003\n\u0005\b\u00a7\u00c3\u0003\u0010\b\u0000\u00a8\u00c3\u0003"+ - "\f\u0006\u0000\u00a9\u00ab\u0003\u0010\b\u0000\u00aa\u00ac\u0005-\u0000"+ + "\f\u0006\u0000\u00a9\u00ab\u0003\u0010\b\u0000\u00aa\u00ac\u0005,\u0000"+ "\u0000\u00ab\u00aa\u0001\u0000\u0000\u0000\u00ab\u00ac\u0001\u0000\u0000"+ - "\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad\u00ae\u0005(\u0000\u0000"+ - "\u00ae\u00af\u0005,\u0000\u0000\u00af\u00b4\u0003\u0010\b\u0000\u00b0"+ - "\u00b1\u0005#\u0000\u0000\u00b1\u00b3\u0003\u0010\b\u0000\u00b2\u00b0"+ + "\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad\u00ae\u0005\'\u0000\u0000"+ + "\u00ae\u00af\u0005+\u0000\u0000\u00af\u00b4\u0003\u0010\b\u0000\u00b0"+ + "\u00b1\u0005\"\u0000\u0000\u00b1\u00b3\u0003\u0010\b\u0000\u00b2\u00b0"+ "\u0001\u0000\u0000\u0000\u00b3\u00b6\u0001\u0000\u0000\u0000\u00b4\u00b2"+ "\u0001\u0000\u0000\u0000\u00b4\u00b5\u0001\u0000\u0000\u0000\u00b5\u00b7"+ "\u0001\u0000\u0000\u0000\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b7\u00b8"+ - "\u00053\u0000\u0000\u00b8\u00c3\u0001\u0000\u0000\u0000\u00b9\u00ba\u0003"+ - "\u0010\b\u0000\u00ba\u00bc\u0005)\u0000\u0000\u00bb\u00bd\u0005-\u0000"+ + "\u00052\u0000\u0000\u00b8\u00c3\u0001\u0000\u0000\u0000\u00b9\u00ba\u0003"+ + "\u0010\b\u0000\u00ba\u00bc\u0005(\u0000\u0000\u00bb\u00bd\u0005,\u0000"+ "\u0000\u00bc\u00bb\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001\u0000\u0000"+ - "\u0000\u00bd\u00be\u0001\u0000\u0000\u0000\u00be\u00bf\u0005.\u0000\u0000"+ + "\u0000\u00bd\u00be\u0001\u0000\u0000\u0000\u00be\u00bf\u0005-\u0000\u0000"+ "\u00bf\u00c3\u0001\u0000\u0000\u0000\u00c0\u00c1\u0004\u0005\u0004\u0000"+ "\u00c1\u00c3\u0003\u000e\u0007\u0000\u00c2\u00a4\u0001\u0000\u0000\u0000"+ "\u00c2\u00a7\u0001\u0000\u0000\u0000\u00c2\u00a8\u0001\u0000\u0000\u0000"+ "\u00c2\u00a9\u0001\u0000\u0000\u0000\u00c2\u00b9\u0001\u0000\u0000\u0000"+ "\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c3\u00cc\u0001\u0000\u0000\u0000"+ - "\u00c4\u00c5\n\u0005\u0000\u0000\u00c5\u00c6\u0005\u001f\u0000\u0000\u00c6"+ + "\u00c4\u00c5\n\u0005\u0000\u0000\u00c5\u00c6\u0005\u001e\u0000\u0000\u00c6"+ "\u00cb\u0003\n\u0005\u0006\u00c7\u00c8\n\u0004\u0000\u0000\u00c8\u00c9"+ - "\u00050\u0000\u0000\u00c9\u00cb\u0003\n\u0005\u0005\u00ca\u00c4\u0001"+ + "\u0005/\u0000\u0000\u00c9\u00cb\u0003\n\u0005\u0005\u00ca\u00c4\u0001"+ "\u0000\u0000\u0000\u00ca\u00c7\u0001\u0000\u0000\u0000\u00cb\u00ce\u0001"+ "\u0000\u0000\u0000\u00cc\u00ca\u0001\u0000\u0000\u0000\u00cc\u00cd\u0001"+ "\u0000\u0000\u0000\u00cd\u000b\u0001\u0000\u0000\u0000\u00ce\u00cc\u0001"+ - "\u0000\u0000\u0000\u00cf\u00d1\u0003\u0010\b\u0000\u00d0\u00d2\u0005-"+ + "\u0000\u0000\u0000\u00cf\u00d1\u0003\u0010\b\u0000\u00d0\u00d2\u0005,"+ "\u0000\u0000\u00d1\u00d0\u0001\u0000\u0000\u0000\u00d1\u00d2\u0001\u0000"+ - "\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005+\u0000"+ + "\u0000\u0000\u00d2\u00d3\u0001\u0000\u0000\u0000\u00d3\u00d4\u0005*\u0000"+ "\u0000\u00d4\u00d5\u0003d2\u0000\u00d5\u00de\u0001\u0000\u0000\u0000\u00d6"+ - "\u00d8\u0003\u0010\b\u0000\u00d7\u00d9\u0005-\u0000\u0000\u00d8\u00d7"+ + "\u00d8\u0003\u0010\b\u0000\u00d7\u00d9\u0005,\u0000\u0000\u00d8\u00d7"+ "\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000\u0000\u00d9\u00da"+ - "\u0001\u0000\u0000\u0000\u00da\u00db\u00052\u0000\u0000\u00db\u00dc\u0003"+ + "\u0001\u0000\u0000\u0000\u00da\u00db\u00051\u0000\u0000\u00db\u00dc\u0003"+ "d2\u0000\u00dc\u00de\u0001\u0000\u0000\u0000\u00dd\u00cf\u0001\u0000\u0000"+ "\u0000\u00dd\u00d6\u0001\u0000\u0000\u0000\u00de\r\u0001\u0000\u0000\u0000"+ - "\u00df\u00e0\u0003\u0010\b\u0000\u00e0\u00e1\u0005\u0014\u0000\u0000\u00e1"+ + "\u00df\u00e0\u0003\u0010\b\u0000\u00e0\u00e1\u0005@\u0000\u0000\u00e1"+ "\u00e2\u0003d2\u0000\u00e2\u000f\u0001\u0000\u0000\u0000\u00e3\u00e9\u0003"+ "\u0012\t\u0000\u00e4\u00e5\u0003\u0012\t\u0000\u00e5\u00e6\u0003f3\u0000"+ "\u00e6\u00e7\u0003\u0012\t\u0000\u00e7\u00e9\u0001\u0000\u0000\u0000\u00e8"+ @@ -5547,186 +5547,186 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde "\u00f9\u0013\u0001\u0000\u0000\u0000\u00fa\u00f8\u0001\u0000\u0000\u0000"+ "\u00fb\u00fc\u0006\n\uffff\uffff\u0000\u00fc\u0104\u0003@ \u0000\u00fd"+ "\u0104\u00036\u001b\u0000\u00fe\u0104\u0003\u0016\u000b\u0000\u00ff\u0100"+ - "\u0005,\u0000\u0000\u0100\u0101\u0003\n\u0005\u0000\u0101\u0102\u0005"+ - "3\u0000\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u00fb\u0001\u0000"+ + "\u0005+\u0000\u0000\u0100\u0101\u0003\n\u0005\u0000\u0101\u0102\u0005"+ + "2\u0000\u0000\u0102\u0104\u0001\u0000\u0000\u0000\u0103\u00fb\u0001\u0000"+ "\u0000\u0000\u0103\u00fd\u0001\u0000\u0000\u0000\u0103\u00fe\u0001\u0000"+ "\u0000\u0000\u0103\u00ff\u0001\u0000\u0000\u0000\u0104\u010a\u0001\u0000"+ - "\u0000\u0000\u0105\u0106\n\u0001\u0000\u0000\u0106\u0107\u0005\"\u0000"+ + "\u0000\u0000\u0105\u0106\n\u0001\u0000\u0000\u0106\u0107\u0005!\u0000"+ "\u0000\u0107\u0109\u0003\u001a\r\u0000\u0108\u0105\u0001\u0000\u0000\u0000"+ "\u0109\u010c\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000\u0000\u0000"+ "\u010a\u010b\u0001\u0000\u0000\u0000\u010b\u0015\u0001\u0000\u0000\u0000"+ "\u010c\u010a\u0001\u0000\u0000\u0000\u010d\u010e\u0003\u0018\f\u0000\u010e"+ - "\u0118\u0005,\u0000\u0000\u010f\u0119\u0005>\u0000\u0000\u0110\u0115\u0003"+ - "\n\u0005\u0000\u0111\u0112\u0005#\u0000\u0000\u0112\u0114\u0003\n\u0005"+ + "\u0118\u0005+\u0000\u0000\u010f\u0119\u0005=\u0000\u0000\u0110\u0115\u0003"+ + "\n\u0005\u0000\u0111\u0112\u0005\"\u0000\u0000\u0112\u0114\u0003\n\u0005"+ "\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\u0117\u0001\u0000\u0000"+ "\u0000\u0115\u0113\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000\u0000"+ "\u0000\u0116\u0119\u0001\u0000\u0000\u0000\u0117\u0115\u0001\u0000\u0000"+ "\u0000\u0118\u010f\u0001\u0000\u0000\u0000\u0118\u0110\u0001\u0000\u0000"+ "\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u011a\u0001\u0000\u0000"+ - "\u0000\u011a\u011b\u00053\u0000\u0000\u011b\u0017\u0001\u0000\u0000\u0000"+ - "\u011c\u011d\u0004\f\n\u0000\u011d\u0120\u0005\u0014\u0000\u0000\u011e"+ - "\u0120\u0003<\u001e\u0000\u011f\u011c\u0001\u0000\u0000\u0000\u011f\u011e"+ - "\u0001\u0000\u0000\u0000\u0120\u0019\u0001\u0000\u0000\u0000\u0121\u0122"+ - "\u0003<\u001e\u0000\u0122\u001b\u0001\u0000\u0000\u0000\u0123\u0124\u0005"+ - "\r\u0000\u0000\u0124\u0125\u0003\u001e\u000f\u0000\u0125\u001d\u0001\u0000"+ - "\u0000\u0000\u0126\u012b\u0003 \u0010\u0000\u0127\u0128\u0005#\u0000\u0000"+ - "\u0128\u012a\u0003 \u0010\u0000\u0129\u0127\u0001\u0000\u0000\u0000\u012a"+ - "\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000\u012b"+ - "\u012c\u0001\u0000\u0000\u0000\u012c\u001f\u0001\u0000\u0000\u0000\u012d"+ - "\u012b\u0001\u0000\u0000\u0000\u012e\u0134\u0003\n\u0005\u0000\u012f\u0130"+ - "\u00036\u001b\u0000\u0130\u0131\u0005!\u0000\u0000\u0131\u0132\u0003\n"+ - "\u0005\u0000\u0132\u0134\u0001\u0000\u0000\u0000\u0133\u012e\u0001\u0000"+ + "\u0000\u011a\u011b\u00052\u0000\u0000\u011b\u0017\u0001\u0000\u0000\u0000"+ + "\u011c\u011d\u0004\f\n\u0000\u011d\u0120\u0005@\u0000\u0000\u011e\u0120"+ + "\u0003<\u001e\u0000\u011f\u011c\u0001\u0000\u0000\u0000\u011f\u011e\u0001"+ + "\u0000\u0000\u0000\u0120\u0019\u0001\u0000\u0000\u0000\u0121\u0122\u0003"+ + "<\u001e\u0000\u0122\u001b\u0001\u0000\u0000\u0000\u0123\u0124\u0005\r"+ + "\u0000\u0000\u0124\u0125\u0003\u001e\u000f\u0000\u0125\u001d\u0001\u0000"+ + "\u0000\u0000\u0126\u012b\u0003 \u0010\u0000\u0127\u0128\u0005\"\u0000"+ + "\u0000\u0128\u012a\u0003 \u0010\u0000\u0129\u0127\u0001\u0000\u0000\u0000"+ + "\u012a\u012d\u0001\u0000\u0000\u0000\u012b\u0129\u0001\u0000\u0000\u0000"+ + "\u012b\u012c\u0001\u0000\u0000\u0000\u012c\u001f\u0001\u0000\u0000\u0000"+ + "\u012d\u012b\u0001\u0000\u0000\u0000\u012e\u0134\u0003\n\u0005\u0000\u012f"+ + "\u0130\u00036\u001b\u0000\u0130\u0131\u0005 \u0000\u0000\u0131\u0132\u0003"+ + "\n\u0005\u0000\u0132\u0134\u0001\u0000\u0000\u0000\u0133\u012e\u0001\u0000"+ "\u0000\u0000\u0133\u012f\u0001\u0000\u0000\u0000\u0134!\u0001\u0000\u0000"+ "\u0000\u0135\u0136\u0005\u0006\u0000\u0000\u0136\u013b\u0003$\u0012\u0000"+ - "\u0137\u0138\u0005#\u0000\u0000\u0138\u013a\u0003$\u0012\u0000\u0139\u0137"+ - "\u0001\u0000\u0000\u0000\u013a\u013d\u0001\u0000\u0000\u0000\u013b\u0139"+ - "\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000\u0000\u013c\u013f"+ - "\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e\u0140"+ - "\u0003*\u0015\u0000\u013f\u013e\u0001\u0000\u0000\u0000\u013f\u0140\u0001"+ - "\u0000\u0000\u0000\u0140#\u0001\u0000\u0000\u0000\u0141\u0142\u0003&\u0013"+ - "\u0000\u0142\u0143\u0005m\u0000\u0000\u0143\u0144\u0003(\u0014\u0000\u0144"+ - "\u0147\u0001\u0000\u0000\u0000\u0145\u0147\u0003(\u0014\u0000\u0146\u0141"+ - "\u0001\u0000\u0000\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147%\u0001"+ - "\u0000\u0000\u0000\u0148\u0149\u0005M\u0000\u0000\u0149\'\u0001\u0000"+ - "\u0000\u0000\u014a\u014b\u0007\u0002\u0000\u0000\u014b)\u0001\u0000\u0000"+ - "\u0000\u014c\u014f\u0003,\u0016\u0000\u014d\u014f\u0003.\u0017\u0000\u014e"+ - "\u014c\u0001\u0000\u0000\u0000\u014e\u014d\u0001\u0000\u0000\u0000\u014f"+ - "+\u0001\u0000\u0000\u0000\u0150\u0151\u0005L\u0000\u0000\u0151\u0156\u0005"+ - "M\u0000\u0000\u0152\u0153\u0005#\u0000\u0000\u0153\u0155\u0005M\u0000"+ - "\u0000\u0154\u0152\u0001\u0000\u0000\u0000\u0155\u0158\u0001\u0000\u0000"+ - "\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001\u0000\u0000"+ - "\u0000\u0157-\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000\u0000\u0000"+ - "\u0159\u015a\u0005B\u0000\u0000\u015a\u015b\u0003,\u0016\u0000\u015b\u015c"+ - "\u0005C\u0000\u0000\u015c/\u0001\u0000\u0000\u0000\u015d\u015e\u0005\u0015"+ - "\u0000\u0000\u015e\u0163\u0003$\u0012\u0000\u015f\u0160\u0005#\u0000\u0000"+ - "\u0160\u0162\u0003$\u0012\u0000\u0161\u015f\u0001\u0000\u0000\u0000\u0162"+ - "\u0165\u0001\u0000\u0000\u0000\u0163\u0161\u0001\u0000\u0000\u0000\u0163"+ - "\u0164\u0001\u0000\u0000\u0000\u0164\u0167\u0001\u0000\u0000\u0000\u0165"+ - "\u0163\u0001\u0000\u0000\u0000\u0166\u0168\u0003\u001e\u000f\u0000\u0167"+ - "\u0166\u0001\u0000\u0000\u0000\u0167\u0168\u0001\u0000\u0000\u0000\u0168"+ - "\u016b\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u001e\u0000\u0000\u016a"+ - "\u016c\u0003\u001e\u000f\u0000\u016b\u0169\u0001\u0000\u0000\u0000\u016b"+ - "\u016c\u0001\u0000\u0000\u0000\u016c1\u0001\u0000\u0000\u0000\u016d\u016e"+ - "\u0005\u0004\u0000\u0000\u016e\u016f\u0003\u001e\u000f\u0000\u016f3\u0001"+ - "\u0000\u0000\u0000\u0170\u0172\u0005\u0010\u0000\u0000\u0171\u0173\u0003"+ - "\u001e\u000f\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u0172\u0173\u0001"+ - "\u0000\u0000\u0000\u0173\u0176\u0001\u0000\u0000\u0000\u0174\u0175\u0005"+ - "\u001e\u0000\u0000\u0175\u0177\u0003\u001e\u000f\u0000\u0176\u0174\u0001"+ - "\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u01775\u0001\u0000"+ - "\u0000\u0000\u0178\u017d\u0003<\u001e\u0000\u0179\u017a\u0005%\u0000\u0000"+ - "\u017a\u017c\u0003<\u001e\u0000\u017b\u0179\u0001\u0000\u0000\u0000\u017c"+ - "\u017f\u0001\u0000\u0000\u0000\u017d\u017b\u0001\u0000\u0000\u0000\u017d"+ - "\u017e\u0001\u0000\u0000\u0000\u017e7\u0001\u0000\u0000\u0000\u017f\u017d"+ - "\u0001\u0000\u0000\u0000\u0180\u0185\u0003>\u001f\u0000\u0181\u0182\u0005"+ - "%\u0000\u0000\u0182\u0184\u0003>\u001f\u0000\u0183\u0181\u0001\u0000\u0000"+ - "\u0000\u0184\u0187\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000"+ - "\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u01869\u0001\u0000\u0000\u0000"+ - "\u0187\u0185\u0001\u0000\u0000\u0000\u0188\u018d\u00038\u001c\u0000\u0189"+ - "\u018a\u0005#\u0000\u0000\u018a\u018c\u00038\u001c\u0000\u018b\u0189\u0001"+ - "\u0000\u0000\u0000\u018c\u018f\u0001\u0000\u0000\u0000\u018d\u018b\u0001"+ - "\u0000\u0000\u0000\u018d\u018e\u0001\u0000\u0000\u0000\u018e;\u0001\u0000"+ - "\u0000\u0000\u018f\u018d\u0001\u0000\u0000\u0000\u0190\u0191\u0007\u0003"+ - "\u0000\u0000\u0191=\u0001\u0000\u0000\u0000\u0192\u0193\u0005Q\u0000\u0000"+ - "\u0193?\u0001\u0000\u0000\u0000\u0194\u01bf\u0005.\u0000\u0000\u0195\u0196"+ - "\u0003b1\u0000\u0196\u0197\u0005D\u0000\u0000\u0197\u01bf\u0001\u0000"+ - "\u0000\u0000\u0198\u01bf\u0003`0\u0000\u0199\u01bf\u0003b1\u0000\u019a"+ - "\u01bf\u0003\\.\u0000\u019b\u01bf\u0003B!\u0000\u019c\u01bf\u0003d2\u0000"+ - "\u019d\u019e\u0005B\u0000\u0000\u019e\u01a3\u0003^/\u0000\u019f\u01a0"+ - "\u0005#\u0000\u0000\u01a0\u01a2\u0003^/\u0000\u01a1\u019f\u0001\u0000"+ - "\u0000\u0000\u01a2\u01a5\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000\u0000\u01a4\u01a6\u0001\u0000"+ - "\u0000\u0000\u01a5\u01a3\u0001\u0000\u0000\u0000\u01a6\u01a7\u0005C\u0000"+ - "\u0000\u01a7\u01bf\u0001\u0000\u0000\u0000\u01a8\u01a9\u0005B\u0000\u0000"+ - "\u01a9\u01ae\u0003\\.\u0000\u01aa\u01ab\u0005#\u0000\u0000\u01ab\u01ad"+ - "\u0003\\.\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000\u01ad\u01b0\u0001"+ - "\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01ae\u01af\u0001"+ - "\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000\u0000\u01b0\u01ae\u0001"+ - "\u0000\u0000\u0000\u01b1\u01b2\u0005C\u0000\u0000\u01b2\u01bf\u0001\u0000"+ - "\u0000\u0000\u01b3\u01b4\u0005B\u0000\u0000\u01b4\u01b9\u0003d2\u0000"+ - "\u01b5\u01b6\u0005#\u0000\u0000\u01b6\u01b8\u0003d2\u0000\u01b7\u01b5"+ - "\u0001\u0000\u0000\u0000\u01b8\u01bb\u0001\u0000\u0000\u0000\u01b9\u01b7"+ - "\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000\u01ba\u01bc"+ - "\u0001\u0000\u0000\u0000\u01bb\u01b9\u0001\u0000\u0000\u0000\u01bc\u01bd"+ - "\u0005C\u0000\u0000\u01bd\u01bf\u0001\u0000\u0000\u0000\u01be\u0194\u0001"+ - "\u0000\u0000\u0000\u01be\u0195\u0001\u0000\u0000\u0000\u01be\u0198\u0001"+ - "\u0000\u0000\u0000\u01be\u0199\u0001\u0000\u0000\u0000\u01be\u019a\u0001"+ - "\u0000\u0000\u0000\u01be\u019b\u0001\u0000\u0000\u0000\u01be\u019c\u0001"+ - "\u0000\u0000\u0000\u01be\u019d\u0001\u0000\u0000\u0000\u01be\u01a8\u0001"+ - "\u0000\u0000\u0000\u01be\u01b3\u0001\u0000\u0000\u0000\u01bfA\u0001\u0000"+ - "\u0000\u0000\u01c0\u01c3\u00051\u0000\u0000\u01c1\u01c3\u0005A\u0000\u0000"+ - "\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c1\u0001\u0000\u0000\u0000"+ - "\u01c3C\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\t\u0000\u0000\u01c5"+ - "\u01c6\u0005\u001c\u0000\u0000\u01c6E\u0001\u0000\u0000\u0000\u01c7\u01c8"+ - "\u0005\u000f\u0000\u0000\u01c8\u01cd\u0003H$\u0000\u01c9\u01ca\u0005#"+ - "\u0000\u0000\u01ca\u01cc\u0003H$\u0000\u01cb\u01c9\u0001\u0000\u0000\u0000"+ - "\u01cc\u01cf\u0001\u0000\u0000\u0000\u01cd\u01cb\u0001\u0000\u0000\u0000"+ - "\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ceG\u0001\u0000\u0000\u0000\u01cf"+ - "\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d2\u0003\n\u0005\u0000\u01d1\u01d3"+ - "\u0007\u0004\u0000\u0000\u01d2\u01d1\u0001\u0000\u0000\u0000\u01d2\u01d3"+ - "\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000\u01d4\u01d5"+ - "\u0005/\u0000\u0000\u01d5\u01d7\u0007\u0005\u0000\u0000\u01d6\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7I\u0001\u0000"+ - "\u0000\u0000\u01d8\u01d9\u0005\b\u0000\u0000\u01d9\u01da\u0003:\u001d"+ - "\u0000\u01daK\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u0002\u0000\u0000"+ - "\u01dc\u01dd\u0003:\u001d\u0000\u01ddM\u0001\u0000\u0000\u0000\u01de\u01df"+ - "\u0005\f\u0000\u0000\u01df\u01e4\u0003P(\u0000\u01e0\u01e1\u0005#\u0000"+ - "\u0000\u01e1\u01e3\u0003P(\u0000\u01e2\u01e0\u0001\u0000\u0000\u0000\u01e3"+ - "\u01e6\u0001\u0000\u0000\u0000\u01e4\u01e2\u0001\u0000\u0000\u0000\u01e4"+ - "\u01e5\u0001\u0000\u0000\u0000\u01e5O\u0001\u0000\u0000\u0000\u01e6\u01e4"+ - "\u0001\u0000\u0000\u0000\u01e7\u01e8\u00038\u001c\u0000\u01e8\u01e9\u0005"+ - "U\u0000\u0000\u01e9\u01ea\u00038\u001c\u0000\u01eaQ\u0001\u0000\u0000"+ - "\u0000\u01eb\u01ec\u0005\u0001\u0000\u0000\u01ec\u01ed\u0003\u0014\n\u0000"+ - "\u01ed\u01ef\u0003d2\u0000\u01ee\u01f0\u0003X,\u0000\u01ef\u01ee\u0001"+ - "\u0000\u0000\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000\u01f0S\u0001\u0000"+ - "\u0000\u0000\u01f1\u01f2\u0005\u0007\u0000\u0000\u01f2\u01f3\u0003\u0014"+ - "\n\u0000\u01f3\u01f4\u0003d2\u0000\u01f4U\u0001\u0000\u0000\u0000\u01f5"+ - "\u01f6\u0005\u000b\u0000\u0000\u01f6\u01f7\u00036\u001b\u0000\u01f7W\u0001"+ - "\u0000\u0000\u0000\u01f8\u01fd\u0003Z-\u0000\u01f9\u01fa\u0005#\u0000"+ - "\u0000\u01fa\u01fc\u0003Z-\u0000\u01fb\u01f9\u0001\u0000\u0000\u0000\u01fc"+ - "\u01ff\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001\u0000\u0000\u0000\u01fd"+ - "\u01fe\u0001\u0000\u0000\u0000\u01feY\u0001\u0000\u0000\u0000\u01ff\u01fd"+ - "\u0001\u0000\u0000\u0000\u0200\u0201\u0003<\u001e\u0000\u0201\u0202\u0005"+ - "!\u0000\u0000\u0202\u0203\u0003@ \u0000\u0203[\u0001\u0000\u0000\u0000"+ - "\u0204\u0205\u0007\u0006\u0000\u0000\u0205]\u0001\u0000\u0000\u0000\u0206"+ - "\u0209\u0003`0\u0000\u0207\u0209\u0003b1\u0000\u0208\u0206\u0001\u0000"+ - "\u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0209_\u0001\u0000\u0000"+ - "\u0000\u020a\u020c\u0007\u0000\u0000\u0000\u020b\u020a\u0001\u0000\u0000"+ - "\u0000\u020b\u020c\u0001\u0000\u0000\u0000\u020c\u020d\u0001\u0000\u0000"+ - "\u0000\u020d\u020e\u0005\u001d\u0000\u0000\u020ea\u0001\u0000\u0000\u0000"+ - "\u020f\u0211\u0007\u0000\u0000\u0000\u0210\u020f\u0001\u0000\u0000\u0000"+ - "\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212\u0001\u0000\u0000\u0000"+ - "\u0212\u0213\u0005\u001c\u0000\u0000\u0213c\u0001\u0000\u0000\u0000\u0214"+ - "\u0215\u0005\u001b\u0000\u0000\u0215e\u0001\u0000\u0000\u0000\u0216\u0217"+ - "\u0007\u0007\u0000\u0000\u0217g\u0001\u0000\u0000\u0000\u0218\u0219\u0005"+ - "\u0005\u0000\u0000\u0219\u021a\u0003j5\u0000\u021ai\u0001\u0000\u0000"+ - "\u0000\u021b\u021c\u0005B\u0000\u0000\u021c\u021d\u0003\u0002\u0001\u0000"+ - "\u021d\u021e\u0005C\u0000\u0000\u021ek\u0001\u0000\u0000\u0000\u021f\u0220"+ - "\u0005\u000e\u0000\u0000\u0220\u0221\u0005e\u0000\u0000\u0221m\u0001\u0000"+ - "\u0000\u0000\u0222\u0223\u0005\n\u0000\u0000\u0223\u0224\u0005i\u0000"+ - "\u0000\u0224o\u0001\u0000\u0000\u0000\u0225\u0226\u0005\u0003\u0000\u0000"+ - "\u0226\u0229\u0005[\u0000\u0000\u0227\u0228\u0005Y\u0000\u0000\u0228\u022a"+ - "\u00038\u001c\u0000\u0229\u0227\u0001\u0000\u0000\u0000\u0229\u022a\u0001"+ - "\u0000\u0000\u0000\u022a\u0234\u0001\u0000\u0000\u0000\u022b\u022c\u0005"+ - "Z\u0000\u0000\u022c\u0231\u0003r9\u0000\u022d\u022e\u0005#\u0000\u0000"+ - "\u022e\u0230\u0003r9\u0000\u022f\u022d\u0001\u0000\u0000\u0000\u0230\u0233"+ - "\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000\u0000\u0000\u0231\u0232"+ - "\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000\u0000\u0000\u0233\u0231"+ - "\u0001\u0000\u0000\u0000\u0234\u022b\u0001\u0000\u0000\u0000\u0234\u0235"+ - "\u0001\u0000\u0000\u0000\u0235q\u0001\u0000\u0000\u0000\u0236\u0237\u0003"+ - "8\u001c\u0000\u0237\u0238\u0005!\u0000\u0000\u0238\u023a\u0001\u0000\u0000"+ - "\u0000\u0239\u0236\u0001\u0000\u0000\u0000\u0239\u023a\u0001\u0000\u0000"+ - "\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b\u023c\u00038\u001c\u0000"+ - "\u023cs\u0001\u0000\u0000\u0000\u023d\u023e\u0005\u0013\u0000\u0000\u023e"+ - "\u023f\u0003$\u0012\u0000\u023f\u0240\u0005Y\u0000\u0000\u0240\u0241\u0003"+ - ":\u001d\u0000\u0241u\u0001\u0000\u0000\u0000\u0242\u0243\u0005\u0012\u0000"+ - "\u0000\u0243\u0246\u0003\u001e\u000f\u0000\u0244\u0245\u0005\u001e\u0000"+ - "\u0000\u0245\u0247\u0003\u001e\u000f\u0000\u0246\u0244\u0001\u0000\u0000"+ - "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247w\u0001\u0000\u0000\u0000"+ - "7\u0083\u008d\u009f\u00ab\u00b4\u00bc\u00c2\u00ca\u00cc\u00d1\u00d8\u00dd"+ - "\u00e8\u00ee\u00f6\u00f8\u0103\u010a\u0115\u0118\u011f\u012b\u0133\u013b"+ - "\u013f\u0146\u014e\u0156\u0163\u0167\u016b\u0172\u0176\u017d\u0185\u018d"+ - "\u01a3\u01ae\u01b9\u01be\u01c2\u01cd\u01d2\u01d6\u01e4\u01ef\u01fd\u0208"+ - "\u020b\u0210\u0229\u0231\u0234\u0239\u0246"; + "\u0137\u0138\u0005\"\u0000\u0000\u0138\u013a\u0003$\u0012\u0000\u0139"+ + "\u0137\u0001\u0000\u0000\u0000\u013a\u013d\u0001\u0000\u0000\u0000\u013b"+ + "\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000\u0000\u0000\u013c"+ + "\u013f\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000\u013e"+ + "\u0140\u0003*\u0015\u0000\u013f\u013e\u0001\u0000\u0000\u0000\u013f\u0140"+ + "\u0001\u0000\u0000\u0000\u0140#\u0001\u0000\u0000\u0000\u0141\u0142\u0003"+ + "&\u0013\u0000\u0142\u0143\u0005m\u0000\u0000\u0143\u0144\u0003(\u0014"+ + "\u0000\u0144\u0147\u0001\u0000\u0000\u0000\u0145\u0147\u0003(\u0014\u0000"+ + "\u0146\u0141\u0001\u0000\u0000\u0000\u0146\u0145\u0001\u0000\u0000\u0000"+ + "\u0147%\u0001\u0000\u0000\u0000\u0148\u0149\u0005M\u0000\u0000\u0149\'"+ + "\u0001\u0000\u0000\u0000\u014a\u014b\u0007\u0002\u0000\u0000\u014b)\u0001"+ + "\u0000\u0000\u0000\u014c\u014f\u0003,\u0016\u0000\u014d\u014f\u0003.\u0017"+ + "\u0000\u014e\u014c\u0001\u0000\u0000\u0000\u014e\u014d\u0001\u0000\u0000"+ + "\u0000\u014f+\u0001\u0000\u0000\u0000\u0150\u0151\u0005L\u0000\u0000\u0151"+ + "\u0156\u0005M\u0000\u0000\u0152\u0153\u0005\"\u0000\u0000\u0153\u0155"+ + "\u0005M\u0000\u0000\u0154\u0152\u0001\u0000\u0000\u0000\u0155\u0158\u0001"+ + "\u0000\u0000\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0156\u0157\u0001"+ + "\u0000\u0000\u0000\u0157-\u0001\u0000\u0000\u0000\u0158\u0156\u0001\u0000"+ + "\u0000\u0000\u0159\u015a\u0005B\u0000\u0000\u015a\u015b\u0003,\u0016\u0000"+ + "\u015b\u015c\u0005C\u0000\u0000\u015c/\u0001\u0000\u0000\u0000\u015d\u015e"+ + "\u0005\u0014\u0000\u0000\u015e\u0163\u0003$\u0012\u0000\u015f\u0160\u0005"+ + "\"\u0000\u0000\u0160\u0162\u0003$\u0012\u0000\u0161\u015f\u0001\u0000"+ + "\u0000\u0000\u0162\u0165\u0001\u0000\u0000\u0000\u0163\u0161\u0001\u0000"+ + "\u0000\u0000\u0163\u0164\u0001\u0000\u0000\u0000\u0164\u0167\u0001\u0000"+ + "\u0000\u0000\u0165\u0163\u0001\u0000\u0000\u0000\u0166\u0168\u0003\u001e"+ + "\u000f\u0000\u0167\u0166\u0001\u0000\u0000\u0000\u0167\u0168\u0001\u0000"+ + "\u0000\u0000\u0168\u016b\u0001\u0000\u0000\u0000\u0169\u016a\u0005\u001d"+ + "\u0000\u0000\u016a\u016c\u0003\u001e\u000f\u0000\u016b\u0169\u0001\u0000"+ + "\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c1\u0001\u0000\u0000"+ + "\u0000\u016d\u016e\u0005\u0004\u0000\u0000\u016e\u016f\u0003\u001e\u000f"+ + "\u0000\u016f3\u0001\u0000\u0000\u0000\u0170\u0172\u0005\u0010\u0000\u0000"+ + "\u0171\u0173\u0003\u001e\u000f\u0000\u0172\u0171\u0001\u0000\u0000\u0000"+ + "\u0172\u0173\u0001\u0000\u0000\u0000\u0173\u0176\u0001\u0000\u0000\u0000"+ + "\u0174\u0175\u0005\u001d\u0000\u0000\u0175\u0177\u0003\u001e\u000f\u0000"+ + "\u0176\u0174\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000"+ + "\u01775\u0001\u0000\u0000\u0000\u0178\u017d\u0003<\u001e\u0000\u0179\u017a"+ + "\u0005$\u0000\u0000\u017a\u017c\u0003<\u001e\u0000\u017b\u0179\u0001\u0000"+ + "\u0000\u0000\u017c\u017f\u0001\u0000\u0000\u0000\u017d\u017b\u0001\u0000"+ + "\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e7\u0001\u0000\u0000"+ + "\u0000\u017f\u017d\u0001\u0000\u0000\u0000\u0180\u0185\u0003>\u001f\u0000"+ + "\u0181\u0182\u0005$\u0000\u0000\u0182\u0184\u0003>\u001f\u0000\u0183\u0181"+ + "\u0001\u0000\u0000\u0000\u0184\u0187\u0001\u0000\u0000\u0000\u0185\u0183"+ + "\u0001\u0000\u0000\u0000\u0185\u0186\u0001\u0000\u0000\u0000\u01869\u0001"+ + "\u0000\u0000\u0000\u0187\u0185\u0001\u0000\u0000\u0000\u0188\u018d\u0003"+ + "8\u001c\u0000\u0189\u018a\u0005\"\u0000\u0000\u018a\u018c\u00038\u001c"+ + "\u0000\u018b\u0189\u0001\u0000\u0000\u0000\u018c\u018f\u0001\u0000\u0000"+ + "\u0000\u018d\u018b\u0001\u0000\u0000\u0000\u018d\u018e\u0001\u0000\u0000"+ + "\u0000\u018e;\u0001\u0000\u0000\u0000\u018f\u018d\u0001\u0000\u0000\u0000"+ + "\u0190\u0191\u0007\u0003\u0000\u0000\u0191=\u0001\u0000\u0000\u0000\u0192"+ + "\u0193\u0005Q\u0000\u0000\u0193?\u0001\u0000\u0000\u0000\u0194\u01bf\u0005"+ + "-\u0000\u0000\u0195\u0196\u0003b1\u0000\u0196\u0197\u0005D\u0000\u0000"+ + "\u0197\u01bf\u0001\u0000\u0000\u0000\u0198\u01bf\u0003`0\u0000\u0199\u01bf"+ + "\u0003b1\u0000\u019a\u01bf\u0003\\.\u0000\u019b\u01bf\u0003B!\u0000\u019c"+ + "\u01bf\u0003d2\u0000\u019d\u019e\u0005B\u0000\u0000\u019e\u01a3\u0003"+ + "^/\u0000\u019f\u01a0\u0005\"\u0000\u0000\u01a0\u01a2\u0003^/\u0000\u01a1"+ + "\u019f\u0001\u0000\u0000\u0000\u01a2\u01a5\u0001\u0000\u0000\u0000\u01a3"+ + "\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a4\u0001\u0000\u0000\u0000\u01a4"+ + "\u01a6\u0001\u0000\u0000\u0000\u01a5\u01a3\u0001\u0000\u0000\u0000\u01a6"+ + "\u01a7\u0005C\u0000\u0000\u01a7\u01bf\u0001\u0000\u0000\u0000\u01a8\u01a9"+ + "\u0005B\u0000\u0000\u01a9\u01ae\u0003\\.\u0000\u01aa\u01ab\u0005\"\u0000"+ + "\u0000\u01ab\u01ad\u0003\\.\u0000\u01ac\u01aa\u0001\u0000\u0000\u0000"+ + "\u01ad\u01b0\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000"+ + "\u01ae\u01af\u0001\u0000\u0000\u0000\u01af\u01b1\u0001\u0000\u0000\u0000"+ + "\u01b0\u01ae\u0001\u0000\u0000\u0000\u01b1\u01b2\u0005C\u0000\u0000\u01b2"+ + "\u01bf\u0001\u0000\u0000\u0000\u01b3\u01b4\u0005B\u0000\u0000\u01b4\u01b9"+ + "\u0003d2\u0000\u01b5\u01b6\u0005\"\u0000\u0000\u01b6\u01b8\u0003d2\u0000"+ + "\u01b7\u01b5\u0001\u0000\u0000\u0000\u01b8\u01bb\u0001\u0000\u0000\u0000"+ + "\u01b9\u01b7\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001\u0000\u0000\u0000"+ + "\u01ba\u01bc\u0001\u0000\u0000\u0000\u01bb\u01b9\u0001\u0000\u0000\u0000"+ + "\u01bc\u01bd\u0005C\u0000\u0000\u01bd\u01bf\u0001\u0000\u0000\u0000\u01be"+ + "\u0194\u0001\u0000\u0000\u0000\u01be\u0195\u0001\u0000\u0000\u0000\u01be"+ + "\u0198\u0001\u0000\u0000\u0000\u01be\u0199\u0001\u0000\u0000\u0000\u01be"+ + "\u019a\u0001\u0000\u0000\u0000\u01be\u019b\u0001\u0000\u0000\u0000\u01be"+ + "\u019c\u0001\u0000\u0000\u0000\u01be\u019d\u0001\u0000\u0000\u0000\u01be"+ + "\u01a8\u0001\u0000\u0000\u0000\u01be\u01b3\u0001\u0000\u0000\u0000\u01bf"+ + "A\u0001\u0000\u0000\u0000\u01c0\u01c3\u00050\u0000\u0000\u01c1\u01c3\u0005"+ + "A\u0000\u0000\u01c2\u01c0\u0001\u0000\u0000\u0000\u01c2\u01c1\u0001\u0000"+ + "\u0000\u0000\u01c3C\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\t\u0000"+ + "\u0000\u01c5\u01c6\u0005\u001b\u0000\u0000\u01c6E\u0001\u0000\u0000\u0000"+ + "\u01c7\u01c8\u0005\u000f\u0000\u0000\u01c8\u01cd\u0003H$\u0000\u01c9\u01ca"+ + "\u0005\"\u0000\u0000\u01ca\u01cc\u0003H$\u0000\u01cb\u01c9\u0001\u0000"+ + "\u0000\u0000\u01cc\u01cf\u0001\u0000\u0000\u0000\u01cd\u01cb\u0001\u0000"+ + "\u0000\u0000\u01cd\u01ce\u0001\u0000\u0000\u0000\u01ceG\u0001\u0000\u0000"+ + "\u0000\u01cf\u01cd\u0001\u0000\u0000\u0000\u01d0\u01d2\u0003\n\u0005\u0000"+ + "\u01d1\u01d3\u0007\u0004\u0000\u0000\u01d2\u01d1\u0001\u0000\u0000\u0000"+ + "\u01d2\u01d3\u0001\u0000\u0000\u0000\u01d3\u01d6\u0001\u0000\u0000\u0000"+ + "\u01d4\u01d5\u0005.\u0000\u0000\u01d5\u01d7\u0007\u0005\u0000\u0000\u01d6"+ + "\u01d4\u0001\u0000\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7"+ + "I\u0001\u0000\u0000\u0000\u01d8\u01d9\u0005\b\u0000\u0000\u01d9\u01da"+ + "\u0003:\u001d\u0000\u01daK\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u0002"+ + "\u0000\u0000\u01dc\u01dd\u0003:\u001d\u0000\u01ddM\u0001\u0000\u0000\u0000"+ + "\u01de\u01df\u0005\f\u0000\u0000\u01df\u01e4\u0003P(\u0000\u01e0\u01e1"+ + "\u0005\"\u0000\u0000\u01e1\u01e3\u0003P(\u0000\u01e2\u01e0\u0001\u0000"+ + "\u0000\u0000\u01e3\u01e6\u0001\u0000\u0000\u0000\u01e4\u01e2\u0001\u0000"+ + "\u0000\u0000\u01e4\u01e5\u0001\u0000\u0000\u0000\u01e5O\u0001\u0000\u0000"+ + "\u0000\u01e6\u01e4\u0001\u0000\u0000\u0000\u01e7\u01e8\u00038\u001c\u0000"+ + "\u01e8\u01e9\u0005U\u0000\u0000\u01e9\u01ea\u00038\u001c\u0000\u01eaQ"+ + "\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\u0001\u0000\u0000\u01ec\u01ed"+ + "\u0003\u0014\n\u0000\u01ed\u01ef\u0003d2\u0000\u01ee\u01f0\u0003X,\u0000"+ + "\u01ef\u01ee\u0001\u0000\u0000\u0000\u01ef\u01f0\u0001\u0000\u0000\u0000"+ + "\u01f0S\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005\u0007\u0000\u0000\u01f2"+ + "\u01f3\u0003\u0014\n\u0000\u01f3\u01f4\u0003d2\u0000\u01f4U\u0001\u0000"+ + "\u0000\u0000\u01f5\u01f6\u0005\u000b\u0000\u0000\u01f6\u01f7\u00036\u001b"+ + "\u0000\u01f7W\u0001\u0000\u0000\u0000\u01f8\u01fd\u0003Z-\u0000\u01f9"+ + "\u01fa\u0005\"\u0000\u0000\u01fa\u01fc\u0003Z-\u0000\u01fb\u01f9\u0001"+ + "\u0000\u0000\u0000\u01fc\u01ff\u0001\u0000\u0000\u0000\u01fd\u01fb\u0001"+ + "\u0000\u0000\u0000\u01fd\u01fe\u0001\u0000\u0000\u0000\u01feY\u0001\u0000"+ + "\u0000\u0000\u01ff\u01fd\u0001\u0000\u0000\u0000\u0200\u0201\u0003<\u001e"+ + "\u0000\u0201\u0202\u0005 \u0000\u0000\u0202\u0203\u0003@ \u0000\u0203"+ + "[\u0001\u0000\u0000\u0000\u0204\u0205\u0007\u0006\u0000\u0000\u0205]\u0001"+ + "\u0000\u0000\u0000\u0206\u0209\u0003`0\u0000\u0207\u0209\u0003b1\u0000"+ + "\u0208\u0206\u0001\u0000\u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000"+ + "\u0209_\u0001\u0000\u0000\u0000\u020a\u020c\u0007\u0000\u0000\u0000\u020b"+ + "\u020a\u0001\u0000\u0000\u0000\u020b\u020c\u0001\u0000\u0000\u0000\u020c"+ + "\u020d\u0001\u0000\u0000\u0000\u020d\u020e\u0005\u001c\u0000\u0000\u020e"+ + "a\u0001\u0000\u0000\u0000\u020f\u0211\u0007\u0000\u0000\u0000\u0210\u020f"+ + "\u0001\u0000\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211\u0212"+ + "\u0001\u0000\u0000\u0000\u0212\u0213\u0005\u001b\u0000\u0000\u0213c\u0001"+ + "\u0000\u0000\u0000\u0214\u0215\u0005\u001a\u0000\u0000\u0215e\u0001\u0000"+ + "\u0000\u0000\u0216\u0217\u0007\u0007\u0000\u0000\u0217g\u0001\u0000\u0000"+ + "\u0000\u0218\u0219\u0005\u0005\u0000\u0000\u0219\u021a\u0003j5\u0000\u021a"+ + "i\u0001\u0000\u0000\u0000\u021b\u021c\u0005B\u0000\u0000\u021c\u021d\u0003"+ + "\u0002\u0001\u0000\u021d\u021e\u0005C\u0000\u0000\u021ek\u0001\u0000\u0000"+ + "\u0000\u021f\u0220\u0005\u000e\u0000\u0000\u0220\u0221\u0005e\u0000\u0000"+ + "\u0221m\u0001\u0000\u0000\u0000\u0222\u0223\u0005\n\u0000\u0000\u0223"+ + "\u0224\u0005i\u0000\u0000\u0224o\u0001\u0000\u0000\u0000\u0225\u0226\u0005"+ + "\u0003\u0000\u0000\u0226\u0229\u0005[\u0000\u0000\u0227\u0228\u0005Y\u0000"+ + "\u0000\u0228\u022a\u00038\u001c\u0000\u0229\u0227\u0001\u0000\u0000\u0000"+ + "\u0229\u022a\u0001\u0000\u0000\u0000\u022a\u0234\u0001\u0000\u0000\u0000"+ + "\u022b\u022c\u0005Z\u0000\u0000\u022c\u0231\u0003r9\u0000\u022d\u022e"+ + "\u0005\"\u0000\u0000\u022e\u0230\u0003r9\u0000\u022f\u022d\u0001\u0000"+ + "\u0000\u0000\u0230\u0233\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000"+ + "\u0000\u0000\u0231\u0232\u0001\u0000\u0000\u0000\u0232\u0235\u0001\u0000"+ + "\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0234\u022b\u0001\u0000"+ + "\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000\u0235q\u0001\u0000\u0000"+ + "\u0000\u0236\u0237\u00038\u001c\u0000\u0237\u0238\u0005 \u0000\u0000\u0238"+ + "\u023a\u0001\u0000\u0000\u0000\u0239\u0236\u0001\u0000\u0000\u0000\u0239"+ + "\u023a\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000\u0000\u023b"+ + "\u023c\u00038\u001c\u0000\u023cs\u0001\u0000\u0000\u0000\u023d\u023e\u0005"+ + "\u0013\u0000\u0000\u023e\u023f\u0003$\u0012\u0000\u023f\u0240\u0005Y\u0000"+ + "\u0000\u0240\u0241\u0003:\u001d\u0000\u0241u\u0001\u0000\u0000\u0000\u0242"+ + "\u0243\u0005\u0012\u0000\u0000\u0243\u0246\u0003\u001e\u000f\u0000\u0244"+ + "\u0245\u0005\u001d\u0000\u0000\u0245\u0247\u0003\u001e\u000f\u0000\u0246"+ + "\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247"+ + "w\u0001\u0000\u0000\u00007\u0083\u008d\u009f\u00ab\u00b4\u00bc\u00c2\u00ca"+ + "\u00cc\u00d1\u00d8\u00dd\u00e8\u00ee\u00f6\u00f8\u0103\u010a\u0115\u0118"+ + "\u011f\u012b\u0133\u013b\u013f\u0146\u014e\u0156\u0163\u0167\u016b\u0172"+ + "\u0176\u017d\u0185\u018d\u01a3\u01ae\u01b9\u01be\u01c2\u01cd\u01d2\u01d6"+ + "\u01e4\u01ef\u01fd\u0208\u020b\u0210\u0229\u0231\u0234\u0239\u0246"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { From 06f2eafd9177a8d2d8c80300072039ac9e79407e Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:39:15 +0200 Subject: [PATCH 78/93] Moved query generation to EsqlExpressionTranslators, simplified class hierarchy methods --- .../function/fulltext/FullTextFunction.java | 16 +++------- .../function/fulltext/MatchFunction.java | 7 ----- .../fulltext/QueryStringFunction.java | 7 ----- .../planner/EsqlExpressionTranslators.java | 30 +++++++++++++------ 4 files changed, 25 insertions(+), 35 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index b4394372a154f..d623c7d0aed4e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -13,7 +13,6 @@ import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; import org.elasticsearch.xpack.esql.core.expression.function.Function; -import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; @@ -86,14 +85,14 @@ public Expression query() { } /** - * Returns the resulting Query for the function parameters so it can be pushed down to Lucene + * Returns the resulting query as a String * - * @return Lucene query + * @return query expression as a string */ - public final Query asQuery() { + public final String queryAsText() { Object queryAsObject = query().fold(); if (queryAsObject instanceof BytesRef bytesRef) { - return asQuery(bytesRef.utf8ToString()); + return bytesRef.utf8ToString(); } throw new IllegalArgumentException( @@ -101,13 +100,6 @@ public final Query asQuery() { ); } - /** - * Overriden by subclasses to return the corresponding Lucene query from a query text - * - * @return corresponding query for the query text - */ - protected abstract Query asQuery(String queryText); - /** * Returns the param ordinal for the query parameter so it can be used in error messages * diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java index 367fd2a6b4202..5970c647379b6 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java @@ -16,8 +16,6 @@ import org.elasticsearch.xpack.esql.core.expression.Expression; import org.elasticsearch.xpack.esql.core.expression.FieldAttribute; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; -import org.elasticsearch.xpack.esql.core.querydsl.query.MatchQuery; -import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; import org.elasticsearch.xpack.esql.core.tree.NodeInfo; import org.elasticsearch.xpack.esql.core.tree.Source; @@ -87,11 +85,6 @@ public String functionName() { return "MATCH"; } - @Override - public Query asQuery(String queryText) { - return new MatchQuery(source(), ((FieldAttribute) field).name(), queryText); - } - @Override protected TypeResolution resolveNonQueryParamTypes() { return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes()); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java index 2db497e8b2df8..7bc871d5442fd 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java @@ -11,7 +11,6 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.querydsl.query.Query; import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; import org.elasticsearch.xpack.esql.core.tree.NodeInfo; import org.elasticsearch.xpack.esql.core.tree.Source; @@ -22,7 +21,6 @@ import java.io.IOException; import java.util.List; -import java.util.Map; /** * Full text function that performs a {@link QueryStringQuery} . @@ -72,11 +70,6 @@ public String functionName() { return "QSTR"; } - @Override - public Query asQuery(String queryText) { - return new QueryStringQuery(source(), queryText, Map.of(), null); - } - @Override public Expression replaceChildren(List newChildren) { return new QueryStringFunction(source(), newChildren.get(0)); diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java index 18aa2628fdc7c..e57d66969676e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java @@ -24,15 +24,18 @@ import org.elasticsearch.xpack.esql.core.planner.ExpressionTranslators; import org.elasticsearch.xpack.esql.core.planner.TranslatorHandler; import org.elasticsearch.xpack.esql.core.querydsl.query.MatchAll; +import org.elasticsearch.xpack.esql.core.querydsl.query.MatchQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.NotQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.Query; +import org.elasticsearch.xpack.esql.core.querydsl.query.QueryStringQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.RangeQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.TermQuery; import org.elasticsearch.xpack.esql.core.querydsl.query.TermsQuery; import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.Check; -import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; import org.elasticsearch.xpack.esql.expression.function.scalar.ip.CIDRMatch; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesFunction; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesUtils; @@ -55,6 +58,7 @@ import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import static org.elasticsearch.xpack.esql.core.expression.Foldables.valueOf; @@ -85,17 +89,11 @@ public final class EsqlExpressionTranslators { new ExpressionTranslators.StringQueries(), new ExpressionTranslators.Matches(), new ExpressionTranslators.MultiMatches(), - new FullTextFunctions(), + new MatchFunctionTranslator(), + new QueryStringFunctionTranslator(), new Scalars() ); - public static class FullTextFunctions extends ExpressionTranslator { - @Override - protected Query asQuery(FullTextFunction fullTextFunction, TranslatorHandler handler) { - return fullTextFunction.asQuery(); - } - } - public static Query toQuery(Expression e, TranslatorHandler handler) { Query translation = null; for (ExpressionTranslator translator : QUERY_TRANSLATORS) { @@ -528,4 +526,18 @@ private static RangeQuery translate(Range r, TranslatorHandler handler) { ); } } + + public static class MatchFunctionTranslator extends ExpressionTranslator { + @Override + protected Query asQuery(MatchFunction matchFunction, TranslatorHandler handler) { + return new MatchQuery(matchFunction.source(), ((FieldAttribute) matchFunction.field()).name(), matchFunction.queryAsText()); + } + } + + public static class QueryStringFunctionTranslator extends ExpressionTranslator { + @Override + protected Query asQuery(QueryStringFunction queryStringFunction, TranslatorHandler handler) { + return new QueryStringQuery(queryStringFunction.source(), queryStringFunction.queryAsText(), Map.of(), null); + } + } } From 097c8f769ab6950b531c8c74c77dd583be92d4d2 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:41:33 +0200 Subject: [PATCH 79/93] Revert "Move disjunctions check from Verifier to the LocalPhysicalVerifier" This reverts commit c433aa1e --- .../xpack/esql/analysis/Verifier.java | 27 ++++++++++++++ .../optimizer/LocalPhysicalPlanOptimizer.java | 8 ++--- .../physical/local/LucenePushDownUtils.java | 2 +- .../xpack/esql/analysis/VerifierTests.java | 36 +++++++++++++++++++ 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index be2c9eb7ce0df..ca536d9972d1e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -24,6 +24,7 @@ import org.elasticsearch.xpack.esql.core.expression.predicate.fulltext.MatchQueryPredicate; import org.elasticsearch.xpack.esql.core.expression.predicate.logical.BinaryLogic; import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Not; +import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Or; import org.elasticsearch.xpack.esql.core.expression.predicate.operator.comparison.BinaryComparison; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.Holder; @@ -652,6 +653,7 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f Expression condition = f.condition(); checkCommandsBeforeQueryStringFunction(plan, condition, failures); checkCommandsBeforeMatchFunction(plan, condition, failures); + checkFullTextFunctionsConditions(condition, failures); checkFullTextFunctionsParents(condition, failures); } else { plan.forEachExpression(FullTextFunction.class, ftf -> { @@ -694,6 +696,31 @@ private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expressio }); } + private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { + condition.forEachUp(Or.class, or -> { + Expression left = or.left(); + Expression right = or.right(); + checkDisjunction(failures, or, left, right); + checkDisjunction(failures, or, right, left); + }); + } + + private static void checkDisjunction(Set failures, Or or, Expression left, Expression right) { + left.forEachDown(FullTextFunction.class, ftf -> { + if (canPushToSource(right, x -> false) == false) { + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", + or.sourceText(), + ftf.functionName(), + right.sourceText() + ) + ); + } + }); + } + private static void checkFullTextFunctionsParents(Expression condition, Set failures) { condition.forEachParent(FullTextFunction.class, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java index c3df757d30a83..48bafd8eef00e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizer.java @@ -33,18 +33,18 @@ */ public class LocalPhysicalPlanOptimizer extends ParameterizedRuleExecutor { - private final LocalPhysicalVerifier verifier = LocalPhysicalVerifier.INSTANCE; + private final PhysicalVerifier verifier = PhysicalVerifier.INSTANCE; public LocalPhysicalPlanOptimizer(LocalPhysicalOptimizerContext context) { super(context); } public PhysicalPlan localOptimize(PhysicalPlan plan) { - return verify(execute(plan), context()); + return verify(execute(plan)); } - PhysicalPlan verify(PhysicalPlan plan, LocalPhysicalOptimizerContext context) { - Collection failures = verifier.verify(plan, context); + PhysicalPlan verify(PhysicalPlan plan) { + Collection failures = verifier.verify(plan); if (failures.isEmpty() == false) { throw new VerificationException(failures); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java index 7993eba43f38e..1242629c1da3c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/LucenePushDownUtils.java @@ -14,7 +14,7 @@ import java.util.function.Predicate; -public class LucenePushDownUtils { +class LucenePushDownUtils { /** * this method is supposed to be used to define if a field can be used for exact push down (eg. sort or filter). * "aggregatable" is the most accurate information we can have from field_caps as of now. diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 2fae5a9984787..56f6e0673600a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -8,6 +8,7 @@ package org.elasticsearch.xpack.esql.analysis; import org.elasticsearch.Build; +import org.elasticsearch.common.logging.LoggerMessageFormat; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; @@ -1195,6 +1196,41 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } + public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { + checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); + } + + public void testMatchWithDisjunctionsThatCannotBePushedDown() { + checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); + } + + private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { + assertEquals( + LoggerMessageFormat.format( + null, + "1:19: Invalid condition [{} or length(first_name) > 12]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", + functionInvocation, + functionName + ), + error("from test | where " + functionInvocation + " or length(first_name) > 12") + ); + assertEquals( + LoggerMessageFormat.format( + null, + "1:19: Invalid condition [({} and first_name is not null) or (length(first_name) > 12 and first_name is null)]. " + + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and first_name is null]", + functionInvocation, + functionName + ), + error( + "from test | where (" + + functionInvocation + + " and first_name is not null) or (length(first_name) > 12 and first_name is null)" + ) + ); + } + public void testQueryStringFunctionWithNonBooleanFunctions() { checkFullTextFunctionsWithNonBooleanFunctions("QSTR", "qstr(\"first_name: Anna\")"); } From b1ed0db92961cb40f9bad1d943be7383499aaa11 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:41:46 +0200 Subject: [PATCH 80/93] Revert "Add disjunction that is pushable" This reverts commit deb539b9b02c766eacf341ec8c28b9472f43d13f. --- .../src/main/resources/match-function.csv-spec | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 8b3d3fc04fdbf..96481e15e3ee9 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -142,21 +142,6 @@ card:keyword |host:keyword |ip0:ip |ip1:ip eth1 |beta |127.0.0.1 |127.0.0.2 ; -matchWithTextEqualsFunctionPushedToLucene -required_capability: match_function - -from books -| where author == "Danny Faulkner" or match(title, "Hobbit") -| keep book_no, author, title; -ignoreOrder:true - -book_no:keyword | author:text | title:text -4289 | J R R Tolkien | Poems from the Hobbit -7480 | J. R. R. Tolkien | The Hobbit -6405 | J. R. R. Tolkien | The Hobbit or There and Back Again -3293 | Danny Faulkner | Universe by Design -; - matchWithNonPushableConjunction required_capability: match_function From 7ed7975f3a2419ce433e117e7f97a9daf5174e9d Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:41:47 +0200 Subject: [PATCH 81/93] Revert "Remove unneeded test" This reverts commit 2200f4d2a9c12bcbb3e2363006a4c57b57a57a76. --- .../LocalPhysicalPlanOptimizerTests.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 106492049eee9..20f45fc55b1bf 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -792,6 +792,23 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St ); } + public void testMatchFunctionDisjunctionNonPushableClauses() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + String queryText = """ + from test + | where match(first_name, "Peter") or length(last_name) > 10 + """; + + VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); + assertThat( + ve.getMessage(), + containsString( + "Invalid condition [match(first_name, \"Peter\") or length(last_name) > 10]. " + + "Function MATCH can't be used as part of an or condition that includes [length(last_name) > 10]" + ) + ); + } + /** * Expected: * LimitExec[1000[INTEGER]] From 96fe43139e7ae01d20fce5c4dbe12967bb142a4b Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:42:38 +0200 Subject: [PATCH 82/93] Remove LocalPhysicalVerifier --- .../esql/optimizer/LocalPhysicalVerifier.java | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java deleted file mode 100644 index e45f5d2eef515..0000000000000 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalVerifier.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -package org.elasticsearch.xpack.esql.optimizer; - -import org.elasticsearch.xpack.esql.common.Failure; -import org.elasticsearch.xpack.esql.core.expression.Expression; -import org.elasticsearch.xpack.esql.core.expression.predicate.logical.Or; -import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; -import org.elasticsearch.xpack.esql.optimizer.rules.physical.local.LucenePushDownUtils; -import org.elasticsearch.xpack.esql.plan.physical.FilterExec; -import org.elasticsearch.xpack.esql.plan.physical.PhysicalPlan; - -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.Set; - -import static org.elasticsearch.xpack.esql.common.Failure.fail; -import static org.elasticsearch.xpack.esql.optimizer.rules.physical.local.PushFiltersToSource.canPushToSource; - -/** Local physical plan verifier. */ -public final class LocalPhysicalVerifier { - - public static final LocalPhysicalVerifier INSTANCE = new LocalPhysicalVerifier(); - - private LocalPhysicalVerifier() {} - - /** Verifies the physical plan. */ - public Collection verify(PhysicalPlan plan, LocalPhysicalOptimizerContext context) { - Set failures = new LinkedHashSet<>(); - - plan.forEachDown(p -> { checkFullTextQueryFunctions(p, context, failures); }); - - return failures; - } - - private static void checkFullTextQueryFunctions(PhysicalPlan plan, LocalPhysicalOptimizerContext ctx, Set failures) { - if (plan instanceof FilterExec fe) { - checkFullTextFunctionsConditions(fe.condition(), ctx, failures); - } - } - - private static void checkFullTextFunctionsConditions(Expression condition, LocalPhysicalOptimizerContext ctx, Set failures) { - condition.forEachUp(Or.class, or -> { - Expression left = or.left(); - Expression right = or.right(); - checkDisjunction(failures, or, left, right, ctx); - checkDisjunction(failures, or, right, left, ctx); - }); - } - - private static void checkDisjunction( - Set failures, - Or or, - Expression first, - Expression second, - LocalPhysicalOptimizerContext ctx - ) { - first.forEachDown(FullTextFunction.class, ftf -> { - if (canPushToSource(second, x -> LucenePushDownUtils.hasIdenticalDelegate(x, ctx.searchStats())) == false) { - failures.add( - fail( - or, - "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", - or.sourceText(), - ftf.functionName(), - second.sourceText() - ) - ); - } - }); - } -} From e4cb62c7f61b0877b2f5682afbc74409e7307908 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Tue, 8 Oct 2024 19:59:01 +0200 Subject: [PATCH 83/93] Fix usage after ROW for match function --- .../java/org/elasticsearch/xpack/esql/analysis/Verifier.java | 2 +- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index ca536d9972d1e..5811df7cb2a1c 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -682,7 +682,7 @@ private static void checkCommandsBeforeQueryStringFunction(LogicalPlan plan, Exp private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expression condition, Set failures) { condition.forEachDown(MatchFunction.class, qsf -> { plan.forEachDown(LogicalPlan.class, lp -> { - if (lp instanceof Limit) { + if (lp instanceof Limit || lp instanceof Row) { failures.add( fail( plan, diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 56f6e0673600a..0fa84af158989 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1095,6 +1095,7 @@ public void testMatchFunctionNotAllowedAfterCommands() throws Exception { "1:24: [MATCH] function cannot be used after LIMIT", error("from test | limit 10 | where match(first_name, \"Anna\")") ); + assertEquals("1:18: [MATCH] function cannot be used after ROW", error("row n = \"test\" | where match(n, \"Anna\")")); } public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { From 11cdb85240506e5af8ce7f53f1aa6d6388485677 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 09:23:18 +0200 Subject: [PATCH 84/93] Reverted row change --- .../java/org/elasticsearch/xpack/esql/analysis/Verifier.java | 2 +- .../org/elasticsearch/xpack/esql/analysis/VerifierTests.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index 5811df7cb2a1c..ca536d9972d1e 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -682,7 +682,7 @@ private static void checkCommandsBeforeQueryStringFunction(LogicalPlan plan, Exp private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expression condition, Set failures) { condition.forEachDown(MatchFunction.class, qsf -> { plan.forEachDown(LogicalPlan.class, lp -> { - if (lp instanceof Limit || lp instanceof Row) { + if (lp instanceof Limit) { failures.add( fail( plan, diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 0fa84af158989..56f6e0673600a 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1095,7 +1095,6 @@ public void testMatchFunctionNotAllowedAfterCommands() throws Exception { "1:24: [MATCH] function cannot be used after LIMIT", error("from test | limit 10 | where match(first_name, \"Anna\")") ); - assertEquals("1:18: [MATCH] function cannot be used after ROW", error("row n = \"test\" | where match(n, \"Anna\")")); } public void testQueryStringFunctionsNotAllowedAfterCommands() throws Exception { From 937ddf1c25aa252d25402b890791c8fcc0b12756 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 09:24:54 +0200 Subject: [PATCH 85/93] FullTextFunctions are not nullable --- .../function/fulltext/FullTextFunction.java | 6 ++++++ .../optimizer/LocalPhysicalPlanOptimizerTests.java | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index d623c7d0aed4e..4f672b5492c01 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -11,6 +11,7 @@ import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.core.expression.Expression; +import org.elasticsearch.xpack.esql.core.expression.Nullability; import org.elasticsearch.xpack.esql.core.expression.TypeResolutions; import org.elasticsearch.xpack.esql.core.expression.function.Function; import org.elasticsearch.xpack.esql.core.tree.Source; @@ -108,4 +109,9 @@ public final String queryAsText() { protected TypeResolutions.ParamOrdinal queryParamOrdinal() { return DEFAULT; } + + @Override + public Nullability nullable() { + return Nullability.FALSE; + } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 20f45fc55b1bf..b12465ff9dde3 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -809,6 +809,20 @@ public void testMatchFunctionDisjunctionNonPushableClauses() { ); } + public void testMatchFunctionIsNotNullable() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + String queryText = """ + row n = null | eval text = n + 5 | where match(text::keyword, "Anna") + """; + + VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); + assertThat( + ve.getMessage(), + containsString("[MATCH] cannot operate on [text::keyword], which is not a field from an index mapping") + ); + } + /** * Expected: * LimitExec[1000[INTEGER]] From 2ff3ec5e0e5eae734e53db101c633fdf65f0626c Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 09:31:26 +0200 Subject: [PATCH 86/93] Regenerate lexer / parser with changes from main --- .../esql/src/main/antlr/EsqlBaseLexer.tokens | 162 +- .../esql/src/main/antlr/EsqlBaseParser.tokens | 162 +- .../xpack/esql/parser/EsqlBaseLexer.interp | 9 +- .../xpack/esql/parser/EsqlBaseLexer.java | 1961 ++++++++--------- .../xpack/esql/parser/EsqlBaseParser.interp | 7 +- .../xpack/esql/parser/EsqlBaseParser.java | 1836 +++++++-------- 6 files changed, 2105 insertions(+), 2032 deletions(-) diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens index 4fd37ab9900f2..2fe262a6983f7 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens @@ -16,51 +16,51 @@ STATS=15 WHERE=16 DEV_INLINESTATS=17 DEV_LOOKUP=18 -DEV_MATCH=19 -DEV_METRICS=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -PIPE=25 -QUOTED_STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -CAST_OP=33 -COMMA=34 -DESC=35 -DOT=36 -FALSE=37 -FIRST=38 -IN=39 -IS=40 -LAST=41 -LIKE=42 -LP=43 -NOT=44 -NULL=45 -NULLS=46 -OR=47 -PARAM=48 -RLIKE=49 -RP=50 -TRUE=51 -EQ=52 -CIEQ=53 -NEQ=54 -LT=55 -LTE=56 -GT=57 -GTE=58 -PLUS=59 -MINUS=60 -ASTERISK=61 -SLASH=62 -PERCENT=63 +DEV_METRICS=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +PIPE=24 +QUOTED_STRING=25 +INTEGER_LITERAL=26 +DECIMAL_LITERAL=27 +BY=28 +AND=29 +ASC=30 +ASSIGN=31 +CAST_OP=32 +COMMA=33 +DESC=34 +DOT=35 +FALSE=36 +FIRST=37 +IN=38 +IS=39 +LAST=40 +LIKE=41 +LP=42 +NOT=43 +NULL=44 +NULLS=45 +OR=46 +PARAM=47 +RLIKE=48 +RP=49 +TRUE=50 +EQ=51 +CIEQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +DEV_MATCH=63 NAMED_OR_POSITIONAL_PARAM=64 OPENING_BRACKET=65 CLOSING_BRACKET=66 @@ -134,42 +134,42 @@ CLOSING_METRICS_WS=120 'sort'=14 'stats'=15 'where'=16 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -'::'=33 -','=34 -'desc'=35 -'.'=36 -'false'=37 -'first'=38 -'in'=39 -'is'=40 -'last'=41 -'like'=42 -'('=43 -'not'=44 -'null'=45 -'nulls'=46 -'or'=47 -'?'=48 -'rlike'=49 -')'=50 -'true'=51 -'=='=52 -'=~'=53 -'!='=54 -'<'=55 -'<='=56 -'>'=57 -'>='=58 -'+'=59 -'-'=60 -'*'=61 -'/'=62 -'%'=63 +'|'=24 +'by'=28 +'and'=29 +'asc'=30 +'='=31 +'::'=32 +','=33 +'desc'=34 +'.'=35 +'false'=36 +'first'=37 +'in'=38 +'is'=39 +'last'=40 +'like'=41 +'('=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 +'?'=47 +'rlike'=48 +')'=49 +'true'=50 +'=='=51 +'=~'=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 ']'=66 'metadata'=75 'as'=84 diff --git a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens index 4fd37ab9900f2..2fe262a6983f7 100644 --- a/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens +++ b/x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens @@ -16,51 +16,51 @@ STATS=15 WHERE=16 DEV_INLINESTATS=17 DEV_LOOKUP=18 -DEV_MATCH=19 -DEV_METRICS=20 -UNKNOWN_CMD=21 -LINE_COMMENT=22 -MULTILINE_COMMENT=23 -WS=24 -PIPE=25 -QUOTED_STRING=26 -INTEGER_LITERAL=27 -DECIMAL_LITERAL=28 -BY=29 -AND=30 -ASC=31 -ASSIGN=32 -CAST_OP=33 -COMMA=34 -DESC=35 -DOT=36 -FALSE=37 -FIRST=38 -IN=39 -IS=40 -LAST=41 -LIKE=42 -LP=43 -NOT=44 -NULL=45 -NULLS=46 -OR=47 -PARAM=48 -RLIKE=49 -RP=50 -TRUE=51 -EQ=52 -CIEQ=53 -NEQ=54 -LT=55 -LTE=56 -GT=57 -GTE=58 -PLUS=59 -MINUS=60 -ASTERISK=61 -SLASH=62 -PERCENT=63 +DEV_METRICS=19 +UNKNOWN_CMD=20 +LINE_COMMENT=21 +MULTILINE_COMMENT=22 +WS=23 +PIPE=24 +QUOTED_STRING=25 +INTEGER_LITERAL=26 +DECIMAL_LITERAL=27 +BY=28 +AND=29 +ASC=30 +ASSIGN=31 +CAST_OP=32 +COMMA=33 +DESC=34 +DOT=35 +FALSE=36 +FIRST=37 +IN=38 +IS=39 +LAST=40 +LIKE=41 +LP=42 +NOT=43 +NULL=44 +NULLS=45 +OR=46 +PARAM=47 +RLIKE=48 +RP=49 +TRUE=50 +EQ=51 +CIEQ=52 +NEQ=53 +LT=54 +LTE=55 +GT=56 +GTE=57 +PLUS=58 +MINUS=59 +ASTERISK=60 +SLASH=61 +PERCENT=62 +DEV_MATCH=63 NAMED_OR_POSITIONAL_PARAM=64 OPENING_BRACKET=65 CLOSING_BRACKET=66 @@ -134,42 +134,42 @@ CLOSING_METRICS_WS=120 'sort'=14 'stats'=15 'where'=16 -'|'=25 -'by'=29 -'and'=30 -'asc'=31 -'='=32 -'::'=33 -','=34 -'desc'=35 -'.'=36 -'false'=37 -'first'=38 -'in'=39 -'is'=40 -'last'=41 -'like'=42 -'('=43 -'not'=44 -'null'=45 -'nulls'=46 -'or'=47 -'?'=48 -'rlike'=49 -')'=50 -'true'=51 -'=='=52 -'=~'=53 -'!='=54 -'<'=55 -'<='=56 -'>'=57 -'>='=58 -'+'=59 -'-'=60 -'*'=61 -'/'=62 -'%'=63 +'|'=24 +'by'=28 +'and'=29 +'asc'=30 +'='=31 +'::'=32 +','=33 +'desc'=34 +'.'=35 +'false'=36 +'first'=37 +'in'=38 +'is'=39 +'last'=40 +'like'=41 +'('=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 +'?'=47 +'rlike'=48 +')'=49 +'true'=50 +'=='=51 +'=~'=52 +'!='=53 +'<'=54 +'<='=55 +'>'=56 +'>='=57 +'+'=58 +'-'=59 +'*'=60 +'/'=61 +'%'=62 ']'=66 'metadata'=75 'as'=84 diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 4f3a843ee09d1..9b8cfc9319fff 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -23,7 +23,6 @@ null null null null -null '|' null null @@ -65,6 +64,7 @@ null '%' null null +null ']' null null @@ -141,7 +141,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -186,6 +185,7 @@ MINUS ASTERISK SLASH PERCENT +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -263,7 +263,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -318,7 +317,7 @@ MINUS ASTERISK SLASH PERCENT -DEV_MATCH_OP +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -458,4 +457,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 120, 1427, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 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, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 571, 8, 20, 11, 20, 12, 20, 572, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 581, 8, 21, 10, 21, 12, 21, 584, 9, 21, 1, 21, 3, 21, 587, 8, 21, 1, 21, 3, 21, 590, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 599, 8, 22, 10, 22, 12, 22, 602, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 610, 8, 23, 11, 23, 12, 23, 611, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 3, 29, 631, 8, 29, 1, 29, 4, 29, 634, 8, 29, 11, 29, 12, 29, 635, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 3, 32, 645, 8, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 652, 8, 34, 1, 35, 1, 35, 1, 35, 5, 35, 657, 8, 35, 10, 35, 12, 35, 660, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 668, 8, 35, 10, 35, 12, 35, 671, 9, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 678, 8, 35, 1, 35, 3, 35, 681, 8, 35, 3, 35, 683, 8, 35, 1, 36, 4, 36, 686, 8, 36, 11, 36, 12, 36, 687, 1, 37, 4, 37, 691, 8, 37, 11, 37, 12, 37, 692, 1, 37, 1, 37, 5, 37, 697, 8, 37, 10, 37, 12, 37, 700, 9, 37, 1, 37, 1, 37, 4, 37, 704, 8, 37, 11, 37, 12, 37, 705, 1, 37, 4, 37, 709, 8, 37, 11, 37, 12, 37, 710, 1, 37, 1, 37, 5, 37, 715, 8, 37, 10, 37, 12, 37, 718, 9, 37, 3, 37, 720, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 4, 37, 726, 8, 37, 11, 37, 12, 37, 727, 1, 37, 1, 37, 3, 37, 732, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 3, 74, 859, 8, 74, 1, 74, 5, 74, 862, 8, 74, 10, 74, 12, 74, 865, 9, 74, 1, 74, 1, 74, 4, 74, 869, 8, 74, 11, 74, 12, 74, 870, 3, 74, 873, 8, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 5, 77, 887, 8, 77, 10, 77, 12, 77, 890, 9, 77, 1, 77, 1, 77, 3, 77, 894, 8, 77, 1, 77, 4, 77, 897, 8, 77, 11, 77, 12, 77, 898, 3, 77, 901, 8, 77, 1, 78, 1, 78, 4, 78, 905, 8, 78, 11, 78, 12, 78, 906, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 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, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 3, 95, 984, 8, 95, 1, 96, 4, 96, 987, 8, 96, 11, 96, 12, 96, 988, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1028, 8, 105, 1, 106, 1, 106, 3, 106, 1032, 8, 106, 1, 106, 5, 106, 1035, 8, 106, 10, 106, 12, 106, 1038, 9, 106, 1, 106, 1, 106, 3, 106, 1042, 8, 106, 1, 106, 4, 106, 1045, 8, 106, 11, 106, 12, 106, 1046, 3, 106, 1049, 8, 106, 1, 107, 1, 107, 4, 107, 1053, 8, 107, 11, 107, 12, 107, 1054, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 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, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 4, 125, 1130, 8, 125, 11, 125, 12, 125, 1131, 1, 125, 1, 125, 3, 125, 1136, 8, 125, 1, 125, 4, 125, 1139, 8, 125, 11, 125, 12, 125, 1140, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 4, 154, 1264, 8, 154, 11, 154, 12, 154, 1265, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 2, 600, 669, 0, 190, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 25, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 0, 163, 64, 165, 65, 167, 66, 169, 67, 171, 0, 173, 68, 175, 69, 177, 70, 179, 71, 181, 0, 183, 0, 185, 72, 187, 73, 189, 74, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 0, 203, 75, 205, 0, 207, 76, 209, 0, 211, 0, 213, 77, 215, 78, 217, 79, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 80, 231, 81, 233, 82, 235, 83, 237, 0, 239, 0, 241, 0, 243, 0, 245, 84, 247, 0, 249, 85, 251, 86, 253, 87, 255, 0, 257, 0, 259, 88, 261, 89, 263, 0, 265, 90, 267, 0, 269, 91, 271, 92, 273, 93, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 94, 291, 95, 293, 96, 295, 0, 297, 0, 299, 0, 301, 0, 303, 97, 305, 98, 307, 99, 309, 0, 311, 100, 313, 101, 315, 102, 317, 103, 319, 0, 321, 104, 323, 105, 325, 106, 327, 107, 329, 108, 331, 0, 333, 0, 335, 0, 337, 0, 339, 0, 341, 0, 343, 0, 345, 109, 347, 110, 349, 111, 351, 0, 353, 0, 355, 0, 357, 0, 359, 112, 361, 113, 363, 114, 365, 0, 367, 0, 369, 0, 371, 115, 373, 116, 375, 117, 377, 0, 379, 0, 381, 118, 383, 119, 385, 120, 387, 0, 389, 0, 391, 0, 393, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1455, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 1, 63, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 169, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 1, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 2, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 203, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 3, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 223, 1, 0, 0, 0, 4, 229, 1, 0, 0, 0, 4, 231, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 4, 235, 1, 0, 0, 0, 5, 237, 1, 0, 0, 0, 5, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 6, 257, 1, 0, 0, 0, 6, 259, 1, 0, 0, 0, 6, 261, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 269, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 6, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 7, 277, 1, 0, 0, 0, 7, 279, 1, 0, 0, 0, 7, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 7, 293, 1, 0, 0, 0, 8, 295, 1, 0, 0, 0, 8, 297, 1, 0, 0, 0, 8, 299, 1, 0, 0, 0, 8, 301, 1, 0, 0, 0, 8, 303, 1, 0, 0, 0, 8, 305, 1, 0, 0, 0, 8, 307, 1, 0, 0, 0, 9, 309, 1, 0, 0, 0, 9, 311, 1, 0, 0, 0, 9, 313, 1, 0, 0, 0, 9, 315, 1, 0, 0, 0, 9, 317, 1, 0, 0, 0, 10, 319, 1, 0, 0, 0, 10, 321, 1, 0, 0, 0, 10, 323, 1, 0, 0, 0, 10, 325, 1, 0, 0, 0, 10, 327, 1, 0, 0, 0, 10, 329, 1, 0, 0, 0, 11, 331, 1, 0, 0, 0, 11, 333, 1, 0, 0, 0, 11, 335, 1, 0, 0, 0, 11, 337, 1, 0, 0, 0, 11, 339, 1, 0, 0, 0, 11, 341, 1, 0, 0, 0, 11, 343, 1, 0, 0, 0, 11, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 11, 349, 1, 0, 0, 0, 12, 351, 1, 0, 0, 0, 12, 353, 1, 0, 0, 0, 12, 355, 1, 0, 0, 0, 12, 357, 1, 0, 0, 0, 12, 359, 1, 0, 0, 0, 12, 361, 1, 0, 0, 0, 12, 363, 1, 0, 0, 0, 13, 365, 1, 0, 0, 0, 13, 367, 1, 0, 0, 0, 13, 369, 1, 0, 0, 0, 13, 371, 1, 0, 0, 0, 13, 373, 1, 0, 0, 0, 13, 375, 1, 0, 0, 0, 14, 377, 1, 0, 0, 0, 14, 379, 1, 0, 0, 0, 14, 381, 1, 0, 0, 0, 14, 383, 1, 0, 0, 0, 14, 385, 1, 0, 0, 0, 14, 387, 1, 0, 0, 0, 14, 389, 1, 0, 0, 0, 14, 391, 1, 0, 0, 0, 14, 393, 1, 0, 0, 0, 15, 395, 1, 0, 0, 0, 17, 405, 1, 0, 0, 0, 19, 412, 1, 0, 0, 0, 21, 421, 1, 0, 0, 0, 23, 428, 1, 0, 0, 0, 25, 438, 1, 0, 0, 0, 27, 445, 1, 0, 0, 0, 29, 452, 1, 0, 0, 0, 31, 459, 1, 0, 0, 0, 33, 467, 1, 0, 0, 0, 35, 479, 1, 0, 0, 0, 37, 488, 1, 0, 0, 0, 39, 494, 1, 0, 0, 0, 41, 501, 1, 0, 0, 0, 43, 508, 1, 0, 0, 0, 45, 516, 1, 0, 0, 0, 47, 524, 1, 0, 0, 0, 49, 539, 1, 0, 0, 0, 51, 549, 1, 0, 0, 0, 53, 558, 1, 0, 0, 0, 55, 570, 1, 0, 0, 0, 57, 576, 1, 0, 0, 0, 59, 593, 1, 0, 0, 0, 61, 609, 1, 0, 0, 0, 63, 615, 1, 0, 0, 0, 65, 619, 1, 0, 0, 0, 67, 621, 1, 0, 0, 0, 69, 623, 1, 0, 0, 0, 71, 626, 1, 0, 0, 0, 73, 628, 1, 0, 0, 0, 75, 637, 1, 0, 0, 0, 77, 639, 1, 0, 0, 0, 79, 644, 1, 0, 0, 0, 81, 646, 1, 0, 0, 0, 83, 651, 1, 0, 0, 0, 85, 682, 1, 0, 0, 0, 87, 685, 1, 0, 0, 0, 89, 731, 1, 0, 0, 0, 91, 733, 1, 0, 0, 0, 93, 736, 1, 0, 0, 0, 95, 740, 1, 0, 0, 0, 97, 744, 1, 0, 0, 0, 99, 746, 1, 0, 0, 0, 101, 749, 1, 0, 0, 0, 103, 751, 1, 0, 0, 0, 105, 756, 1, 0, 0, 0, 107, 758, 1, 0, 0, 0, 109, 764, 1, 0, 0, 0, 111, 770, 1, 0, 0, 0, 113, 773, 1, 0, 0, 0, 115, 776, 1, 0, 0, 0, 117, 781, 1, 0, 0, 0, 119, 786, 1, 0, 0, 0, 121, 788, 1, 0, 0, 0, 123, 792, 1, 0, 0, 0, 125, 797, 1, 0, 0, 0, 127, 803, 1, 0, 0, 0, 129, 806, 1, 0, 0, 0, 131, 808, 1, 0, 0, 0, 133, 814, 1, 0, 0, 0, 135, 816, 1, 0, 0, 0, 137, 821, 1, 0, 0, 0, 139, 824, 1, 0, 0, 0, 141, 827, 1, 0, 0, 0, 143, 830, 1, 0, 0, 0, 145, 832, 1, 0, 0, 0, 147, 835, 1, 0, 0, 0, 149, 837, 1, 0, 0, 0, 151, 840, 1, 0, 0, 0, 153, 842, 1, 0, 0, 0, 155, 844, 1, 0, 0, 0, 157, 846, 1, 0, 0, 0, 159, 848, 1, 0, 0, 0, 161, 850, 1, 0, 0, 0, 163, 872, 1, 0, 0, 0, 165, 874, 1, 0, 0, 0, 167, 879, 1, 0, 0, 0, 169, 900, 1, 0, 0, 0, 171, 902, 1, 0, 0, 0, 173, 910, 1, 0, 0, 0, 175, 912, 1, 0, 0, 0, 177, 916, 1, 0, 0, 0, 179, 920, 1, 0, 0, 0, 181, 924, 1, 0, 0, 0, 183, 929, 1, 0, 0, 0, 185, 934, 1, 0, 0, 0, 187, 938, 1, 0, 0, 0, 189, 942, 1, 0, 0, 0, 191, 946, 1, 0, 0, 0, 193, 951, 1, 0, 0, 0, 195, 955, 1, 0, 0, 0, 197, 959, 1, 0, 0, 0, 199, 963, 1, 0, 0, 0, 201, 967, 1, 0, 0, 0, 203, 971, 1, 0, 0, 0, 205, 983, 1, 0, 0, 0, 207, 986, 1, 0, 0, 0, 209, 990, 1, 0, 0, 0, 211, 994, 1, 0, 0, 0, 213, 998, 1, 0, 0, 0, 215, 1002, 1, 0, 0, 0, 217, 1006, 1, 0, 0, 0, 219, 1010, 1, 0, 0, 0, 221, 1015, 1, 0, 0, 0, 223, 1019, 1, 0, 0, 0, 225, 1027, 1, 0, 0, 0, 227, 1048, 1, 0, 0, 0, 229, 1052, 1, 0, 0, 0, 231, 1056, 1, 0, 0, 0, 233, 1060, 1, 0, 0, 0, 235, 1064, 1, 0, 0, 0, 237, 1068, 1, 0, 0, 0, 239, 1073, 1, 0, 0, 0, 241, 1077, 1, 0, 0, 0, 243, 1081, 1, 0, 0, 0, 245, 1085, 1, 0, 0, 0, 247, 1088, 1, 0, 0, 0, 249, 1092, 1, 0, 0, 0, 251, 1096, 1, 0, 0, 0, 253, 1100, 1, 0, 0, 0, 255, 1104, 1, 0, 0, 0, 257, 1109, 1, 0, 0, 0, 259, 1114, 1, 0, 0, 0, 261, 1119, 1, 0, 0, 0, 263, 1126, 1, 0, 0, 0, 265, 1135, 1, 0, 0, 0, 267, 1142, 1, 0, 0, 0, 269, 1146, 1, 0, 0, 0, 271, 1150, 1, 0, 0, 0, 273, 1154, 1, 0, 0, 0, 275, 1158, 1, 0, 0, 0, 277, 1164, 1, 0, 0, 0, 279, 1168, 1, 0, 0, 0, 281, 1172, 1, 0, 0, 0, 283, 1176, 1, 0, 0, 0, 285, 1180, 1, 0, 0, 0, 287, 1184, 1, 0, 0, 0, 289, 1188, 1, 0, 0, 0, 291, 1192, 1, 0, 0, 0, 293, 1196, 1, 0, 0, 0, 295, 1200, 1, 0, 0, 0, 297, 1205, 1, 0, 0, 0, 299, 1209, 1, 0, 0, 0, 301, 1213, 1, 0, 0, 0, 303, 1217, 1, 0, 0, 0, 305, 1221, 1, 0, 0, 0, 307, 1225, 1, 0, 0, 0, 309, 1229, 1, 0, 0, 0, 311, 1234, 1, 0, 0, 0, 313, 1239, 1, 0, 0, 0, 315, 1243, 1, 0, 0, 0, 317, 1247, 1, 0, 0, 0, 319, 1251, 1, 0, 0, 0, 321, 1256, 1, 0, 0, 0, 323, 1263, 1, 0, 0, 0, 325, 1267, 1, 0, 0, 0, 327, 1271, 1, 0, 0, 0, 329, 1275, 1, 0, 0, 0, 331, 1279, 1, 0, 0, 0, 333, 1284, 1, 0, 0, 0, 335, 1288, 1, 0, 0, 0, 337, 1292, 1, 0, 0, 0, 339, 1296, 1, 0, 0, 0, 341, 1301, 1, 0, 0, 0, 343, 1305, 1, 0, 0, 0, 345, 1309, 1, 0, 0, 0, 347, 1313, 1, 0, 0, 0, 349, 1317, 1, 0, 0, 0, 351, 1321, 1, 0, 0, 0, 353, 1327, 1, 0, 0, 0, 355, 1331, 1, 0, 0, 0, 357, 1335, 1, 0, 0, 0, 359, 1339, 1, 0, 0, 0, 361, 1343, 1, 0, 0, 0, 363, 1347, 1, 0, 0, 0, 365, 1351, 1, 0, 0, 0, 367, 1356, 1, 0, 0, 0, 369, 1362, 1, 0, 0, 0, 371, 1368, 1, 0, 0, 0, 373, 1372, 1, 0, 0, 0, 375, 1376, 1, 0, 0, 0, 377, 1380, 1, 0, 0, 0, 379, 1386, 1, 0, 0, 0, 381, 1392, 1, 0, 0, 0, 383, 1396, 1, 0, 0, 0, 385, 1400, 1, 0, 0, 0, 387, 1404, 1, 0, 0, 0, 389, 1410, 1, 0, 0, 0, 391, 1416, 1, 0, 0, 0, 393, 1422, 1, 0, 0, 0, 395, 396, 7, 0, 0, 0, 396, 397, 7, 1, 0, 0, 397, 398, 7, 2, 0, 0, 398, 399, 7, 2, 0, 0, 399, 400, 7, 3, 0, 0, 400, 401, 7, 4, 0, 0, 401, 402, 7, 5, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 6, 0, 0, 0, 404, 16, 1, 0, 0, 0, 405, 406, 7, 0, 0, 0, 406, 407, 7, 6, 0, 0, 407, 408, 7, 7, 0, 0, 408, 409, 7, 8, 0, 0, 409, 410, 1, 0, 0, 0, 410, 411, 6, 1, 1, 0, 411, 18, 1, 0, 0, 0, 412, 413, 7, 3, 0, 0, 413, 414, 7, 9, 0, 0, 414, 415, 7, 6, 0, 0, 415, 416, 7, 1, 0, 0, 416, 417, 7, 4, 0, 0, 417, 418, 7, 10, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 2, 2, 0, 420, 20, 1, 0, 0, 0, 421, 422, 7, 3, 0, 0, 422, 423, 7, 11, 0, 0, 423, 424, 7, 12, 0, 0, 424, 425, 7, 13, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 6, 3, 0, 0, 427, 22, 1, 0, 0, 0, 428, 429, 7, 3, 0, 0, 429, 430, 7, 14, 0, 0, 430, 431, 7, 8, 0, 0, 431, 432, 7, 13, 0, 0, 432, 433, 7, 12, 0, 0, 433, 434, 7, 1, 0, 0, 434, 435, 7, 9, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 6, 4, 3, 0, 437, 24, 1, 0, 0, 0, 438, 439, 7, 15, 0, 0, 439, 440, 7, 6, 0, 0, 440, 441, 7, 7, 0, 0, 441, 442, 7, 16, 0, 0, 442, 443, 1, 0, 0, 0, 443, 444, 6, 5, 4, 0, 444, 26, 1, 0, 0, 0, 445, 446, 7, 17, 0, 0, 446, 447, 7, 6, 0, 0, 447, 448, 7, 7, 0, 0, 448, 449, 7, 18, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 6, 6, 0, 0, 451, 28, 1, 0, 0, 0, 452, 453, 7, 18, 0, 0, 453, 454, 7, 3, 0, 0, 454, 455, 7, 3, 0, 0, 455, 456, 7, 8, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 6, 7, 1, 0, 458, 30, 1, 0, 0, 0, 459, 460, 7, 13, 0, 0, 460, 461, 7, 1, 0, 0, 461, 462, 7, 16, 0, 0, 462, 463, 7, 1, 0, 0, 463, 464, 7, 5, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 6, 8, 0, 0, 466, 32, 1, 0, 0, 0, 467, 468, 7, 16, 0, 0, 468, 469, 7, 11, 0, 0, 469, 470, 5, 95, 0, 0, 470, 471, 7, 3, 0, 0, 471, 472, 7, 14, 0, 0, 472, 473, 7, 8, 0, 0, 473, 474, 7, 12, 0, 0, 474, 475, 7, 9, 0, 0, 475, 476, 7, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 6, 9, 5, 0, 478, 34, 1, 0, 0, 0, 479, 480, 7, 6, 0, 0, 480, 481, 7, 3, 0, 0, 481, 482, 7, 9, 0, 0, 482, 483, 7, 12, 0, 0, 483, 484, 7, 16, 0, 0, 484, 485, 7, 3, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 6, 10, 6, 0, 487, 36, 1, 0, 0, 0, 488, 489, 7, 6, 0, 0, 489, 490, 7, 7, 0, 0, 490, 491, 7, 19, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 6, 11, 0, 0, 493, 38, 1, 0, 0, 0, 494, 495, 7, 2, 0, 0, 495, 496, 7, 10, 0, 0, 496, 497, 7, 7, 0, 0, 497, 498, 7, 19, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 6, 12, 7, 0, 500, 40, 1, 0, 0, 0, 501, 502, 7, 2, 0, 0, 502, 503, 7, 7, 0, 0, 503, 504, 7, 6, 0, 0, 504, 505, 7, 5, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 13, 0, 0, 507, 42, 1, 0, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 7, 5, 0, 0, 510, 511, 7, 12, 0, 0, 511, 512, 7, 5, 0, 0, 512, 513, 7, 2, 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 6, 14, 0, 0, 515, 44, 1, 0, 0, 0, 516, 517, 7, 19, 0, 0, 517, 518, 7, 10, 0, 0, 518, 519, 7, 3, 0, 0, 519, 520, 7, 6, 0, 0, 520, 521, 7, 3, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 6, 15, 0, 0, 523, 46, 1, 0, 0, 0, 524, 525, 4, 16, 0, 0, 525, 526, 7, 1, 0, 0, 526, 527, 7, 9, 0, 0, 527, 528, 7, 13, 0, 0, 528, 529, 7, 1, 0, 0, 529, 530, 7, 9, 0, 0, 530, 531, 7, 3, 0, 0, 531, 532, 7, 2, 0, 0, 532, 533, 7, 5, 0, 0, 533, 534, 7, 12, 0, 0, 534, 535, 7, 5, 0, 0, 535, 536, 7, 2, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 6, 16, 0, 0, 538, 48, 1, 0, 0, 0, 539, 540, 4, 17, 1, 0, 540, 541, 7, 13, 0, 0, 541, 542, 7, 7, 0, 0, 542, 543, 7, 7, 0, 0, 543, 544, 7, 18, 0, 0, 544, 545, 7, 20, 0, 0, 545, 546, 7, 8, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 6, 17, 8, 0, 548, 50, 1, 0, 0, 0, 549, 550, 4, 18, 2, 0, 550, 551, 7, 16, 0, 0, 551, 552, 7, 12, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 4, 0, 0, 554, 555, 7, 10, 0, 0, 555, 556, 1, 0, 0, 0, 556, 557, 6, 18, 0, 0, 557, 52, 1, 0, 0, 0, 558, 559, 4, 19, 3, 0, 559, 560, 7, 16, 0, 0, 560, 561, 7, 3, 0, 0, 561, 562, 7, 5, 0, 0, 562, 563, 7, 6, 0, 0, 563, 564, 7, 1, 0, 0, 564, 565, 7, 4, 0, 0, 565, 566, 7, 2, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 6, 19, 9, 0, 568, 54, 1, 0, 0, 0, 569, 571, 8, 21, 0, 0, 570, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 570, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 6, 20, 0, 0, 575, 56, 1, 0, 0, 0, 576, 577, 5, 47, 0, 0, 577, 578, 5, 47, 0, 0, 578, 582, 1, 0, 0, 0, 579, 581, 8, 22, 0, 0, 580, 579, 1, 0, 0, 0, 581, 584, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 586, 1, 0, 0, 0, 584, 582, 1, 0, 0, 0, 585, 587, 5, 13, 0, 0, 586, 585, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 589, 1, 0, 0, 0, 588, 590, 5, 10, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 6, 21, 10, 0, 592, 58, 1, 0, 0, 0, 593, 594, 5, 47, 0, 0, 594, 595, 5, 42, 0, 0, 595, 600, 1, 0, 0, 0, 596, 599, 3, 59, 22, 0, 597, 599, 9, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 597, 1, 0, 0, 0, 599, 602, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 603, 604, 5, 42, 0, 0, 604, 605, 5, 47, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 6, 22, 10, 0, 607, 60, 1, 0, 0, 0, 608, 610, 7, 23, 0, 0, 609, 608, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 6, 23, 10, 0, 614, 62, 1, 0, 0, 0, 615, 616, 5, 124, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 6, 24, 11, 0, 618, 64, 1, 0, 0, 0, 619, 620, 7, 24, 0, 0, 620, 66, 1, 0, 0, 0, 621, 622, 7, 25, 0, 0, 622, 68, 1, 0, 0, 0, 623, 624, 5, 92, 0, 0, 624, 625, 7, 26, 0, 0, 625, 70, 1, 0, 0, 0, 626, 627, 8, 27, 0, 0, 627, 72, 1, 0, 0, 0, 628, 630, 7, 3, 0, 0, 629, 631, 7, 28, 0, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 633, 1, 0, 0, 0, 632, 634, 3, 65, 25, 0, 633, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 74, 1, 0, 0, 0, 637, 638, 5, 64, 0, 0, 638, 76, 1, 0, 0, 0, 639, 640, 5, 96, 0, 0, 640, 78, 1, 0, 0, 0, 641, 645, 8, 29, 0, 0, 642, 643, 5, 96, 0, 0, 643, 645, 5, 96, 0, 0, 644, 641, 1, 0, 0, 0, 644, 642, 1, 0, 0, 0, 645, 80, 1, 0, 0, 0, 646, 647, 5, 95, 0, 0, 647, 82, 1, 0, 0, 0, 648, 652, 3, 67, 26, 0, 649, 652, 3, 65, 25, 0, 650, 652, 3, 81, 33, 0, 651, 648, 1, 0, 0, 0, 651, 649, 1, 0, 0, 0, 651, 650, 1, 0, 0, 0, 652, 84, 1, 0, 0, 0, 653, 658, 5, 34, 0, 0, 654, 657, 3, 69, 27, 0, 655, 657, 3, 71, 28, 0, 656, 654, 1, 0, 0, 0, 656, 655, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 683, 5, 34, 0, 0, 662, 663, 5, 34, 0, 0, 663, 664, 5, 34, 0, 0, 664, 665, 5, 34, 0, 0, 665, 669, 1, 0, 0, 0, 666, 668, 8, 22, 0, 0, 667, 666, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 5, 34, 0, 0, 673, 674, 5, 34, 0, 0, 674, 675, 5, 34, 0, 0, 675, 677, 1, 0, 0, 0, 676, 678, 5, 34, 0, 0, 677, 676, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 680, 1, 0, 0, 0, 679, 681, 5, 34, 0, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 653, 1, 0, 0, 0, 682, 662, 1, 0, 0, 0, 683, 86, 1, 0, 0, 0, 684, 686, 3, 65, 25, 0, 685, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 88, 1, 0, 0, 0, 689, 691, 3, 65, 25, 0, 690, 689, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 690, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 698, 3, 105, 45, 0, 695, 697, 3, 65, 25, 0, 696, 695, 1, 0, 0, 0, 697, 700, 1, 0, 0, 0, 698, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 732, 1, 0, 0, 0, 700, 698, 1, 0, 0, 0, 701, 703, 3, 105, 45, 0, 702, 704, 3, 65, 25, 0, 703, 702, 1, 0, 0, 0, 704, 705, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 732, 1, 0, 0, 0, 707, 709, 3, 65, 25, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 719, 1, 0, 0, 0, 712, 716, 3, 105, 45, 0, 713, 715, 3, 65, 25, 0, 714, 713, 1, 0, 0, 0, 715, 718, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 719, 712, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 722, 3, 73, 29, 0, 722, 732, 1, 0, 0, 0, 723, 725, 3, 105, 45, 0, 724, 726, 3, 65, 25, 0, 725, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 3, 73, 29, 0, 730, 732, 1, 0, 0, 0, 731, 690, 1, 0, 0, 0, 731, 701, 1, 0, 0, 0, 731, 708, 1, 0, 0, 0, 731, 723, 1, 0, 0, 0, 732, 90, 1, 0, 0, 0, 733, 734, 7, 30, 0, 0, 734, 735, 7, 31, 0, 0, 735, 92, 1, 0, 0, 0, 736, 737, 7, 12, 0, 0, 737, 738, 7, 9, 0, 0, 738, 739, 7, 0, 0, 0, 739, 94, 1, 0, 0, 0, 740, 741, 7, 12, 0, 0, 741, 742, 7, 2, 0, 0, 742, 743, 7, 4, 0, 0, 743, 96, 1, 0, 0, 0, 744, 745, 5, 61, 0, 0, 745, 98, 1, 0, 0, 0, 746, 747, 5, 58, 0, 0, 747, 748, 5, 58, 0, 0, 748, 100, 1, 0, 0, 0, 749, 750, 5, 44, 0, 0, 750, 102, 1, 0, 0, 0, 751, 752, 7, 0, 0, 0, 752, 753, 7, 3, 0, 0, 753, 754, 7, 2, 0, 0, 754, 755, 7, 4, 0, 0, 755, 104, 1, 0, 0, 0, 756, 757, 5, 46, 0, 0, 757, 106, 1, 0, 0, 0, 758, 759, 7, 15, 0, 0, 759, 760, 7, 12, 0, 0, 760, 761, 7, 13, 0, 0, 761, 762, 7, 2, 0, 0, 762, 763, 7, 3, 0, 0, 763, 108, 1, 0, 0, 0, 764, 765, 7, 15, 0, 0, 765, 766, 7, 1, 0, 0, 766, 767, 7, 6, 0, 0, 767, 768, 7, 2, 0, 0, 768, 769, 7, 5, 0, 0, 769, 110, 1, 0, 0, 0, 770, 771, 7, 1, 0, 0, 771, 772, 7, 9, 0, 0, 772, 112, 1, 0, 0, 0, 773, 774, 7, 1, 0, 0, 774, 775, 7, 2, 0, 0, 775, 114, 1, 0, 0, 0, 776, 777, 7, 13, 0, 0, 777, 778, 7, 12, 0, 0, 778, 779, 7, 2, 0, 0, 779, 780, 7, 5, 0, 0, 780, 116, 1, 0, 0, 0, 781, 782, 7, 13, 0, 0, 782, 783, 7, 1, 0, 0, 783, 784, 7, 18, 0, 0, 784, 785, 7, 3, 0, 0, 785, 118, 1, 0, 0, 0, 786, 787, 5, 40, 0, 0, 787, 120, 1, 0, 0, 0, 788, 789, 7, 9, 0, 0, 789, 790, 7, 7, 0, 0, 790, 791, 7, 5, 0, 0, 791, 122, 1, 0, 0, 0, 792, 793, 7, 9, 0, 0, 793, 794, 7, 20, 0, 0, 794, 795, 7, 13, 0, 0, 795, 796, 7, 13, 0, 0, 796, 124, 1, 0, 0, 0, 797, 798, 7, 9, 0, 0, 798, 799, 7, 20, 0, 0, 799, 800, 7, 13, 0, 0, 800, 801, 7, 13, 0, 0, 801, 802, 7, 2, 0, 0, 802, 126, 1, 0, 0, 0, 803, 804, 7, 7, 0, 0, 804, 805, 7, 6, 0, 0, 805, 128, 1, 0, 0, 0, 806, 807, 5, 63, 0, 0, 807, 130, 1, 0, 0, 0, 808, 809, 7, 6, 0, 0, 809, 810, 7, 13, 0, 0, 810, 811, 7, 1, 0, 0, 811, 812, 7, 18, 0, 0, 812, 813, 7, 3, 0, 0, 813, 132, 1, 0, 0, 0, 814, 815, 5, 41, 0, 0, 815, 134, 1, 0, 0, 0, 816, 817, 7, 5, 0, 0, 817, 818, 7, 6, 0, 0, 818, 819, 7, 20, 0, 0, 819, 820, 7, 3, 0, 0, 820, 136, 1, 0, 0, 0, 821, 822, 5, 61, 0, 0, 822, 823, 5, 61, 0, 0, 823, 138, 1, 0, 0, 0, 824, 825, 5, 61, 0, 0, 825, 826, 5, 126, 0, 0, 826, 140, 1, 0, 0, 0, 827, 828, 5, 33, 0, 0, 828, 829, 5, 61, 0, 0, 829, 142, 1, 0, 0, 0, 830, 831, 5, 60, 0, 0, 831, 144, 1, 0, 0, 0, 832, 833, 5, 60, 0, 0, 833, 834, 5, 61, 0, 0, 834, 146, 1, 0, 0, 0, 835, 836, 5, 62, 0, 0, 836, 148, 1, 0, 0, 0, 837, 838, 5, 62, 0, 0, 838, 839, 5, 61, 0, 0, 839, 150, 1, 0, 0, 0, 840, 841, 5, 43, 0, 0, 841, 152, 1, 0, 0, 0, 842, 843, 5, 45, 0, 0, 843, 154, 1, 0, 0, 0, 844, 845, 5, 42, 0, 0, 845, 156, 1, 0, 0, 0, 846, 847, 5, 47, 0, 0, 847, 158, 1, 0, 0, 0, 848, 849, 5, 37, 0, 0, 849, 160, 1, 0, 0, 0, 850, 851, 4, 73, 4, 0, 851, 852, 3, 51, 18, 0, 852, 853, 1, 0, 0, 0, 853, 854, 6, 73, 12, 0, 854, 162, 1, 0, 0, 0, 855, 858, 3, 129, 57, 0, 856, 859, 3, 67, 26, 0, 857, 859, 3, 81, 33, 0, 858, 856, 1, 0, 0, 0, 858, 857, 1, 0, 0, 0, 859, 863, 1, 0, 0, 0, 860, 862, 3, 83, 34, 0, 861, 860, 1, 0, 0, 0, 862, 865, 1, 0, 0, 0, 863, 861, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 873, 1, 0, 0, 0, 865, 863, 1, 0, 0, 0, 866, 868, 3, 129, 57, 0, 867, 869, 3, 65, 25, 0, 868, 867, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 873, 1, 0, 0, 0, 872, 855, 1, 0, 0, 0, 872, 866, 1, 0, 0, 0, 873, 164, 1, 0, 0, 0, 874, 875, 5, 91, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 6, 75, 0, 0, 877, 878, 6, 75, 0, 0, 878, 166, 1, 0, 0, 0, 879, 880, 5, 93, 0, 0, 880, 881, 1, 0, 0, 0, 881, 882, 6, 76, 11, 0, 882, 883, 6, 76, 11, 0, 883, 168, 1, 0, 0, 0, 884, 888, 3, 67, 26, 0, 885, 887, 3, 83, 34, 0, 886, 885, 1, 0, 0, 0, 887, 890, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 901, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 891, 894, 3, 81, 33, 0, 892, 894, 3, 75, 30, 0, 893, 891, 1, 0, 0, 0, 893, 892, 1, 0, 0, 0, 894, 896, 1, 0, 0, 0, 895, 897, 3, 83, 34, 0, 896, 895, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 884, 1, 0, 0, 0, 900, 893, 1, 0, 0, 0, 901, 170, 1, 0, 0, 0, 902, 904, 3, 77, 31, 0, 903, 905, 3, 79, 32, 0, 904, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 909, 3, 77, 31, 0, 909, 172, 1, 0, 0, 0, 910, 911, 3, 171, 78, 0, 911, 174, 1, 0, 0, 0, 912, 913, 3, 57, 21, 0, 913, 914, 1, 0, 0, 0, 914, 915, 6, 80, 10, 0, 915, 176, 1, 0, 0, 0, 916, 917, 3, 59, 22, 0, 917, 918, 1, 0, 0, 0, 918, 919, 6, 81, 10, 0, 919, 178, 1, 0, 0, 0, 920, 921, 3, 61, 23, 0, 921, 922, 1, 0, 0, 0, 922, 923, 6, 82, 10, 0, 923, 180, 1, 0, 0, 0, 924, 925, 3, 165, 75, 0, 925, 926, 1, 0, 0, 0, 926, 927, 6, 83, 13, 0, 927, 928, 6, 83, 14, 0, 928, 182, 1, 0, 0, 0, 929, 930, 3, 63, 24, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 84, 15, 0, 932, 933, 6, 84, 11, 0, 933, 184, 1, 0, 0, 0, 934, 935, 3, 61, 23, 0, 935, 936, 1, 0, 0, 0, 936, 937, 6, 85, 10, 0, 937, 186, 1, 0, 0, 0, 938, 939, 3, 57, 21, 0, 939, 940, 1, 0, 0, 0, 940, 941, 6, 86, 10, 0, 941, 188, 1, 0, 0, 0, 942, 943, 3, 59, 22, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 87, 10, 0, 945, 190, 1, 0, 0, 0, 946, 947, 3, 63, 24, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 88, 15, 0, 949, 950, 6, 88, 11, 0, 950, 192, 1, 0, 0, 0, 951, 952, 3, 165, 75, 0, 952, 953, 1, 0, 0, 0, 953, 954, 6, 89, 13, 0, 954, 194, 1, 0, 0, 0, 955, 956, 3, 167, 76, 0, 956, 957, 1, 0, 0, 0, 957, 958, 6, 90, 16, 0, 958, 196, 1, 0, 0, 0, 959, 960, 3, 321, 153, 0, 960, 961, 1, 0, 0, 0, 961, 962, 6, 91, 17, 0, 962, 198, 1, 0, 0, 0, 963, 964, 3, 101, 43, 0, 964, 965, 1, 0, 0, 0, 965, 966, 6, 92, 18, 0, 966, 200, 1, 0, 0, 0, 967, 968, 3, 97, 41, 0, 968, 969, 1, 0, 0, 0, 969, 970, 6, 93, 19, 0, 970, 202, 1, 0, 0, 0, 971, 972, 7, 16, 0, 0, 972, 973, 7, 3, 0, 0, 973, 974, 7, 5, 0, 0, 974, 975, 7, 12, 0, 0, 975, 976, 7, 0, 0, 0, 976, 977, 7, 12, 0, 0, 977, 978, 7, 5, 0, 0, 978, 979, 7, 12, 0, 0, 979, 204, 1, 0, 0, 0, 980, 984, 8, 32, 0, 0, 981, 982, 5, 47, 0, 0, 982, 984, 8, 33, 0, 0, 983, 980, 1, 0, 0, 0, 983, 981, 1, 0, 0, 0, 984, 206, 1, 0, 0, 0, 985, 987, 3, 205, 95, 0, 986, 985, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 208, 1, 0, 0, 0, 990, 991, 3, 207, 96, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 97, 20, 0, 993, 210, 1, 0, 0, 0, 994, 995, 3, 85, 35, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 98, 21, 0, 997, 212, 1, 0, 0, 0, 998, 999, 3, 57, 21, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 6, 99, 10, 0, 1001, 214, 1, 0, 0, 0, 1002, 1003, 3, 59, 22, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 100, 10, 0, 1005, 216, 1, 0, 0, 0, 1006, 1007, 3, 61, 23, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 101, 10, 0, 1009, 218, 1, 0, 0, 0, 1010, 1011, 3, 63, 24, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 102, 15, 0, 1013, 1014, 6, 102, 11, 0, 1014, 220, 1, 0, 0, 0, 1015, 1016, 3, 105, 45, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 103, 22, 0, 1018, 222, 1, 0, 0, 0, 1019, 1020, 3, 101, 43, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 6, 104, 18, 0, 1022, 224, 1, 0, 0, 0, 1023, 1028, 3, 67, 26, 0, 1024, 1028, 3, 65, 25, 0, 1025, 1028, 3, 81, 33, 0, 1026, 1028, 3, 155, 70, 0, 1027, 1023, 1, 0, 0, 0, 1027, 1024, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1026, 1, 0, 0, 0, 1028, 226, 1, 0, 0, 0, 1029, 1032, 3, 67, 26, 0, 1030, 1032, 3, 155, 70, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1030, 1, 0, 0, 0, 1032, 1036, 1, 0, 0, 0, 1033, 1035, 3, 225, 105, 0, 1034, 1033, 1, 0, 0, 0, 1035, 1038, 1, 0, 0, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1049, 1, 0, 0, 0, 1038, 1036, 1, 0, 0, 0, 1039, 1042, 3, 81, 33, 0, 1040, 1042, 3, 75, 30, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1045, 3, 225, 105, 0, 1044, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1049, 1, 0, 0, 0, 1048, 1031, 1, 0, 0, 0, 1048, 1041, 1, 0, 0, 0, 1049, 228, 1, 0, 0, 0, 1050, 1053, 3, 227, 106, 0, 1051, 1053, 3, 171, 78, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 230, 1, 0, 0, 0, 1056, 1057, 3, 57, 21, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 108, 10, 0, 1059, 232, 1, 0, 0, 0, 1060, 1061, 3, 59, 22, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 109, 10, 0, 1063, 234, 1, 0, 0, 0, 1064, 1065, 3, 61, 23, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 110, 10, 0, 1067, 236, 1, 0, 0, 0, 1068, 1069, 3, 63, 24, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 111, 15, 0, 1071, 1072, 6, 111, 11, 0, 1072, 238, 1, 0, 0, 0, 1073, 1074, 3, 97, 41, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 112, 19, 0, 1076, 240, 1, 0, 0, 0, 1077, 1078, 3, 101, 43, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 113, 18, 0, 1080, 242, 1, 0, 0, 0, 1081, 1082, 3, 105, 45, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 6, 114, 22, 0, 1084, 244, 1, 0, 0, 0, 1085, 1086, 7, 12, 0, 0, 1086, 1087, 7, 2, 0, 0, 1087, 246, 1, 0, 0, 0, 1088, 1089, 3, 229, 107, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 116, 23, 0, 1091, 248, 1, 0, 0, 0, 1092, 1093, 3, 57, 21, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 117, 10, 0, 1095, 250, 1, 0, 0, 0, 1096, 1097, 3, 59, 22, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 118, 10, 0, 1099, 252, 1, 0, 0, 0, 1100, 1101, 3, 61, 23, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 119, 10, 0, 1103, 254, 1, 0, 0, 0, 1104, 1105, 3, 63, 24, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 120, 15, 0, 1107, 1108, 6, 120, 11, 0, 1108, 256, 1, 0, 0, 0, 1109, 1110, 3, 165, 75, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1112, 6, 121, 13, 0, 1112, 1113, 6, 121, 24, 0, 1113, 258, 1, 0, 0, 0, 1114, 1115, 7, 7, 0, 0, 1115, 1116, 7, 9, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 122, 25, 0, 1118, 260, 1, 0, 0, 0, 1119, 1120, 7, 19, 0, 0, 1120, 1121, 7, 1, 0, 0, 1121, 1122, 7, 5, 0, 0, 1122, 1123, 7, 10, 0, 0, 1123, 1124, 1, 0, 0, 0, 1124, 1125, 6, 123, 25, 0, 1125, 262, 1, 0, 0, 0, 1126, 1127, 8, 34, 0, 0, 1127, 264, 1, 0, 0, 0, 1128, 1130, 3, 263, 124, 0, 1129, 1128, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 3, 321, 153, 0, 1134, 1136, 1, 0, 0, 0, 1135, 1129, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1138, 1, 0, 0, 0, 1137, 1139, 3, 263, 124, 0, 1138, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1138, 1, 0, 0, 0, 1140, 1141, 1, 0, 0, 0, 1141, 266, 1, 0, 0, 0, 1142, 1143, 3, 265, 125, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 126, 26, 0, 1145, 268, 1, 0, 0, 0, 1146, 1147, 3, 57, 21, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 127, 10, 0, 1149, 270, 1, 0, 0, 0, 1150, 1151, 3, 59, 22, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 128, 10, 0, 1153, 272, 1, 0, 0, 0, 1154, 1155, 3, 61, 23, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 129, 10, 0, 1157, 274, 1, 0, 0, 0, 1158, 1159, 3, 63, 24, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 6, 130, 15, 0, 1161, 1162, 6, 130, 11, 0, 1162, 1163, 6, 130, 11, 0, 1163, 276, 1, 0, 0, 0, 1164, 1165, 3, 97, 41, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 131, 19, 0, 1167, 278, 1, 0, 0, 0, 1168, 1169, 3, 101, 43, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 132, 18, 0, 1171, 280, 1, 0, 0, 0, 1172, 1173, 3, 105, 45, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 133, 22, 0, 1175, 282, 1, 0, 0, 0, 1176, 1177, 3, 261, 123, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 6, 134, 27, 0, 1179, 284, 1, 0, 0, 0, 1180, 1181, 3, 229, 107, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1183, 6, 135, 23, 0, 1183, 286, 1, 0, 0, 0, 1184, 1185, 3, 173, 79, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 136, 28, 0, 1187, 288, 1, 0, 0, 0, 1188, 1189, 3, 57, 21, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 137, 10, 0, 1191, 290, 1, 0, 0, 0, 1192, 1193, 3, 59, 22, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 138, 10, 0, 1195, 292, 1, 0, 0, 0, 1196, 1197, 3, 61, 23, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 139, 10, 0, 1199, 294, 1, 0, 0, 0, 1200, 1201, 3, 63, 24, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 140, 15, 0, 1203, 1204, 6, 140, 11, 0, 1204, 296, 1, 0, 0, 0, 1205, 1206, 3, 105, 45, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 141, 22, 0, 1208, 298, 1, 0, 0, 0, 1209, 1210, 3, 173, 79, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 6, 142, 28, 0, 1212, 300, 1, 0, 0, 0, 1213, 1214, 3, 169, 77, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 6, 143, 29, 0, 1216, 302, 1, 0, 0, 0, 1217, 1218, 3, 57, 21, 0, 1218, 1219, 1, 0, 0, 0, 1219, 1220, 6, 144, 10, 0, 1220, 304, 1, 0, 0, 0, 1221, 1222, 3, 59, 22, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1224, 6, 145, 10, 0, 1224, 306, 1, 0, 0, 0, 1225, 1226, 3, 61, 23, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 6, 146, 10, 0, 1228, 308, 1, 0, 0, 0, 1229, 1230, 3, 63, 24, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 6, 147, 15, 0, 1232, 1233, 6, 147, 11, 0, 1233, 310, 1, 0, 0, 0, 1234, 1235, 7, 1, 0, 0, 1235, 1236, 7, 9, 0, 0, 1236, 1237, 7, 15, 0, 0, 1237, 1238, 7, 7, 0, 0, 1238, 312, 1, 0, 0, 0, 1239, 1240, 3, 57, 21, 0, 1240, 1241, 1, 0, 0, 0, 1241, 1242, 6, 149, 10, 0, 1242, 314, 1, 0, 0, 0, 1243, 1244, 3, 59, 22, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 6, 150, 10, 0, 1246, 316, 1, 0, 0, 0, 1247, 1248, 3, 61, 23, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 6, 151, 10, 0, 1250, 318, 1, 0, 0, 0, 1251, 1252, 3, 167, 76, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1254, 6, 152, 16, 0, 1254, 1255, 6, 152, 11, 0, 1255, 320, 1, 0, 0, 0, 1256, 1257, 5, 58, 0, 0, 1257, 322, 1, 0, 0, 0, 1258, 1264, 3, 75, 30, 0, 1259, 1264, 3, 65, 25, 0, 1260, 1264, 3, 105, 45, 0, 1261, 1264, 3, 67, 26, 0, 1262, 1264, 3, 81, 33, 0, 1263, 1258, 1, 0, 0, 0, 1263, 1259, 1, 0, 0, 0, 1263, 1260, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1263, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1263, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 324, 1, 0, 0, 0, 1267, 1268, 3, 57, 21, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 6, 155, 10, 0, 1270, 326, 1, 0, 0, 0, 1271, 1272, 3, 59, 22, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 6, 156, 10, 0, 1274, 328, 1, 0, 0, 0, 1275, 1276, 3, 61, 23, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 6, 157, 10, 0, 1278, 330, 1, 0, 0, 0, 1279, 1280, 3, 63, 24, 0, 1280, 1281, 1, 0, 0, 0, 1281, 1282, 6, 158, 15, 0, 1282, 1283, 6, 158, 11, 0, 1283, 332, 1, 0, 0, 0, 1284, 1285, 3, 321, 153, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 6, 159, 17, 0, 1287, 334, 1, 0, 0, 0, 1288, 1289, 3, 101, 43, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1291, 6, 160, 18, 0, 1291, 336, 1, 0, 0, 0, 1292, 1293, 3, 105, 45, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 161, 22, 0, 1295, 338, 1, 0, 0, 0, 1296, 1297, 3, 259, 122, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 6, 162, 30, 0, 1299, 1300, 6, 162, 31, 0, 1300, 340, 1, 0, 0, 0, 1301, 1302, 3, 207, 96, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 6, 163, 20, 0, 1304, 342, 1, 0, 0, 0, 1305, 1306, 3, 85, 35, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 6, 164, 21, 0, 1308, 344, 1, 0, 0, 0, 1309, 1310, 3, 57, 21, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1312, 6, 165, 10, 0, 1312, 346, 1, 0, 0, 0, 1313, 1314, 3, 59, 22, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1316, 6, 166, 10, 0, 1316, 348, 1, 0, 0, 0, 1317, 1318, 3, 61, 23, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 6, 167, 10, 0, 1320, 350, 1, 0, 0, 0, 1321, 1322, 3, 63, 24, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 6, 168, 15, 0, 1324, 1325, 6, 168, 11, 0, 1325, 1326, 6, 168, 11, 0, 1326, 352, 1, 0, 0, 0, 1327, 1328, 3, 101, 43, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 169, 18, 0, 1330, 354, 1, 0, 0, 0, 1331, 1332, 3, 105, 45, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 170, 22, 0, 1334, 356, 1, 0, 0, 0, 1335, 1336, 3, 229, 107, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, 171, 23, 0, 1338, 358, 1, 0, 0, 0, 1339, 1340, 3, 57, 21, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1342, 6, 172, 10, 0, 1342, 360, 1, 0, 0, 0, 1343, 1344, 3, 59, 22, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1346, 6, 173, 10, 0, 1346, 362, 1, 0, 0, 0, 1347, 1348, 3, 61, 23, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1350, 6, 174, 10, 0, 1350, 364, 1, 0, 0, 0, 1351, 1352, 3, 63, 24, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 6, 175, 15, 0, 1354, 1355, 6, 175, 11, 0, 1355, 366, 1, 0, 0, 0, 1356, 1357, 3, 207, 96, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 176, 20, 0, 1359, 1360, 6, 176, 11, 0, 1360, 1361, 6, 176, 32, 0, 1361, 368, 1, 0, 0, 0, 1362, 1363, 3, 85, 35, 0, 1363, 1364, 1, 0, 0, 0, 1364, 1365, 6, 177, 21, 0, 1365, 1366, 6, 177, 11, 0, 1366, 1367, 6, 177, 32, 0, 1367, 370, 1, 0, 0, 0, 1368, 1369, 3, 57, 21, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1371, 6, 178, 10, 0, 1371, 372, 1, 0, 0, 0, 1372, 1373, 3, 59, 22, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1375, 6, 179, 10, 0, 1375, 374, 1, 0, 0, 0, 1376, 1377, 3, 61, 23, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1379, 6, 180, 10, 0, 1379, 376, 1, 0, 0, 0, 1380, 1381, 3, 321, 153, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1383, 6, 181, 17, 0, 1383, 1384, 6, 181, 11, 0, 1384, 1385, 6, 181, 9, 0, 1385, 378, 1, 0, 0, 0, 1386, 1387, 3, 101, 43, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 182, 18, 0, 1389, 1390, 6, 182, 11, 0, 1390, 1391, 6, 182, 9, 0, 1391, 380, 1, 0, 0, 0, 1392, 1393, 3, 57, 21, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1395, 6, 183, 10, 0, 1395, 382, 1, 0, 0, 0, 1396, 1397, 3, 59, 22, 0, 1397, 1398, 1, 0, 0, 0, 1398, 1399, 6, 184, 10, 0, 1399, 384, 1, 0, 0, 0, 1400, 1401, 3, 61, 23, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1403, 6, 185, 10, 0, 1403, 386, 1, 0, 0, 0, 1404, 1405, 3, 173, 79, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1407, 6, 186, 11, 0, 1407, 1408, 6, 186, 0, 0, 1408, 1409, 6, 186, 28, 0, 1409, 388, 1, 0, 0, 0, 1410, 1411, 3, 169, 77, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 187, 11, 0, 1413, 1414, 6, 187, 0, 0, 1414, 1415, 6, 187, 29, 0, 1415, 390, 1, 0, 0, 0, 1416, 1417, 3, 91, 38, 0, 1417, 1418, 1, 0, 0, 0, 1418, 1419, 6, 188, 11, 0, 1419, 1420, 6, 188, 0, 0, 1420, 1421, 6, 188, 33, 0, 1421, 392, 1, 0, 0, 0, 1422, 1423, 3, 63, 24, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1425, 6, 189, 15, 0, 1425, 1426, 6, 189, 11, 0, 1426, 394, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 572, 582, 586, 589, 598, 600, 611, 630, 635, 644, 651, 656, 658, 669, 677, 680, 682, 687, 692, 698, 705, 710, 716, 719, 727, 731, 858, 863, 870, 872, 888, 893, 898, 900, 906, 983, 988, 1027, 1031, 1036, 1041, 1046, 1048, 1052, 1054, 1131, 1135, 1140, 1263, 1265, 34, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 19, 0, 7, 65, 0, 5, 0, 0, 7, 25, 0, 7, 66, 0, 7, 104, 0, 7, 34, 0, 7, 32, 0, 7, 76, 0, 7, 26, 0, 7, 36, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 29, 0] \ No newline at end of file +[4, 0, 120, 1418, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 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, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 560, 8, 19, 11, 19, 12, 19, 561, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 570, 8, 20, 10, 20, 12, 20, 573, 9, 20, 1, 20, 3, 20, 576, 8, 20, 1, 20, 3, 20, 579, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 588, 8, 21, 10, 21, 12, 21, 591, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 599, 8, 22, 11, 22, 12, 22, 600, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 620, 8, 28, 1, 28, 4, 28, 623, 8, 28, 11, 28, 12, 28, 624, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 634, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 641, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 646, 8, 34, 10, 34, 12, 34, 649, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 657, 8, 34, 10, 34, 12, 34, 660, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 667, 8, 34, 1, 34, 3, 34, 670, 8, 34, 3, 34, 672, 8, 34, 1, 35, 4, 35, 675, 8, 35, 11, 35, 12, 35, 676, 1, 36, 4, 36, 680, 8, 36, 11, 36, 12, 36, 681, 1, 36, 1, 36, 5, 36, 686, 8, 36, 10, 36, 12, 36, 689, 9, 36, 1, 36, 1, 36, 4, 36, 693, 8, 36, 11, 36, 12, 36, 694, 1, 36, 4, 36, 698, 8, 36, 11, 36, 12, 36, 699, 1, 36, 1, 36, 5, 36, 704, 8, 36, 10, 36, 12, 36, 707, 9, 36, 3, 36, 709, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 4, 36, 715, 8, 36, 11, 36, 12, 36, 716, 1, 36, 1, 36, 3, 36, 721, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 3, 73, 850, 8, 73, 1, 73, 5, 73, 853, 8, 73, 10, 73, 12, 73, 856, 9, 73, 1, 73, 1, 73, 4, 73, 860, 8, 73, 11, 73, 12, 73, 861, 3, 73, 864, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 5, 76, 878, 8, 76, 10, 76, 12, 76, 881, 9, 76, 1, 76, 1, 76, 3, 76, 885, 8, 76, 1, 76, 4, 76, 888, 8, 76, 11, 76, 12, 76, 889, 3, 76, 892, 8, 76, 1, 77, 1, 77, 4, 77, 896, 8, 77, 11, 77, 12, 77, 897, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 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, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 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, 94, 1, 94, 1, 94, 3, 94, 975, 8, 94, 1, 95, 4, 95, 978, 8, 95, 11, 95, 12, 95, 979, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1019, 8, 104, 1, 105, 1, 105, 3, 105, 1023, 8, 105, 1, 105, 5, 105, 1026, 8, 105, 10, 105, 12, 105, 1029, 9, 105, 1, 105, 1, 105, 3, 105, 1033, 8, 105, 1, 105, 4, 105, 1036, 8, 105, 11, 105, 12, 105, 1037, 3, 105, 1040, 8, 105, 1, 106, 1, 106, 4, 106, 1044, 8, 106, 11, 106, 12, 106, 1045, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 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, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 4, 124, 1121, 8, 124, 11, 124, 12, 124, 1122, 1, 124, 1, 124, 3, 124, 1127, 8, 124, 1, 124, 4, 124, 1130, 8, 124, 11, 124, 12, 124, 1131, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 4, 153, 1255, 8, 153, 11, 153, 12, 153, 1256, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 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, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 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, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 2, 589, 658, 0, 189, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 25, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 66, 167, 67, 169, 0, 171, 68, 173, 69, 175, 70, 177, 71, 179, 0, 181, 0, 183, 72, 185, 73, 187, 74, 189, 0, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 75, 203, 0, 205, 76, 207, 0, 209, 0, 211, 77, 213, 78, 215, 79, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 80, 229, 81, 231, 82, 233, 83, 235, 0, 237, 0, 239, 0, 241, 0, 243, 84, 245, 0, 247, 85, 249, 86, 251, 87, 253, 0, 255, 0, 257, 88, 259, 89, 261, 0, 263, 90, 265, 0, 267, 91, 269, 92, 271, 93, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 94, 289, 95, 291, 96, 293, 0, 295, 0, 297, 0, 299, 0, 301, 97, 303, 98, 305, 99, 307, 0, 309, 100, 311, 101, 313, 102, 315, 103, 317, 0, 319, 104, 321, 105, 323, 106, 325, 107, 327, 108, 329, 0, 331, 0, 333, 0, 335, 0, 337, 0, 339, 0, 341, 0, 343, 109, 345, 110, 347, 111, 349, 0, 351, 0, 353, 0, 355, 0, 357, 112, 359, 113, 361, 114, 363, 0, 365, 0, 367, 0, 369, 115, 371, 116, 373, 117, 375, 0, 377, 0, 379, 118, 381, 119, 383, 120, 385, 0, 387, 0, 389, 0, 391, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1446, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 1, 83, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 171, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 2, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 205, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 4, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 227, 1, 0, 0, 0, 4, 229, 1, 0, 0, 0, 4, 231, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 5, 235, 1, 0, 0, 0, 5, 237, 1, 0, 0, 0, 5, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 6, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 6, 257, 1, 0, 0, 0, 6, 259, 1, 0, 0, 0, 6, 263, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 269, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 7, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 7, 277, 1, 0, 0, 0, 7, 279, 1, 0, 0, 0, 7, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 8, 293, 1, 0, 0, 0, 8, 295, 1, 0, 0, 0, 8, 297, 1, 0, 0, 0, 8, 299, 1, 0, 0, 0, 8, 301, 1, 0, 0, 0, 8, 303, 1, 0, 0, 0, 8, 305, 1, 0, 0, 0, 9, 307, 1, 0, 0, 0, 9, 309, 1, 0, 0, 0, 9, 311, 1, 0, 0, 0, 9, 313, 1, 0, 0, 0, 9, 315, 1, 0, 0, 0, 10, 317, 1, 0, 0, 0, 10, 319, 1, 0, 0, 0, 10, 321, 1, 0, 0, 0, 10, 323, 1, 0, 0, 0, 10, 325, 1, 0, 0, 0, 10, 327, 1, 0, 0, 0, 11, 329, 1, 0, 0, 0, 11, 331, 1, 0, 0, 0, 11, 333, 1, 0, 0, 0, 11, 335, 1, 0, 0, 0, 11, 337, 1, 0, 0, 0, 11, 339, 1, 0, 0, 0, 11, 341, 1, 0, 0, 0, 11, 343, 1, 0, 0, 0, 11, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 12, 349, 1, 0, 0, 0, 12, 351, 1, 0, 0, 0, 12, 353, 1, 0, 0, 0, 12, 355, 1, 0, 0, 0, 12, 357, 1, 0, 0, 0, 12, 359, 1, 0, 0, 0, 12, 361, 1, 0, 0, 0, 13, 363, 1, 0, 0, 0, 13, 365, 1, 0, 0, 0, 13, 367, 1, 0, 0, 0, 13, 369, 1, 0, 0, 0, 13, 371, 1, 0, 0, 0, 13, 373, 1, 0, 0, 0, 14, 375, 1, 0, 0, 0, 14, 377, 1, 0, 0, 0, 14, 379, 1, 0, 0, 0, 14, 381, 1, 0, 0, 0, 14, 383, 1, 0, 0, 0, 14, 385, 1, 0, 0, 0, 14, 387, 1, 0, 0, 0, 14, 389, 1, 0, 0, 0, 14, 391, 1, 0, 0, 0, 15, 393, 1, 0, 0, 0, 17, 403, 1, 0, 0, 0, 19, 410, 1, 0, 0, 0, 21, 419, 1, 0, 0, 0, 23, 426, 1, 0, 0, 0, 25, 436, 1, 0, 0, 0, 27, 443, 1, 0, 0, 0, 29, 450, 1, 0, 0, 0, 31, 457, 1, 0, 0, 0, 33, 465, 1, 0, 0, 0, 35, 477, 1, 0, 0, 0, 37, 486, 1, 0, 0, 0, 39, 492, 1, 0, 0, 0, 41, 499, 1, 0, 0, 0, 43, 506, 1, 0, 0, 0, 45, 514, 1, 0, 0, 0, 47, 522, 1, 0, 0, 0, 49, 537, 1, 0, 0, 0, 51, 547, 1, 0, 0, 0, 53, 559, 1, 0, 0, 0, 55, 565, 1, 0, 0, 0, 57, 582, 1, 0, 0, 0, 59, 598, 1, 0, 0, 0, 61, 604, 1, 0, 0, 0, 63, 608, 1, 0, 0, 0, 65, 610, 1, 0, 0, 0, 67, 612, 1, 0, 0, 0, 69, 615, 1, 0, 0, 0, 71, 617, 1, 0, 0, 0, 73, 626, 1, 0, 0, 0, 75, 628, 1, 0, 0, 0, 77, 633, 1, 0, 0, 0, 79, 635, 1, 0, 0, 0, 81, 640, 1, 0, 0, 0, 83, 671, 1, 0, 0, 0, 85, 674, 1, 0, 0, 0, 87, 720, 1, 0, 0, 0, 89, 722, 1, 0, 0, 0, 91, 725, 1, 0, 0, 0, 93, 729, 1, 0, 0, 0, 95, 733, 1, 0, 0, 0, 97, 735, 1, 0, 0, 0, 99, 738, 1, 0, 0, 0, 101, 740, 1, 0, 0, 0, 103, 745, 1, 0, 0, 0, 105, 747, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 759, 1, 0, 0, 0, 111, 762, 1, 0, 0, 0, 113, 765, 1, 0, 0, 0, 115, 770, 1, 0, 0, 0, 117, 775, 1, 0, 0, 0, 119, 777, 1, 0, 0, 0, 121, 781, 1, 0, 0, 0, 123, 786, 1, 0, 0, 0, 125, 792, 1, 0, 0, 0, 127, 795, 1, 0, 0, 0, 129, 797, 1, 0, 0, 0, 131, 803, 1, 0, 0, 0, 133, 805, 1, 0, 0, 0, 135, 810, 1, 0, 0, 0, 137, 813, 1, 0, 0, 0, 139, 816, 1, 0, 0, 0, 141, 819, 1, 0, 0, 0, 143, 821, 1, 0, 0, 0, 145, 824, 1, 0, 0, 0, 147, 826, 1, 0, 0, 0, 149, 829, 1, 0, 0, 0, 151, 831, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 835, 1, 0, 0, 0, 157, 837, 1, 0, 0, 0, 159, 839, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 865, 1, 0, 0, 0, 165, 870, 1, 0, 0, 0, 167, 891, 1, 0, 0, 0, 169, 893, 1, 0, 0, 0, 171, 901, 1, 0, 0, 0, 173, 903, 1, 0, 0, 0, 175, 907, 1, 0, 0, 0, 177, 911, 1, 0, 0, 0, 179, 915, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 925, 1, 0, 0, 0, 185, 929, 1, 0, 0, 0, 187, 933, 1, 0, 0, 0, 189, 937, 1, 0, 0, 0, 191, 942, 1, 0, 0, 0, 193, 946, 1, 0, 0, 0, 195, 950, 1, 0, 0, 0, 197, 954, 1, 0, 0, 0, 199, 958, 1, 0, 0, 0, 201, 962, 1, 0, 0, 0, 203, 974, 1, 0, 0, 0, 205, 977, 1, 0, 0, 0, 207, 981, 1, 0, 0, 0, 209, 985, 1, 0, 0, 0, 211, 989, 1, 0, 0, 0, 213, 993, 1, 0, 0, 0, 215, 997, 1, 0, 0, 0, 217, 1001, 1, 0, 0, 0, 219, 1006, 1, 0, 0, 0, 221, 1010, 1, 0, 0, 0, 223, 1018, 1, 0, 0, 0, 225, 1039, 1, 0, 0, 0, 227, 1043, 1, 0, 0, 0, 229, 1047, 1, 0, 0, 0, 231, 1051, 1, 0, 0, 0, 233, 1055, 1, 0, 0, 0, 235, 1059, 1, 0, 0, 0, 237, 1064, 1, 0, 0, 0, 239, 1068, 1, 0, 0, 0, 241, 1072, 1, 0, 0, 0, 243, 1076, 1, 0, 0, 0, 245, 1079, 1, 0, 0, 0, 247, 1083, 1, 0, 0, 0, 249, 1087, 1, 0, 0, 0, 251, 1091, 1, 0, 0, 0, 253, 1095, 1, 0, 0, 0, 255, 1100, 1, 0, 0, 0, 257, 1105, 1, 0, 0, 0, 259, 1110, 1, 0, 0, 0, 261, 1117, 1, 0, 0, 0, 263, 1126, 1, 0, 0, 0, 265, 1133, 1, 0, 0, 0, 267, 1137, 1, 0, 0, 0, 269, 1141, 1, 0, 0, 0, 271, 1145, 1, 0, 0, 0, 273, 1149, 1, 0, 0, 0, 275, 1155, 1, 0, 0, 0, 277, 1159, 1, 0, 0, 0, 279, 1163, 1, 0, 0, 0, 281, 1167, 1, 0, 0, 0, 283, 1171, 1, 0, 0, 0, 285, 1175, 1, 0, 0, 0, 287, 1179, 1, 0, 0, 0, 289, 1183, 1, 0, 0, 0, 291, 1187, 1, 0, 0, 0, 293, 1191, 1, 0, 0, 0, 295, 1196, 1, 0, 0, 0, 297, 1200, 1, 0, 0, 0, 299, 1204, 1, 0, 0, 0, 301, 1208, 1, 0, 0, 0, 303, 1212, 1, 0, 0, 0, 305, 1216, 1, 0, 0, 0, 307, 1220, 1, 0, 0, 0, 309, 1225, 1, 0, 0, 0, 311, 1230, 1, 0, 0, 0, 313, 1234, 1, 0, 0, 0, 315, 1238, 1, 0, 0, 0, 317, 1242, 1, 0, 0, 0, 319, 1247, 1, 0, 0, 0, 321, 1254, 1, 0, 0, 0, 323, 1258, 1, 0, 0, 0, 325, 1262, 1, 0, 0, 0, 327, 1266, 1, 0, 0, 0, 329, 1270, 1, 0, 0, 0, 331, 1275, 1, 0, 0, 0, 333, 1279, 1, 0, 0, 0, 335, 1283, 1, 0, 0, 0, 337, 1287, 1, 0, 0, 0, 339, 1292, 1, 0, 0, 0, 341, 1296, 1, 0, 0, 0, 343, 1300, 1, 0, 0, 0, 345, 1304, 1, 0, 0, 0, 347, 1308, 1, 0, 0, 0, 349, 1312, 1, 0, 0, 0, 351, 1318, 1, 0, 0, 0, 353, 1322, 1, 0, 0, 0, 355, 1326, 1, 0, 0, 0, 357, 1330, 1, 0, 0, 0, 359, 1334, 1, 0, 0, 0, 361, 1338, 1, 0, 0, 0, 363, 1342, 1, 0, 0, 0, 365, 1347, 1, 0, 0, 0, 367, 1353, 1, 0, 0, 0, 369, 1359, 1, 0, 0, 0, 371, 1363, 1, 0, 0, 0, 373, 1367, 1, 0, 0, 0, 375, 1371, 1, 0, 0, 0, 377, 1377, 1, 0, 0, 0, 379, 1383, 1, 0, 0, 0, 381, 1387, 1, 0, 0, 0, 383, 1391, 1, 0, 0, 0, 385, 1395, 1, 0, 0, 0, 387, 1401, 1, 0, 0, 0, 389, 1407, 1, 0, 0, 0, 391, 1413, 1, 0, 0, 0, 393, 394, 7, 0, 0, 0, 394, 395, 7, 1, 0, 0, 395, 396, 7, 2, 0, 0, 396, 397, 7, 2, 0, 0, 397, 398, 7, 3, 0, 0, 398, 399, 7, 4, 0, 0, 399, 400, 7, 5, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 6, 0, 0, 0, 402, 16, 1, 0, 0, 0, 403, 404, 7, 0, 0, 0, 404, 405, 7, 6, 0, 0, 405, 406, 7, 7, 0, 0, 406, 407, 7, 8, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 1, 1, 0, 409, 18, 1, 0, 0, 0, 410, 411, 7, 3, 0, 0, 411, 412, 7, 9, 0, 0, 412, 413, 7, 6, 0, 0, 413, 414, 7, 1, 0, 0, 414, 415, 7, 4, 0, 0, 415, 416, 7, 10, 0, 0, 416, 417, 1, 0, 0, 0, 417, 418, 6, 2, 2, 0, 418, 20, 1, 0, 0, 0, 419, 420, 7, 3, 0, 0, 420, 421, 7, 11, 0, 0, 421, 422, 7, 12, 0, 0, 422, 423, 7, 13, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 6, 3, 0, 0, 425, 22, 1, 0, 0, 0, 426, 427, 7, 3, 0, 0, 427, 428, 7, 14, 0, 0, 428, 429, 7, 8, 0, 0, 429, 430, 7, 13, 0, 0, 430, 431, 7, 12, 0, 0, 431, 432, 7, 1, 0, 0, 432, 433, 7, 9, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 6, 4, 3, 0, 435, 24, 1, 0, 0, 0, 436, 437, 7, 15, 0, 0, 437, 438, 7, 6, 0, 0, 438, 439, 7, 7, 0, 0, 439, 440, 7, 16, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 6, 5, 4, 0, 442, 26, 1, 0, 0, 0, 443, 444, 7, 17, 0, 0, 444, 445, 7, 6, 0, 0, 445, 446, 7, 7, 0, 0, 446, 447, 7, 18, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 6, 6, 0, 0, 449, 28, 1, 0, 0, 0, 450, 451, 7, 18, 0, 0, 451, 452, 7, 3, 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 8, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 6, 7, 1, 0, 456, 30, 1, 0, 0, 0, 457, 458, 7, 13, 0, 0, 458, 459, 7, 1, 0, 0, 459, 460, 7, 16, 0, 0, 460, 461, 7, 1, 0, 0, 461, 462, 7, 5, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 8, 0, 0, 464, 32, 1, 0, 0, 0, 465, 466, 7, 16, 0, 0, 466, 467, 7, 11, 0, 0, 467, 468, 5, 95, 0, 0, 468, 469, 7, 3, 0, 0, 469, 470, 7, 14, 0, 0, 470, 471, 7, 8, 0, 0, 471, 472, 7, 12, 0, 0, 472, 473, 7, 9, 0, 0, 473, 474, 7, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 6, 9, 5, 0, 476, 34, 1, 0, 0, 0, 477, 478, 7, 6, 0, 0, 478, 479, 7, 3, 0, 0, 479, 480, 7, 9, 0, 0, 480, 481, 7, 12, 0, 0, 481, 482, 7, 16, 0, 0, 482, 483, 7, 3, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 6, 10, 6, 0, 485, 36, 1, 0, 0, 0, 486, 487, 7, 6, 0, 0, 487, 488, 7, 7, 0, 0, 488, 489, 7, 19, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 6, 11, 0, 0, 491, 38, 1, 0, 0, 0, 492, 493, 7, 2, 0, 0, 493, 494, 7, 10, 0, 0, 494, 495, 7, 7, 0, 0, 495, 496, 7, 19, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 12, 7, 0, 498, 40, 1, 0, 0, 0, 499, 500, 7, 2, 0, 0, 500, 501, 7, 7, 0, 0, 501, 502, 7, 6, 0, 0, 502, 503, 7, 5, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 6, 13, 0, 0, 505, 42, 1, 0, 0, 0, 506, 507, 7, 2, 0, 0, 507, 508, 7, 5, 0, 0, 508, 509, 7, 12, 0, 0, 509, 510, 7, 5, 0, 0, 510, 511, 7, 2, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 14, 0, 0, 513, 44, 1, 0, 0, 0, 514, 515, 7, 19, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 3, 0, 0, 517, 518, 7, 6, 0, 0, 518, 519, 7, 3, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 15, 0, 0, 521, 46, 1, 0, 0, 0, 522, 523, 4, 16, 0, 0, 523, 524, 7, 1, 0, 0, 524, 525, 7, 9, 0, 0, 525, 526, 7, 13, 0, 0, 526, 527, 7, 1, 0, 0, 527, 528, 7, 9, 0, 0, 528, 529, 7, 3, 0, 0, 529, 530, 7, 2, 0, 0, 530, 531, 7, 5, 0, 0, 531, 532, 7, 12, 0, 0, 532, 533, 7, 5, 0, 0, 533, 534, 7, 2, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 6, 16, 0, 0, 536, 48, 1, 0, 0, 0, 537, 538, 4, 17, 1, 0, 538, 539, 7, 13, 0, 0, 539, 540, 7, 7, 0, 0, 540, 541, 7, 7, 0, 0, 541, 542, 7, 18, 0, 0, 542, 543, 7, 20, 0, 0, 543, 544, 7, 8, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 6, 17, 8, 0, 546, 50, 1, 0, 0, 0, 547, 548, 4, 18, 2, 0, 548, 549, 7, 16, 0, 0, 549, 550, 7, 3, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 6, 0, 0, 552, 553, 7, 1, 0, 0, 553, 554, 7, 4, 0, 0, 554, 555, 7, 2, 0, 0, 555, 556, 1, 0, 0, 0, 556, 557, 6, 18, 9, 0, 557, 52, 1, 0, 0, 0, 558, 560, 8, 21, 0, 0, 559, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 19, 0, 0, 564, 54, 1, 0, 0, 0, 565, 566, 5, 47, 0, 0, 566, 567, 5, 47, 0, 0, 567, 571, 1, 0, 0, 0, 568, 570, 8, 22, 0, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 576, 5, 13, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 578, 1, 0, 0, 0, 577, 579, 5, 10, 0, 0, 578, 577, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 6, 20, 10, 0, 581, 56, 1, 0, 0, 0, 582, 583, 5, 47, 0, 0, 583, 584, 5, 42, 0, 0, 584, 589, 1, 0, 0, 0, 585, 588, 3, 57, 21, 0, 586, 588, 9, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 586, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 593, 5, 42, 0, 0, 593, 594, 5, 47, 0, 0, 594, 595, 1, 0, 0, 0, 595, 596, 6, 21, 10, 0, 596, 58, 1, 0, 0, 0, 597, 599, 7, 23, 0, 0, 598, 597, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 6, 22, 10, 0, 603, 60, 1, 0, 0, 0, 604, 605, 5, 124, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 6, 23, 11, 0, 607, 62, 1, 0, 0, 0, 608, 609, 7, 24, 0, 0, 609, 64, 1, 0, 0, 0, 610, 611, 7, 25, 0, 0, 611, 66, 1, 0, 0, 0, 612, 613, 5, 92, 0, 0, 613, 614, 7, 26, 0, 0, 614, 68, 1, 0, 0, 0, 615, 616, 8, 27, 0, 0, 616, 70, 1, 0, 0, 0, 617, 619, 7, 3, 0, 0, 618, 620, 7, 28, 0, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, 1, 0, 0, 0, 621, 623, 3, 63, 24, 0, 622, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 72, 1, 0, 0, 0, 626, 627, 5, 64, 0, 0, 627, 74, 1, 0, 0, 0, 628, 629, 5, 96, 0, 0, 629, 76, 1, 0, 0, 0, 630, 634, 8, 29, 0, 0, 631, 632, 5, 96, 0, 0, 632, 634, 5, 96, 0, 0, 633, 630, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 634, 78, 1, 0, 0, 0, 635, 636, 5, 95, 0, 0, 636, 80, 1, 0, 0, 0, 637, 641, 3, 65, 25, 0, 638, 641, 3, 63, 24, 0, 639, 641, 3, 79, 32, 0, 640, 637, 1, 0, 0, 0, 640, 638, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 82, 1, 0, 0, 0, 642, 647, 5, 34, 0, 0, 643, 646, 3, 67, 26, 0, 644, 646, 3, 69, 27, 0, 645, 643, 1, 0, 0, 0, 645, 644, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 672, 5, 34, 0, 0, 651, 652, 5, 34, 0, 0, 652, 653, 5, 34, 0, 0, 653, 654, 5, 34, 0, 0, 654, 658, 1, 0, 0, 0, 655, 657, 8, 22, 0, 0, 656, 655, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 662, 5, 34, 0, 0, 662, 663, 5, 34, 0, 0, 663, 664, 5, 34, 0, 0, 664, 666, 1, 0, 0, 0, 665, 667, 5, 34, 0, 0, 666, 665, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 670, 5, 34, 0, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 642, 1, 0, 0, 0, 671, 651, 1, 0, 0, 0, 672, 84, 1, 0, 0, 0, 673, 675, 3, 63, 24, 0, 674, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 674, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 86, 1, 0, 0, 0, 678, 680, 3, 63, 24, 0, 679, 678, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 687, 3, 103, 44, 0, 684, 686, 3, 63, 24, 0, 685, 684, 1, 0, 0, 0, 686, 689, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 721, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 692, 3, 103, 44, 0, 691, 693, 3, 63, 24, 0, 692, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 721, 1, 0, 0, 0, 696, 698, 3, 63, 24, 0, 697, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 708, 1, 0, 0, 0, 701, 705, 3, 103, 44, 0, 702, 704, 3, 63, 24, 0, 703, 702, 1, 0, 0, 0, 704, 707, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 701, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 3, 71, 28, 0, 711, 721, 1, 0, 0, 0, 712, 714, 3, 103, 44, 0, 713, 715, 3, 63, 24, 0, 714, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 3, 71, 28, 0, 719, 721, 1, 0, 0, 0, 720, 679, 1, 0, 0, 0, 720, 690, 1, 0, 0, 0, 720, 697, 1, 0, 0, 0, 720, 712, 1, 0, 0, 0, 721, 88, 1, 0, 0, 0, 722, 723, 7, 30, 0, 0, 723, 724, 7, 31, 0, 0, 724, 90, 1, 0, 0, 0, 725, 726, 7, 12, 0, 0, 726, 727, 7, 9, 0, 0, 727, 728, 7, 0, 0, 0, 728, 92, 1, 0, 0, 0, 729, 730, 7, 12, 0, 0, 730, 731, 7, 2, 0, 0, 731, 732, 7, 4, 0, 0, 732, 94, 1, 0, 0, 0, 733, 734, 5, 61, 0, 0, 734, 96, 1, 0, 0, 0, 735, 736, 5, 58, 0, 0, 736, 737, 5, 58, 0, 0, 737, 98, 1, 0, 0, 0, 738, 739, 5, 44, 0, 0, 739, 100, 1, 0, 0, 0, 740, 741, 7, 0, 0, 0, 741, 742, 7, 3, 0, 0, 742, 743, 7, 2, 0, 0, 743, 744, 7, 4, 0, 0, 744, 102, 1, 0, 0, 0, 745, 746, 5, 46, 0, 0, 746, 104, 1, 0, 0, 0, 747, 748, 7, 15, 0, 0, 748, 749, 7, 12, 0, 0, 749, 750, 7, 13, 0, 0, 750, 751, 7, 2, 0, 0, 751, 752, 7, 3, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 7, 15, 0, 0, 754, 755, 7, 1, 0, 0, 755, 756, 7, 6, 0, 0, 756, 757, 7, 2, 0, 0, 757, 758, 7, 5, 0, 0, 758, 108, 1, 0, 0, 0, 759, 760, 7, 1, 0, 0, 760, 761, 7, 9, 0, 0, 761, 110, 1, 0, 0, 0, 762, 763, 7, 1, 0, 0, 763, 764, 7, 2, 0, 0, 764, 112, 1, 0, 0, 0, 765, 766, 7, 13, 0, 0, 766, 767, 7, 12, 0, 0, 767, 768, 7, 2, 0, 0, 768, 769, 7, 5, 0, 0, 769, 114, 1, 0, 0, 0, 770, 771, 7, 13, 0, 0, 771, 772, 7, 1, 0, 0, 772, 773, 7, 18, 0, 0, 773, 774, 7, 3, 0, 0, 774, 116, 1, 0, 0, 0, 775, 776, 5, 40, 0, 0, 776, 118, 1, 0, 0, 0, 777, 778, 7, 9, 0, 0, 778, 779, 7, 7, 0, 0, 779, 780, 7, 5, 0, 0, 780, 120, 1, 0, 0, 0, 781, 782, 7, 9, 0, 0, 782, 783, 7, 20, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 13, 0, 0, 785, 122, 1, 0, 0, 0, 786, 787, 7, 9, 0, 0, 787, 788, 7, 20, 0, 0, 788, 789, 7, 13, 0, 0, 789, 790, 7, 13, 0, 0, 790, 791, 7, 2, 0, 0, 791, 124, 1, 0, 0, 0, 792, 793, 7, 7, 0, 0, 793, 794, 7, 6, 0, 0, 794, 126, 1, 0, 0, 0, 795, 796, 5, 63, 0, 0, 796, 128, 1, 0, 0, 0, 797, 798, 7, 6, 0, 0, 798, 799, 7, 13, 0, 0, 799, 800, 7, 1, 0, 0, 800, 801, 7, 18, 0, 0, 801, 802, 7, 3, 0, 0, 802, 130, 1, 0, 0, 0, 803, 804, 5, 41, 0, 0, 804, 132, 1, 0, 0, 0, 805, 806, 7, 5, 0, 0, 806, 807, 7, 6, 0, 0, 807, 808, 7, 20, 0, 0, 808, 809, 7, 3, 0, 0, 809, 134, 1, 0, 0, 0, 810, 811, 5, 61, 0, 0, 811, 812, 5, 61, 0, 0, 812, 136, 1, 0, 0, 0, 813, 814, 5, 61, 0, 0, 814, 815, 5, 126, 0, 0, 815, 138, 1, 0, 0, 0, 816, 817, 5, 33, 0, 0, 817, 818, 5, 61, 0, 0, 818, 140, 1, 0, 0, 0, 819, 820, 5, 60, 0, 0, 820, 142, 1, 0, 0, 0, 821, 822, 5, 60, 0, 0, 822, 823, 5, 61, 0, 0, 823, 144, 1, 0, 0, 0, 824, 825, 5, 62, 0, 0, 825, 146, 1, 0, 0, 0, 826, 827, 5, 62, 0, 0, 827, 828, 5, 61, 0, 0, 828, 148, 1, 0, 0, 0, 829, 830, 5, 43, 0, 0, 830, 150, 1, 0, 0, 0, 831, 832, 5, 45, 0, 0, 832, 152, 1, 0, 0, 0, 833, 834, 5, 42, 0, 0, 834, 154, 1, 0, 0, 0, 835, 836, 5, 47, 0, 0, 836, 156, 1, 0, 0, 0, 837, 838, 5, 37, 0, 0, 838, 158, 1, 0, 0, 0, 839, 840, 4, 72, 3, 0, 840, 841, 7, 16, 0, 0, 841, 842, 7, 12, 0, 0, 842, 843, 7, 5, 0, 0, 843, 844, 7, 4, 0, 0, 844, 845, 7, 10, 0, 0, 845, 160, 1, 0, 0, 0, 846, 849, 3, 127, 56, 0, 847, 850, 3, 65, 25, 0, 848, 850, 3, 79, 32, 0, 849, 847, 1, 0, 0, 0, 849, 848, 1, 0, 0, 0, 850, 854, 1, 0, 0, 0, 851, 853, 3, 81, 33, 0, 852, 851, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 864, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 857, 859, 3, 127, 56, 0, 858, 860, 3, 63, 24, 0, 859, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 846, 1, 0, 0, 0, 863, 857, 1, 0, 0, 0, 864, 162, 1, 0, 0, 0, 865, 866, 5, 91, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 6, 74, 0, 0, 868, 869, 6, 74, 0, 0, 869, 164, 1, 0, 0, 0, 870, 871, 5, 93, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 6, 75, 11, 0, 873, 874, 6, 75, 11, 0, 874, 166, 1, 0, 0, 0, 875, 879, 3, 65, 25, 0, 876, 878, 3, 81, 33, 0, 877, 876, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 892, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 885, 3, 79, 32, 0, 883, 885, 3, 73, 29, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 885, 887, 1, 0, 0, 0, 886, 888, 3, 81, 33, 0, 887, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 875, 1, 0, 0, 0, 891, 884, 1, 0, 0, 0, 892, 168, 1, 0, 0, 0, 893, 895, 3, 75, 30, 0, 894, 896, 3, 77, 31, 0, 895, 894, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 895, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 3, 75, 30, 0, 900, 170, 1, 0, 0, 0, 901, 902, 3, 169, 77, 0, 902, 172, 1, 0, 0, 0, 903, 904, 3, 55, 20, 0, 904, 905, 1, 0, 0, 0, 905, 906, 6, 79, 10, 0, 906, 174, 1, 0, 0, 0, 907, 908, 3, 57, 21, 0, 908, 909, 1, 0, 0, 0, 909, 910, 6, 80, 10, 0, 910, 176, 1, 0, 0, 0, 911, 912, 3, 59, 22, 0, 912, 913, 1, 0, 0, 0, 913, 914, 6, 81, 10, 0, 914, 178, 1, 0, 0, 0, 915, 916, 3, 163, 74, 0, 916, 917, 1, 0, 0, 0, 917, 918, 6, 82, 12, 0, 918, 919, 6, 82, 13, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 61, 23, 0, 921, 922, 1, 0, 0, 0, 922, 923, 6, 83, 14, 0, 923, 924, 6, 83, 11, 0, 924, 182, 1, 0, 0, 0, 925, 926, 3, 59, 22, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 84, 10, 0, 928, 184, 1, 0, 0, 0, 929, 930, 3, 55, 20, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 85, 10, 0, 932, 186, 1, 0, 0, 0, 933, 934, 3, 57, 21, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 86, 10, 0, 936, 188, 1, 0, 0, 0, 937, 938, 3, 61, 23, 0, 938, 939, 1, 0, 0, 0, 939, 940, 6, 87, 14, 0, 940, 941, 6, 87, 11, 0, 941, 190, 1, 0, 0, 0, 942, 943, 3, 163, 74, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 88, 12, 0, 945, 192, 1, 0, 0, 0, 946, 947, 3, 165, 75, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 89, 15, 0, 949, 194, 1, 0, 0, 0, 950, 951, 3, 319, 152, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 90, 16, 0, 953, 196, 1, 0, 0, 0, 954, 955, 3, 99, 42, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 91, 17, 0, 957, 198, 1, 0, 0, 0, 958, 959, 3, 95, 40, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 92, 18, 0, 961, 200, 1, 0, 0, 0, 962, 963, 7, 16, 0, 0, 963, 964, 7, 3, 0, 0, 964, 965, 7, 5, 0, 0, 965, 966, 7, 12, 0, 0, 966, 967, 7, 0, 0, 0, 967, 968, 7, 12, 0, 0, 968, 969, 7, 5, 0, 0, 969, 970, 7, 12, 0, 0, 970, 202, 1, 0, 0, 0, 971, 975, 8, 32, 0, 0, 972, 973, 5, 47, 0, 0, 973, 975, 8, 33, 0, 0, 974, 971, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 204, 1, 0, 0, 0, 976, 978, 3, 203, 94, 0, 977, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 977, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 206, 1, 0, 0, 0, 981, 982, 3, 205, 95, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 96, 19, 0, 984, 208, 1, 0, 0, 0, 985, 986, 3, 83, 34, 0, 986, 987, 1, 0, 0, 0, 987, 988, 6, 97, 20, 0, 988, 210, 1, 0, 0, 0, 989, 990, 3, 55, 20, 0, 990, 991, 1, 0, 0, 0, 991, 992, 6, 98, 10, 0, 992, 212, 1, 0, 0, 0, 993, 994, 3, 57, 21, 0, 994, 995, 1, 0, 0, 0, 995, 996, 6, 99, 10, 0, 996, 214, 1, 0, 0, 0, 997, 998, 3, 59, 22, 0, 998, 999, 1, 0, 0, 0, 999, 1000, 6, 100, 10, 0, 1000, 216, 1, 0, 0, 0, 1001, 1002, 3, 61, 23, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 101, 14, 0, 1004, 1005, 6, 101, 11, 0, 1005, 218, 1, 0, 0, 0, 1006, 1007, 3, 103, 44, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 102, 21, 0, 1009, 220, 1, 0, 0, 0, 1010, 1011, 3, 99, 42, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 103, 17, 0, 1013, 222, 1, 0, 0, 0, 1014, 1019, 3, 65, 25, 0, 1015, 1019, 3, 63, 24, 0, 1016, 1019, 3, 79, 32, 0, 1017, 1019, 3, 153, 69, 0, 1018, 1014, 1, 0, 0, 0, 1018, 1015, 1, 0, 0, 0, 1018, 1016, 1, 0, 0, 0, 1018, 1017, 1, 0, 0, 0, 1019, 224, 1, 0, 0, 0, 1020, 1023, 3, 65, 25, 0, 1021, 1023, 3, 153, 69, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1021, 1, 0, 0, 0, 1023, 1027, 1, 0, 0, 0, 1024, 1026, 3, 223, 104, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1040, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1033, 3, 79, 32, 0, 1031, 1033, 3, 73, 29, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1031, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1036, 3, 223, 104, 0, 1035, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1040, 1, 0, 0, 0, 1039, 1022, 1, 0, 0, 0, 1039, 1032, 1, 0, 0, 0, 1040, 226, 1, 0, 0, 0, 1041, 1044, 3, 225, 105, 0, 1042, 1044, 3, 169, 77, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 228, 1, 0, 0, 0, 1047, 1048, 3, 55, 20, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1050, 6, 107, 10, 0, 1050, 230, 1, 0, 0, 0, 1051, 1052, 3, 57, 21, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 6, 108, 10, 0, 1054, 232, 1, 0, 0, 0, 1055, 1056, 3, 59, 22, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1058, 6, 109, 10, 0, 1058, 234, 1, 0, 0, 0, 1059, 1060, 3, 61, 23, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1062, 6, 110, 14, 0, 1062, 1063, 6, 110, 11, 0, 1063, 236, 1, 0, 0, 0, 1064, 1065, 3, 95, 40, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 111, 18, 0, 1067, 238, 1, 0, 0, 0, 1068, 1069, 3, 99, 42, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 112, 17, 0, 1071, 240, 1, 0, 0, 0, 1072, 1073, 3, 103, 44, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 113, 21, 0, 1075, 242, 1, 0, 0, 0, 1076, 1077, 7, 12, 0, 0, 1077, 1078, 7, 2, 0, 0, 1078, 244, 1, 0, 0, 0, 1079, 1080, 3, 227, 106, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 115, 22, 0, 1082, 246, 1, 0, 0, 0, 1083, 1084, 3, 55, 20, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 116, 10, 0, 1086, 248, 1, 0, 0, 0, 1087, 1088, 3, 57, 21, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 117, 10, 0, 1090, 250, 1, 0, 0, 0, 1091, 1092, 3, 59, 22, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 118, 10, 0, 1094, 252, 1, 0, 0, 0, 1095, 1096, 3, 61, 23, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 119, 14, 0, 1098, 1099, 6, 119, 11, 0, 1099, 254, 1, 0, 0, 0, 1100, 1101, 3, 163, 74, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 120, 12, 0, 1103, 1104, 6, 120, 23, 0, 1104, 256, 1, 0, 0, 0, 1105, 1106, 7, 7, 0, 0, 1106, 1107, 7, 9, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 121, 24, 0, 1109, 258, 1, 0, 0, 0, 1110, 1111, 7, 19, 0, 0, 1111, 1112, 7, 1, 0, 0, 1112, 1113, 7, 5, 0, 0, 1113, 1114, 7, 10, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 122, 24, 0, 1116, 260, 1, 0, 0, 0, 1117, 1118, 8, 34, 0, 0, 1118, 262, 1, 0, 0, 0, 1119, 1121, 3, 261, 123, 0, 1120, 1119, 1, 0, 0, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1122, 1123, 1, 0, 0, 0, 1123, 1124, 1, 0, 0, 0, 1124, 1125, 3, 319, 152, 0, 1125, 1127, 1, 0, 0, 0, 1126, 1120, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1129, 1, 0, 0, 0, 1128, 1130, 3, 261, 123, 0, 1129, 1128, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 264, 1, 0, 0, 0, 1133, 1134, 3, 263, 124, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 6, 125, 25, 0, 1136, 266, 1, 0, 0, 0, 1137, 1138, 3, 55, 20, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1140, 6, 126, 10, 0, 1140, 268, 1, 0, 0, 0, 1141, 1142, 3, 57, 21, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 6, 127, 10, 0, 1144, 270, 1, 0, 0, 0, 1145, 1146, 3, 59, 22, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 128, 10, 0, 1148, 272, 1, 0, 0, 0, 1149, 1150, 3, 61, 23, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1152, 6, 129, 14, 0, 1152, 1153, 6, 129, 11, 0, 1153, 1154, 6, 129, 11, 0, 1154, 274, 1, 0, 0, 0, 1155, 1156, 3, 95, 40, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 6, 130, 18, 0, 1158, 276, 1, 0, 0, 0, 1159, 1160, 3, 99, 42, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 131, 17, 0, 1162, 278, 1, 0, 0, 0, 1163, 1164, 3, 103, 44, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 6, 132, 21, 0, 1166, 280, 1, 0, 0, 0, 1167, 1168, 3, 259, 122, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 6, 133, 26, 0, 1170, 282, 1, 0, 0, 0, 1171, 1172, 3, 227, 106, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 6, 134, 22, 0, 1174, 284, 1, 0, 0, 0, 1175, 1176, 3, 171, 78, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 135, 27, 0, 1178, 286, 1, 0, 0, 0, 1179, 1180, 3, 55, 20, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 136, 10, 0, 1182, 288, 1, 0, 0, 0, 1183, 1184, 3, 57, 21, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 137, 10, 0, 1186, 290, 1, 0, 0, 0, 1187, 1188, 3, 59, 22, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 138, 10, 0, 1190, 292, 1, 0, 0, 0, 1191, 1192, 3, 61, 23, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 139, 14, 0, 1194, 1195, 6, 139, 11, 0, 1195, 294, 1, 0, 0, 0, 1196, 1197, 3, 103, 44, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 140, 21, 0, 1199, 296, 1, 0, 0, 0, 1200, 1201, 3, 171, 78, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 141, 27, 0, 1203, 298, 1, 0, 0, 0, 1204, 1205, 3, 167, 76, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 142, 28, 0, 1207, 300, 1, 0, 0, 0, 1208, 1209, 3, 55, 20, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 143, 10, 0, 1211, 302, 1, 0, 0, 0, 1212, 1213, 3, 57, 21, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 144, 10, 0, 1215, 304, 1, 0, 0, 0, 1216, 1217, 3, 59, 22, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 145, 10, 0, 1219, 306, 1, 0, 0, 0, 1220, 1221, 3, 61, 23, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 146, 14, 0, 1223, 1224, 6, 146, 11, 0, 1224, 308, 1, 0, 0, 0, 1225, 1226, 7, 1, 0, 0, 1226, 1227, 7, 9, 0, 0, 1227, 1228, 7, 15, 0, 0, 1228, 1229, 7, 7, 0, 0, 1229, 310, 1, 0, 0, 0, 1230, 1231, 3, 55, 20, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 148, 10, 0, 1233, 312, 1, 0, 0, 0, 1234, 1235, 3, 57, 21, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 149, 10, 0, 1237, 314, 1, 0, 0, 0, 1238, 1239, 3, 59, 22, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 150, 10, 0, 1241, 316, 1, 0, 0, 0, 1242, 1243, 3, 165, 75, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1245, 6, 151, 15, 0, 1245, 1246, 6, 151, 11, 0, 1246, 318, 1, 0, 0, 0, 1247, 1248, 5, 58, 0, 0, 1248, 320, 1, 0, 0, 0, 1249, 1255, 3, 73, 29, 0, 1250, 1255, 3, 63, 24, 0, 1251, 1255, 3, 103, 44, 0, 1252, 1255, 3, 65, 25, 0, 1253, 1255, 3, 79, 32, 0, 1254, 1249, 1, 0, 0, 0, 1254, 1250, 1, 0, 0, 0, 1254, 1251, 1, 0, 0, 0, 1254, 1252, 1, 0, 0, 0, 1254, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 322, 1, 0, 0, 0, 1258, 1259, 3, 55, 20, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 6, 154, 10, 0, 1261, 324, 1, 0, 0, 0, 1262, 1263, 3, 57, 21, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 155, 10, 0, 1265, 326, 1, 0, 0, 0, 1266, 1267, 3, 59, 22, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 156, 10, 0, 1269, 328, 1, 0, 0, 0, 1270, 1271, 3, 61, 23, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 157, 14, 0, 1273, 1274, 6, 157, 11, 0, 1274, 330, 1, 0, 0, 0, 1275, 1276, 3, 319, 152, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 6, 158, 16, 0, 1278, 332, 1, 0, 0, 0, 1279, 1280, 3, 99, 42, 0, 1280, 1281, 1, 0, 0, 0, 1281, 1282, 6, 159, 17, 0, 1282, 334, 1, 0, 0, 0, 1283, 1284, 3, 103, 44, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 6, 160, 21, 0, 1286, 336, 1, 0, 0, 0, 1287, 1288, 3, 257, 121, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 6, 161, 29, 0, 1290, 1291, 6, 161, 30, 0, 1291, 338, 1, 0, 0, 0, 1292, 1293, 3, 205, 95, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 162, 19, 0, 1295, 340, 1, 0, 0, 0, 1296, 1297, 3, 83, 34, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 6, 163, 20, 0, 1299, 342, 1, 0, 0, 0, 1300, 1301, 3, 55, 20, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 6, 164, 10, 0, 1303, 344, 1, 0, 0, 0, 1304, 1305, 3, 57, 21, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 6, 165, 10, 0, 1307, 346, 1, 0, 0, 0, 1308, 1309, 3, 59, 22, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 6, 166, 10, 0, 1311, 348, 1, 0, 0, 0, 1312, 1313, 3, 61, 23, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 167, 14, 0, 1315, 1316, 6, 167, 11, 0, 1316, 1317, 6, 167, 11, 0, 1317, 350, 1, 0, 0, 0, 1318, 1319, 3, 99, 42, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 168, 17, 0, 1321, 352, 1, 0, 0, 0, 1322, 1323, 3, 103, 44, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 169, 21, 0, 1325, 354, 1, 0, 0, 0, 1326, 1327, 3, 227, 106, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 170, 22, 0, 1329, 356, 1, 0, 0, 0, 1330, 1331, 3, 55, 20, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1333, 6, 171, 10, 0, 1333, 358, 1, 0, 0, 0, 1334, 1335, 3, 57, 21, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 172, 10, 0, 1337, 360, 1, 0, 0, 0, 1338, 1339, 3, 59, 22, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 173, 10, 0, 1341, 362, 1, 0, 0, 0, 1342, 1343, 3, 61, 23, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 174, 14, 0, 1345, 1346, 6, 174, 11, 0, 1346, 364, 1, 0, 0, 0, 1347, 1348, 3, 205, 95, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1350, 6, 175, 19, 0, 1350, 1351, 6, 175, 11, 0, 1351, 1352, 6, 175, 31, 0, 1352, 366, 1, 0, 0, 0, 1353, 1354, 3, 83, 34, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 176, 20, 0, 1356, 1357, 6, 176, 11, 0, 1357, 1358, 6, 176, 31, 0, 1358, 368, 1, 0, 0, 0, 1359, 1360, 3, 55, 20, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 177, 10, 0, 1362, 370, 1, 0, 0, 0, 1363, 1364, 3, 57, 21, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 178, 10, 0, 1366, 372, 1, 0, 0, 0, 1367, 1368, 3, 59, 22, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 6, 179, 10, 0, 1370, 374, 1, 0, 0, 0, 1371, 1372, 3, 319, 152, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1374, 6, 180, 16, 0, 1374, 1375, 6, 180, 11, 0, 1375, 1376, 6, 180, 9, 0, 1376, 376, 1, 0, 0, 0, 1377, 1378, 3, 99, 42, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 181, 17, 0, 1380, 1381, 6, 181, 11, 0, 1381, 1382, 6, 181, 9, 0, 1382, 378, 1, 0, 0, 0, 1383, 1384, 3, 55, 20, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 6, 182, 10, 0, 1386, 380, 1, 0, 0, 0, 1387, 1388, 3, 57, 21, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 183, 10, 0, 1390, 382, 1, 0, 0, 0, 1391, 1392, 3, 59, 22, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 184, 10, 0, 1394, 384, 1, 0, 0, 0, 1395, 1396, 3, 171, 78, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 185, 11, 0, 1398, 1399, 6, 185, 0, 0, 1399, 1400, 6, 185, 27, 0, 1400, 386, 1, 0, 0, 0, 1401, 1402, 3, 167, 76, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 6, 186, 11, 0, 1404, 1405, 6, 186, 0, 0, 1405, 1406, 6, 186, 28, 0, 1406, 388, 1, 0, 0, 0, 1407, 1408, 3, 89, 37, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 187, 11, 0, 1410, 1411, 6, 187, 0, 0, 1411, 1412, 6, 187, 32, 0, 1412, 390, 1, 0, 0, 0, 1413, 1414, 3, 61, 23, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1416, 6, 188, 14, 0, 1416, 1417, 6, 188, 11, 0, 1417, 392, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 561, 571, 575, 578, 587, 589, 600, 619, 624, 633, 640, 645, 647, 658, 666, 669, 671, 676, 681, 687, 694, 699, 705, 708, 716, 720, 849, 854, 861, 863, 879, 884, 889, 891, 897, 974, 979, 1018, 1022, 1027, 1032, 1037, 1039, 1043, 1045, 1122, 1126, 1131, 1254, 1256, 33, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 65, 0, 5, 0, 0, 7, 24, 0, 7, 66, 0, 7, 104, 0, 7, 33, 0, 7, 31, 0, 7, 76, 0, 7, 25, 0, 7, 35, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 28, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index d3ad1d00d749e..0dd7796e6e5d3 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -8,14 +8,16 @@ * 2.0. */ -import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.RuntimeMetaData; +import org.antlr.v4.runtime.Vocabulary; +import org.antlr.v4.runtime.VocabularyImpl; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.atn.ATNDeserializer; +import org.antlr.v4.runtime.atn.LexerATNSimulator; +import org.antlr.v4.runtime.atn.PredictionContextCache; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) public class EsqlBaseLexer extends LexerConfig { @@ -25,86 +27,86 @@ public class EsqlBaseLexer extends LexerConfig { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, - LIMIT=9, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, - WHERE=16, DEV_INLINESTATS=17, DEV_LOOKUP=18, DEV_MATCH=19, DEV_METRICS=20, - UNKNOWN_CMD=21, LINE_COMMENT=22, MULTILINE_COMMENT=23, WS=24, PIPE=25, - QUOTED_STRING=26, INTEGER_LITERAL=27, DECIMAL_LITERAL=28, BY=29, AND=30, - ASC=31, ASSIGN=32, CAST_OP=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, - IN=39, IS=40, LAST=41, LIKE=42, LP=43, NOT=44, NULL=45, NULLS=46, OR=47, - PARAM=48, RLIKE=49, RP=50, TRUE=51, EQ=52, CIEQ=53, NEQ=54, LT=55, LTE=56, - GT=57, GTE=58, PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, NAMED_OR_POSITIONAL_PARAM=64, - OPENING_BRACKET=65, CLOSING_BRACKET=66, UNQUOTED_IDENTIFIER=67, QUOTED_IDENTIFIER=68, - EXPR_LINE_COMMENT=69, EXPR_MULTILINE_COMMENT=70, EXPR_WS=71, EXPLAIN_WS=72, - EXPLAIN_LINE_COMMENT=73, EXPLAIN_MULTILINE_COMMENT=74, METADATA=75, UNQUOTED_SOURCE=76, - FROM_LINE_COMMENT=77, FROM_MULTILINE_COMMENT=78, FROM_WS=79, ID_PATTERN=80, - PROJECT_LINE_COMMENT=81, PROJECT_MULTILINE_COMMENT=82, PROJECT_WS=83, - AS=84, RENAME_LINE_COMMENT=85, RENAME_MULTILINE_COMMENT=86, RENAME_WS=87, - ON=88, WITH=89, ENRICH_POLICY_NAME=90, ENRICH_LINE_COMMENT=91, ENRICH_MULTILINE_COMMENT=92, - ENRICH_WS=93, ENRICH_FIELD_LINE_COMMENT=94, ENRICH_FIELD_MULTILINE_COMMENT=95, - ENRICH_FIELD_WS=96, MVEXPAND_LINE_COMMENT=97, MVEXPAND_MULTILINE_COMMENT=98, - MVEXPAND_WS=99, INFO=100, SHOW_LINE_COMMENT=101, SHOW_MULTILINE_COMMENT=102, - SHOW_WS=103, COLON=104, SETTING=105, SETTING_LINE_COMMENT=106, SETTTING_MULTILINE_COMMENT=107, - SETTING_WS=108, LOOKUP_LINE_COMMENT=109, LOOKUP_MULTILINE_COMMENT=110, - LOOKUP_WS=111, LOOKUP_FIELD_LINE_COMMENT=112, LOOKUP_FIELD_MULTILINE_COMMENT=113, - LOOKUP_FIELD_WS=114, METRICS_LINE_COMMENT=115, METRICS_MULTILINE_COMMENT=116, - METRICS_WS=117, CLOSING_METRICS_LINE_COMMENT=118, CLOSING_METRICS_MULTILINE_COMMENT=119, + DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, + LIMIT=9, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, + WHERE=16, DEV_INLINESTATS=17, DEV_LOOKUP=18, DEV_METRICS=19, UNKNOWN_CMD=20, + LINE_COMMENT=21, MULTILINE_COMMENT=22, WS=23, PIPE=24, QUOTED_STRING=25, + INTEGER_LITERAL=26, DECIMAL_LITERAL=27, BY=28, AND=29, ASC=30, ASSIGN=31, + CAST_OP=32, COMMA=33, DESC=34, DOT=35, FALSE=36, FIRST=37, IN=38, IS=39, + LAST=40, LIKE=41, LP=42, NOT=43, NULL=44, NULLS=45, OR=46, PARAM=47, RLIKE=48, + RP=49, TRUE=50, EQ=51, CIEQ=52, NEQ=53, LT=54, LTE=55, GT=56, GTE=57, + PLUS=58, MINUS=59, ASTERISK=60, SLASH=61, PERCENT=62, DEV_MATCH=63, NAMED_OR_POSITIONAL_PARAM=64, + OPENING_BRACKET=65, CLOSING_BRACKET=66, UNQUOTED_IDENTIFIER=67, QUOTED_IDENTIFIER=68, + EXPR_LINE_COMMENT=69, EXPR_MULTILINE_COMMENT=70, EXPR_WS=71, EXPLAIN_WS=72, + EXPLAIN_LINE_COMMENT=73, EXPLAIN_MULTILINE_COMMENT=74, METADATA=75, UNQUOTED_SOURCE=76, + FROM_LINE_COMMENT=77, FROM_MULTILINE_COMMENT=78, FROM_WS=79, ID_PATTERN=80, + PROJECT_LINE_COMMENT=81, PROJECT_MULTILINE_COMMENT=82, PROJECT_WS=83, + AS=84, RENAME_LINE_COMMENT=85, RENAME_MULTILINE_COMMENT=86, RENAME_WS=87, + ON=88, WITH=89, ENRICH_POLICY_NAME=90, ENRICH_LINE_COMMENT=91, ENRICH_MULTILINE_COMMENT=92, + ENRICH_WS=93, ENRICH_FIELD_LINE_COMMENT=94, ENRICH_FIELD_MULTILINE_COMMENT=95, + ENRICH_FIELD_WS=96, MVEXPAND_LINE_COMMENT=97, MVEXPAND_MULTILINE_COMMENT=98, + MVEXPAND_WS=99, INFO=100, SHOW_LINE_COMMENT=101, SHOW_MULTILINE_COMMENT=102, + SHOW_WS=103, COLON=104, SETTING=105, SETTING_LINE_COMMENT=106, SETTTING_MULTILINE_COMMENT=107, + SETTING_WS=108, LOOKUP_LINE_COMMENT=109, LOOKUP_MULTILINE_COMMENT=110, + LOOKUP_WS=111, LOOKUP_FIELD_LINE_COMMENT=112, LOOKUP_FIELD_MULTILINE_COMMENT=113, + LOOKUP_FIELD_WS=114, METRICS_LINE_COMMENT=115, METRICS_MULTILINE_COMMENT=116, + METRICS_WS=117, CLOSING_METRICS_LINE_COMMENT=118, CLOSING_METRICS_MULTILINE_COMMENT=119, CLOSING_METRICS_WS=120; public static final int - EXPRESSION_MODE=1, EXPLAIN_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, - ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, SETTING_MODE=10, + EXPRESSION_MODE=1, EXPLAIN_MODE=2, FROM_MODE=3, PROJECT_MODE=4, RENAME_MODE=5, + ENRICH_MODE=6, ENRICH_FIELD_MODE=7, MVEXPAND_MODE=8, SHOW_MODE=9, SETTING_MODE=10, LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, METRICS_MODE=13, CLOSING_METRICS_MODE=14; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; public static String[] modeNames = { - "DEFAULT_MODE", "EXPRESSION_MODE", "EXPLAIN_MODE", "FROM_MODE", "PROJECT_MODE", - "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", + "DEFAULT_MODE", "EXPRESSION_MODE", "EXPLAIN_MODE", "FROM_MODE", "PROJECT_MODE", + "RENAME_MODE", "ENRICH_MODE", "ENRICH_FIELD_MODE", "MVEXPAND_MODE", "SHOW_MODE", "SETTING_MODE", "LOOKUP_MODE", "LOOKUP_FIELD_MODE", "METRICS_MODE", "CLOSING_METRICS_MODE" }; private static String[] makeRuleNames() { return new String[] { - "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", - "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", - "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", "UNKNOWN_CMD", - "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", - "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", - "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "DEV_MATCH_OP", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", - "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", - "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", - "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", - "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", - "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", - "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", - "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_PIPE", "LOOKUP_COLON", - "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", - "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", - "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", - "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", - "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", - "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", + "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "KEEP", + "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", + "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", "LINE_COMMENT", + "MULTILINE_COMMENT", "WS", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", + "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", + "UNDERSCORE", "UNQUOTED_ID_BODY", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", + "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", + "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", + "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_OPENING_BRACKET", + "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", + "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", + "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", + "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", + "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", + "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", + "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", + "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", + "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", + "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", + "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", + "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", + "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_PIPE", "LOOKUP_COLON", + "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", + "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", + "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", + "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", + "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE" }; } @@ -112,46 +114,46 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { - null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", - "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", - "'sort'", "'stats'", "'where'", null, null, null, null, null, null, null, - null, "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", "'::'", - "','", "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", "'last'", - "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", "'rlike'", - "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", - "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", null, null, null, - null, null, null, null, null, "'metadata'", null, null, null, null, null, - null, null, null, "'as'", null, null, null, "'on'", "'with'", null, null, - null, null, null, null, null, null, null, null, "'info'", null, null, + null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", + "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", + "'sort'", "'stats'", "'where'", null, null, null, null, null, null, null, + "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", "'::'", "','", + "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", "'last'", "'like'", + "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", "'rlike'", "')'", + "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", + "'-'", "'*'", "'/'", "'%'", null, null, null, "']'", null, null, null, + null, null, null, null, null, "'metadata'", null, null, null, null, null, + null, null, null, "'as'", null, null, null, "'on'", "'with'", null, null, + null, null, null, null, null, null, null, null, "'info'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", - "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", - "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", "SHOW_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", - "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", + "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", + "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", + "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", + "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", + "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", + "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS" }; } @@ -222,11 +224,9 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { case 17: return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex); case 18: - return DEV_MATCH_sempred((RuleContext)_localctx, predIndex); - case 19: return DEV_METRICS_sempred((RuleContext)_localctx, predIndex); - case 73: - return DEV_MATCH_OP_sempred((RuleContext)_localctx, predIndex); + case 72: + return DEV_MATCH_sempred((RuleContext)_localctx, predIndex); } return true; } @@ -244,30 +244,23 @@ private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) { } return true; } - private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 2: return this.isDevVersion(); } return true; } - private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) { + private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { switch (predIndex) { case 3: return this.isDevVersion(); } return true; } - private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { - switch (predIndex) { - case 4: - return this.isDevVersion(); - } - return true; - } public static final String _serializedATN = - "\u0004\u0000x\u0593\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000x\u058a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ @@ -320,878 +313,872 @@ private boolean DEV_MATCH_OP_sempred(RuleContext _localctx, int predIndex) { "\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002"+ "\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002"+ "\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002"+ - "\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002"+ - "\u00bd\u0007\u00bd\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0001"+ "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ - "\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0014"+ - "\u0004\u0014\u023b\b\u0014\u000b\u0014\f\u0014\u023c\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u0245"+ - "\b\u0015\n\u0015\f\u0015\u0248\t\u0015\u0001\u0015\u0003\u0015\u024b\b"+ - "\u0015\u0001\u0015\u0003\u0015\u024e\b\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0005\u0016\u0257"+ - "\b\u0016\n\u0016\f\u0016\u025a\t\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0017\u0004\u0017\u0262\b\u0017\u000b\u0017"+ - "\f\u0017\u0263\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d"+ - "\u0003\u001d\u0277\b\u001d\u0001\u001d\u0004\u001d\u027a\b\u001d\u000b"+ - "\u001d\f\u001d\u027b\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ - " \u0001 \u0001 \u0003 \u0285\b \u0001!\u0001!\u0001\"\u0001\"\u0001\""+ - "\u0003\"\u028c\b\"\u0001#\u0001#\u0001#\u0005#\u0291\b#\n#\f#\u0294\t"+ - "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0005#\u029c\b#\n#\f#\u029f"+ - "\t#\u0001#\u0001#\u0001#\u0001#\u0001#\u0003#\u02a6\b#\u0001#\u0003#\u02a9"+ - "\b#\u0003#\u02ab\b#\u0001$\u0004$\u02ae\b$\u000b$\f$\u02af\u0001%\u0004"+ - "%\u02b3\b%\u000b%\f%\u02b4\u0001%\u0001%\u0005%\u02b9\b%\n%\f%\u02bc\t"+ - "%\u0001%\u0001%\u0004%\u02c0\b%\u000b%\f%\u02c1\u0001%\u0004%\u02c5\b"+ - "%\u000b%\f%\u02c6\u0001%\u0001%\u0005%\u02cb\b%\n%\f%\u02ce\t%\u0003%"+ - "\u02d0\b%\u0001%\u0001%\u0001%\u0001%\u0004%\u02d6\b%\u000b%\f%\u02d7"+ - "\u0001%\u0001%\u0003%\u02dc\b%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001)\u0001)\u0001*\u0001*\u0001"+ - "*\u0001+\u0001+\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001"+ - ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001/\u0001"+ - "/\u0001/\u00010\u00010\u00010\u00011\u00011\u00011\u00012\u00012\u0001"+ - "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00014\u00014\u0001"+ - "5\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u00017\u0001"+ - "7\u00017\u00017\u00017\u00017\u00018\u00018\u00018\u00019\u00019\u0001"+ - ":\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001<\u0001<\u0001"+ - "<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001"+ - "?\u0001?\u0001@\u0001@\u0001A\u0001A\u0001A\u0001B\u0001B\u0001C\u0001"+ - "C\u0001C\u0001D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001"+ - "H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001J\u0001J\u0001J\u0003"+ - "J\u035b\bJ\u0001J\u0005J\u035e\bJ\nJ\fJ\u0361\tJ\u0001J\u0001J\u0004J"+ - "\u0365\bJ\u000bJ\fJ\u0366\u0003J\u0369\bJ\u0001K\u0001K\u0001K\u0001K"+ - "\u0001K\u0001L\u0001L\u0001L\u0001L\u0001L\u0001M\u0001M\u0005M\u0377"+ - "\bM\nM\fM\u037a\tM\u0001M\u0001M\u0003M\u037e\bM\u0001M\u0004M\u0381\b"+ - "M\u000bM\fM\u0382\u0003M\u0385\bM\u0001N\u0001N\u0004N\u0389\bN\u000b"+ - "N\fN\u038a\u0001N\u0001N\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001"+ - "Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ - "S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001U\u0001U\u0001"+ - "U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001"+ - "X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001"+ - "Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001\\\u0001"+ - "\\\u0001]\u0001]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001"+ - "^\u0001^\u0001^\u0001^\u0001_\u0001_\u0001_\u0003_\u03d8\b_\u0001`\u0004"+ - "`\u03db\b`\u000b`\f`\u03dc\u0001a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001"+ - "b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001"+ - "e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001f\u0001f\u0001g\u0001"+ - "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+ - "i\u0003i\u0404\bi\u0001j\u0001j\u0003j\u0408\bj\u0001j\u0005j\u040b\b"+ - "j\nj\fj\u040e\tj\u0001j\u0001j\u0003j\u0412\bj\u0001j\u0004j\u0415\bj"+ - "\u000bj\fj\u0416\u0003j\u0419\bj\u0001k\u0001k\u0004k\u041d\bk\u000bk"+ - "\fk\u041e\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001"+ - "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001o\u0001p\u0001"+ - "p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001"+ - "r\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001"+ - "u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001w\u0001"+ - "x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001y\u0001"+ - "z\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001"+ - "{\u0001{\u0001|\u0001|\u0001}\u0004}\u046a\b}\u000b}\f}\u046b\u0001}\u0001"+ - "}\u0003}\u0470\b}\u0001}\u0004}\u0473\b}\u000b}\f}\u0474\u0001~\u0001"+ - "~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001\u007f\u0001"+ - "\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001\u0081\u0001"+ - "\u0081\u0001\u0081\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001"+ - "\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+ - "\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ - "\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008e\u0001"+ - "\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0091\u0001"+ - "\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001"+ - "\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0095\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001\u0096\u0001"+ - "\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0098\u0001"+ - "\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001"+ - "\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0004\u009a\u04f0"+ - "\b\u009a\u000b\u009a\f\u009a\u04f1\u0001\u009b\u0001\u009b\u0001\u009b"+ - "\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f"+ - "\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a4"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a7"+ - "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8"+ - "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00ab"+ - "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ae"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af\u0001\u00af\u0001\u00af"+ - "\u0001\u00af\u0001\u00af\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ - "\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4"+ - "\u0001\u00b4\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ - "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ - "\u0001\u00ba\u0001\u00ba\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb"+ - "\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc"+ - "\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd"+ - "\u0001\u00bd\u0002\u0258\u029d\u0000\u00be\u000f\u0001\u0011\u0002\u0013"+ - "\u0003\u0015\u0004\u0017\u0005\u0019\u0006\u001b\u0007\u001d\b\u001f\t"+ - "!\n#\u000b%\f\'\r)\u000e+\u000f-\u0010/\u00111\u00123\u00135\u00147\u0015"+ - "9\u0016;\u0017=\u0018?\u0019A\u0000C\u0000E\u0000G\u0000I\u0000K\u0000"+ - "M\u0000O\u0000Q\u0000S\u0000U\u001aW\u001bY\u001c[\u001d]\u001e_\u001f"+ - "a c!e\"g#i$k%m&o\'q(s)u*w+y,{-}.\u007f/\u00810\u00831\u00852\u00873\u0089"+ - "4\u008b5\u008d6\u008f7\u00918\u00939\u0095:\u0097;\u0099<\u009b=\u009d"+ - ">\u009f?\u00a1\u0000\u00a3@\u00a5A\u00a7B\u00a9C\u00ab\u0000\u00adD\u00af"+ - "E\u00b1F\u00b3G\u00b5\u0000\u00b7\u0000\u00b9H\u00bbI\u00bdJ\u00bf\u0000"+ - "\u00c1\u0000\u00c3\u0000\u00c5\u0000\u00c7\u0000\u00c9\u0000\u00cbK\u00cd"+ - "\u0000\u00cfL\u00d1\u0000\u00d3\u0000\u00d5M\u00d7N\u00d9O\u00db\u0000"+ - "\u00dd\u0000\u00df\u0000\u00e1\u0000\u00e3\u0000\u00e5P\u00e7Q\u00e9R"+ - "\u00ebS\u00ed\u0000\u00ef\u0000\u00f1\u0000\u00f3\u0000\u00f5T\u00f7\u0000"+ - "\u00f9U\u00fbV\u00fdW\u00ff\u0000\u0101\u0000\u0103X\u0105Y\u0107\u0000"+ - "\u0109Z\u010b\u0000\u010d[\u010f\\\u0111]\u0113\u0000\u0115\u0000\u0117"+ - "\u0000\u0119\u0000\u011b\u0000\u011d\u0000\u011f\u0000\u0121^\u0123_\u0125"+ - "`\u0127\u0000\u0129\u0000\u012b\u0000\u012d\u0000\u012fa\u0131b\u0133"+ - "c\u0135\u0000\u0137d\u0139e\u013bf\u013dg\u013f\u0000\u0141h\u0143i\u0145"+ - "j\u0147k\u0149l\u014b\u0000\u014d\u0000\u014f\u0000\u0151\u0000\u0153"+ - "\u0000\u0155\u0000\u0157\u0000\u0159m\u015bn\u015do\u015f\u0000\u0161"+ - "\u0000\u0163\u0000\u0165\u0000\u0167p\u0169q\u016br\u016d\u0000\u016f"+ - "\u0000\u0171\u0000\u0173s\u0175t\u0177u\u0179\u0000\u017b\u0000\u017d"+ - "v\u017fw\u0181x\u0183\u0000\u0185\u0000\u0187\u0000\u0189\u0000\u000f"+ - "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+ - "#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000SSss\u0002\u0000EEee\u0002"+ - "\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002\u0000"+ - "PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000AAaa\u0002"+ - "\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002\u0000"+ - "GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000UUuu\u0006\u0000\t\n\r"+ - "\r //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r\r \u0001\u000009\u0002"+ - "\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000\n\n\r\r\"\"\\\\\u0002"+ - "\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000YYyy\u000b\u0000\t"+ - "\n\r\r \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000\t\n\r\r \"#,,"+ - "//::<<>?\\\\||\u05af\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001"+ - "\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001"+ - "\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001"+ - "\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001"+ - "\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000"+ - "\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000"+ - "\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000"+ - "+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001"+ - "\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000"+ - "\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u0000"+ - "9\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001"+ - "\u0000\u0000\u0000\u0001?\u0001\u0000\u0000\u0000\u0001U\u0001\u0000\u0000"+ - "\u0000\u0001W\u0001\u0000\u0000\u0000\u0001Y\u0001\u0000\u0000\u0000\u0001"+ - "[\u0001\u0000\u0000\u0000\u0001]\u0001\u0000\u0000\u0000\u0001_\u0001"+ - "\u0000\u0000\u0000\u0001a\u0001\u0000\u0000\u0000\u0001c\u0001\u0000\u0000"+ - "\u0000\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001\u0000\u0000\u0000\u0001"+ - "i\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000\u0000\u0001m\u0001"+ - "\u0000\u0000\u0000\u0001o\u0001\u0000\u0000\u0000\u0001q\u0001\u0000\u0000"+ - "\u0000\u0001s\u0001\u0000\u0000\u0000\u0001u\u0001\u0000\u0000\u0000\u0001"+ - "w\u0001\u0000\u0000\u0000\u0001y\u0001\u0000\u0000\u0000\u0001{\u0001"+ - "\u0000\u0000\u0000\u0001}\u0001\u0000\u0000\u0000\u0001\u007f\u0001\u0000"+ - "\u0000\u0000\u0001\u0081\u0001\u0000\u0000\u0000\u0001\u0083\u0001\u0000"+ - "\u0000\u0000\u0001\u0085\u0001\u0000\u0000\u0000\u0001\u0087\u0001\u0000"+ - "\u0000\u0000\u0001\u0089\u0001\u0000\u0000\u0000\u0001\u008b\u0001\u0000"+ - "\u0000\u0000\u0001\u008d\u0001\u0000\u0000\u0000\u0001\u008f\u0001\u0000"+ - "\u0000\u0000\u0001\u0091\u0001\u0000\u0000\u0000\u0001\u0093\u0001\u0000"+ - "\u0000\u0000\u0001\u0095\u0001\u0000\u0000\u0000\u0001\u0097\u0001\u0000"+ - "\u0000\u0000\u0001\u0099\u0001\u0000\u0000\u0000\u0001\u009b\u0001\u0000"+ - "\u0000\u0000\u0001\u009d\u0001\u0000\u0000\u0000\u0001\u009f\u0001\u0000"+ - "\u0000\u0000\u0001\u00a1\u0001\u0000\u0000\u0000\u0001\u00a3\u0001\u0000"+ - "\u0000\u0000\u0001\u00a5\u0001\u0000\u0000\u0000\u0001\u00a7\u0001\u0000"+ - "\u0000\u0000\u0001\u00a9\u0001\u0000\u0000\u0000\u0001\u00ad\u0001\u0000"+ - "\u0000\u0000\u0001\u00af\u0001\u0000\u0000\u0000\u0001\u00b1\u0001\u0000"+ - "\u0000\u0000\u0001\u00b3\u0001\u0000\u0000\u0000\u0002\u00b5\u0001\u0000"+ - "\u0000\u0000\u0002\u00b7\u0001\u0000\u0000\u0000\u0002\u00b9\u0001\u0000"+ - "\u0000\u0000\u0002\u00bb\u0001\u0000\u0000\u0000\u0002\u00bd\u0001\u0000"+ - "\u0000\u0000\u0003\u00bf\u0001\u0000\u0000\u0000\u0003\u00c1\u0001\u0000"+ - "\u0000\u0000\u0003\u00c3\u0001\u0000\u0000\u0000\u0003\u00c5\u0001\u0000"+ - "\u0000\u0000\u0003\u00c7\u0001\u0000\u0000\u0000\u0003\u00c9\u0001\u0000"+ - "\u0000\u0000\u0003\u00cb\u0001\u0000\u0000\u0000\u0003\u00cf\u0001\u0000"+ - "\u0000\u0000\u0003\u00d1\u0001\u0000\u0000\u0000\u0003\u00d3\u0001\u0000"+ - "\u0000\u0000\u0003\u00d5\u0001\u0000\u0000\u0000\u0003\u00d7\u0001\u0000"+ - "\u0000\u0000\u0003\u00d9\u0001\u0000\u0000\u0000\u0004\u00db\u0001\u0000"+ - "\u0000\u0000\u0004\u00dd\u0001\u0000\u0000\u0000\u0004\u00df\u0001\u0000"+ - "\u0000\u0000\u0004\u00e5\u0001\u0000\u0000\u0000\u0004\u00e7\u0001\u0000"+ - "\u0000\u0000\u0004\u00e9\u0001\u0000\u0000\u0000\u0004\u00eb\u0001\u0000"+ - "\u0000\u0000\u0005\u00ed\u0001\u0000\u0000\u0000\u0005\u00ef\u0001\u0000"+ - "\u0000\u0000\u0005\u00f1\u0001\u0000\u0000\u0000\u0005\u00f3\u0001\u0000"+ - "\u0000\u0000\u0005\u00f5\u0001\u0000\u0000\u0000\u0005\u00f7\u0001\u0000"+ - "\u0000\u0000\u0005\u00f9\u0001\u0000\u0000\u0000\u0005\u00fb\u0001\u0000"+ - "\u0000\u0000\u0005\u00fd\u0001\u0000\u0000\u0000\u0006\u00ff\u0001\u0000"+ - "\u0000\u0000\u0006\u0101\u0001\u0000\u0000\u0000\u0006\u0103\u0001\u0000"+ - "\u0000\u0000\u0006\u0105\u0001\u0000\u0000\u0000\u0006\u0109\u0001\u0000"+ - "\u0000\u0000\u0006\u010b\u0001\u0000\u0000\u0000\u0006\u010d\u0001\u0000"+ - "\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\u0006\u0111\u0001\u0000"+ - "\u0000\u0000\u0007\u0113\u0001\u0000\u0000\u0000\u0007\u0115\u0001\u0000"+ - "\u0000\u0000\u0007\u0117\u0001\u0000\u0000\u0000\u0007\u0119\u0001\u0000"+ - "\u0000\u0000\u0007\u011b\u0001\u0000\u0000\u0000\u0007\u011d\u0001\u0000"+ - "\u0000\u0000\u0007\u011f\u0001\u0000\u0000\u0000\u0007\u0121\u0001\u0000"+ - "\u0000\u0000\u0007\u0123\u0001\u0000\u0000\u0000\u0007\u0125\u0001\u0000"+ - "\u0000\u0000\b\u0127\u0001\u0000\u0000\u0000\b\u0129\u0001\u0000\u0000"+ - "\u0000\b\u012b\u0001\u0000\u0000\u0000\b\u012d\u0001\u0000\u0000\u0000"+ - "\b\u012f\u0001\u0000\u0000\u0000\b\u0131\u0001\u0000\u0000\u0000\b\u0133"+ - "\u0001\u0000\u0000\u0000\t\u0135\u0001\u0000\u0000\u0000\t\u0137\u0001"+ - "\u0000\u0000\u0000\t\u0139\u0001\u0000\u0000\u0000\t\u013b\u0001\u0000"+ - "\u0000\u0000\t\u013d\u0001\u0000\u0000\u0000\n\u013f\u0001\u0000\u0000"+ - "\u0000\n\u0141\u0001\u0000\u0000\u0000\n\u0143\u0001\u0000\u0000\u0000"+ - "\n\u0145\u0001\u0000\u0000\u0000\n\u0147\u0001\u0000\u0000\u0000\n\u0149"+ - "\u0001\u0000\u0000\u0000\u000b\u014b\u0001\u0000\u0000\u0000\u000b\u014d"+ - "\u0001\u0000\u0000\u0000\u000b\u014f\u0001\u0000\u0000\u0000\u000b\u0151"+ - "\u0001\u0000\u0000\u0000\u000b\u0153\u0001\u0000\u0000\u0000\u000b\u0155"+ - "\u0001\u0000\u0000\u0000\u000b\u0157\u0001\u0000\u0000\u0000\u000b\u0159"+ - "\u0001\u0000\u0000\u0000\u000b\u015b\u0001\u0000\u0000\u0000\u000b\u015d"+ - "\u0001\u0000\u0000\u0000\f\u015f\u0001\u0000\u0000\u0000\f\u0161\u0001"+ - "\u0000\u0000\u0000\f\u0163\u0001\u0000\u0000\u0000\f\u0165\u0001\u0000"+ - "\u0000\u0000\f\u0167\u0001\u0000\u0000\u0000\f\u0169\u0001\u0000\u0000"+ - "\u0000\f\u016b\u0001\u0000\u0000\u0000\r\u016d\u0001\u0000\u0000\u0000"+ - "\r\u016f\u0001\u0000\u0000\u0000\r\u0171\u0001\u0000\u0000\u0000\r\u0173"+ - "\u0001\u0000\u0000\u0000\r\u0175\u0001\u0000\u0000\u0000\r\u0177\u0001"+ - "\u0000\u0000\u0000\u000e\u0179\u0001\u0000\u0000\u0000\u000e\u017b\u0001"+ - "\u0000\u0000\u0000\u000e\u017d\u0001\u0000\u0000\u0000\u000e\u017f\u0001"+ - "\u0000\u0000\u0000\u000e\u0181\u0001\u0000\u0000\u0000\u000e\u0183\u0001"+ - "\u0000\u0000\u0000\u000e\u0185\u0001\u0000\u0000\u0000\u000e\u0187\u0001"+ - "\u0000\u0000\u0000\u000e\u0189\u0001\u0000\u0000\u0000\u000f\u018b\u0001"+ - "\u0000\u0000\u0000\u0011\u0195\u0001\u0000\u0000\u0000\u0013\u019c\u0001"+ - "\u0000\u0000\u0000\u0015\u01a5\u0001\u0000\u0000\u0000\u0017\u01ac\u0001"+ - "\u0000\u0000\u0000\u0019\u01b6\u0001\u0000\u0000\u0000\u001b\u01bd\u0001"+ - "\u0000\u0000\u0000\u001d\u01c4\u0001\u0000\u0000\u0000\u001f\u01cb\u0001"+ - "\u0000\u0000\u0000!\u01d3\u0001\u0000\u0000\u0000#\u01df\u0001\u0000\u0000"+ - "\u0000%\u01e8\u0001\u0000\u0000\u0000\'\u01ee\u0001\u0000\u0000\u0000"+ - ")\u01f5\u0001\u0000\u0000\u0000+\u01fc\u0001\u0000\u0000\u0000-\u0204"+ - "\u0001\u0000\u0000\u0000/\u020c\u0001\u0000\u0000\u00001\u021b\u0001\u0000"+ - "\u0000\u00003\u0225\u0001\u0000\u0000\u00005\u022e\u0001\u0000\u0000\u0000"+ - "7\u023a\u0001\u0000\u0000\u00009\u0240\u0001\u0000\u0000\u0000;\u0251"+ - "\u0001\u0000\u0000\u0000=\u0261\u0001\u0000\u0000\u0000?\u0267\u0001\u0000"+ - "\u0000\u0000A\u026b\u0001\u0000\u0000\u0000C\u026d\u0001\u0000\u0000\u0000"+ - "E\u026f\u0001\u0000\u0000\u0000G\u0272\u0001\u0000\u0000\u0000I\u0274"+ - "\u0001\u0000\u0000\u0000K\u027d\u0001\u0000\u0000\u0000M\u027f\u0001\u0000"+ - "\u0000\u0000O\u0284\u0001\u0000\u0000\u0000Q\u0286\u0001\u0000\u0000\u0000"+ - "S\u028b\u0001\u0000\u0000\u0000U\u02aa\u0001\u0000\u0000\u0000W\u02ad"+ - "\u0001\u0000\u0000\u0000Y\u02db\u0001\u0000\u0000\u0000[\u02dd\u0001\u0000"+ - "\u0000\u0000]\u02e0\u0001\u0000\u0000\u0000_\u02e4\u0001\u0000\u0000\u0000"+ - "a\u02e8\u0001\u0000\u0000\u0000c\u02ea\u0001\u0000\u0000\u0000e\u02ed"+ - "\u0001\u0000\u0000\u0000g\u02ef\u0001\u0000\u0000\u0000i\u02f4\u0001\u0000"+ - "\u0000\u0000k\u02f6\u0001\u0000\u0000\u0000m\u02fc\u0001\u0000\u0000\u0000"+ - "o\u0302\u0001\u0000\u0000\u0000q\u0305\u0001\u0000\u0000\u0000s\u0308"+ - "\u0001\u0000\u0000\u0000u\u030d\u0001\u0000\u0000\u0000w\u0312\u0001\u0000"+ - "\u0000\u0000y\u0314\u0001\u0000\u0000\u0000{\u0318\u0001\u0000\u0000\u0000"+ - "}\u031d\u0001\u0000\u0000\u0000\u007f\u0323\u0001\u0000\u0000\u0000\u0081"+ - "\u0326\u0001\u0000\u0000\u0000\u0083\u0328\u0001\u0000\u0000\u0000\u0085"+ - "\u032e\u0001\u0000\u0000\u0000\u0087\u0330\u0001\u0000\u0000\u0000\u0089"+ - "\u0335\u0001\u0000\u0000\u0000\u008b\u0338\u0001\u0000\u0000\u0000\u008d"+ - "\u033b\u0001\u0000\u0000\u0000\u008f\u033e\u0001\u0000\u0000\u0000\u0091"+ - "\u0340\u0001\u0000\u0000\u0000\u0093\u0343\u0001\u0000\u0000\u0000\u0095"+ - "\u0345\u0001\u0000\u0000\u0000\u0097\u0348\u0001\u0000\u0000\u0000\u0099"+ - "\u034a\u0001\u0000\u0000\u0000\u009b\u034c\u0001\u0000\u0000\u0000\u009d"+ - "\u034e\u0001\u0000\u0000\u0000\u009f\u0350\u0001\u0000\u0000\u0000\u00a1"+ - "\u0352\u0001\u0000\u0000\u0000\u00a3\u0368\u0001\u0000\u0000\u0000\u00a5"+ - "\u036a\u0001\u0000\u0000\u0000\u00a7\u036f\u0001\u0000\u0000\u0000\u00a9"+ - "\u0384\u0001\u0000\u0000\u0000\u00ab\u0386\u0001\u0000\u0000\u0000\u00ad"+ - "\u038e\u0001\u0000\u0000\u0000\u00af\u0390\u0001\u0000\u0000\u0000\u00b1"+ - "\u0394\u0001\u0000\u0000\u0000\u00b3\u0398\u0001\u0000\u0000\u0000\u00b5"+ - "\u039c\u0001\u0000\u0000\u0000\u00b7\u03a1\u0001\u0000\u0000\u0000\u00b9"+ - "\u03a6\u0001\u0000\u0000\u0000\u00bb\u03aa\u0001\u0000\u0000\u0000\u00bd"+ - "\u03ae\u0001\u0000\u0000\u0000\u00bf\u03b2\u0001\u0000\u0000\u0000\u00c1"+ - "\u03b7\u0001\u0000\u0000\u0000\u00c3\u03bb\u0001\u0000\u0000\u0000\u00c5"+ - "\u03bf\u0001\u0000\u0000\u0000\u00c7\u03c3\u0001\u0000\u0000\u0000\u00c9"+ - "\u03c7\u0001\u0000\u0000\u0000\u00cb\u03cb\u0001\u0000\u0000\u0000\u00cd"+ - "\u03d7\u0001\u0000\u0000\u0000\u00cf\u03da\u0001\u0000\u0000\u0000\u00d1"+ - "\u03de\u0001\u0000\u0000\u0000\u00d3\u03e2\u0001\u0000\u0000\u0000\u00d5"+ - "\u03e6\u0001\u0000\u0000\u0000\u00d7\u03ea\u0001\u0000\u0000\u0000\u00d9"+ - "\u03ee\u0001\u0000\u0000\u0000\u00db\u03f2\u0001\u0000\u0000\u0000\u00dd"+ - "\u03f7\u0001\u0000\u0000\u0000\u00df\u03fb\u0001\u0000\u0000\u0000\u00e1"+ - "\u0403\u0001\u0000\u0000\u0000\u00e3\u0418\u0001\u0000\u0000\u0000\u00e5"+ - "\u041c\u0001\u0000\u0000\u0000\u00e7\u0420\u0001\u0000\u0000\u0000\u00e9"+ - "\u0424\u0001\u0000\u0000\u0000\u00eb\u0428\u0001\u0000\u0000\u0000\u00ed"+ - "\u042c\u0001\u0000\u0000\u0000\u00ef\u0431\u0001\u0000\u0000\u0000\u00f1"+ - "\u0435\u0001\u0000\u0000\u0000\u00f3\u0439\u0001\u0000\u0000\u0000\u00f5"+ - "\u043d\u0001\u0000\u0000\u0000\u00f7\u0440\u0001\u0000\u0000\u0000\u00f9"+ - "\u0444\u0001\u0000\u0000\u0000\u00fb\u0448\u0001\u0000\u0000\u0000\u00fd"+ - "\u044c\u0001\u0000\u0000\u0000\u00ff\u0450\u0001\u0000\u0000\u0000\u0101"+ - "\u0455\u0001\u0000\u0000\u0000\u0103\u045a\u0001\u0000\u0000\u0000\u0105"+ - "\u045f\u0001\u0000\u0000\u0000\u0107\u0466\u0001\u0000\u0000\u0000\u0109"+ - "\u046f\u0001\u0000\u0000\u0000\u010b\u0476\u0001\u0000\u0000\u0000\u010d"+ - "\u047a\u0001\u0000\u0000\u0000\u010f\u047e\u0001\u0000\u0000\u0000\u0111"+ - "\u0482\u0001\u0000\u0000\u0000\u0113\u0486\u0001\u0000\u0000\u0000\u0115"+ - "\u048c\u0001\u0000\u0000\u0000\u0117\u0490\u0001\u0000\u0000\u0000\u0119"+ - "\u0494\u0001\u0000\u0000\u0000\u011b\u0498\u0001\u0000\u0000\u0000\u011d"+ - "\u049c\u0001\u0000\u0000\u0000\u011f\u04a0\u0001\u0000\u0000\u0000\u0121"+ - "\u04a4\u0001\u0000\u0000\u0000\u0123\u04a8\u0001\u0000\u0000\u0000\u0125"+ - "\u04ac\u0001\u0000\u0000\u0000\u0127\u04b0\u0001\u0000\u0000\u0000\u0129"+ - "\u04b5\u0001\u0000\u0000\u0000\u012b\u04b9\u0001\u0000\u0000\u0000\u012d"+ - "\u04bd\u0001\u0000\u0000\u0000\u012f\u04c1\u0001\u0000\u0000\u0000\u0131"+ - "\u04c5\u0001\u0000\u0000\u0000\u0133\u04c9\u0001\u0000\u0000\u0000\u0135"+ - "\u04cd\u0001\u0000\u0000\u0000\u0137\u04d2\u0001\u0000\u0000\u0000\u0139"+ - "\u04d7\u0001\u0000\u0000\u0000\u013b\u04db\u0001\u0000\u0000\u0000\u013d"+ - "\u04df\u0001\u0000\u0000\u0000\u013f\u04e3\u0001\u0000\u0000\u0000\u0141"+ - "\u04e8\u0001\u0000\u0000\u0000\u0143\u04ef\u0001\u0000\u0000\u0000\u0145"+ - "\u04f3\u0001\u0000\u0000\u0000\u0147\u04f7\u0001\u0000\u0000\u0000\u0149"+ - "\u04fb\u0001\u0000\u0000\u0000\u014b\u04ff\u0001\u0000\u0000\u0000\u014d"+ - "\u0504\u0001\u0000\u0000\u0000\u014f\u0508\u0001\u0000\u0000\u0000\u0151"+ - "\u050c\u0001\u0000\u0000\u0000\u0153\u0510\u0001\u0000\u0000\u0000\u0155"+ - "\u0515\u0001\u0000\u0000\u0000\u0157\u0519\u0001\u0000\u0000\u0000\u0159"+ - "\u051d\u0001\u0000\u0000\u0000\u015b\u0521\u0001\u0000\u0000\u0000\u015d"+ - "\u0525\u0001\u0000\u0000\u0000\u015f\u0529\u0001\u0000\u0000\u0000\u0161"+ - "\u052f\u0001\u0000\u0000\u0000\u0163\u0533\u0001\u0000\u0000\u0000\u0165"+ - "\u0537\u0001\u0000\u0000\u0000\u0167\u053b\u0001\u0000\u0000\u0000\u0169"+ - "\u053f\u0001\u0000\u0000\u0000\u016b\u0543\u0001\u0000\u0000\u0000\u016d"+ - "\u0547\u0001\u0000\u0000\u0000\u016f\u054c\u0001\u0000\u0000\u0000\u0171"+ - "\u0552\u0001\u0000\u0000\u0000\u0173\u0558\u0001\u0000\u0000\u0000\u0175"+ - "\u055c\u0001\u0000\u0000\u0000\u0177\u0560\u0001\u0000\u0000\u0000\u0179"+ - "\u0564\u0001\u0000\u0000\u0000\u017b\u056a\u0001\u0000\u0000\u0000\u017d"+ - "\u0570\u0001\u0000\u0000\u0000\u017f\u0574\u0001\u0000\u0000\u0000\u0181"+ - "\u0578\u0001\u0000\u0000\u0000\u0183\u057c\u0001\u0000\u0000\u0000\u0185"+ - "\u0582\u0001\u0000\u0000\u0000\u0187\u0588\u0001\u0000\u0000\u0000\u0189"+ - "\u058e\u0001\u0000\u0000\u0000\u018b\u018c\u0007\u0000\u0000\u0000\u018c"+ - "\u018d\u0007\u0001\u0000\u0000\u018d\u018e\u0007\u0002\u0000\u0000\u018e"+ - "\u018f\u0007\u0002\u0000\u0000\u018f\u0190\u0007\u0003\u0000\u0000\u0190"+ - "\u0191\u0007\u0004\u0000\u0000\u0191\u0192\u0007\u0005\u0000\u0000\u0192"+ - "\u0193\u0001\u0000\u0000\u0000\u0193\u0194\u0006\u0000\u0000\u0000\u0194"+ - "\u0010\u0001\u0000\u0000\u0000\u0195\u0196\u0007\u0000\u0000\u0000\u0196"+ - "\u0197\u0007\u0006\u0000\u0000\u0197\u0198\u0007\u0007\u0000\u0000\u0198"+ - "\u0199\u0007\b\u0000\u0000\u0199\u019a\u0001\u0000\u0000\u0000\u019a\u019b"+ - "\u0006\u0001\u0001\u0000\u019b\u0012\u0001\u0000\u0000\u0000\u019c\u019d"+ - "\u0007\u0003\u0000\u0000\u019d\u019e\u0007\t\u0000\u0000\u019e\u019f\u0007"+ - "\u0006\u0000\u0000\u019f\u01a0\u0007\u0001\u0000\u0000\u01a0\u01a1\u0007"+ - "\u0004\u0000\u0000\u01a1\u01a2\u0007\n\u0000\u0000\u01a2\u01a3\u0001\u0000"+ - "\u0000\u0000\u01a3\u01a4\u0006\u0002\u0002\u0000\u01a4\u0014\u0001\u0000"+ - "\u0000\u0000\u01a5\u01a6\u0007\u0003\u0000\u0000\u01a6\u01a7\u0007\u000b"+ - "\u0000\u0000\u01a7\u01a8\u0007\f\u0000\u0000\u01a8\u01a9\u0007\r\u0000"+ - "\u0000\u01a9\u01aa\u0001\u0000\u0000\u0000\u01aa\u01ab\u0006\u0003\u0000"+ - "\u0000\u01ab\u0016\u0001\u0000\u0000\u0000\u01ac\u01ad\u0007\u0003\u0000"+ - "\u0000\u01ad\u01ae\u0007\u000e\u0000\u0000\u01ae\u01af\u0007\b\u0000\u0000"+ - "\u01af\u01b0\u0007\r\u0000\u0000\u01b0\u01b1\u0007\f\u0000\u0000\u01b1"+ - "\u01b2\u0007\u0001\u0000\u0000\u01b2\u01b3\u0007\t\u0000\u0000\u01b3\u01b4"+ - "\u0001\u0000\u0000\u0000\u01b4\u01b5\u0006\u0004\u0003\u0000\u01b5\u0018"+ - "\u0001\u0000\u0000\u0000\u01b6\u01b7\u0007\u000f\u0000\u0000\u01b7\u01b8"+ - "\u0007\u0006\u0000\u0000\u01b8\u01b9\u0007\u0007\u0000\u0000\u01b9\u01ba"+ - "\u0007\u0010\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb\u01bc"+ - "\u0006\u0005\u0004\u0000\u01bc\u001a\u0001\u0000\u0000\u0000\u01bd\u01be"+ - "\u0007\u0011\u0000\u0000\u01be\u01bf\u0007\u0006\u0000\u0000\u01bf\u01c0"+ - "\u0007\u0007\u0000\u0000\u01c0\u01c1\u0007\u0012\u0000\u0000\u01c1\u01c2"+ - "\u0001\u0000\u0000\u0000\u01c2\u01c3\u0006\u0006\u0000\u0000\u01c3\u001c"+ - "\u0001\u0000\u0000\u0000\u01c4\u01c5\u0007\u0012\u0000\u0000\u01c5\u01c6"+ - "\u0007\u0003\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8"+ - "\u0007\b\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01ca\u0006"+ - "\u0007\u0001\u0000\u01ca\u001e\u0001\u0000\u0000\u0000\u01cb\u01cc\u0007"+ - "\r\u0000\u0000\u01cc\u01cd\u0007\u0001\u0000\u0000\u01cd\u01ce\u0007\u0010"+ - "\u0000\u0000\u01ce\u01cf\u0007\u0001\u0000\u0000\u01cf\u01d0\u0007\u0005"+ - "\u0000\u0000\u01d0\u01d1\u0001\u0000\u0000\u0000\u01d1\u01d2\u0006\b\u0000"+ - "\u0000\u01d2 \u0001\u0000\u0000\u0000\u01d3\u01d4\u0007\u0010\u0000\u0000"+ - "\u01d4\u01d5\u0007\u000b\u0000\u0000\u01d5\u01d6\u0005_\u0000\u0000\u01d6"+ - "\u01d7\u0007\u0003\u0000\u0000\u01d7\u01d8\u0007\u000e\u0000\u0000\u01d8"+ - "\u01d9\u0007\b\u0000\u0000\u01d9\u01da\u0007\f\u0000\u0000\u01da\u01db"+ - "\u0007\t\u0000\u0000\u01db\u01dc\u0007\u0000\u0000\u0000\u01dc\u01dd\u0001"+ - "\u0000\u0000\u0000\u01dd\u01de\u0006\t\u0005\u0000\u01de\"\u0001\u0000"+ - "\u0000\u0000\u01df\u01e0\u0007\u0006\u0000\u0000\u01e0\u01e1\u0007\u0003"+ - "\u0000\u0000\u01e1\u01e2\u0007\t\u0000\u0000\u01e2\u01e3\u0007\f\u0000"+ - "\u0000\u01e3\u01e4\u0007\u0010\u0000\u0000\u01e4\u01e5\u0007\u0003\u0000"+ - "\u0000\u01e5\u01e6\u0001\u0000\u0000\u0000\u01e6\u01e7\u0006\n\u0006\u0000"+ - "\u01e7$\u0001\u0000\u0000\u0000\u01e8\u01e9\u0007\u0006\u0000\u0000\u01e9"+ - "\u01ea\u0007\u0007\u0000\u0000\u01ea\u01eb\u0007\u0013\u0000\u0000\u01eb"+ - "\u01ec\u0001\u0000\u0000\u0000\u01ec\u01ed\u0006\u000b\u0000\u0000\u01ed"+ - "&\u0001\u0000\u0000\u0000\u01ee\u01ef\u0007\u0002\u0000\u0000\u01ef\u01f0"+ - "\u0007\n\u0000\u0000\u01f0\u01f1\u0007\u0007\u0000\u0000\u01f1\u01f2\u0007"+ - "\u0013\u0000\u0000\u01f2\u01f3\u0001\u0000\u0000\u0000\u01f3\u01f4\u0006"+ - "\f\u0007\u0000\u01f4(\u0001\u0000\u0000\u0000\u01f5\u01f6\u0007\u0002"+ - "\u0000\u0000\u01f6\u01f7\u0007\u0007\u0000\u0000\u01f7\u01f8\u0007\u0006"+ - "\u0000\u0000\u01f8\u01f9\u0007\u0005\u0000\u0000\u01f9\u01fa\u0001\u0000"+ - "\u0000\u0000\u01fa\u01fb\u0006\r\u0000\u0000\u01fb*\u0001\u0000\u0000"+ - "\u0000\u01fc\u01fd\u0007\u0002\u0000\u0000\u01fd\u01fe\u0007\u0005\u0000"+ - "\u0000\u01fe\u01ff\u0007\f\u0000\u0000\u01ff\u0200\u0007\u0005\u0000\u0000"+ - "\u0200\u0201\u0007\u0002\u0000\u0000\u0201\u0202\u0001\u0000\u0000\u0000"+ - "\u0202\u0203\u0006\u000e\u0000\u0000\u0203,\u0001\u0000\u0000\u0000\u0204"+ - "\u0205\u0007\u0013\u0000\u0000\u0205\u0206\u0007\n\u0000\u0000\u0206\u0207"+ - "\u0007\u0003\u0000\u0000\u0207\u0208\u0007\u0006\u0000\u0000\u0208\u0209"+ - "\u0007\u0003\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b"+ - "\u0006\u000f\u0000\u0000\u020b.\u0001\u0000\u0000\u0000\u020c\u020d\u0004"+ - "\u0010\u0000\u0000\u020d\u020e\u0007\u0001\u0000\u0000\u020e\u020f\u0007"+ - "\t\u0000\u0000\u020f\u0210\u0007\r\u0000\u0000\u0210\u0211\u0007\u0001"+ - "\u0000\u0000\u0211\u0212\u0007\t\u0000\u0000\u0212\u0213\u0007\u0003\u0000"+ - "\u0000\u0213\u0214\u0007\u0002\u0000\u0000\u0214\u0215\u0007\u0005\u0000"+ - "\u0000\u0215\u0216\u0007\f\u0000\u0000\u0216\u0217\u0007\u0005\u0000\u0000"+ - "\u0217\u0218\u0007\u0002\u0000\u0000\u0218\u0219\u0001\u0000\u0000\u0000"+ - "\u0219\u021a\u0006\u0010\u0000\u0000\u021a0\u0001\u0000\u0000\u0000\u021b"+ - "\u021c\u0004\u0011\u0001\u0000\u021c\u021d\u0007\r\u0000\u0000\u021d\u021e"+ - "\u0007\u0007\u0000\u0000\u021e\u021f\u0007\u0007\u0000\u0000\u021f\u0220"+ - "\u0007\u0012\u0000\u0000\u0220\u0221\u0007\u0014\u0000\u0000\u0221\u0222"+ - "\u0007\b\u0000\u0000\u0222\u0223\u0001\u0000\u0000\u0000\u0223\u0224\u0006"+ - "\u0011\b\u0000\u02242\u0001\u0000\u0000\u0000\u0225\u0226\u0004\u0012"+ - "\u0002\u0000\u0226\u0227\u0007\u0010\u0000\u0000\u0227\u0228\u0007\f\u0000"+ - "\u0000\u0228\u0229\u0007\u0005\u0000\u0000\u0229\u022a\u0007\u0004\u0000"+ - "\u0000\u022a\u022b\u0007\n\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000"+ - "\u022c\u022d\u0006\u0012\u0000\u0000\u022d4\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u0004\u0013\u0003\u0000\u022f\u0230\u0007\u0010\u0000\u0000\u0230"+ - "\u0231\u0007\u0003\u0000\u0000\u0231\u0232\u0007\u0005\u0000\u0000\u0232"+ - "\u0233\u0007\u0006\u0000\u0000\u0233\u0234\u0007\u0001\u0000\u0000\u0234"+ - "\u0235\u0007\u0004\u0000\u0000\u0235\u0236\u0007\u0002\u0000\u0000\u0236"+ - "\u0237\u0001\u0000\u0000\u0000\u0237\u0238\u0006\u0013\t\u0000\u02386"+ - "\u0001\u0000\u0000\u0000\u0239\u023b\b\u0015\u0000\u0000\u023a\u0239\u0001"+ - "\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c\u023a\u0001"+ - "\u0000\u0000\u0000\u023c\u023d\u0001\u0000\u0000\u0000\u023d\u023e\u0001"+ - "\u0000\u0000\u0000\u023e\u023f\u0006\u0014\u0000\u0000\u023f8\u0001\u0000"+ - "\u0000\u0000\u0240\u0241\u0005/\u0000\u0000\u0241\u0242\u0005/\u0000\u0000"+ - "\u0242\u0246\u0001\u0000\u0000\u0000\u0243\u0245\b\u0016\u0000\u0000\u0244"+ - "\u0243\u0001\u0000\u0000\u0000\u0245\u0248\u0001\u0000\u0000\u0000\u0246"+ - "\u0244\u0001\u0000\u0000\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247"+ - "\u024a\u0001\u0000\u0000\u0000\u0248\u0246\u0001\u0000\u0000\u0000\u0249"+ - "\u024b\u0005\r\u0000\u0000\u024a\u0249\u0001\u0000\u0000\u0000\u024a\u024b"+ - "\u0001\u0000\u0000\u0000\u024b\u024d\u0001\u0000\u0000\u0000\u024c\u024e"+ - "\u0005\n\u0000\u0000\u024d\u024c\u0001\u0000\u0000\u0000\u024d\u024e\u0001"+ - "\u0000\u0000\u0000\u024e\u024f\u0001\u0000\u0000\u0000\u024f\u0250\u0006"+ - "\u0015\n\u0000\u0250:\u0001\u0000\u0000\u0000\u0251\u0252\u0005/\u0000"+ - "\u0000\u0252\u0253\u0005*\u0000\u0000\u0253\u0258\u0001\u0000\u0000\u0000"+ - "\u0254\u0257\u0003;\u0016\u0000\u0255\u0257\t\u0000\u0000\u0000\u0256"+ - "\u0254\u0001\u0000\u0000\u0000\u0256\u0255\u0001\u0000\u0000\u0000\u0257"+ - "\u025a\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000\u0000\u0000\u0258"+ - "\u0256\u0001\u0000\u0000\u0000\u0259\u025b\u0001\u0000\u0000\u0000\u025a"+ - "\u0258\u0001\u0000\u0000\u0000\u025b\u025c\u0005*\u0000\u0000\u025c\u025d"+ - "\u0005/\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f\u0006"+ - "\u0016\n\u0000\u025f<\u0001\u0000\u0000\u0000\u0260\u0262\u0007\u0017"+ - "\u0000\u0000\u0261\u0260\u0001\u0000\u0000\u0000\u0262\u0263\u0001\u0000"+ - "\u0000\u0000\u0263\u0261\u0001\u0000\u0000\u0000\u0263\u0264\u0001\u0000"+ - "\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000\u0265\u0266\u0006\u0017"+ - "\n\u0000\u0266>\u0001\u0000\u0000\u0000\u0267\u0268\u0005|\u0000\u0000"+ - "\u0268\u0269\u0001\u0000\u0000\u0000\u0269\u026a\u0006\u0018\u000b\u0000"+ - "\u026a@\u0001\u0000\u0000\u0000\u026b\u026c\u0007\u0018\u0000\u0000\u026c"+ - "B\u0001\u0000\u0000\u0000\u026d\u026e\u0007\u0019\u0000\u0000\u026eD\u0001"+ - "\u0000\u0000\u0000\u026f\u0270\u0005\\\u0000\u0000\u0270\u0271\u0007\u001a"+ - "\u0000\u0000\u0271F\u0001\u0000\u0000\u0000\u0272\u0273\b\u001b\u0000"+ - "\u0000\u0273H\u0001\u0000\u0000\u0000\u0274\u0276\u0007\u0003\u0000\u0000"+ - "\u0275\u0277\u0007\u001c\u0000\u0000\u0276\u0275\u0001\u0000\u0000\u0000"+ - "\u0276\u0277\u0001\u0000\u0000\u0000\u0277\u0279\u0001\u0000\u0000\u0000"+ - "\u0278\u027a\u0003A\u0019\u0000\u0279\u0278\u0001\u0000\u0000\u0000\u027a"+ - "\u027b\u0001\u0000\u0000\u0000\u027b\u0279\u0001\u0000\u0000\u0000\u027b"+ - "\u027c\u0001\u0000\u0000\u0000\u027cJ\u0001\u0000\u0000\u0000\u027d\u027e"+ - "\u0005@\u0000\u0000\u027eL\u0001\u0000\u0000\u0000\u027f\u0280\u0005`"+ - "\u0000\u0000\u0280N\u0001\u0000\u0000\u0000\u0281\u0285\b\u001d\u0000"+ - "\u0000\u0282\u0283\u0005`\u0000\u0000\u0283\u0285\u0005`\u0000\u0000\u0284"+ - "\u0281\u0001\u0000\u0000\u0000\u0284\u0282\u0001\u0000\u0000\u0000\u0285"+ - "P\u0001\u0000\u0000\u0000\u0286\u0287\u0005_\u0000\u0000\u0287R\u0001"+ - "\u0000\u0000\u0000\u0288\u028c\u0003C\u001a\u0000\u0289\u028c\u0003A\u0019"+ - "\u0000\u028a\u028c\u0003Q!\u0000\u028b\u0288\u0001\u0000\u0000\u0000\u028b"+ - "\u0289\u0001\u0000\u0000\u0000\u028b\u028a\u0001\u0000\u0000\u0000\u028c"+ - "T\u0001\u0000\u0000\u0000\u028d\u0292\u0005\"\u0000\u0000\u028e\u0291"+ - "\u0003E\u001b\u0000\u028f\u0291\u0003G\u001c\u0000\u0290\u028e\u0001\u0000"+ - "\u0000\u0000\u0290\u028f\u0001\u0000\u0000\u0000\u0291\u0294\u0001\u0000"+ - "\u0000\u0000\u0292\u0290\u0001\u0000\u0000\u0000\u0292\u0293\u0001\u0000"+ - "\u0000\u0000\u0293\u0295\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000"+ - "\u0000\u0000\u0295\u02ab\u0005\"\u0000\u0000\u0296\u0297\u0005\"\u0000"+ - "\u0000\u0297\u0298\u0005\"\u0000\u0000\u0298\u0299\u0005\"\u0000\u0000"+ - "\u0299\u029d\u0001\u0000\u0000\u0000\u029a\u029c\b\u0016\u0000\u0000\u029b"+ - "\u029a\u0001\u0000\u0000\u0000\u029c\u029f\u0001\u0000\u0000\u0000\u029d"+ - "\u029e\u0001\u0000\u0000\u0000\u029d\u029b\u0001\u0000\u0000\u0000\u029e"+ - "\u02a0\u0001\u0000\u0000\u0000\u029f\u029d\u0001\u0000\u0000\u0000\u02a0"+ - "\u02a1\u0005\"\u0000\u0000\u02a1\u02a2\u0005\"\u0000\u0000\u02a2\u02a3"+ - "\u0005\"\u0000\u0000\u02a3\u02a5\u0001\u0000\u0000\u0000\u02a4\u02a6\u0005"+ - "\"\u0000\u0000\u02a5\u02a4\u0001\u0000\u0000\u0000\u02a5\u02a6\u0001\u0000"+ - "\u0000\u0000\u02a6\u02a8\u0001\u0000\u0000\u0000\u02a7\u02a9\u0005\"\u0000"+ - "\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a8\u02a9\u0001\u0000\u0000"+ - "\u0000\u02a9\u02ab\u0001\u0000\u0000\u0000\u02aa\u028d\u0001\u0000\u0000"+ - "\u0000\u02aa\u0296\u0001\u0000\u0000\u0000\u02abV\u0001\u0000\u0000\u0000"+ - "\u02ac\u02ae\u0003A\u0019\u0000\u02ad\u02ac\u0001\u0000\u0000\u0000\u02ae"+ - "\u02af\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000\u0000\u02af"+ - "\u02b0\u0001\u0000\u0000\u0000\u02b0X\u0001\u0000\u0000\u0000\u02b1\u02b3"+ - "\u0003A\u0019\u0000\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3\u02b4\u0001"+ - "\u0000\u0000\u0000\u02b4\u02b2\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001"+ - "\u0000\u0000\u0000\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02ba\u0003"+ - "i-\u0000\u02b7\u02b9\u0003A\u0019\u0000\u02b8\u02b7\u0001\u0000\u0000"+ - "\u0000\u02b9\u02bc\u0001\u0000\u0000\u0000\u02ba\u02b8\u0001\u0000\u0000"+ - "\u0000\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02dc\u0001\u0000\u0000"+ - "\u0000\u02bc\u02ba\u0001\u0000\u0000\u0000\u02bd\u02bf\u0003i-\u0000\u02be"+ - "\u02c0\u0003A\u0019\u0000\u02bf\u02be\u0001\u0000\u0000\u0000\u02c0\u02c1"+ - "\u0001\u0000\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c1\u02c2"+ - "\u0001\u0000\u0000\u0000\u02c2\u02dc\u0001\u0000\u0000\u0000\u02c3\u02c5"+ - "\u0003A\u0019\u0000\u02c4\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001"+ - "\u0000\u0000\u0000\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001"+ - "\u0000\u0000\u0000\u02c7\u02cf\u0001\u0000\u0000\u0000\u02c8\u02cc\u0003"+ - "i-\u0000\u02c9\u02cb\u0003A\u0019\u0000\u02ca\u02c9\u0001\u0000\u0000"+ - "\u0000\u02cb\u02ce\u0001\u0000\u0000\u0000\u02cc\u02ca\u0001\u0000\u0000"+ - "\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02d0\u0001\u0000\u0000"+ - "\u0000\u02ce\u02cc\u0001\u0000\u0000\u0000\u02cf\u02c8\u0001\u0000\u0000"+ - "\u0000\u02cf\u02d0\u0001\u0000\u0000\u0000\u02d0\u02d1\u0001\u0000\u0000"+ - "\u0000\u02d1\u02d2\u0003I\u001d\u0000\u02d2\u02dc\u0001\u0000\u0000\u0000"+ - "\u02d3\u02d5\u0003i-\u0000\u02d4\u02d6\u0003A\u0019\u0000\u02d5\u02d4"+ - "\u0001\u0000\u0000\u0000\u02d6\u02d7\u0001\u0000\u0000\u0000\u02d7\u02d5"+ - "\u0001\u0000\u0000\u0000\u02d7\u02d8\u0001\u0000\u0000\u0000\u02d8\u02d9"+ - "\u0001\u0000\u0000\u0000\u02d9\u02da\u0003I\u001d\u0000\u02da\u02dc\u0001"+ - "\u0000\u0000\u0000\u02db\u02b2\u0001\u0000\u0000\u0000\u02db\u02bd\u0001"+ - "\u0000\u0000\u0000\u02db\u02c4\u0001\u0000\u0000\u0000\u02db\u02d3\u0001"+ - "\u0000\u0000\u0000\u02dcZ\u0001\u0000\u0000\u0000\u02dd\u02de\u0007\u001e"+ - "\u0000\u0000\u02de\u02df\u0007\u001f\u0000\u0000\u02df\\\u0001\u0000\u0000"+ - "\u0000\u02e0\u02e1\u0007\f\u0000\u0000\u02e1\u02e2\u0007\t\u0000\u0000"+ - "\u02e2\u02e3\u0007\u0000\u0000\u0000\u02e3^\u0001\u0000\u0000\u0000\u02e4"+ - "\u02e5\u0007\f\u0000\u0000\u02e5\u02e6\u0007\u0002\u0000\u0000\u02e6\u02e7"+ - "\u0007\u0004\u0000\u0000\u02e7`\u0001\u0000\u0000\u0000\u02e8\u02e9\u0005"+ - "=\u0000\u0000\u02e9b\u0001\u0000\u0000\u0000\u02ea\u02eb\u0005:\u0000"+ - "\u0000\u02eb\u02ec\u0005:\u0000\u0000\u02ecd\u0001\u0000\u0000\u0000\u02ed"+ - "\u02ee\u0005,\u0000\u0000\u02eef\u0001\u0000\u0000\u0000\u02ef\u02f0\u0007"+ - "\u0000\u0000\u0000\u02f0\u02f1\u0007\u0003\u0000\u0000\u02f1\u02f2\u0007"+ - "\u0002\u0000\u0000\u02f2\u02f3\u0007\u0004\u0000\u0000\u02f3h\u0001\u0000"+ - "\u0000\u0000\u02f4\u02f5\u0005.\u0000\u0000\u02f5j\u0001\u0000\u0000\u0000"+ - "\u02f6\u02f7\u0007\u000f\u0000\u0000\u02f7\u02f8\u0007\f\u0000\u0000\u02f8"+ - "\u02f9\u0007\r\u0000\u0000\u02f9\u02fa\u0007\u0002\u0000\u0000\u02fa\u02fb"+ - "\u0007\u0003\u0000\u0000\u02fbl\u0001\u0000\u0000\u0000\u02fc\u02fd\u0007"+ - "\u000f\u0000\u0000\u02fd\u02fe\u0007\u0001\u0000\u0000\u02fe\u02ff\u0007"+ - "\u0006\u0000\u0000\u02ff\u0300\u0007\u0002\u0000\u0000\u0300\u0301\u0007"+ - "\u0005\u0000\u0000\u0301n\u0001\u0000\u0000\u0000\u0302\u0303\u0007\u0001"+ - "\u0000\u0000\u0303\u0304\u0007\t\u0000\u0000\u0304p\u0001\u0000\u0000"+ - "\u0000\u0305\u0306\u0007\u0001\u0000\u0000\u0306\u0307\u0007\u0002\u0000"+ - "\u0000\u0307r\u0001\u0000\u0000\u0000\u0308\u0309\u0007\r\u0000\u0000"+ - "\u0309\u030a\u0007\f\u0000\u0000\u030a\u030b\u0007\u0002\u0000\u0000\u030b"+ - "\u030c\u0007\u0005\u0000\u0000\u030ct\u0001\u0000\u0000\u0000\u030d\u030e"+ - "\u0007\r\u0000\u0000\u030e\u030f\u0007\u0001\u0000\u0000\u030f\u0310\u0007"+ - "\u0012\u0000\u0000\u0310\u0311\u0007\u0003\u0000\u0000\u0311v\u0001\u0000"+ - "\u0000\u0000\u0312\u0313\u0005(\u0000\u0000\u0313x\u0001\u0000\u0000\u0000"+ - "\u0314\u0315\u0007\t\u0000\u0000\u0315\u0316\u0007\u0007\u0000\u0000\u0316"+ - "\u0317\u0007\u0005\u0000\u0000\u0317z\u0001\u0000\u0000\u0000\u0318\u0319"+ - "\u0007\t\u0000\u0000\u0319\u031a\u0007\u0014\u0000\u0000\u031a\u031b\u0007"+ - "\r\u0000\u0000\u031b\u031c\u0007\r\u0000\u0000\u031c|\u0001\u0000\u0000"+ - "\u0000\u031d\u031e\u0007\t\u0000\u0000\u031e\u031f\u0007\u0014\u0000\u0000"+ - "\u031f\u0320\u0007\r\u0000\u0000\u0320\u0321\u0007\r\u0000\u0000\u0321"+ - "\u0322\u0007\u0002\u0000\u0000\u0322~\u0001\u0000\u0000\u0000\u0323\u0324"+ - "\u0007\u0007\u0000\u0000\u0324\u0325\u0007\u0006\u0000\u0000\u0325\u0080"+ - "\u0001\u0000\u0000\u0000\u0326\u0327\u0005?\u0000\u0000\u0327\u0082\u0001"+ - "\u0000\u0000\u0000\u0328\u0329\u0007\u0006\u0000\u0000\u0329\u032a\u0007"+ - "\r\u0000\u0000\u032a\u032b\u0007\u0001\u0000\u0000\u032b\u032c\u0007\u0012"+ - "\u0000\u0000\u032c\u032d\u0007\u0003\u0000\u0000\u032d\u0084\u0001\u0000"+ - "\u0000\u0000\u032e\u032f\u0005)\u0000\u0000\u032f\u0086\u0001\u0000\u0000"+ - "\u0000\u0330\u0331\u0007\u0005\u0000\u0000\u0331\u0332\u0007\u0006\u0000"+ - "\u0000\u0332\u0333\u0007\u0014\u0000\u0000\u0333\u0334\u0007\u0003\u0000"+ - "\u0000\u0334\u0088\u0001\u0000\u0000\u0000\u0335\u0336\u0005=\u0000\u0000"+ - "\u0336\u0337\u0005=\u0000\u0000\u0337\u008a\u0001\u0000\u0000\u0000\u0338"+ - "\u0339\u0005=\u0000\u0000\u0339\u033a\u0005~\u0000\u0000\u033a\u008c\u0001"+ - "\u0000\u0000\u0000\u033b\u033c\u0005!\u0000\u0000\u033c\u033d\u0005=\u0000"+ - "\u0000\u033d\u008e\u0001\u0000\u0000\u0000\u033e\u033f\u0005<\u0000\u0000"+ - "\u033f\u0090\u0001\u0000\u0000\u0000\u0340\u0341\u0005<\u0000\u0000\u0341"+ - "\u0342\u0005=\u0000\u0000\u0342\u0092\u0001\u0000\u0000\u0000\u0343\u0344"+ - "\u0005>\u0000\u0000\u0344\u0094\u0001\u0000\u0000\u0000\u0345\u0346\u0005"+ - ">\u0000\u0000\u0346\u0347\u0005=\u0000\u0000\u0347\u0096\u0001\u0000\u0000"+ - "\u0000\u0348\u0349\u0005+\u0000\u0000\u0349\u0098\u0001\u0000\u0000\u0000"+ - "\u034a\u034b\u0005-\u0000\u0000\u034b\u009a\u0001\u0000\u0000\u0000\u034c"+ - "\u034d\u0005*\u0000\u0000\u034d\u009c\u0001\u0000\u0000\u0000\u034e\u034f"+ - "\u0005/\u0000\u0000\u034f\u009e\u0001\u0000\u0000\u0000\u0350\u0351\u0005"+ - "%\u0000\u0000\u0351\u00a0\u0001\u0000\u0000\u0000\u0352\u0353\u0004I\u0004"+ - "\u0000\u0353\u0354\u00033\u0012\u0000\u0354\u0355\u0001\u0000\u0000\u0000"+ - "\u0355\u0356\u0006I\f\u0000\u0356\u00a2\u0001\u0000\u0000\u0000\u0357"+ - "\u035a\u0003\u00819\u0000\u0358\u035b\u0003C\u001a\u0000\u0359\u035b\u0003"+ - "Q!\u0000\u035a\u0358\u0001\u0000\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ - "\u0000\u035b\u035f\u0001\u0000\u0000\u0000\u035c\u035e\u0003S\"\u0000"+ - "\u035d\u035c\u0001\u0000\u0000\u0000\u035e\u0361\u0001\u0000\u0000\u0000"+ - "\u035f\u035d\u0001\u0000\u0000\u0000\u035f\u0360\u0001\u0000\u0000\u0000"+ - "\u0360\u0369\u0001\u0000\u0000\u0000\u0361\u035f\u0001\u0000\u0000\u0000"+ - "\u0362\u0364\u0003\u00819\u0000\u0363\u0365\u0003A\u0019\u0000\u0364\u0363"+ - "\u0001\u0000\u0000\u0000\u0365\u0366\u0001\u0000\u0000\u0000\u0366\u0364"+ - "\u0001\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0369"+ - "\u0001\u0000\u0000\u0000\u0368\u0357\u0001\u0000\u0000\u0000\u0368\u0362"+ - "\u0001\u0000\u0000\u0000\u0369\u00a4\u0001\u0000\u0000\u0000\u036a\u036b"+ - "\u0005[\u0000\u0000\u036b\u036c\u0001\u0000\u0000\u0000\u036c\u036d\u0006"+ - "K\u0000\u0000\u036d\u036e\u0006K\u0000\u0000\u036e\u00a6\u0001\u0000\u0000"+ - "\u0000\u036f\u0370\u0005]\u0000\u0000\u0370\u0371\u0001\u0000\u0000\u0000"+ - "\u0371\u0372\u0006L\u000b\u0000\u0372\u0373\u0006L\u000b\u0000\u0373\u00a8"+ - "\u0001\u0000\u0000\u0000\u0374\u0378\u0003C\u001a\u0000\u0375\u0377\u0003"+ - "S\"\u0000\u0376\u0375\u0001\u0000\u0000\u0000\u0377\u037a\u0001\u0000"+ - "\u0000\u0000\u0378\u0376\u0001\u0000\u0000\u0000\u0378\u0379\u0001\u0000"+ - "\u0000\u0000\u0379\u0385\u0001\u0000\u0000\u0000\u037a\u0378\u0001\u0000"+ - "\u0000\u0000\u037b\u037e\u0003Q!\u0000\u037c\u037e\u0003K\u001e\u0000"+ - "\u037d\u037b\u0001\u0000\u0000\u0000\u037d\u037c\u0001\u0000\u0000\u0000"+ - "\u037e\u0380\u0001\u0000\u0000\u0000\u037f\u0381\u0003S\"\u0000\u0380"+ - "\u037f\u0001\u0000\u0000\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382"+ - "\u0380\u0001\u0000\u0000\u0000\u0382\u0383\u0001\u0000\u0000\u0000\u0383"+ - "\u0385\u0001\u0000\u0000\u0000\u0384\u0374\u0001\u0000\u0000\u0000\u0384"+ - "\u037d\u0001\u0000\u0000\u0000\u0385\u00aa\u0001\u0000\u0000\u0000\u0386"+ - "\u0388\u0003M\u001f\u0000\u0387\u0389\u0003O \u0000\u0388\u0387\u0001"+ - "\u0000\u0000\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u0388\u0001"+ - "\u0000\u0000\u0000\u038a\u038b\u0001\u0000\u0000\u0000\u038b\u038c\u0001"+ - "\u0000\u0000\u0000\u038c\u038d\u0003M\u001f\u0000\u038d\u00ac\u0001\u0000"+ - "\u0000\u0000\u038e\u038f\u0003\u00abN\u0000\u038f\u00ae\u0001\u0000\u0000"+ - "\u0000\u0390\u0391\u00039\u0015\u0000\u0391\u0392\u0001\u0000\u0000\u0000"+ - "\u0392\u0393\u0006P\n\u0000\u0393\u00b0\u0001\u0000\u0000\u0000\u0394"+ - "\u0395\u0003;\u0016\u0000\u0395\u0396\u0001\u0000\u0000\u0000\u0396\u0397"+ - "\u0006Q\n\u0000\u0397\u00b2\u0001\u0000\u0000\u0000\u0398\u0399\u0003"+ - "=\u0017\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u039b\u0006R\n"+ - "\u0000\u039b\u00b4\u0001\u0000\u0000\u0000\u039c\u039d\u0003\u00a5K\u0000"+ - "\u039d\u039e\u0001\u0000\u0000\u0000\u039e\u039f\u0006S\r\u0000\u039f"+ - "\u03a0\u0006S\u000e\u0000\u03a0\u00b6\u0001\u0000\u0000\u0000\u03a1\u03a2"+ - "\u0003?\u0018\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0006"+ - "T\u000f\u0000\u03a4\u03a5\u0006T\u000b\u0000\u03a5\u00b8\u0001\u0000\u0000"+ - "\u0000\u03a6\u03a7\u0003=\u0017\u0000\u03a7\u03a8\u0001\u0000\u0000\u0000"+ - "\u03a8\u03a9\u0006U\n\u0000\u03a9\u00ba\u0001\u0000\u0000\u0000\u03aa"+ - "\u03ab\u00039\u0015\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad"+ - "\u0006V\n\u0000\u03ad\u00bc\u0001\u0000\u0000\u0000\u03ae\u03af\u0003"+ - ";\u0016\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0006W\n"+ - "\u0000\u03b1\u00be\u0001\u0000\u0000\u0000\u03b2\u03b3\u0003?\u0018\u0000"+ - "\u03b3\u03b4\u0001\u0000\u0000\u0000\u03b4\u03b5\u0006X\u000f\u0000\u03b5"+ - "\u03b6\u0006X\u000b\u0000\u03b6\u00c0\u0001\u0000\u0000\u0000\u03b7\u03b8"+ - "\u0003\u00a5K\u0000\u03b8\u03b9\u0001\u0000\u0000\u0000\u03b9\u03ba\u0006"+ - "Y\r\u0000\u03ba\u00c2\u0001\u0000\u0000\u0000\u03bb\u03bc\u0003\u00a7"+ - "L\u0000\u03bc\u03bd\u0001\u0000\u0000\u0000\u03bd\u03be\u0006Z\u0010\u0000"+ - "\u03be\u00c4\u0001\u0000\u0000\u0000\u03bf\u03c0\u0003\u0141\u0099\u0000"+ - "\u03c0\u03c1\u0001\u0000\u0000\u0000\u03c1\u03c2\u0006[\u0011\u0000\u03c2"+ - "\u00c6\u0001\u0000\u0000\u0000\u03c3\u03c4\u0003e+\u0000\u03c4\u03c5\u0001"+ - "\u0000\u0000\u0000\u03c5\u03c6\u0006\\\u0012\u0000\u03c6\u00c8\u0001\u0000"+ - "\u0000\u0000\u03c7\u03c8\u0003a)\u0000\u03c8\u03c9\u0001\u0000\u0000\u0000"+ - "\u03c9\u03ca\u0006]\u0013\u0000\u03ca\u00ca\u0001\u0000\u0000\u0000\u03cb"+ - "\u03cc\u0007\u0010\u0000\u0000\u03cc\u03cd\u0007\u0003\u0000\u0000\u03cd"+ - "\u03ce\u0007\u0005\u0000\u0000\u03ce\u03cf\u0007\f\u0000\u0000\u03cf\u03d0"+ - "\u0007\u0000\u0000\u0000\u03d0\u03d1\u0007\f\u0000\u0000\u03d1\u03d2\u0007"+ - "\u0005\u0000\u0000\u03d2\u03d3\u0007\f\u0000\u0000\u03d3\u00cc\u0001\u0000"+ - "\u0000\u0000\u03d4\u03d8\b \u0000\u0000\u03d5\u03d6\u0005/\u0000\u0000"+ - "\u03d6\u03d8\b!\u0000\u0000\u03d7\u03d4\u0001\u0000\u0000\u0000\u03d7"+ - "\u03d5\u0001\u0000\u0000\u0000\u03d8\u00ce\u0001\u0000\u0000\u0000\u03d9"+ - "\u03db\u0003\u00cd_\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03dc"+ - "\u0001\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd"+ - "\u0001\u0000\u0000\u0000\u03dd\u00d0\u0001\u0000\u0000\u0000\u03de\u03df"+ - "\u0003\u00cf`\u0000\u03df\u03e0\u0001\u0000\u0000\u0000\u03e0\u03e1\u0006"+ - "a\u0014\u0000\u03e1\u00d2\u0001\u0000\u0000\u0000\u03e2\u03e3\u0003U#"+ - "\u0000\u03e3\u03e4\u0001\u0000\u0000\u0000\u03e4\u03e5\u0006b\u0015\u0000"+ - "\u03e5\u00d4\u0001\u0000\u0000\u0000\u03e6\u03e7\u00039\u0015\u0000\u03e7"+ - "\u03e8\u0001\u0000\u0000\u0000\u03e8\u03e9\u0006c\n\u0000\u03e9\u00d6"+ - "\u0001\u0000\u0000\u0000\u03ea\u03eb\u0003;\u0016\u0000\u03eb\u03ec\u0001"+ - "\u0000\u0000\u0000\u03ec\u03ed\u0006d\n\u0000\u03ed\u00d8\u0001\u0000"+ - "\u0000\u0000\u03ee\u03ef\u0003=\u0017\u0000\u03ef\u03f0\u0001\u0000\u0000"+ - "\u0000\u03f0\u03f1\u0006e\n\u0000\u03f1\u00da\u0001\u0000\u0000\u0000"+ - "\u03f2\u03f3\u0003?\u0018\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4"+ - "\u03f5\u0006f\u000f\u0000\u03f5\u03f6\u0006f\u000b\u0000\u03f6\u00dc\u0001"+ - "\u0000\u0000\u0000\u03f7\u03f8\u0003i-\u0000\u03f8\u03f9\u0001\u0000\u0000"+ - "\u0000\u03f9\u03fa\u0006g\u0016\u0000\u03fa\u00de\u0001\u0000\u0000\u0000"+ - "\u03fb\u03fc\u0003e+\u0000\u03fc\u03fd\u0001\u0000\u0000\u0000\u03fd\u03fe"+ - "\u0006h\u0012\u0000\u03fe\u00e0\u0001\u0000\u0000\u0000\u03ff\u0404\u0003"+ - "C\u001a\u0000\u0400\u0404\u0003A\u0019\u0000\u0401\u0404\u0003Q!\u0000"+ - "\u0402\u0404\u0003\u009bF\u0000\u0403\u03ff\u0001\u0000\u0000\u0000\u0403"+ - "\u0400\u0001\u0000\u0000\u0000\u0403\u0401\u0001\u0000\u0000\u0000\u0403"+ - "\u0402\u0001\u0000\u0000\u0000\u0404\u00e2\u0001\u0000\u0000\u0000\u0405"+ - "\u0408\u0003C\u001a\u0000\u0406\u0408\u0003\u009bF\u0000\u0407\u0405\u0001"+ - "\u0000\u0000\u0000\u0407\u0406\u0001\u0000\u0000\u0000\u0408\u040c\u0001"+ - "\u0000\u0000\u0000\u0409\u040b\u0003\u00e1i\u0000\u040a\u0409\u0001\u0000"+ - "\u0000\u0000\u040b\u040e\u0001\u0000\u0000\u0000\u040c\u040a\u0001\u0000"+ - "\u0000\u0000\u040c\u040d\u0001\u0000\u0000\u0000\u040d\u0419\u0001\u0000"+ - "\u0000\u0000\u040e\u040c\u0001\u0000\u0000\u0000\u040f\u0412\u0003Q!\u0000"+ - "\u0410\u0412\u0003K\u001e\u0000\u0411\u040f\u0001\u0000\u0000\u0000\u0411"+ - "\u0410\u0001\u0000\u0000\u0000\u0412\u0414\u0001\u0000\u0000\u0000\u0413"+ - "\u0415\u0003\u00e1i\u0000\u0414\u0413\u0001\u0000\u0000\u0000\u0415\u0416"+ - "\u0001\u0000\u0000\u0000\u0416\u0414\u0001\u0000\u0000\u0000\u0416\u0417"+ - "\u0001\u0000\u0000\u0000\u0417\u0419\u0001\u0000\u0000\u0000\u0418\u0407"+ - "\u0001\u0000\u0000\u0000\u0418\u0411\u0001\u0000\u0000\u0000\u0419\u00e4"+ - "\u0001\u0000\u0000\u0000\u041a\u041d\u0003\u00e3j\u0000\u041b\u041d\u0003"+ - "\u00abN\u0000\u041c\u041a\u0001\u0000\u0000\u0000\u041c\u041b\u0001\u0000"+ - "\u0000\u0000\u041d\u041e\u0001\u0000\u0000\u0000\u041e\u041c\u0001\u0000"+ - "\u0000\u0000\u041e\u041f\u0001\u0000\u0000\u0000\u041f\u00e6\u0001\u0000"+ - "\u0000\u0000\u0420\u0421\u00039\u0015\u0000\u0421\u0422\u0001\u0000\u0000"+ - "\u0000\u0422\u0423\u0006l\n\u0000\u0423\u00e8\u0001\u0000\u0000\u0000"+ - "\u0424\u0425\u0003;\u0016\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426"+ - "\u0427\u0006m\n\u0000\u0427\u00ea\u0001\u0000\u0000\u0000\u0428\u0429"+ - "\u0003=\u0017\u0000\u0429\u042a\u0001\u0000\u0000\u0000\u042a\u042b\u0006"+ - "n\n\u0000\u042b\u00ec\u0001\u0000\u0000\u0000\u042c\u042d\u0003?\u0018"+ - "\u0000\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u042f\u0006o\u000f\u0000"+ - "\u042f\u0430\u0006o\u000b\u0000\u0430\u00ee\u0001\u0000\u0000\u0000\u0431"+ - "\u0432\u0003a)\u0000\u0432\u0433\u0001\u0000\u0000\u0000\u0433\u0434\u0006"+ - "p\u0013\u0000\u0434\u00f0\u0001\u0000\u0000\u0000\u0435\u0436\u0003e+"+ - "\u0000\u0436\u0437\u0001\u0000\u0000\u0000\u0437\u0438\u0006q\u0012\u0000"+ - "\u0438\u00f2\u0001\u0000\u0000\u0000\u0439\u043a\u0003i-\u0000\u043a\u043b"+ - "\u0001\u0000\u0000\u0000\u043b\u043c\u0006r\u0016\u0000\u043c\u00f4\u0001"+ - "\u0000\u0000\u0000\u043d\u043e\u0007\f\u0000\u0000\u043e\u043f\u0007\u0002"+ - "\u0000\u0000\u043f\u00f6\u0001\u0000\u0000\u0000\u0440\u0441\u0003\u00e5"+ - "k\u0000\u0441\u0442\u0001\u0000\u0000\u0000\u0442\u0443\u0006t\u0017\u0000"+ - "\u0443\u00f8\u0001\u0000\u0000\u0000\u0444\u0445\u00039\u0015\u0000\u0445"+ - "\u0446\u0001\u0000\u0000\u0000\u0446\u0447\u0006u\n\u0000\u0447\u00fa"+ - "\u0001\u0000\u0000\u0000\u0448\u0449\u0003;\u0016\u0000\u0449\u044a\u0001"+ - "\u0000\u0000\u0000\u044a\u044b\u0006v\n\u0000\u044b\u00fc\u0001\u0000"+ - "\u0000\u0000\u044c\u044d\u0003=\u0017\u0000\u044d\u044e\u0001\u0000\u0000"+ - "\u0000\u044e\u044f\u0006w\n\u0000\u044f\u00fe\u0001\u0000\u0000\u0000"+ - "\u0450\u0451\u0003?\u0018\u0000\u0451\u0452\u0001\u0000\u0000\u0000\u0452"+ - "\u0453\u0006x\u000f\u0000\u0453\u0454\u0006x\u000b\u0000\u0454\u0100\u0001"+ - "\u0000\u0000\u0000\u0455\u0456\u0003\u00a5K\u0000\u0456\u0457\u0001\u0000"+ - "\u0000\u0000\u0457\u0458\u0006y\r\u0000\u0458\u0459\u0006y\u0018\u0000"+ - "\u0459\u0102\u0001\u0000\u0000\u0000\u045a\u045b\u0007\u0007\u0000\u0000"+ - "\u045b\u045c\u0007\t\u0000\u0000\u045c\u045d\u0001\u0000\u0000\u0000\u045d"+ - "\u045e\u0006z\u0019\u0000\u045e\u0104\u0001\u0000\u0000\u0000\u045f\u0460"+ - "\u0007\u0013\u0000\u0000\u0460\u0461\u0007\u0001\u0000\u0000\u0461\u0462"+ - "\u0007\u0005\u0000\u0000\u0462\u0463\u0007\n\u0000\u0000\u0463\u0464\u0001"+ - "\u0000\u0000\u0000\u0464\u0465\u0006{\u0019\u0000\u0465\u0106\u0001\u0000"+ - "\u0000\u0000\u0466\u0467\b\"\u0000\u0000\u0467\u0108\u0001\u0000\u0000"+ - "\u0000\u0468\u046a\u0003\u0107|\u0000\u0469\u0468\u0001\u0000\u0000\u0000"+ - "\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u0469\u0001\u0000\u0000\u0000"+ - "\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u046d\u0001\u0000\u0000\u0000"+ - "\u046d\u046e\u0003\u0141\u0099\u0000\u046e\u0470\u0001\u0000\u0000\u0000"+ - "\u046f\u0469\u0001\u0000\u0000\u0000\u046f\u0470\u0001\u0000\u0000\u0000"+ - "\u0470\u0472\u0001\u0000\u0000\u0000\u0471\u0473\u0003\u0107|\u0000\u0472"+ - "\u0471\u0001\u0000\u0000\u0000\u0473\u0474\u0001\u0000\u0000\u0000\u0474"+ - "\u0472\u0001\u0000\u0000\u0000\u0474\u0475\u0001\u0000\u0000\u0000\u0475"+ - "\u010a\u0001\u0000\u0000\u0000\u0476\u0477\u0003\u0109}\u0000\u0477\u0478"+ - "\u0001\u0000\u0000\u0000\u0478\u0479\u0006~\u001a\u0000\u0479\u010c\u0001"+ - "\u0000\u0000\u0000\u047a\u047b\u00039\u0015\u0000\u047b\u047c\u0001\u0000"+ - "\u0000\u0000\u047c\u047d\u0006\u007f\n\u0000\u047d\u010e\u0001\u0000\u0000"+ - "\u0000\u047e\u047f\u0003;\u0016\u0000\u047f\u0480\u0001\u0000\u0000\u0000"+ - "\u0480\u0481\u0006\u0080\n\u0000\u0481\u0110\u0001\u0000\u0000\u0000\u0482"+ - "\u0483\u0003=\u0017\u0000\u0483\u0484\u0001\u0000\u0000\u0000\u0484\u0485"+ - "\u0006\u0081\n\u0000\u0485\u0112\u0001\u0000\u0000\u0000\u0486\u0487\u0003"+ - "?\u0018\u0000\u0487\u0488\u0001\u0000\u0000\u0000\u0488\u0489\u0006\u0082"+ - "\u000f\u0000\u0489\u048a\u0006\u0082\u000b\u0000\u048a\u048b\u0006\u0082"+ - "\u000b\u0000\u048b\u0114\u0001\u0000\u0000\u0000\u048c\u048d\u0003a)\u0000"+ - "\u048d\u048e\u0001\u0000\u0000\u0000\u048e\u048f\u0006\u0083\u0013\u0000"+ - "\u048f\u0116\u0001\u0000\u0000\u0000\u0490\u0491\u0003e+\u0000\u0491\u0492"+ - "\u0001\u0000\u0000\u0000\u0492\u0493\u0006\u0084\u0012\u0000\u0493\u0118"+ - "\u0001\u0000\u0000\u0000\u0494\u0495\u0003i-\u0000\u0495\u0496\u0001\u0000"+ - "\u0000\u0000\u0496\u0497\u0006\u0085\u0016\u0000\u0497\u011a\u0001\u0000"+ - "\u0000\u0000\u0498\u0499\u0003\u0105{\u0000\u0499\u049a\u0001\u0000\u0000"+ - "\u0000\u049a\u049b\u0006\u0086\u001b\u0000\u049b\u011c\u0001\u0000\u0000"+ - "\u0000\u049c\u049d\u0003\u00e5k\u0000\u049d\u049e\u0001\u0000\u0000\u0000"+ - "\u049e\u049f\u0006\u0087\u0017\u0000\u049f\u011e\u0001\u0000\u0000\u0000"+ - "\u04a0\u04a1\u0003\u00adO\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000\u04a2"+ - "\u04a3\u0006\u0088\u001c\u0000\u04a3\u0120\u0001\u0000\u0000\u0000\u04a4"+ - "\u04a5\u00039\u0015\u0000\u04a5\u04a6\u0001\u0000\u0000\u0000\u04a6\u04a7"+ - "\u0006\u0089\n\u0000\u04a7\u0122\u0001\u0000\u0000\u0000\u04a8\u04a9\u0003"+ - ";\u0016\u0000\u04a9\u04aa\u0001\u0000\u0000\u0000\u04aa\u04ab\u0006\u008a"+ - "\n\u0000\u04ab\u0124\u0001\u0000\u0000\u0000\u04ac\u04ad\u0003=\u0017"+ - "\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04af\u0006\u008b\n\u0000"+ - "\u04af\u0126\u0001\u0000\u0000\u0000\u04b0\u04b1\u0003?\u0018\u0000\u04b1"+ - "\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0006\u008c\u000f\u0000\u04b3"+ - "\u04b4\u0006\u008c\u000b\u0000\u04b4\u0128\u0001\u0000\u0000\u0000\u04b5"+ - "\u04b6\u0003i-\u0000\u04b6\u04b7\u0001\u0000\u0000\u0000\u04b7\u04b8\u0006"+ - "\u008d\u0016\u0000\u04b8\u012a\u0001\u0000\u0000\u0000\u04b9\u04ba\u0003"+ - "\u00adO\u0000\u04ba\u04bb\u0001\u0000\u0000\u0000\u04bb\u04bc\u0006\u008e"+ - "\u001c\u0000\u04bc\u012c\u0001\u0000\u0000\u0000\u04bd\u04be\u0003\u00a9"+ - "M\u0000\u04be\u04bf\u0001\u0000\u0000\u0000\u04bf\u04c0\u0006\u008f\u001d"+ - "\u0000\u04c0\u012e\u0001\u0000\u0000\u0000\u04c1\u04c2\u00039\u0015\u0000"+ - "\u04c2\u04c3\u0001\u0000\u0000\u0000\u04c3\u04c4\u0006\u0090\n\u0000\u04c4"+ - "\u0130\u0001\u0000\u0000\u0000\u04c5\u04c6\u0003;\u0016\u0000\u04c6\u04c7"+ - "\u0001\u0000\u0000\u0000\u04c7\u04c8\u0006\u0091\n\u0000\u04c8\u0132\u0001"+ - "\u0000\u0000\u0000\u04c9\u04ca\u0003=\u0017\u0000\u04ca\u04cb\u0001\u0000"+ - "\u0000\u0000\u04cb\u04cc\u0006\u0092\n\u0000\u04cc\u0134\u0001\u0000\u0000"+ - "\u0000\u04cd\u04ce\u0003?\u0018\u0000\u04ce\u04cf\u0001\u0000\u0000\u0000"+ - "\u04cf\u04d0\u0006\u0093\u000f\u0000\u04d0\u04d1\u0006\u0093\u000b\u0000"+ - "\u04d1\u0136\u0001\u0000\u0000\u0000\u04d2\u04d3\u0007\u0001\u0000\u0000"+ - "\u04d3\u04d4\u0007\t\u0000\u0000\u04d4\u04d5\u0007\u000f\u0000\u0000\u04d5"+ - "\u04d6\u0007\u0007\u0000\u0000\u04d6\u0138\u0001\u0000\u0000\u0000\u04d7"+ - "\u04d8\u00039\u0015\u0000\u04d8\u04d9\u0001\u0000\u0000\u0000\u04d9\u04da"+ - "\u0006\u0095\n\u0000\u04da\u013a\u0001\u0000\u0000\u0000\u04db\u04dc\u0003"+ - ";\u0016\u0000\u04dc\u04dd\u0001\u0000\u0000\u0000\u04dd\u04de\u0006\u0096"+ - "\n\u0000\u04de\u013c\u0001\u0000\u0000\u0000\u04df\u04e0\u0003=\u0017"+ - "\u0000\u04e0\u04e1\u0001\u0000\u0000\u0000\u04e1\u04e2\u0006\u0097\n\u0000"+ - "\u04e2\u013e\u0001\u0000\u0000\u0000\u04e3\u04e4\u0003\u00a7L\u0000\u04e4"+ - "\u04e5\u0001\u0000\u0000\u0000\u04e5\u04e6\u0006\u0098\u0010\u0000\u04e6"+ - "\u04e7\u0006\u0098\u000b\u0000\u04e7\u0140\u0001\u0000\u0000\u0000\u04e8"+ - "\u04e9\u0005:\u0000\u0000\u04e9\u0142\u0001\u0000\u0000\u0000\u04ea\u04f0"+ - "\u0003K\u001e\u0000\u04eb\u04f0\u0003A\u0019\u0000\u04ec\u04f0\u0003i"+ - "-\u0000\u04ed\u04f0\u0003C\u001a\u0000\u04ee\u04f0\u0003Q!\u0000\u04ef"+ - "\u04ea\u0001\u0000\u0000\u0000\u04ef\u04eb\u0001\u0000\u0000\u0000\u04ef"+ - "\u04ec\u0001\u0000\u0000\u0000\u04ef\u04ed\u0001\u0000\u0000\u0000\u04ef"+ - "\u04ee\u0001\u0000\u0000\u0000\u04f0\u04f1\u0001\u0000\u0000\u0000\u04f1"+ - "\u04ef\u0001\u0000\u0000\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2"+ - "\u0144\u0001\u0000\u0000\u0000\u04f3\u04f4\u00039\u0015\u0000\u04f4\u04f5"+ - "\u0001\u0000\u0000\u0000\u04f5\u04f6\u0006\u009b\n\u0000\u04f6\u0146\u0001"+ - "\u0000\u0000\u0000\u04f7\u04f8\u0003;\u0016\u0000\u04f8\u04f9\u0001\u0000"+ - "\u0000\u0000\u04f9\u04fa\u0006\u009c\n\u0000\u04fa\u0148\u0001\u0000\u0000"+ - "\u0000\u04fb\u04fc\u0003=\u0017\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000"+ - "\u04fd\u04fe\u0006\u009d\n\u0000\u04fe\u014a\u0001\u0000\u0000\u0000\u04ff"+ - "\u0500\u0003?\u0018\u0000\u0500\u0501\u0001\u0000\u0000\u0000\u0501\u0502"+ - "\u0006\u009e\u000f\u0000\u0502\u0503\u0006\u009e\u000b\u0000\u0503\u014c"+ - "\u0001\u0000\u0000\u0000\u0504\u0505\u0003\u0141\u0099\u0000\u0505\u0506"+ - "\u0001\u0000\u0000\u0000\u0506\u0507\u0006\u009f\u0011\u0000\u0507\u014e"+ - "\u0001\u0000\u0000\u0000\u0508\u0509\u0003e+\u0000\u0509\u050a\u0001\u0000"+ - "\u0000\u0000\u050a\u050b\u0006\u00a0\u0012\u0000\u050b\u0150\u0001\u0000"+ - "\u0000\u0000\u050c\u050d\u0003i-\u0000\u050d\u050e\u0001\u0000\u0000\u0000"+ - "\u050e\u050f\u0006\u00a1\u0016\u0000\u050f\u0152\u0001\u0000\u0000\u0000"+ - "\u0510\u0511\u0003\u0103z\u0000\u0511\u0512\u0001\u0000\u0000\u0000\u0512"+ - "\u0513\u0006\u00a2\u001e\u0000\u0513\u0514\u0006\u00a2\u001f\u0000\u0514"+ - "\u0154\u0001\u0000\u0000\u0000\u0515\u0516\u0003\u00cf`\u0000\u0516\u0517"+ - "\u0001\u0000\u0000\u0000\u0517\u0518\u0006\u00a3\u0014\u0000\u0518\u0156"+ - "\u0001\u0000\u0000\u0000\u0519\u051a\u0003U#\u0000\u051a\u051b\u0001\u0000"+ - "\u0000\u0000\u051b\u051c\u0006\u00a4\u0015\u0000\u051c\u0158\u0001\u0000"+ - "\u0000\u0000\u051d\u051e\u00039\u0015\u0000\u051e\u051f\u0001\u0000\u0000"+ - "\u0000\u051f\u0520\u0006\u00a5\n\u0000\u0520\u015a\u0001\u0000\u0000\u0000"+ - "\u0521\u0522\u0003;\u0016\u0000\u0522\u0523\u0001\u0000\u0000\u0000\u0523"+ - "\u0524\u0006\u00a6\n\u0000\u0524\u015c\u0001\u0000\u0000\u0000\u0525\u0526"+ - "\u0003=\u0017\u0000\u0526\u0527\u0001\u0000\u0000\u0000\u0527\u0528\u0006"+ - "\u00a7\n\u0000\u0528\u015e\u0001\u0000\u0000\u0000\u0529\u052a\u0003?"+ - "\u0018\u0000\u052a\u052b\u0001\u0000\u0000\u0000\u052b\u052c\u0006\u00a8"+ - "\u000f\u0000\u052c\u052d\u0006\u00a8\u000b\u0000\u052d\u052e\u0006\u00a8"+ - "\u000b\u0000\u052e\u0160\u0001\u0000\u0000\u0000\u052f\u0530\u0003e+\u0000"+ - "\u0530\u0531\u0001\u0000\u0000\u0000\u0531\u0532\u0006\u00a9\u0012\u0000"+ - "\u0532\u0162\u0001\u0000\u0000\u0000\u0533\u0534\u0003i-\u0000\u0534\u0535"+ - "\u0001\u0000\u0000\u0000\u0535\u0536\u0006\u00aa\u0016\u0000\u0536\u0164"+ - "\u0001\u0000\u0000\u0000\u0537\u0538\u0003\u00e5k\u0000\u0538\u0539\u0001"+ - "\u0000\u0000\u0000\u0539\u053a\u0006\u00ab\u0017\u0000\u053a\u0166\u0001"+ - "\u0000\u0000\u0000\u053b\u053c\u00039\u0015\u0000\u053c\u053d\u0001\u0000"+ - "\u0000\u0000\u053d\u053e\u0006\u00ac\n\u0000\u053e\u0168\u0001\u0000\u0000"+ - "\u0000\u053f\u0540\u0003;\u0016\u0000\u0540\u0541\u0001\u0000\u0000\u0000"+ - "\u0541\u0542\u0006\u00ad\n\u0000\u0542\u016a\u0001\u0000\u0000\u0000\u0543"+ - "\u0544\u0003=\u0017\u0000\u0544\u0545\u0001\u0000\u0000\u0000\u0545\u0546"+ - "\u0006\u00ae\n\u0000\u0546\u016c\u0001\u0000\u0000\u0000\u0547\u0548\u0003"+ - "?\u0018\u0000\u0548\u0549\u0001\u0000\u0000\u0000\u0549\u054a\u0006\u00af"+ - "\u000f\u0000\u054a\u054b\u0006\u00af\u000b\u0000\u054b\u016e\u0001\u0000"+ - "\u0000\u0000\u054c\u054d\u0003\u00cf`\u0000\u054d\u054e\u0001\u0000\u0000"+ - "\u0000\u054e\u054f\u0006\u00b0\u0014\u0000\u054f\u0550\u0006\u00b0\u000b"+ - "\u0000\u0550\u0551\u0006\u00b0 \u0000\u0551\u0170\u0001\u0000\u0000\u0000"+ - "\u0552\u0553\u0003U#\u0000\u0553\u0554\u0001\u0000\u0000\u0000\u0554\u0555"+ - "\u0006\u00b1\u0015\u0000\u0555\u0556\u0006\u00b1\u000b\u0000\u0556\u0557"+ - "\u0006\u00b1 \u0000\u0557\u0172\u0001\u0000\u0000\u0000\u0558\u0559\u0003"+ - "9\u0015\u0000\u0559\u055a\u0001\u0000\u0000\u0000\u055a\u055b\u0006\u00b2"+ - "\n\u0000\u055b\u0174\u0001\u0000\u0000\u0000\u055c\u055d\u0003;\u0016"+ - "\u0000\u055d\u055e\u0001\u0000\u0000\u0000\u055e\u055f\u0006\u00b3\n\u0000"+ - "\u055f\u0176\u0001\u0000\u0000\u0000\u0560\u0561\u0003=\u0017\u0000\u0561"+ - "\u0562\u0001\u0000\u0000\u0000\u0562\u0563\u0006\u00b4\n\u0000\u0563\u0178"+ - "\u0001\u0000\u0000\u0000\u0564\u0565\u0003\u0141\u0099\u0000\u0565\u0566"+ - "\u0001\u0000\u0000\u0000\u0566\u0567\u0006\u00b5\u0011\u0000\u0567\u0568"+ - "\u0006\u00b5\u000b\u0000\u0568\u0569\u0006\u00b5\t\u0000\u0569\u017a\u0001"+ - "\u0000\u0000\u0000\u056a\u056b\u0003e+\u0000\u056b\u056c\u0001\u0000\u0000"+ - "\u0000\u056c\u056d\u0006\u00b6\u0012\u0000\u056d\u056e\u0006\u00b6\u000b"+ - "\u0000\u056e\u056f\u0006\u00b6\t\u0000\u056f\u017c\u0001\u0000\u0000\u0000"+ - "\u0570\u0571\u00039\u0015\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572"+ - "\u0573\u0006\u00b7\n\u0000\u0573\u017e\u0001\u0000\u0000\u0000\u0574\u0575"+ - "\u0003;\u0016\u0000\u0575\u0576\u0001\u0000\u0000\u0000\u0576\u0577\u0006"+ - "\u00b8\n\u0000\u0577\u0180\u0001\u0000\u0000\u0000\u0578\u0579\u0003="+ - "\u0017\u0000\u0579\u057a\u0001\u0000\u0000\u0000\u057a\u057b\u0006\u00b9"+ - "\n\u0000\u057b\u0182\u0001\u0000\u0000\u0000\u057c\u057d\u0003\u00adO"+ - "\u0000\u057d\u057e\u0001\u0000\u0000\u0000\u057e\u057f\u0006\u00ba\u000b"+ - "\u0000\u057f\u0580\u0006\u00ba\u0000\u0000\u0580\u0581\u0006\u00ba\u001c"+ - "\u0000\u0581\u0184\u0001\u0000\u0000\u0000\u0582\u0583\u0003\u00a9M\u0000"+ - "\u0583\u0584\u0001\u0000\u0000\u0000\u0584\u0585\u0006\u00bb\u000b\u0000"+ - "\u0585\u0586\u0006\u00bb\u0000\u0000\u0586\u0587\u0006\u00bb\u001d\u0000"+ - "\u0587\u0186\u0001\u0000\u0000\u0000\u0588\u0589\u0003[&\u0000\u0589\u058a"+ - "\u0001\u0000\u0000\u0000\u058a\u058b\u0006\u00bc\u000b\u0000\u058b\u058c"+ - "\u0006\u00bc\u0000\u0000\u058c\u058d\u0006\u00bc!\u0000\u058d\u0188\u0001"+ - "\u0000\u0000\u0000\u058e\u058f\u0003?\u0018\u0000\u058f\u0590\u0001\u0000"+ - "\u0000\u0000\u0590\u0591\u0006\u00bd\u000f\u0000\u0591\u0592\u0006\u00bd"+ - "\u000b\u0000\u0592\u018a\u0001\u0000\u0000\u0000A\u0000\u0001\u0002\u0003"+ - "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u023c\u0246\u024a\u024d"+ - "\u0256\u0258\u0263\u0276\u027b\u0284\u028b\u0290\u0292\u029d\u02a5\u02a8"+ - "\u02aa\u02af\u02b4\u02ba\u02c1\u02c6\u02cc\u02cf\u02d7\u02db\u035a\u035f"+ - "\u0366\u0368\u0378\u037d\u0382\u0384\u038a\u03d7\u03dc\u0403\u0407\u040c"+ - "\u0411\u0416\u0418\u041c\u041e\u046b\u046f\u0474\u04ef\u04f1\"\u0005\u0001"+ - "\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0005\u0003"+ - "\u0000\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005\u000b\u0000"+ - "\u0005\r\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0007\u0013\u0000\u0007"+ - "A\u0000\u0005\u0000\u0000\u0007\u0019\u0000\u0007B\u0000\u0007h\u0000"+ - "\u0007\"\u0000\u0007 \u0000\u0007L\u0000\u0007\u001a\u0000\u0007$\u0000"+ - "\u0007P\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007Z\u0000\u0007Y\u0000"+ - "\u0007D\u0000\u0007C\u0000\u0007X\u0000\u0005\f\u0000\u0005\u000e\u0000"+ - "\u0007\u001d\u0000"; + "\u0001\u0013\u0004\u0013\u0230\b\u0013\u000b\u0013\f\u0013\u0231\u0001"+ + "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005"+ + "\u0014\u023a\b\u0014\n\u0014\f\u0014\u023d\t\u0014\u0001\u0014\u0003\u0014"+ + "\u0240\b\u0014\u0001\u0014\u0003\u0014\u0243\b\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005"+ + "\u0015\u024c\b\u0015\n\u0015\f\u0015\u024f\t\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0004\u0016\u0257\b\u0016"+ + "\u000b\u0016\f\u0016\u0258\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ + "\u0001\u001c\u0003\u001c\u026c\b\u001c\u0001\u001c\u0004\u001c\u026f\b"+ + "\u001c\u000b\u001c\f\u001c\u0270\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+ + "\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u027a\b\u001f\u0001"+ + " \u0001 \u0001!\u0001!\u0001!\u0003!\u0281\b!\u0001\"\u0001\"\u0001\""+ + "\u0005\"\u0286\b\"\n\"\f\"\u0289\t\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0005\"\u0291\b\"\n\"\f\"\u0294\t\"\u0001\"\u0001\"\u0001\""+ + "\u0001\"\u0001\"\u0003\"\u029b\b\"\u0001\"\u0003\"\u029e\b\"\u0003\"\u02a0"+ + "\b\"\u0001#\u0004#\u02a3\b#\u000b#\f#\u02a4\u0001$\u0004$\u02a8\b$\u000b"+ + "$\f$\u02a9\u0001$\u0001$\u0005$\u02ae\b$\n$\f$\u02b1\t$\u0001$\u0001$"+ + "\u0004$\u02b5\b$\u000b$\f$\u02b6\u0001$\u0004$\u02ba\b$\u000b$\f$\u02bb"+ + "\u0001$\u0001$\u0005$\u02c0\b$\n$\f$\u02c3\t$\u0003$\u02c5\b$\u0001$\u0001"+ + "$\u0001$\u0001$\u0004$\u02cb\b$\u000b$\f$\u02cc\u0001$\u0001$\u0003$\u02d1"+ + "\b$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00012\u0001"+ + "2\u00012\u00012\u00012\u00013\u00013\u00014\u00014\u00014\u00014\u0001"+ + "5\u00015\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ + "9\u00019\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001"+ + "<\u0001<\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ + "@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001"+ + "D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0003I\u0352\bI\u0001"+ + "I\u0005I\u0355\bI\nI\fI\u0358\tI\u0001I\u0001I\u0004I\u035c\bI\u000bI"+ + "\fI\u035d\u0003I\u0360\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005L\u036e\bL\nL\fL\u0371\tL\u0001"+ + "L\u0001L\u0003L\u0375\bL\u0001L\u0004L\u0378\bL\u000bL\fL\u0379\u0003"+ + "L\u037c\bL\u0001M\u0001M\u0004M\u0380\bM\u000bM\fM\u0381\u0001M\u0001"+ + "M\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ + "S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ + "U\u0001U\u0001U\u0001V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001"+ + "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ + "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ + "]\u0001^\u0001^\u0001^\u0003^\u03cf\b^\u0001_\u0004_\u03d2\b_\u000b_\f"+ + "_\u03d3\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+ + "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ + "f\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0003h\u03fb"+ + "\bh\u0001i\u0001i\u0003i\u03ff\bi\u0001i\u0005i\u0402\bi\ni\fi\u0405\t"+ + "i\u0001i\u0001i\u0003i\u0409\bi\u0001i\u0004i\u040c\bi\u000bi\fi\u040d"+ + "\u0003i\u0410\bi\u0001j\u0001j\u0004j\u0414\bj\u000bj\fj\u0415\u0001k"+ + "\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001"+ + "m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ + "o\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001"+ + "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001"+ + "u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001"+ + "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001"+ + "y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001"+ + "{\u0001{\u0001|\u0004|\u0461\b|\u000b|\f|\u0462\u0001|\u0001|\u0003|\u0467"+ + "\b|\u0001|\u0004|\u046a\b|\u000b|\f|\u046b\u0001}\u0001}\u0001}\u0001"+ + "}\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001"+ + "\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001"+ + "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001"+ + "\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ + "\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ + "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ + "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ + "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ + "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ + "\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001"+ + "\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ + "\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001"+ + "\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ + "\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001"+ + "\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ + "\u0099\u0001\u0099\u0004\u0099\u04e7\b\u0099\u000b\u0099\f\u0099\u04e8"+ + "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b"+ + "\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c"+ + "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ + "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f"+ + "\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1"+ + "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ + "\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ + "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba"+ + "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0002\u024d\u0292\u0000"+ + "\u00bd\u000f\u0001\u0011\u0002\u0013\u0003\u0015\u0004\u0017\u0005\u0019"+ + "\u0006\u001b\u0007\u001d\b\u001f\t!\n#\u000b%\f\'\r)\u000e+\u000f-\u0010"+ + "/\u00111\u00123\u00135\u00147\u00159\u0016;\u0017=\u0018?\u0000A\u0000"+ + "C\u0000E\u0000G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0019U\u001a"+ + "W\u001bY\u001c[\u001d]\u001e_\u001fa c!e\"g#i$k%m&o\'q(s)u*w+y,{-}.\u007f"+ + "/\u00810\u00831\u00852\u00873\u00894\u008b5\u008d6\u008f7\u00918\u0093"+ + "9\u0095:\u0097;\u0099<\u009b=\u009d>\u009f?\u00a1@\u00a3A\u00a5B\u00a7"+ + "C\u00a9\u0000\u00abD\u00adE\u00afF\u00b1G\u00b3\u0000\u00b5\u0000\u00b7"+ + "H\u00b9I\u00bbJ\u00bd\u0000\u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5"+ + "\u0000\u00c7\u0000\u00c9K\u00cb\u0000\u00cdL\u00cf\u0000\u00d1\u0000\u00d3"+ + "M\u00d5N\u00d7O\u00d9\u0000\u00db\u0000\u00dd\u0000\u00df\u0000\u00e1"+ + "\u0000\u00e3P\u00e5Q\u00e7R\u00e9S\u00eb\u0000\u00ed\u0000\u00ef\u0000"+ + "\u00f1\u0000\u00f3T\u00f5\u0000\u00f7U\u00f9V\u00fbW\u00fd\u0000\u00ff"+ + "\u0000\u0101X\u0103Y\u0105\u0000\u0107Z\u0109\u0000\u010b[\u010d\\\u010f"+ + "]\u0111\u0000\u0113\u0000\u0115\u0000\u0117\u0000\u0119\u0000\u011b\u0000"+ + "\u011d\u0000\u011f^\u0121_\u0123`\u0125\u0000\u0127\u0000\u0129\u0000"+ + "\u012b\u0000\u012da\u012fb\u0131c\u0133\u0000\u0135d\u0137e\u0139f\u013b"+ + "g\u013d\u0000\u013fh\u0141i\u0143j\u0145k\u0147l\u0149\u0000\u014b\u0000"+ + "\u014d\u0000\u014f\u0000\u0151\u0000\u0153\u0000\u0155\u0000\u0157m\u0159"+ + "n\u015bo\u015d\u0000\u015f\u0000\u0161\u0000\u0163\u0000\u0165p\u0167"+ + "q\u0169r\u016b\u0000\u016d\u0000\u016f\u0000\u0171s\u0173t\u0175u\u0177"+ + "\u0000\u0179\u0000\u017bv\u017dw\u017fx\u0181\u0000\u0183\u0000\u0185"+ + "\u0000\u0187\u0000\u000f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"+ + "\b\t\n\u000b\f\r\u000e#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000SS"+ + "ss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+ + "\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000"+ + "VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002"+ + "\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ + "UUuu\u0006\u0000\t\n\r\r //[[]]\u0002\u0000\n\n\r\r\u0003\u0000\t\n\r"+ + "\r \u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000"+ + "\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000"+ + "YYyy\u000b\u0000\t\n\r\r \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000"+ + "\t\n\r\r \"#,,//::<<>?\\\\||\u05a6\u0000\u000f\u0001\u0000\u0000\u0000"+ + "\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000"+ + "\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000"+ + "\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000"+ + "\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000\u0000"+ + "\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000%"+ + "\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001"+ + "\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000"+ + "\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u0000"+ + "3\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u00007\u0001"+ + "\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000\u0000;\u0001\u0000\u0000"+ + "\u0000\u0001=\u0001\u0000\u0000\u0000\u0001S\u0001\u0000\u0000\u0000\u0001"+ + "U\u0001\u0000\u0000\u0000\u0001W\u0001\u0000\u0000\u0000\u0001Y\u0001"+ + "\u0000\u0000\u0000\u0001[\u0001\u0000\u0000\u0000\u0001]\u0001\u0000\u0000"+ + "\u0000\u0001_\u0001\u0000\u0000\u0000\u0001a\u0001\u0000\u0000\u0000\u0001"+ + "c\u0001\u0000\u0000\u0000\u0001e\u0001\u0000\u0000\u0000\u0001g\u0001"+ + "\u0000\u0000\u0000\u0001i\u0001\u0000\u0000\u0000\u0001k\u0001\u0000\u0000"+ + "\u0000\u0001m\u0001\u0000\u0000\u0000\u0001o\u0001\u0000\u0000\u0000\u0001"+ + "q\u0001\u0000\u0000\u0000\u0001s\u0001\u0000\u0000\u0000\u0001u\u0001"+ + "\u0000\u0000\u0000\u0001w\u0001\u0000\u0000\u0000\u0001y\u0001\u0000\u0000"+ + "\u0000\u0001{\u0001\u0000\u0000\u0000\u0001}\u0001\u0000\u0000\u0000\u0001"+ + "\u007f\u0001\u0000\u0000\u0000\u0001\u0081\u0001\u0000\u0000\u0000\u0001"+ + "\u0083\u0001\u0000\u0000\u0000\u0001\u0085\u0001\u0000\u0000\u0000\u0001"+ + "\u0087\u0001\u0000\u0000\u0000\u0001\u0089\u0001\u0000\u0000\u0000\u0001"+ + "\u008b\u0001\u0000\u0000\u0000\u0001\u008d\u0001\u0000\u0000\u0000\u0001"+ + "\u008f\u0001\u0000\u0000\u0000\u0001\u0091\u0001\u0000\u0000\u0000\u0001"+ + "\u0093\u0001\u0000\u0000\u0000\u0001\u0095\u0001\u0000\u0000\u0000\u0001"+ + "\u0097\u0001\u0000\u0000\u0000\u0001\u0099\u0001\u0000\u0000\u0000\u0001"+ + "\u009b\u0001\u0000\u0000\u0000\u0001\u009d\u0001\u0000\u0000\u0000\u0001"+ + "\u009f\u0001\u0000\u0000\u0000\u0001\u00a1\u0001\u0000\u0000\u0000\u0001"+ + "\u00a3\u0001\u0000\u0000\u0000\u0001\u00a5\u0001\u0000\u0000\u0000\u0001"+ + "\u00a7\u0001\u0000\u0000\u0000\u0001\u00ab\u0001\u0000\u0000\u0000\u0001"+ + "\u00ad\u0001\u0000\u0000\u0000\u0001\u00af\u0001\u0000\u0000\u0000\u0001"+ + "\u00b1\u0001\u0000\u0000\u0000\u0002\u00b3\u0001\u0000\u0000\u0000\u0002"+ + "\u00b5\u0001\u0000\u0000\u0000\u0002\u00b7\u0001\u0000\u0000\u0000\u0002"+ + "\u00b9\u0001\u0000\u0000\u0000\u0002\u00bb\u0001\u0000\u0000\u0000\u0003"+ + "\u00bd\u0001\u0000\u0000\u0000\u0003\u00bf\u0001\u0000\u0000\u0000\u0003"+ + "\u00c1\u0001\u0000\u0000\u0000\u0003\u00c3\u0001\u0000\u0000\u0000\u0003"+ + "\u00c5\u0001\u0000\u0000\u0000\u0003\u00c7\u0001\u0000\u0000\u0000\u0003"+ + "\u00c9\u0001\u0000\u0000\u0000\u0003\u00cd\u0001\u0000\u0000\u0000\u0003"+ + "\u00cf\u0001\u0000\u0000\u0000\u0003\u00d1\u0001\u0000\u0000\u0000\u0003"+ + "\u00d3\u0001\u0000\u0000\u0000\u0003\u00d5\u0001\u0000\u0000\u0000\u0003"+ + "\u00d7\u0001\u0000\u0000\u0000\u0004\u00d9\u0001\u0000\u0000\u0000\u0004"+ + "\u00db\u0001\u0000\u0000\u0000\u0004\u00dd\u0001\u0000\u0000\u0000\u0004"+ + "\u00e3\u0001\u0000\u0000\u0000\u0004\u00e5\u0001\u0000\u0000\u0000\u0004"+ + "\u00e7\u0001\u0000\u0000\u0000\u0004\u00e9\u0001\u0000\u0000\u0000\u0005"+ + "\u00eb\u0001\u0000\u0000\u0000\u0005\u00ed\u0001\u0000\u0000\u0000\u0005"+ + "\u00ef\u0001\u0000\u0000\u0000\u0005\u00f1\u0001\u0000\u0000\u0000\u0005"+ + "\u00f3\u0001\u0000\u0000\u0000\u0005\u00f5\u0001\u0000\u0000\u0000\u0005"+ + "\u00f7\u0001\u0000\u0000\u0000\u0005\u00f9\u0001\u0000\u0000\u0000\u0005"+ + "\u00fb\u0001\u0000\u0000\u0000\u0006\u00fd\u0001\u0000\u0000\u0000\u0006"+ + "\u00ff\u0001\u0000\u0000\u0000\u0006\u0101\u0001\u0000\u0000\u0000\u0006"+ + "\u0103\u0001\u0000\u0000\u0000\u0006\u0107\u0001\u0000\u0000\u0000\u0006"+ + "\u0109\u0001\u0000\u0000\u0000\u0006\u010b\u0001\u0000\u0000\u0000\u0006"+ + "\u010d\u0001\u0000\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\u0007"+ + "\u0111\u0001\u0000\u0000\u0000\u0007\u0113\u0001\u0000\u0000\u0000\u0007"+ + "\u0115\u0001\u0000\u0000\u0000\u0007\u0117\u0001\u0000\u0000\u0000\u0007"+ + "\u0119\u0001\u0000\u0000\u0000\u0007\u011b\u0001\u0000\u0000\u0000\u0007"+ + "\u011d\u0001\u0000\u0000\u0000\u0007\u011f\u0001\u0000\u0000\u0000\u0007"+ + "\u0121\u0001\u0000\u0000\u0000\u0007\u0123\u0001\u0000\u0000\u0000\b\u0125"+ + "\u0001\u0000\u0000\u0000\b\u0127\u0001\u0000\u0000\u0000\b\u0129\u0001"+ + "\u0000\u0000\u0000\b\u012b\u0001\u0000\u0000\u0000\b\u012d\u0001\u0000"+ + "\u0000\u0000\b\u012f\u0001\u0000\u0000\u0000\b\u0131\u0001\u0000\u0000"+ + "\u0000\t\u0133\u0001\u0000\u0000\u0000\t\u0135\u0001\u0000\u0000\u0000"+ + "\t\u0137\u0001\u0000\u0000\u0000\t\u0139\u0001\u0000\u0000\u0000\t\u013b"+ + "\u0001\u0000\u0000\u0000\n\u013d\u0001\u0000\u0000\u0000\n\u013f\u0001"+ + "\u0000\u0000\u0000\n\u0141\u0001\u0000\u0000\u0000\n\u0143\u0001\u0000"+ + "\u0000\u0000\n\u0145\u0001\u0000\u0000\u0000\n\u0147\u0001\u0000\u0000"+ + "\u0000\u000b\u0149\u0001\u0000\u0000\u0000\u000b\u014b\u0001\u0000\u0000"+ + "\u0000\u000b\u014d\u0001\u0000\u0000\u0000\u000b\u014f\u0001\u0000\u0000"+ + "\u0000\u000b\u0151\u0001\u0000\u0000\u0000\u000b\u0153\u0001\u0000\u0000"+ + "\u0000\u000b\u0155\u0001\u0000\u0000\u0000\u000b\u0157\u0001\u0000\u0000"+ + "\u0000\u000b\u0159\u0001\u0000\u0000\u0000\u000b\u015b\u0001\u0000\u0000"+ + "\u0000\f\u015d\u0001\u0000\u0000\u0000\f\u015f\u0001\u0000\u0000\u0000"+ + "\f\u0161\u0001\u0000\u0000\u0000\f\u0163\u0001\u0000\u0000\u0000\f\u0165"+ + "\u0001\u0000\u0000\u0000\f\u0167\u0001\u0000\u0000\u0000\f\u0169\u0001"+ + "\u0000\u0000\u0000\r\u016b\u0001\u0000\u0000\u0000\r\u016d\u0001\u0000"+ + "\u0000\u0000\r\u016f\u0001\u0000\u0000\u0000\r\u0171\u0001\u0000\u0000"+ + "\u0000\r\u0173\u0001\u0000\u0000\u0000\r\u0175\u0001\u0000\u0000\u0000"+ + "\u000e\u0177\u0001\u0000\u0000\u0000\u000e\u0179\u0001\u0000\u0000\u0000"+ + "\u000e\u017b\u0001\u0000\u0000\u0000\u000e\u017d\u0001\u0000\u0000\u0000"+ + "\u000e\u017f\u0001\u0000\u0000\u0000\u000e\u0181\u0001\u0000\u0000\u0000"+ + "\u000e\u0183\u0001\u0000\u0000\u0000\u000e\u0185\u0001\u0000\u0000\u0000"+ + "\u000e\u0187\u0001\u0000\u0000\u0000\u000f\u0189\u0001\u0000\u0000\u0000"+ + "\u0011\u0193\u0001\u0000\u0000\u0000\u0013\u019a\u0001\u0000\u0000\u0000"+ + "\u0015\u01a3\u0001\u0000\u0000\u0000\u0017\u01aa\u0001\u0000\u0000\u0000"+ + "\u0019\u01b4\u0001\u0000\u0000\u0000\u001b\u01bb\u0001\u0000\u0000\u0000"+ + "\u001d\u01c2\u0001\u0000\u0000\u0000\u001f\u01c9\u0001\u0000\u0000\u0000"+ + "!\u01d1\u0001\u0000\u0000\u0000#\u01dd\u0001\u0000\u0000\u0000%\u01e6"+ + "\u0001\u0000\u0000\u0000\'\u01ec\u0001\u0000\u0000\u0000)\u01f3\u0001"+ + "\u0000\u0000\u0000+\u01fa\u0001\u0000\u0000\u0000-\u0202\u0001\u0000\u0000"+ + "\u0000/\u020a\u0001\u0000\u0000\u00001\u0219\u0001\u0000\u0000\u00003"+ + "\u0223\u0001\u0000\u0000\u00005\u022f\u0001\u0000\u0000\u00007\u0235\u0001"+ + "\u0000\u0000\u00009\u0246\u0001\u0000\u0000\u0000;\u0256\u0001\u0000\u0000"+ + "\u0000=\u025c\u0001\u0000\u0000\u0000?\u0260\u0001\u0000\u0000\u0000A"+ + "\u0262\u0001\u0000\u0000\u0000C\u0264\u0001\u0000\u0000\u0000E\u0267\u0001"+ + "\u0000\u0000\u0000G\u0269\u0001\u0000\u0000\u0000I\u0272\u0001\u0000\u0000"+ + "\u0000K\u0274\u0001\u0000\u0000\u0000M\u0279\u0001\u0000\u0000\u0000O"+ + "\u027b\u0001\u0000\u0000\u0000Q\u0280\u0001\u0000\u0000\u0000S\u029f\u0001"+ + "\u0000\u0000\u0000U\u02a2\u0001\u0000\u0000\u0000W\u02d0\u0001\u0000\u0000"+ + "\u0000Y\u02d2\u0001\u0000\u0000\u0000[\u02d5\u0001\u0000\u0000\u0000]"+ + "\u02d9\u0001\u0000\u0000\u0000_\u02dd\u0001\u0000\u0000\u0000a\u02df\u0001"+ + "\u0000\u0000\u0000c\u02e2\u0001\u0000\u0000\u0000e\u02e4\u0001\u0000\u0000"+ + "\u0000g\u02e9\u0001\u0000\u0000\u0000i\u02eb\u0001\u0000\u0000\u0000k"+ + "\u02f1\u0001\u0000\u0000\u0000m\u02f7\u0001\u0000\u0000\u0000o\u02fa\u0001"+ + "\u0000\u0000\u0000q\u02fd\u0001\u0000\u0000\u0000s\u0302\u0001\u0000\u0000"+ + "\u0000u\u0307\u0001\u0000\u0000\u0000w\u0309\u0001\u0000\u0000\u0000y"+ + "\u030d\u0001\u0000\u0000\u0000{\u0312\u0001\u0000\u0000\u0000}\u0318\u0001"+ + "\u0000\u0000\u0000\u007f\u031b\u0001\u0000\u0000\u0000\u0081\u031d\u0001"+ + "\u0000\u0000\u0000\u0083\u0323\u0001\u0000\u0000\u0000\u0085\u0325\u0001"+ + "\u0000\u0000\u0000\u0087\u032a\u0001\u0000\u0000\u0000\u0089\u032d\u0001"+ + "\u0000\u0000\u0000\u008b\u0330\u0001\u0000\u0000\u0000\u008d\u0333\u0001"+ + "\u0000\u0000\u0000\u008f\u0335\u0001\u0000\u0000\u0000\u0091\u0338\u0001"+ + "\u0000\u0000\u0000\u0093\u033a\u0001\u0000\u0000\u0000\u0095\u033d\u0001"+ + "\u0000\u0000\u0000\u0097\u033f\u0001\u0000\u0000\u0000\u0099\u0341\u0001"+ + "\u0000\u0000\u0000\u009b\u0343\u0001\u0000\u0000\u0000\u009d\u0345\u0001"+ + "\u0000\u0000\u0000\u009f\u0347\u0001\u0000\u0000\u0000\u00a1\u035f\u0001"+ + "\u0000\u0000\u0000\u00a3\u0361\u0001\u0000\u0000\u0000\u00a5\u0366\u0001"+ + "\u0000\u0000\u0000\u00a7\u037b\u0001\u0000\u0000\u0000\u00a9\u037d\u0001"+ + "\u0000\u0000\u0000\u00ab\u0385\u0001\u0000\u0000\u0000\u00ad\u0387\u0001"+ + "\u0000\u0000\u0000\u00af\u038b\u0001\u0000\u0000\u0000\u00b1\u038f\u0001"+ + "\u0000\u0000\u0000\u00b3\u0393\u0001\u0000\u0000\u0000\u00b5\u0398\u0001"+ + "\u0000\u0000\u0000\u00b7\u039d\u0001\u0000\u0000\u0000\u00b9\u03a1\u0001"+ + "\u0000\u0000\u0000\u00bb\u03a5\u0001\u0000\u0000\u0000\u00bd\u03a9\u0001"+ + "\u0000\u0000\u0000\u00bf\u03ae\u0001\u0000\u0000\u0000\u00c1\u03b2\u0001"+ + "\u0000\u0000\u0000\u00c3\u03b6\u0001\u0000\u0000\u0000\u00c5\u03ba\u0001"+ + "\u0000\u0000\u0000\u00c7\u03be\u0001\u0000\u0000\u0000\u00c9\u03c2\u0001"+ + "\u0000\u0000\u0000\u00cb\u03ce\u0001\u0000\u0000\u0000\u00cd\u03d1\u0001"+ + "\u0000\u0000\u0000\u00cf\u03d5\u0001\u0000\u0000\u0000\u00d1\u03d9\u0001"+ + "\u0000\u0000\u0000\u00d3\u03dd\u0001\u0000\u0000\u0000\u00d5\u03e1\u0001"+ + "\u0000\u0000\u0000\u00d7\u03e5\u0001\u0000\u0000\u0000\u00d9\u03e9\u0001"+ + "\u0000\u0000\u0000\u00db\u03ee\u0001\u0000\u0000\u0000\u00dd\u03f2\u0001"+ + "\u0000\u0000\u0000\u00df\u03fa\u0001\u0000\u0000\u0000\u00e1\u040f\u0001"+ + "\u0000\u0000\u0000\u00e3\u0413\u0001\u0000\u0000\u0000\u00e5\u0417\u0001"+ + "\u0000\u0000\u0000\u00e7\u041b\u0001\u0000\u0000\u0000\u00e9\u041f\u0001"+ + "\u0000\u0000\u0000\u00eb\u0423\u0001\u0000\u0000\u0000\u00ed\u0428\u0001"+ + "\u0000\u0000\u0000\u00ef\u042c\u0001\u0000\u0000\u0000\u00f1\u0430\u0001"+ + "\u0000\u0000\u0000\u00f3\u0434\u0001\u0000\u0000\u0000\u00f5\u0437\u0001"+ + "\u0000\u0000\u0000\u00f7\u043b\u0001\u0000\u0000\u0000\u00f9\u043f\u0001"+ + "\u0000\u0000\u0000\u00fb\u0443\u0001\u0000\u0000\u0000\u00fd\u0447\u0001"+ + "\u0000\u0000\u0000\u00ff\u044c\u0001\u0000\u0000\u0000\u0101\u0451\u0001"+ + "\u0000\u0000\u0000\u0103\u0456\u0001\u0000\u0000\u0000\u0105\u045d\u0001"+ + "\u0000\u0000\u0000\u0107\u0466\u0001\u0000\u0000\u0000\u0109\u046d\u0001"+ + "\u0000\u0000\u0000\u010b\u0471\u0001\u0000\u0000\u0000\u010d\u0475\u0001"+ + "\u0000\u0000\u0000\u010f\u0479\u0001\u0000\u0000\u0000\u0111\u047d\u0001"+ + "\u0000\u0000\u0000\u0113\u0483\u0001\u0000\u0000\u0000\u0115\u0487\u0001"+ + "\u0000\u0000\u0000\u0117\u048b\u0001\u0000\u0000\u0000\u0119\u048f\u0001"+ + "\u0000\u0000\u0000\u011b\u0493\u0001\u0000\u0000\u0000\u011d\u0497\u0001"+ + "\u0000\u0000\u0000\u011f\u049b\u0001\u0000\u0000\u0000\u0121\u049f\u0001"+ + "\u0000\u0000\u0000\u0123\u04a3\u0001\u0000\u0000\u0000\u0125\u04a7\u0001"+ + "\u0000\u0000\u0000\u0127\u04ac\u0001\u0000\u0000\u0000\u0129\u04b0\u0001"+ + "\u0000\u0000\u0000\u012b\u04b4\u0001\u0000\u0000\u0000\u012d\u04b8\u0001"+ + "\u0000\u0000\u0000\u012f\u04bc\u0001\u0000\u0000\u0000\u0131\u04c0\u0001"+ + "\u0000\u0000\u0000\u0133\u04c4\u0001\u0000\u0000\u0000\u0135\u04c9\u0001"+ + "\u0000\u0000\u0000\u0137\u04ce\u0001\u0000\u0000\u0000\u0139\u04d2\u0001"+ + "\u0000\u0000\u0000\u013b\u04d6\u0001\u0000\u0000\u0000\u013d\u04da\u0001"+ + "\u0000\u0000\u0000\u013f\u04df\u0001\u0000\u0000\u0000\u0141\u04e6\u0001"+ + "\u0000\u0000\u0000\u0143\u04ea\u0001\u0000\u0000\u0000\u0145\u04ee\u0001"+ + "\u0000\u0000\u0000\u0147\u04f2\u0001\u0000\u0000\u0000\u0149\u04f6\u0001"+ + "\u0000\u0000\u0000\u014b\u04fb\u0001\u0000\u0000\u0000\u014d\u04ff\u0001"+ + "\u0000\u0000\u0000\u014f\u0503\u0001\u0000\u0000\u0000\u0151\u0507\u0001"+ + "\u0000\u0000\u0000\u0153\u050c\u0001\u0000\u0000\u0000\u0155\u0510\u0001"+ + "\u0000\u0000\u0000\u0157\u0514\u0001\u0000\u0000\u0000\u0159\u0518\u0001"+ + "\u0000\u0000\u0000\u015b\u051c\u0001\u0000\u0000\u0000\u015d\u0520\u0001"+ + "\u0000\u0000\u0000\u015f\u0526\u0001\u0000\u0000\u0000\u0161\u052a\u0001"+ + "\u0000\u0000\u0000\u0163\u052e\u0001\u0000\u0000\u0000\u0165\u0532\u0001"+ + "\u0000\u0000\u0000\u0167\u0536\u0001\u0000\u0000\u0000\u0169\u053a\u0001"+ + "\u0000\u0000\u0000\u016b\u053e\u0001\u0000\u0000\u0000\u016d\u0543\u0001"+ + "\u0000\u0000\u0000\u016f\u0549\u0001\u0000\u0000\u0000\u0171\u054f\u0001"+ + "\u0000\u0000\u0000\u0173\u0553\u0001\u0000\u0000\u0000\u0175\u0557\u0001"+ + "\u0000\u0000\u0000\u0177\u055b\u0001\u0000\u0000\u0000\u0179\u0561\u0001"+ + "\u0000\u0000\u0000\u017b\u0567\u0001\u0000\u0000\u0000\u017d\u056b\u0001"+ + "\u0000\u0000\u0000\u017f\u056f\u0001\u0000\u0000\u0000\u0181\u0573\u0001"+ + "\u0000\u0000\u0000\u0183\u0579\u0001\u0000\u0000\u0000\u0185\u057f\u0001"+ + "\u0000\u0000\u0000\u0187\u0585\u0001\u0000\u0000\u0000\u0189\u018a\u0007"+ + "\u0000\u0000\u0000\u018a\u018b\u0007\u0001\u0000\u0000\u018b\u018c\u0007"+ + "\u0002\u0000\u0000\u018c\u018d\u0007\u0002\u0000\u0000\u018d\u018e\u0007"+ + "\u0003\u0000\u0000\u018e\u018f\u0007\u0004\u0000\u0000\u018f\u0190\u0007"+ + "\u0005\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u0192\u0006"+ + "\u0000\u0000\u0000\u0192\u0010\u0001\u0000\u0000\u0000\u0193\u0194\u0007"+ + "\u0000\u0000\u0000\u0194\u0195\u0007\u0006\u0000\u0000\u0195\u0196\u0007"+ + "\u0007\u0000\u0000\u0196\u0197\u0007\b\u0000\u0000\u0197\u0198\u0001\u0000"+ + "\u0000\u0000\u0198\u0199\u0006\u0001\u0001\u0000\u0199\u0012\u0001\u0000"+ + "\u0000\u0000\u019a\u019b\u0007\u0003\u0000\u0000\u019b\u019c\u0007\t\u0000"+ + "\u0000\u019c\u019d\u0007\u0006\u0000\u0000\u019d\u019e\u0007\u0001\u0000"+ + "\u0000\u019e\u019f\u0007\u0004\u0000\u0000\u019f\u01a0\u0007\n\u0000\u0000"+ + "\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a2\u0006\u0002\u0002\u0000"+ + "\u01a2\u0014\u0001\u0000\u0000\u0000\u01a3\u01a4\u0007\u0003\u0000\u0000"+ + "\u01a4\u01a5\u0007\u000b\u0000\u0000\u01a5\u01a6\u0007\f\u0000\u0000\u01a6"+ + "\u01a7\u0007\r\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a9"+ + "\u0006\u0003\u0000\u0000\u01a9\u0016\u0001\u0000\u0000\u0000\u01aa\u01ab"+ + "\u0007\u0003\u0000\u0000\u01ab\u01ac\u0007\u000e\u0000\u0000\u01ac\u01ad"+ + "\u0007\b\u0000\u0000\u01ad\u01ae\u0007\r\u0000\u0000\u01ae\u01af\u0007"+ + "\f\u0000\u0000\u01af\u01b0\u0007\u0001\u0000\u0000\u01b0\u01b1\u0007\t"+ + "\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b3\u0006\u0004"+ + "\u0003\u0000\u01b3\u0018\u0001\u0000\u0000\u0000\u01b4\u01b5\u0007\u000f"+ + "\u0000\u0000\u01b5\u01b6\u0007\u0006\u0000\u0000\u01b6\u01b7\u0007\u0007"+ + "\u0000\u0000\u01b7\u01b8\u0007\u0010\u0000\u0000\u01b8\u01b9\u0001\u0000"+ + "\u0000\u0000\u01b9\u01ba\u0006\u0005\u0004\u0000\u01ba\u001a\u0001\u0000"+ + "\u0000\u0000\u01bb\u01bc\u0007\u0011\u0000\u0000\u01bc\u01bd\u0007\u0006"+ + "\u0000\u0000\u01bd\u01be\u0007\u0007\u0000\u0000\u01be\u01bf\u0007\u0012"+ + "\u0000\u0000\u01bf\u01c0\u0001\u0000\u0000\u0000\u01c0\u01c1\u0006\u0006"+ + "\u0000\u0000\u01c1\u001c\u0001\u0000\u0000\u0000\u01c2\u01c3\u0007\u0012"+ + "\u0000\u0000\u01c3\u01c4\u0007\u0003\u0000\u0000\u01c4\u01c5\u0007\u0003"+ + "\u0000\u0000\u01c5\u01c6\u0007\b\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000"+ + "\u0000\u01c7\u01c8\u0006\u0007\u0001\u0000\u01c8\u001e\u0001\u0000\u0000"+ + "\u0000\u01c9\u01ca\u0007\r\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000"+ + "\u01cb\u01cc\u0007\u0010\u0000\u0000\u01cc\u01cd\u0007\u0001\u0000\u0000"+ + "\u01cd\u01ce\u0007\u0005\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000"+ + "\u01cf\u01d0\u0006\b\u0000\u0000\u01d0 \u0001\u0000\u0000\u0000\u01d1"+ + "\u01d2\u0007\u0010\u0000\u0000\u01d2\u01d3\u0007\u000b\u0000\u0000\u01d3"+ + "\u01d4\u0005_\u0000\u0000\u01d4\u01d5\u0007\u0003\u0000\u0000\u01d5\u01d6"+ + "\u0007\u000e\u0000\u0000\u01d6\u01d7\u0007\b\u0000\u0000\u01d7\u01d8\u0007"+ + "\f\u0000\u0000\u01d8\u01d9\u0007\t\u0000\u0000\u01d9\u01da\u0007\u0000"+ + "\u0000\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01dc\u0006\t\u0005"+ + "\u0000\u01dc\"\u0001\u0000\u0000\u0000\u01dd\u01de\u0007\u0006\u0000\u0000"+ + "\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0\u0007\t\u0000\u0000\u01e0"+ + "\u01e1\u0007\f\u0000\u0000\u01e1\u01e2\u0007\u0010\u0000\u0000\u01e2\u01e3"+ + "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000\u01e4\u01e5"+ + "\u0006\n\u0006\u0000\u01e5$\u0001\u0000\u0000\u0000\u01e6\u01e7\u0007"+ + "\u0006\u0000\u0000\u01e7\u01e8\u0007\u0007\u0000\u0000\u01e8\u01e9\u0007"+ + "\u0013\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea\u01eb\u0006"+ + "\u000b\u0000\u0000\u01eb&\u0001\u0000\u0000\u0000\u01ec\u01ed\u0007\u0002"+ + "\u0000\u0000\u01ed\u01ee\u0007\n\u0000\u0000\u01ee\u01ef\u0007\u0007\u0000"+ + "\u0000\u01ef\u01f0\u0007\u0013\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000"+ + "\u0000\u01f1\u01f2\u0006\f\u0007\u0000\u01f2(\u0001\u0000\u0000\u0000"+ + "\u01f3\u01f4\u0007\u0002\u0000\u0000\u01f4\u01f5\u0007\u0007\u0000\u0000"+ + "\u01f5\u01f6\u0007\u0006\u0000\u0000\u01f6\u01f7\u0007\u0005\u0000\u0000"+ + "\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0006\r\u0000\u0000\u01f9"+ + "*\u0001\u0000\u0000\u0000\u01fa\u01fb\u0007\u0002\u0000\u0000\u01fb\u01fc"+ + "\u0007\u0005\u0000\u0000\u01fc\u01fd\u0007\f\u0000\u0000\u01fd\u01fe\u0007"+ + "\u0005\u0000\u0000\u01fe\u01ff\u0007\u0002\u0000\u0000\u01ff\u0200\u0001"+ + "\u0000\u0000\u0000\u0200\u0201\u0006\u000e\u0000\u0000\u0201,\u0001\u0000"+ + "\u0000\u0000\u0202\u0203\u0007\u0013\u0000\u0000\u0203\u0204\u0007\n\u0000"+ + "\u0000\u0204\u0205\u0007\u0003\u0000\u0000\u0205\u0206\u0007\u0006\u0000"+ + "\u0000\u0206\u0207\u0007\u0003\u0000\u0000\u0207\u0208\u0001\u0000\u0000"+ + "\u0000\u0208\u0209\u0006\u000f\u0000\u0000\u0209.\u0001\u0000\u0000\u0000"+ + "\u020a\u020b\u0004\u0010\u0000\u0000\u020b\u020c\u0007\u0001\u0000\u0000"+ + "\u020c\u020d\u0007\t\u0000\u0000\u020d\u020e\u0007\r\u0000\u0000\u020e"+ + "\u020f\u0007\u0001\u0000\u0000\u020f\u0210\u0007\t\u0000\u0000\u0210\u0211"+ + "\u0007\u0003\u0000\u0000\u0211\u0212\u0007\u0002\u0000\u0000\u0212\u0213"+ + "\u0007\u0005\u0000\u0000\u0213\u0214\u0007\f\u0000\u0000\u0214\u0215\u0007"+ + "\u0005\u0000\u0000\u0215\u0216\u0007\u0002\u0000\u0000\u0216\u0217\u0001"+ + "\u0000\u0000\u0000\u0217\u0218\u0006\u0010\u0000\u0000\u02180\u0001\u0000"+ + "\u0000\u0000\u0219\u021a\u0004\u0011\u0001\u0000\u021a\u021b\u0007\r\u0000"+ + "\u0000\u021b\u021c\u0007\u0007\u0000\u0000\u021c\u021d\u0007\u0007\u0000"+ + "\u0000\u021d\u021e\u0007\u0012\u0000\u0000\u021e\u021f\u0007\u0014\u0000"+ + "\u0000\u021f\u0220\u0007\b\u0000\u0000\u0220\u0221\u0001\u0000\u0000\u0000"+ + "\u0221\u0222\u0006\u0011\b\u0000\u02222\u0001\u0000\u0000\u0000\u0223"+ + "\u0224\u0004\u0012\u0002\u0000\u0224\u0225\u0007\u0010\u0000\u0000\u0225"+ + "\u0226\u0007\u0003\u0000\u0000\u0226\u0227\u0007\u0005\u0000\u0000\u0227"+ + "\u0228\u0007\u0006\u0000\u0000\u0228\u0229\u0007\u0001\u0000\u0000\u0229"+ + "\u022a\u0007\u0004\u0000\u0000\u022a\u022b\u0007\u0002\u0000\u0000\u022b"+ + "\u022c\u0001\u0000\u0000\u0000\u022c\u022d\u0006\u0012\t\u0000\u022d4"+ + "\u0001\u0000\u0000\u0000\u022e\u0230\b\u0015\u0000\u0000\u022f\u022e\u0001"+ + "\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231\u022f\u0001"+ + "\u0000\u0000\u0000\u0231\u0232\u0001\u0000\u0000\u0000\u0232\u0233\u0001"+ + "\u0000\u0000\u0000\u0233\u0234\u0006\u0013\u0000\u0000\u02346\u0001\u0000"+ + "\u0000\u0000\u0235\u0236\u0005/\u0000\u0000\u0236\u0237\u0005/\u0000\u0000"+ + "\u0237\u023b\u0001\u0000\u0000\u0000\u0238\u023a\b\u0016\u0000\u0000\u0239"+ + "\u0238\u0001\u0000\u0000\u0000\u023a\u023d\u0001\u0000\u0000\u0000\u023b"+ + "\u0239\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c"+ + "\u023f\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000\u0000\u0000\u023e"+ + "\u0240\u0005\r\u0000\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u023f\u0240"+ + "\u0001\u0000\u0000\u0000\u0240\u0242\u0001\u0000\u0000\u0000\u0241\u0243"+ + "\u0005\n\u0000\u0000\u0242\u0241\u0001\u0000\u0000\u0000\u0242\u0243\u0001"+ + "\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0006"+ + "\u0014\n\u0000\u02458\u0001\u0000\u0000\u0000\u0246\u0247\u0005/\u0000"+ + "\u0000\u0247\u0248\u0005*\u0000\u0000\u0248\u024d\u0001\u0000\u0000\u0000"+ + "\u0249\u024c\u00039\u0015\u0000\u024a\u024c\t\u0000\u0000\u0000\u024b"+ + "\u0249\u0001\u0000\u0000\u0000\u024b\u024a\u0001\u0000\u0000\u0000\u024c"+ + "\u024f\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024d"+ + "\u024b\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000\u0000\u0000\u024f"+ + "\u024d\u0001\u0000\u0000\u0000\u0250\u0251\u0005*\u0000\u0000\u0251\u0252"+ + "\u0005/\u0000\u0000\u0252\u0253\u0001\u0000\u0000\u0000\u0253\u0254\u0006"+ + "\u0015\n\u0000\u0254:\u0001\u0000\u0000\u0000\u0255\u0257\u0007\u0017"+ + "\u0000\u0000\u0256\u0255\u0001\u0000\u0000\u0000\u0257\u0258\u0001\u0000"+ + "\u0000\u0000\u0258\u0256\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000"+ + "\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b\u0006\u0016"+ + "\n\u0000\u025b<\u0001\u0000\u0000\u0000\u025c\u025d\u0005|\u0000\u0000"+ + "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f\u0006\u0017\u000b\u0000"+ + "\u025f>\u0001\u0000\u0000\u0000\u0260\u0261\u0007\u0018\u0000\u0000\u0261"+ + "@\u0001\u0000\u0000\u0000\u0262\u0263\u0007\u0019\u0000\u0000\u0263B\u0001"+ + "\u0000\u0000\u0000\u0264\u0265\u0005\\\u0000\u0000\u0265\u0266\u0007\u001a"+ + "\u0000\u0000\u0266D\u0001\u0000\u0000\u0000\u0267\u0268\b\u001b\u0000"+ + "\u0000\u0268F\u0001\u0000\u0000\u0000\u0269\u026b\u0007\u0003\u0000\u0000"+ + "\u026a\u026c\u0007\u001c\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ + "\u026b\u026c\u0001\u0000\u0000\u0000\u026c\u026e\u0001\u0000\u0000\u0000"+ + "\u026d\u026f\u0003?\u0018\u0000\u026e\u026d\u0001\u0000\u0000\u0000\u026f"+ + "\u0270\u0001\u0000\u0000\u0000\u0270\u026e\u0001\u0000\u0000\u0000\u0270"+ + "\u0271\u0001\u0000\u0000\u0000\u0271H\u0001\u0000\u0000\u0000\u0272\u0273"+ + "\u0005@\u0000\u0000\u0273J\u0001\u0000\u0000\u0000\u0274\u0275\u0005`"+ + "\u0000\u0000\u0275L\u0001\u0000\u0000\u0000\u0276\u027a\b\u001d\u0000"+ + "\u0000\u0277\u0278\u0005`\u0000\u0000\u0278\u027a\u0005`\u0000\u0000\u0279"+ + "\u0276\u0001\u0000\u0000\u0000\u0279\u0277\u0001\u0000\u0000\u0000\u027a"+ + "N\u0001\u0000\u0000\u0000\u027b\u027c\u0005_\u0000\u0000\u027cP\u0001"+ + "\u0000\u0000\u0000\u027d\u0281\u0003A\u0019\u0000\u027e\u0281\u0003?\u0018"+ + "\u0000\u027f\u0281\u0003O \u0000\u0280\u027d\u0001\u0000\u0000\u0000\u0280"+ + "\u027e\u0001\u0000\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0281"+ + "R\u0001\u0000\u0000\u0000\u0282\u0287\u0005\"\u0000\u0000\u0283\u0286"+ + "\u0003C\u001a\u0000\u0284\u0286\u0003E\u001b\u0000\u0285\u0283\u0001\u0000"+ + "\u0000\u0000\u0285\u0284\u0001\u0000\u0000\u0000\u0286\u0289\u0001\u0000"+ + "\u0000\u0000\u0287\u0285\u0001\u0000\u0000\u0000\u0287\u0288\u0001\u0000"+ + "\u0000\u0000\u0288\u028a\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000"+ + "\u0000\u0000\u028a\u02a0\u0005\"\u0000\u0000\u028b\u028c\u0005\"\u0000"+ + "\u0000\u028c\u028d\u0005\"\u0000\u0000\u028d\u028e\u0005\"\u0000\u0000"+ + "\u028e\u0292\u0001\u0000\u0000\u0000\u028f\u0291\b\u0016\u0000\u0000\u0290"+ + "\u028f\u0001\u0000\u0000\u0000\u0291\u0294\u0001\u0000\u0000\u0000\u0292"+ + "\u0293\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000\u0000\u0293"+ + "\u0295\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000\u0295"+ + "\u0296\u0005\"\u0000\u0000\u0296\u0297\u0005\"\u0000\u0000\u0297\u0298"+ + "\u0005\"\u0000\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u029b\u0005"+ + "\"\u0000\u0000\u029a\u0299\u0001\u0000\u0000\u0000\u029a\u029b\u0001\u0000"+ + "\u0000\u0000\u029b\u029d\u0001\u0000\u0000\u0000\u029c\u029e\u0005\"\u0000"+ + "\u0000\u029d\u029c\u0001\u0000\u0000\u0000\u029d\u029e\u0001\u0000\u0000"+ + "\u0000\u029e\u02a0\u0001\u0000\u0000\u0000\u029f\u0282\u0001\u0000\u0000"+ + "\u0000\u029f\u028b\u0001\u0000\u0000\u0000\u02a0T\u0001\u0000\u0000\u0000"+ + "\u02a1\u02a3\u0003?\u0018\u0000\u02a2\u02a1\u0001\u0000\u0000\u0000\u02a3"+ + "\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4"+ + "\u02a5\u0001\u0000\u0000\u0000\u02a5V\u0001\u0000\u0000\u0000\u02a6\u02a8"+ + "\u0003?\u0018\u0000\u02a7\u02a6\u0001\u0000\u0000\u0000\u02a8\u02a9\u0001"+ + "\u0000\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000\u02a9\u02aa\u0001"+ + "\u0000\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02af\u0003"+ + "g,\u0000\u02ac\u02ae\u0003?\u0018\u0000\u02ad\u02ac\u0001\u0000\u0000"+ + "\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000"+ + "\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02d1\u0001\u0000\u0000"+ + "\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b4\u0003g,\u0000\u02b3"+ + "\u02b5\u0003?\u0018\u0000\u02b4\u02b3\u0001\u0000\u0000\u0000\u02b5\u02b6"+ + "\u0001\u0000\u0000\u0000\u02b6\u02b4\u0001\u0000\u0000\u0000\u02b6\u02b7"+ + "\u0001\u0000\u0000\u0000\u02b7\u02d1\u0001\u0000\u0000\u0000\u02b8\u02ba"+ + "\u0003?\u0018\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02ba\u02bb\u0001"+ + "\u0000\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000\u0000\u02bb\u02bc\u0001"+ + "\u0000\u0000\u0000\u02bc\u02c4\u0001\u0000\u0000\u0000\u02bd\u02c1\u0003"+ + "g,\u0000\u02be\u02c0\u0003?\u0018\u0000\u02bf\u02be\u0001\u0000\u0000"+ + "\u0000\u02c0\u02c3\u0001\u0000\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000"+ + "\u0000\u02c1\u02c2\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000"+ + "\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c4\u02bd\u0001\u0000\u0000"+ + "\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000"+ + "\u0000\u02c6\u02c7\u0003G\u001c\u0000\u02c7\u02d1\u0001\u0000\u0000\u0000"+ + "\u02c8\u02ca\u0003g,\u0000\u02c9\u02cb\u0003?\u0018\u0000\u02ca\u02c9"+ + "\u0001\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02ca"+ + "\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce"+ + "\u0001\u0000\u0000\u0000\u02ce\u02cf\u0003G\u001c\u0000\u02cf\u02d1\u0001"+ + "\u0000\u0000\u0000\u02d0\u02a7\u0001\u0000\u0000\u0000\u02d0\u02b2\u0001"+ + "\u0000\u0000\u0000\u02d0\u02b9\u0001\u0000\u0000\u0000\u02d0\u02c8\u0001"+ + "\u0000\u0000\u0000\u02d1X\u0001\u0000\u0000\u0000\u02d2\u02d3\u0007\u001e"+ + "\u0000\u0000\u02d3\u02d4\u0007\u001f\u0000\u0000\u02d4Z\u0001\u0000\u0000"+ + "\u0000\u02d5\u02d6\u0007\f\u0000\u0000\u02d6\u02d7\u0007\t\u0000\u0000"+ + "\u02d7\u02d8\u0007\u0000\u0000\u0000\u02d8\\\u0001\u0000\u0000\u0000\u02d9"+ + "\u02da\u0007\f\u0000\u0000\u02da\u02db\u0007\u0002\u0000\u0000\u02db\u02dc"+ + "\u0007\u0004\u0000\u0000\u02dc^\u0001\u0000\u0000\u0000\u02dd\u02de\u0005"+ + "=\u0000\u0000\u02de`\u0001\u0000\u0000\u0000\u02df\u02e0\u0005:\u0000"+ + "\u0000\u02e0\u02e1\u0005:\u0000\u0000\u02e1b\u0001\u0000\u0000\u0000\u02e2"+ + "\u02e3\u0005,\u0000\u0000\u02e3d\u0001\u0000\u0000\u0000\u02e4\u02e5\u0007"+ + "\u0000\u0000\u0000\u02e5\u02e6\u0007\u0003\u0000\u0000\u02e6\u02e7\u0007"+ + "\u0002\u0000\u0000\u02e7\u02e8\u0007\u0004\u0000\u0000\u02e8f\u0001\u0000"+ + "\u0000\u0000\u02e9\u02ea\u0005.\u0000\u0000\u02eah\u0001\u0000\u0000\u0000"+ + "\u02eb\u02ec\u0007\u000f\u0000\u0000\u02ec\u02ed\u0007\f\u0000\u0000\u02ed"+ + "\u02ee\u0007\r\u0000\u0000\u02ee\u02ef\u0007\u0002\u0000\u0000\u02ef\u02f0"+ + "\u0007\u0003\u0000\u0000\u02f0j\u0001\u0000\u0000\u0000\u02f1\u02f2\u0007"+ + "\u000f\u0000\u0000\u02f2\u02f3\u0007\u0001\u0000\u0000\u02f3\u02f4\u0007"+ + "\u0006\u0000\u0000\u02f4\u02f5\u0007\u0002\u0000\u0000\u02f5\u02f6\u0007"+ + "\u0005\u0000\u0000\u02f6l\u0001\u0000\u0000\u0000\u02f7\u02f8\u0007\u0001"+ + "\u0000\u0000\u02f8\u02f9\u0007\t\u0000\u0000\u02f9n\u0001\u0000\u0000"+ + "\u0000\u02fa\u02fb\u0007\u0001\u0000\u0000\u02fb\u02fc\u0007\u0002\u0000"+ + "\u0000\u02fcp\u0001\u0000\u0000\u0000\u02fd\u02fe\u0007\r\u0000\u0000"+ + "\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0002\u0000\u0000\u0300"+ + "\u0301\u0007\u0005\u0000\u0000\u0301r\u0001\u0000\u0000\u0000\u0302\u0303"+ + "\u0007\r\u0000\u0000\u0303\u0304\u0007\u0001\u0000\u0000\u0304\u0305\u0007"+ + "\u0012\u0000\u0000\u0305\u0306\u0007\u0003\u0000\u0000\u0306t\u0001\u0000"+ + "\u0000\u0000\u0307\u0308\u0005(\u0000\u0000\u0308v\u0001\u0000\u0000\u0000"+ + "\u0309\u030a\u0007\t\u0000\u0000\u030a\u030b\u0007\u0007\u0000\u0000\u030b"+ + "\u030c\u0007\u0005\u0000\u0000\u030cx\u0001\u0000\u0000\u0000\u030d\u030e"+ + "\u0007\t\u0000\u0000\u030e\u030f\u0007\u0014\u0000\u0000\u030f\u0310\u0007"+ + "\r\u0000\u0000\u0310\u0311\u0007\r\u0000\u0000\u0311z\u0001\u0000\u0000"+ + "\u0000\u0312\u0313\u0007\t\u0000\u0000\u0313\u0314\u0007\u0014\u0000\u0000"+ + "\u0314\u0315\u0007\r\u0000\u0000\u0315\u0316\u0007\r\u0000\u0000\u0316"+ + "\u0317\u0007\u0002\u0000\u0000\u0317|\u0001\u0000\u0000\u0000\u0318\u0319"+ + "\u0007\u0007\u0000\u0000\u0319\u031a\u0007\u0006\u0000\u0000\u031a~\u0001"+ + "\u0000\u0000\u0000\u031b\u031c\u0005?\u0000\u0000\u031c\u0080\u0001\u0000"+ + "\u0000\u0000\u031d\u031e\u0007\u0006\u0000\u0000\u031e\u031f\u0007\r\u0000"+ + "\u0000\u031f\u0320\u0007\u0001\u0000\u0000\u0320\u0321\u0007\u0012\u0000"+ + "\u0000\u0321\u0322\u0007\u0003\u0000\u0000\u0322\u0082\u0001\u0000\u0000"+ + "\u0000\u0323\u0324\u0005)\u0000\u0000\u0324\u0084\u0001\u0000\u0000\u0000"+ + "\u0325\u0326\u0007\u0005\u0000\u0000\u0326\u0327\u0007\u0006\u0000\u0000"+ + "\u0327\u0328\u0007\u0014\u0000\u0000\u0328\u0329\u0007\u0003\u0000\u0000"+ + "\u0329\u0086\u0001\u0000\u0000\u0000\u032a\u032b\u0005=\u0000\u0000\u032b"+ + "\u032c\u0005=\u0000\u0000\u032c\u0088\u0001\u0000\u0000\u0000\u032d\u032e"+ + "\u0005=\u0000\u0000\u032e\u032f\u0005~\u0000\u0000\u032f\u008a\u0001\u0000"+ + "\u0000\u0000\u0330\u0331\u0005!\u0000\u0000\u0331\u0332\u0005=\u0000\u0000"+ + "\u0332\u008c\u0001\u0000\u0000\u0000\u0333\u0334\u0005<\u0000\u0000\u0334"+ + "\u008e\u0001\u0000\u0000\u0000\u0335\u0336\u0005<\u0000\u0000\u0336\u0337"+ + "\u0005=\u0000\u0000\u0337\u0090\u0001\u0000\u0000\u0000\u0338\u0339\u0005"+ + ">\u0000\u0000\u0339\u0092\u0001\u0000\u0000\u0000\u033a\u033b\u0005>\u0000"+ + "\u0000\u033b\u033c\u0005=\u0000\u0000\u033c\u0094\u0001\u0000\u0000\u0000"+ + "\u033d\u033e\u0005+\u0000\u0000\u033e\u0096\u0001\u0000\u0000\u0000\u033f"+ + "\u0340\u0005-\u0000\u0000\u0340\u0098\u0001\u0000\u0000\u0000\u0341\u0342"+ + "\u0005*\u0000\u0000\u0342\u009a\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ + "/\u0000\u0000\u0344\u009c\u0001\u0000\u0000\u0000\u0345\u0346\u0005%\u0000"+ + "\u0000\u0346\u009e\u0001\u0000\u0000\u0000\u0347\u0348\u0004H\u0003\u0000"+ + "\u0348\u0349\u0007\u0010\u0000\u0000\u0349\u034a\u0007\f\u0000\u0000\u034a"+ + "\u034b\u0007\u0005\u0000\u0000\u034b\u034c\u0007\u0004\u0000\u0000\u034c"+ + "\u034d\u0007\n\u0000\u0000\u034d\u00a0\u0001\u0000\u0000\u0000\u034e\u0351"+ + "\u0003\u007f8\u0000\u034f\u0352\u0003A\u0019\u0000\u0350\u0352\u0003O"+ + " \u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0350\u0001\u0000\u0000"+ + "\u0000\u0352\u0356\u0001\u0000\u0000\u0000\u0353\u0355\u0003Q!\u0000\u0354"+ + "\u0353\u0001\u0000\u0000\u0000\u0355\u0358\u0001\u0000\u0000\u0000\u0356"+ + "\u0354\u0001\u0000\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000\u0357"+ + "\u0360\u0001\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0359"+ + "\u035b\u0003\u007f8\u0000\u035a\u035c\u0003?\u0018\u0000\u035b\u035a\u0001"+ + "\u0000\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035b\u0001"+ + "\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e\u0360\u0001"+ + "\u0000\u0000\u0000\u035f\u034e\u0001\u0000\u0000\u0000\u035f\u0359\u0001"+ + "\u0000\u0000\u0000\u0360\u00a2\u0001\u0000\u0000\u0000\u0361\u0362\u0005"+ + "[\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000\u0363\u0364\u0006J\u0000"+ + "\u0000\u0364\u0365\u0006J\u0000\u0000\u0365\u00a4\u0001\u0000\u0000\u0000"+ + "\u0366\u0367\u0005]\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368"+ + "\u0369\u0006K\u000b\u0000\u0369\u036a\u0006K\u000b\u0000\u036a\u00a6\u0001"+ + "\u0000\u0000\u0000\u036b\u036f\u0003A\u0019\u0000\u036c\u036e\u0003Q!"+ + "\u0000\u036d\u036c\u0001\u0000\u0000\u0000\u036e\u0371\u0001\u0000\u0000"+ + "\u0000\u036f\u036d\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000"+ + "\u0000\u0370\u037c\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000"+ + "\u0000\u0372\u0375\u0003O \u0000\u0373\u0375\u0003I\u001d\u0000\u0374"+ + "\u0372\u0001\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375"+ + "\u0377\u0001\u0000\u0000\u0000\u0376\u0378\u0003Q!\u0000\u0377\u0376\u0001"+ + "\u0000\u0000\u0000\u0378\u0379\u0001\u0000\u0000\u0000\u0379\u0377\u0001"+ + "\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u037c\u0001"+ + "\u0000\u0000\u0000\u037b\u036b\u0001\u0000\u0000\u0000\u037b\u0374\u0001"+ + "\u0000\u0000\u0000\u037c\u00a8\u0001\u0000\u0000\u0000\u037d\u037f\u0003"+ + "K\u001e\u0000\u037e\u0380\u0003M\u001f\u0000\u037f\u037e\u0001\u0000\u0000"+ + "\u0000\u0380\u0381\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000"+ + "\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0001\u0000\u0000"+ + "\u0000\u0383\u0384\u0003K\u001e\u0000\u0384\u00aa\u0001\u0000\u0000\u0000"+ + "\u0385\u0386\u0003\u00a9M\u0000\u0386\u00ac\u0001\u0000\u0000\u0000\u0387"+ + "\u0388\u00037\u0014\u0000\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a"+ + "\u0006O\n\u0000\u038a\u00ae\u0001\u0000\u0000\u0000\u038b\u038c\u0003"+ + "9\u0015\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038e\u0006P\n"+ + "\u0000\u038e\u00b0\u0001\u0000\u0000\u0000\u038f\u0390\u0003;\u0016\u0000"+ + "\u0390\u0391\u0001\u0000\u0000\u0000\u0391\u0392\u0006Q\n\u0000\u0392"+ + "\u00b2\u0001\u0000\u0000\u0000\u0393\u0394\u0003\u00a3J\u0000\u0394\u0395"+ + "\u0001\u0000\u0000\u0000\u0395\u0396\u0006R\f\u0000\u0396\u0397\u0006"+ + "R\r\u0000\u0397\u00b4\u0001\u0000\u0000\u0000\u0398\u0399\u0003=\u0017"+ + "\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u039b\u0006S\u000e\u0000"+ + "\u039b\u039c\u0006S\u000b\u0000\u039c\u00b6\u0001\u0000\u0000\u0000\u039d"+ + "\u039e\u0003;\u0016\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0"+ + "\u0006T\n\u0000\u03a0\u00b8\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003"+ + "7\u0014\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0006U\n"+ + "\u0000\u03a4\u00ba\u0001\u0000\u0000\u0000\u03a5\u03a6\u00039\u0015\u0000"+ + "\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u03a8\u0006V\n\u0000\u03a8"+ + "\u00bc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0003=\u0017\u0000\u03aa\u03ab"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0006W\u000e\u0000\u03ac\u03ad\u0006"+ + "W\u000b\u0000\u03ad\u00be\u0001\u0000\u0000\u0000\u03ae\u03af\u0003\u00a3"+ + "J\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0006X\f\u0000"+ + "\u03b1\u00c0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0003\u00a5K\u0000\u03b3"+ + "\u03b4\u0001\u0000\u0000\u0000\u03b4\u03b5\u0006Y\u000f\u0000\u03b5\u00c2"+ + "\u0001\u0000\u0000\u0000\u03b6\u03b7\u0003\u013f\u0098\u0000\u03b7\u03b8"+ + "\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006Z\u0010\u0000\u03b9\u00c4\u0001"+ + "\u0000\u0000\u0000\u03ba\u03bb\u0003c*\u0000\u03bb\u03bc\u0001\u0000\u0000"+ + "\u0000\u03bc\u03bd\u0006[\u0011\u0000\u03bd\u00c6\u0001\u0000\u0000\u0000"+ + "\u03be\u03bf\u0003_(\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1"+ + "\u0006\\\u0012\u0000\u03c1\u00c8\u0001\u0000\u0000\u0000\u03c2\u03c3\u0007"+ + "\u0010\u0000\u0000\u03c3\u03c4\u0007\u0003\u0000\u0000\u03c4\u03c5\u0007"+ + "\u0005\u0000\u0000\u03c5\u03c6\u0007\f\u0000\u0000\u03c6\u03c7\u0007\u0000"+ + "\u0000\u0000\u03c7\u03c8\u0007\f\u0000\u0000\u03c8\u03c9\u0007\u0005\u0000"+ + "\u0000\u03c9\u03ca\u0007\f\u0000\u0000\u03ca\u00ca\u0001\u0000\u0000\u0000"+ + "\u03cb\u03cf\b \u0000\u0000\u03cc\u03cd\u0005/\u0000\u0000\u03cd\u03cf"+ + "\b!\u0000\u0000\u03ce\u03cb\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001"+ + "\u0000\u0000\u0000\u03cf\u00cc\u0001\u0000\u0000\u0000\u03d0\u03d2\u0003"+ + "\u00cb^\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000"+ + "\u0000\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001\u0000"+ + "\u0000\u0000\u03d4\u00ce\u0001\u0000\u0000\u0000\u03d5\u03d6\u0003\u00cd"+ + "_\u0000\u03d6\u03d7\u0001\u0000\u0000\u0000\u03d7\u03d8\u0006`\u0013\u0000"+ + "\u03d8\u00d0\u0001\u0000\u0000\u0000\u03d9\u03da\u0003S\"\u0000\u03da"+ + "\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0006a\u0014\u0000\u03dc\u00d2"+ + "\u0001\u0000\u0000\u0000\u03dd\u03de\u00037\u0014\u0000\u03de\u03df\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0006b\n\u0000\u03e0\u00d4\u0001\u0000"+ + "\u0000\u0000\u03e1\u03e2\u00039\u0015\u0000\u03e2\u03e3\u0001\u0000\u0000"+ + "\u0000\u03e3\u03e4\u0006c\n\u0000\u03e4\u00d6\u0001\u0000\u0000\u0000"+ + "\u03e5\u03e6\u0003;\u0016\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7"+ + "\u03e8\u0006d\n\u0000\u03e8\u00d8\u0001\u0000\u0000\u0000\u03e9\u03ea"+ + "\u0003=\u0017\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0006"+ + "e\u000e\u0000\u03ec\u03ed\u0006e\u000b\u0000\u03ed\u00da\u0001\u0000\u0000"+ + "\u0000\u03ee\u03ef\u0003g,\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0"+ + "\u03f1\u0006f\u0015\u0000\u03f1\u00dc\u0001\u0000\u0000\u0000\u03f2\u03f3"+ + "\u0003c*\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006g"+ + "\u0011\u0000\u03f5\u00de\u0001\u0000\u0000\u0000\u03f6\u03fb\u0003A\u0019"+ + "\u0000\u03f7\u03fb\u0003?\u0018\u0000\u03f8\u03fb\u0003O \u0000\u03f9"+ + "\u03fb\u0003\u0099E\u0000\u03fa\u03f6\u0001\u0000\u0000\u0000\u03fa\u03f7"+ + "\u0001\u0000\u0000\u0000\u03fa\u03f8\u0001\u0000\u0000\u0000\u03fa\u03f9"+ + "\u0001\u0000\u0000\u0000\u03fb\u00e0\u0001\u0000\u0000\u0000\u03fc\u03ff"+ + "\u0003A\u0019\u0000\u03fd\u03ff\u0003\u0099E\u0000\u03fe\u03fc\u0001\u0000"+ + "\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0403\u0001\u0000"+ + "\u0000\u0000\u0400\u0402\u0003\u00dfh\u0000\u0401\u0400\u0001\u0000\u0000"+ + "\u0000\u0402\u0405\u0001\u0000\u0000\u0000\u0403\u0401\u0001\u0000\u0000"+ + "\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0410\u0001\u0000\u0000"+ + "\u0000\u0405\u0403\u0001\u0000\u0000\u0000\u0406\u0409\u0003O \u0000\u0407"+ + "\u0409\u0003I\u001d\u0000\u0408\u0406\u0001\u0000\u0000\u0000\u0408\u0407"+ + "\u0001\u0000\u0000\u0000\u0409\u040b\u0001\u0000\u0000\u0000\u040a\u040c"+ + "\u0003\u00dfh\u0000\u040b\u040a\u0001\u0000\u0000\u0000\u040c\u040d\u0001"+ + "\u0000\u0000\u0000\u040d\u040b\u0001\u0000\u0000\u0000\u040d\u040e\u0001"+ + "\u0000\u0000\u0000\u040e\u0410\u0001\u0000\u0000\u0000\u040f\u03fe\u0001"+ + "\u0000\u0000\u0000\u040f\u0408\u0001\u0000\u0000\u0000\u0410\u00e2\u0001"+ + "\u0000\u0000\u0000\u0411\u0414\u0003\u00e1i\u0000\u0412\u0414\u0003\u00a9"+ + "M\u0000\u0413\u0411\u0001\u0000\u0000\u0000\u0413\u0412\u0001\u0000\u0000"+ + "\u0000\u0414\u0415\u0001\u0000\u0000\u0000\u0415\u0413\u0001\u0000\u0000"+ + "\u0000\u0415\u0416\u0001\u0000\u0000\u0000\u0416\u00e4\u0001\u0000\u0000"+ + "\u0000\u0417\u0418\u00037\u0014\u0000\u0418\u0419\u0001\u0000\u0000\u0000"+ + "\u0419\u041a\u0006k\n\u0000\u041a\u00e6\u0001\u0000\u0000\u0000\u041b"+ + "\u041c\u00039\u0015\u0000\u041c\u041d\u0001\u0000\u0000\u0000\u041d\u041e"+ + "\u0006l\n\u0000\u041e\u00e8\u0001\u0000\u0000\u0000\u041f\u0420\u0003"+ + ";\u0016\u0000\u0420\u0421\u0001\u0000\u0000\u0000\u0421\u0422\u0006m\n"+ + "\u0000\u0422\u00ea\u0001\u0000\u0000\u0000\u0423\u0424\u0003=\u0017\u0000"+ + "\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0426\u0006n\u000e\u0000\u0426"+ + "\u0427\u0006n\u000b\u0000\u0427\u00ec\u0001\u0000\u0000\u0000\u0428\u0429"+ + "\u0003_(\u0000\u0429\u042a\u0001\u0000\u0000\u0000\u042a\u042b\u0006o"+ + "\u0012\u0000\u042b\u00ee\u0001\u0000\u0000\u0000\u042c\u042d\u0003c*\u0000"+ + "\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u042f\u0006p\u0011\u0000\u042f"+ + "\u00f0\u0001\u0000\u0000\u0000\u0430\u0431\u0003g,\u0000\u0431\u0432\u0001"+ + "\u0000\u0000\u0000\u0432\u0433\u0006q\u0015\u0000\u0433\u00f2\u0001\u0000"+ + "\u0000\u0000\u0434\u0435\u0007\f\u0000\u0000\u0435\u0436\u0007\u0002\u0000"+ + "\u0000\u0436\u00f4\u0001\u0000\u0000\u0000\u0437\u0438\u0003\u00e3j\u0000"+ + "\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0006s\u0016\u0000\u043a"+ + "\u00f6\u0001\u0000\u0000\u0000\u043b\u043c\u00037\u0014\u0000\u043c\u043d"+ + "\u0001\u0000\u0000\u0000\u043d\u043e\u0006t\n\u0000\u043e\u00f8\u0001"+ + "\u0000\u0000\u0000\u043f\u0440\u00039\u0015\u0000\u0440\u0441\u0001\u0000"+ + "\u0000\u0000\u0441\u0442\u0006u\n\u0000\u0442\u00fa\u0001\u0000\u0000"+ + "\u0000\u0443\u0444\u0003;\u0016\u0000\u0444\u0445\u0001\u0000\u0000\u0000"+ + "\u0445\u0446\u0006v\n\u0000\u0446\u00fc\u0001\u0000\u0000\u0000\u0447"+ + "\u0448\u0003=\u0017\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a"+ + "\u0006w\u000e\u0000\u044a\u044b\u0006w\u000b\u0000\u044b\u00fe\u0001\u0000"+ + "\u0000\u0000\u044c\u044d\u0003\u00a3J\u0000\u044d\u044e\u0001\u0000\u0000"+ + "\u0000\u044e\u044f\u0006x\f\u0000\u044f\u0450\u0006x\u0017\u0000\u0450"+ + "\u0100\u0001\u0000\u0000\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452"+ + "\u0453\u0007\t\u0000\u0000\u0453\u0454\u0001\u0000\u0000\u0000\u0454\u0455"+ + "\u0006y\u0018\u0000\u0455\u0102\u0001\u0000\u0000\u0000\u0456\u0457\u0007"+ + "\u0013\u0000\u0000\u0457\u0458\u0007\u0001\u0000\u0000\u0458\u0459\u0007"+ + "\u0005\u0000\u0000\u0459\u045a\u0007\n\u0000\u0000\u045a\u045b\u0001\u0000"+ + "\u0000\u0000\u045b\u045c\u0006z\u0018\u0000\u045c\u0104\u0001\u0000\u0000"+ + "\u0000\u045d\u045e\b\"\u0000\u0000\u045e\u0106\u0001\u0000\u0000\u0000"+ + "\u045f\u0461\u0003\u0105{\u0000\u0460\u045f\u0001\u0000\u0000\u0000\u0461"+ + "\u0462\u0001\u0000\u0000\u0000\u0462\u0460\u0001\u0000\u0000\u0000\u0462"+ + "\u0463\u0001\u0000\u0000\u0000\u0463\u0464\u0001\u0000\u0000\u0000\u0464"+ + "\u0465\u0003\u013f\u0098\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466"+ + "\u0460\u0001\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467"+ + "\u0469\u0001\u0000\u0000\u0000\u0468\u046a\u0003\u0105{\u0000\u0469\u0468"+ + "\u0001\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u0469"+ + "\u0001\u0000\u0000\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u0108"+ + "\u0001\u0000\u0000\u0000\u046d\u046e\u0003\u0107|\u0000\u046e\u046f\u0001"+ + "\u0000\u0000\u0000\u046f\u0470\u0006}\u0019\u0000\u0470\u010a\u0001\u0000"+ + "\u0000\u0000\u0471\u0472\u00037\u0014\u0000\u0472\u0473\u0001\u0000\u0000"+ + "\u0000\u0473\u0474\u0006~\n\u0000\u0474\u010c\u0001\u0000\u0000\u0000"+ + "\u0475\u0476\u00039\u0015\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477"+ + "\u0478\u0006\u007f\n\u0000\u0478\u010e\u0001\u0000\u0000\u0000\u0479\u047a"+ + "\u0003;\u0016\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047c\u0006"+ + "\u0080\n\u0000\u047c\u0110\u0001\u0000\u0000\u0000\u047d\u047e\u0003="+ + "\u0017\u0000\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u0480\u0006\u0081"+ + "\u000e\u0000\u0480\u0481\u0006\u0081\u000b\u0000\u0481\u0482\u0006\u0081"+ + "\u000b\u0000\u0482\u0112\u0001\u0000\u0000\u0000\u0483\u0484\u0003_(\u0000"+ + "\u0484\u0485\u0001\u0000\u0000\u0000\u0485\u0486\u0006\u0082\u0012\u0000"+ + "\u0486\u0114\u0001\u0000\u0000\u0000\u0487\u0488\u0003c*\u0000\u0488\u0489"+ + "\u0001\u0000\u0000\u0000\u0489\u048a\u0006\u0083\u0011\u0000\u048a\u0116"+ + "\u0001\u0000\u0000\u0000\u048b\u048c\u0003g,\u0000\u048c\u048d\u0001\u0000"+ + "\u0000\u0000\u048d\u048e\u0006\u0084\u0015\u0000\u048e\u0118\u0001\u0000"+ + "\u0000\u0000\u048f\u0490\u0003\u0103z\u0000\u0490\u0491\u0001\u0000\u0000"+ + "\u0000\u0491\u0492\u0006\u0085\u001a\u0000\u0492\u011a\u0001\u0000\u0000"+ + "\u0000\u0493\u0494\u0003\u00e3j\u0000\u0494\u0495\u0001\u0000\u0000\u0000"+ + "\u0495\u0496\u0006\u0086\u0016\u0000\u0496\u011c\u0001\u0000\u0000\u0000"+ + "\u0497\u0498\u0003\u00abN\u0000\u0498\u0499\u0001\u0000\u0000\u0000\u0499"+ + "\u049a\u0006\u0087\u001b\u0000\u049a\u011e\u0001\u0000\u0000\u0000\u049b"+ + "\u049c\u00037\u0014\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e"+ + "\u0006\u0088\n\u0000\u049e\u0120\u0001\u0000\u0000\u0000\u049f\u04a0\u0003"+ + "9\u0015\u0000\u04a0\u04a1\u0001\u0000\u0000\u0000\u04a1\u04a2\u0006\u0089"+ + "\n\u0000\u04a2\u0122\u0001\u0000\u0000\u0000\u04a3\u04a4\u0003;\u0016"+ + "\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5\u04a6\u0006\u008a\n\u0000"+ + "\u04a6\u0124\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003=\u0017\u0000\u04a8"+ + "\u04a9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0006\u008b\u000e\u0000\u04aa"+ + "\u04ab\u0006\u008b\u000b\u0000\u04ab\u0126\u0001\u0000\u0000\u0000\u04ac"+ + "\u04ad\u0003g,\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04af\u0006"+ + "\u008c\u0015\u0000\u04af\u0128\u0001\u0000\u0000\u0000\u04b0\u04b1\u0003"+ + "\u00abN\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0006\u008d"+ + "\u001b\u0000\u04b3\u012a\u0001\u0000\u0000\u0000\u04b4\u04b5\u0003\u00a7"+ + "L\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7\u0006\u008e\u001c"+ + "\u0000\u04b7\u012c\u0001\u0000\u0000\u0000\u04b8\u04b9\u00037\u0014\u0000"+ + "\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006\u008f\n\u0000\u04bb"+ + "\u012e\u0001\u0000\u0000\u0000\u04bc\u04bd\u00039\u0015\u0000\u04bd\u04be"+ + "\u0001\u0000\u0000\u0000\u04be\u04bf\u0006\u0090\n\u0000\u04bf\u0130\u0001"+ + "\u0000\u0000\u0000\u04c0\u04c1\u0003;\u0016\u0000\u04c1\u04c2\u0001\u0000"+ + "\u0000\u0000\u04c2\u04c3\u0006\u0091\n\u0000\u04c3\u0132\u0001\u0000\u0000"+ + "\u0000\u04c4\u04c5\u0003=\u0017\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000"+ + "\u04c6\u04c7\u0006\u0092\u000e\u0000\u04c7\u04c8\u0006\u0092\u000b\u0000"+ + "\u04c8\u0134\u0001\u0000\u0000\u0000\u04c9\u04ca\u0007\u0001\u0000\u0000"+ + "\u04ca\u04cb\u0007\t\u0000\u0000\u04cb\u04cc\u0007\u000f\u0000\u0000\u04cc"+ + "\u04cd\u0007\u0007\u0000\u0000\u04cd\u0136\u0001\u0000\u0000\u0000\u04ce"+ + "\u04cf\u00037\u0014\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d1"+ + "\u0006\u0094\n\u0000\u04d1\u0138\u0001\u0000\u0000\u0000\u04d2\u04d3\u0003"+ + "9\u0015\u0000\u04d3\u04d4\u0001\u0000\u0000\u0000\u04d4\u04d5\u0006\u0095"+ + "\n\u0000\u04d5\u013a\u0001\u0000\u0000\u0000\u04d6\u04d7\u0003;\u0016"+ + "\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0006\u0096\n\u0000"+ + "\u04d9\u013c\u0001\u0000\u0000\u0000\u04da\u04db\u0003\u00a5K\u0000\u04db"+ + "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04dd\u0006\u0097\u000f\u0000\u04dd"+ + "\u04de\u0006\u0097\u000b\u0000\u04de\u013e\u0001\u0000\u0000\u0000\u04df"+ + "\u04e0\u0005:\u0000\u0000\u04e0\u0140\u0001\u0000\u0000\u0000\u04e1\u04e7"+ + "\u0003I\u001d\u0000\u04e2\u04e7\u0003?\u0018\u0000\u04e3\u04e7\u0003g"+ + ",\u0000\u04e4\u04e7\u0003A\u0019\u0000\u04e5\u04e7\u0003O \u0000\u04e6"+ + "\u04e1\u0001\u0000\u0000\u0000\u04e6\u04e2\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e4\u0001\u0000\u0000\u0000\u04e6"+ + "\u04e5\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8"+ + "\u04e6\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9"+ + "\u0142\u0001\u0000\u0000\u0000\u04ea\u04eb\u00037\u0014\u0000\u04eb\u04ec"+ + "\u0001\u0000\u0000\u0000\u04ec\u04ed\u0006\u009a\n\u0000\u04ed\u0144\u0001"+ + "\u0000\u0000\u0000\u04ee\u04ef\u00039\u0015\u0000\u04ef\u04f0\u0001\u0000"+ + "\u0000\u0000\u04f0\u04f1\u0006\u009b\n\u0000\u04f1\u0146\u0001\u0000\u0000"+ + "\u0000\u04f2\u04f3\u0003;\u0016\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000"+ + "\u04f4\u04f5\u0006\u009c\n\u0000\u04f5\u0148\u0001\u0000\u0000\u0000\u04f6"+ + "\u04f7\u0003=\u0017\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04f9"+ + "\u0006\u009d\u000e\u0000\u04f9\u04fa\u0006\u009d\u000b\u0000\u04fa\u014a"+ + "\u0001\u0000\u0000\u0000\u04fb\u04fc\u0003\u013f\u0098\u0000\u04fc\u04fd"+ + "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0006\u009e\u0010\u0000\u04fe\u014c"+ + "\u0001\u0000\u0000\u0000\u04ff\u0500\u0003c*\u0000\u0500\u0501\u0001\u0000"+ + "\u0000\u0000\u0501\u0502\u0006\u009f\u0011\u0000\u0502\u014e\u0001\u0000"+ + "\u0000\u0000\u0503\u0504\u0003g,\u0000\u0504\u0505\u0001\u0000\u0000\u0000"+ + "\u0505\u0506\u0006\u00a0\u0015\u0000\u0506\u0150\u0001\u0000\u0000\u0000"+ + "\u0507\u0508\u0003\u0101y\u0000\u0508\u0509\u0001\u0000\u0000\u0000\u0509"+ + "\u050a\u0006\u00a1\u001d\u0000\u050a\u050b\u0006\u00a1\u001e\u0000\u050b"+ + "\u0152\u0001\u0000\u0000\u0000\u050c\u050d\u0003\u00cd_\u0000\u050d\u050e"+ + "\u0001\u0000\u0000\u0000\u050e\u050f\u0006\u00a2\u0013\u0000\u050f\u0154"+ + "\u0001\u0000\u0000\u0000\u0510\u0511\u0003S\"\u0000\u0511\u0512\u0001"+ + "\u0000\u0000\u0000\u0512\u0513\u0006\u00a3\u0014\u0000\u0513\u0156\u0001"+ + "\u0000\u0000\u0000\u0514\u0515\u00037\u0014\u0000\u0515\u0516\u0001\u0000"+ + "\u0000\u0000\u0516\u0517\u0006\u00a4\n\u0000\u0517\u0158\u0001\u0000\u0000"+ + "\u0000\u0518\u0519\u00039\u0015\u0000\u0519\u051a\u0001\u0000\u0000\u0000"+ + "\u051a\u051b\u0006\u00a5\n\u0000\u051b\u015a\u0001\u0000\u0000\u0000\u051c"+ + "\u051d\u0003;\u0016\u0000\u051d\u051e\u0001\u0000\u0000\u0000\u051e\u051f"+ + "\u0006\u00a6\n\u0000\u051f\u015c\u0001\u0000\u0000\u0000\u0520\u0521\u0003"+ + "=\u0017\u0000\u0521\u0522\u0001\u0000\u0000\u0000\u0522\u0523\u0006\u00a7"+ + "\u000e\u0000\u0523\u0524\u0006\u00a7\u000b\u0000\u0524\u0525\u0006\u00a7"+ + "\u000b\u0000\u0525\u015e\u0001\u0000\u0000\u0000\u0526\u0527\u0003c*\u0000"+ + "\u0527\u0528\u0001\u0000\u0000\u0000\u0528\u0529\u0006\u00a8\u0011\u0000"+ + "\u0529\u0160\u0001\u0000\u0000\u0000\u052a\u052b\u0003g,\u0000\u052b\u052c"+ + "\u0001\u0000\u0000\u0000\u052c\u052d\u0006\u00a9\u0015\u0000\u052d\u0162"+ + "\u0001\u0000\u0000\u0000\u052e\u052f\u0003\u00e3j\u0000\u052f\u0530\u0001"+ + "\u0000\u0000\u0000\u0530\u0531\u0006\u00aa\u0016\u0000\u0531\u0164\u0001"+ + "\u0000\u0000\u0000\u0532\u0533\u00037\u0014\u0000\u0533\u0534\u0001\u0000"+ + "\u0000\u0000\u0534\u0535\u0006\u00ab\n\u0000\u0535\u0166\u0001\u0000\u0000"+ + "\u0000\u0536\u0537\u00039\u0015\u0000\u0537\u0538\u0001\u0000\u0000\u0000"+ + "\u0538\u0539\u0006\u00ac\n\u0000\u0539\u0168\u0001\u0000\u0000\u0000\u053a"+ + "\u053b\u0003;\u0016\u0000\u053b\u053c\u0001\u0000\u0000\u0000\u053c\u053d"+ + "\u0006\u00ad\n\u0000\u053d\u016a\u0001\u0000\u0000\u0000\u053e\u053f\u0003"+ + "=\u0017\u0000\u053f\u0540\u0001\u0000\u0000\u0000\u0540\u0541\u0006\u00ae"+ + "\u000e\u0000\u0541\u0542\u0006\u00ae\u000b\u0000\u0542\u016c\u0001\u0000"+ + "\u0000\u0000\u0543\u0544\u0003\u00cd_\u0000\u0544\u0545\u0001\u0000\u0000"+ + "\u0000\u0545\u0546\u0006\u00af\u0013\u0000\u0546\u0547\u0006\u00af\u000b"+ + "\u0000\u0547\u0548\u0006\u00af\u001f\u0000\u0548\u016e\u0001\u0000\u0000"+ + "\u0000\u0549\u054a\u0003S\"\u0000\u054a\u054b\u0001\u0000\u0000\u0000"+ + "\u054b\u054c\u0006\u00b0\u0014\u0000\u054c\u054d\u0006\u00b0\u000b\u0000"+ + "\u054d\u054e\u0006\u00b0\u001f\u0000\u054e\u0170\u0001\u0000\u0000\u0000"+ + "\u054f\u0550\u00037\u0014\u0000\u0550\u0551\u0001\u0000\u0000\u0000\u0551"+ + "\u0552\u0006\u00b1\n\u0000\u0552\u0172\u0001\u0000\u0000\u0000\u0553\u0554"+ + "\u00039\u0015\u0000\u0554\u0555\u0001\u0000\u0000\u0000\u0555\u0556\u0006"+ + "\u00b2\n\u0000\u0556\u0174\u0001\u0000\u0000\u0000\u0557\u0558\u0003;"+ + "\u0016\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055a\u0006\u00b3"+ + "\n\u0000\u055a\u0176\u0001\u0000\u0000\u0000\u055b\u055c\u0003\u013f\u0098"+ + "\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055e\u0006\u00b4\u0010"+ + "\u0000\u055e\u055f\u0006\u00b4\u000b\u0000\u055f\u0560\u0006\u00b4\t\u0000"+ + "\u0560\u0178\u0001\u0000\u0000\u0000\u0561\u0562\u0003c*\u0000\u0562\u0563"+ + "\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u00b5\u0011\u0000\u0564\u0565"+ + "\u0006\u00b5\u000b\u0000\u0565\u0566\u0006\u00b5\t\u0000\u0566\u017a\u0001"+ + "\u0000\u0000\u0000\u0567\u0568\u00037\u0014\u0000\u0568\u0569\u0001\u0000"+ + "\u0000\u0000\u0569\u056a\u0006\u00b6\n\u0000\u056a\u017c\u0001\u0000\u0000"+ + "\u0000\u056b\u056c\u00039\u0015\u0000\u056c\u056d\u0001\u0000\u0000\u0000"+ + "\u056d\u056e\u0006\u00b7\n\u0000\u056e\u017e\u0001\u0000\u0000\u0000\u056f"+ + "\u0570\u0003;\u0016\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572"+ + "\u0006\u00b8\n\u0000\u0572\u0180\u0001\u0000\u0000\u0000\u0573\u0574\u0003"+ + "\u00abN\u0000\u0574\u0575\u0001\u0000\u0000\u0000\u0575\u0576\u0006\u00b9"+ + "\u000b\u0000\u0576\u0577\u0006\u00b9\u0000\u0000\u0577\u0578\u0006\u00b9"+ + "\u001b\u0000\u0578\u0182\u0001\u0000\u0000\u0000\u0579\u057a\u0003\u00a7"+ + "L\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u057c\u0006\u00ba\u000b"+ + "\u0000\u057c\u057d\u0006\u00ba\u0000\u0000\u057d\u057e\u0006\u00ba\u001c"+ + "\u0000\u057e\u0184\u0001\u0000\u0000\u0000\u057f\u0580\u0003Y%\u0000\u0580"+ + "\u0581\u0001\u0000\u0000\u0000\u0581\u0582\u0006\u00bb\u000b\u0000\u0582"+ + "\u0583\u0006\u00bb\u0000\u0000\u0583\u0584\u0006\u00bb \u0000\u0584\u0186"+ + "\u0001\u0000\u0000\u0000\u0585\u0586\u0003=\u0017\u0000\u0586\u0587\u0001"+ + "\u0000\u0000\u0000\u0587\u0588\u0006\u00bc\u000e\u0000\u0588\u0589\u0006"+ + "\u00bc\u000b\u0000\u0589\u0188\u0001\u0000\u0000\u0000A\u0000\u0001\u0002"+ + "\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u0231\u023b\u023f"+ + "\u0242\u024b\u024d\u0258\u026b\u0270\u0279\u0280\u0285\u0287\u0292\u029a"+ + "\u029d\u029f\u02a4\u02a9\u02af\u02b6\u02bb\u02c1\u02c4\u02cc\u02d0\u0351"+ + "\u0356\u035d\u035f\u036f\u0374\u0379\u037b\u0381\u03ce\u03d3\u03fa\u03fe"+ + "\u0403\u0408\u040d\u040f\u0413\u0415\u0462\u0466\u046b\u04e6\u04e8!\u0005"+ + "\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0005"+ + "\u0003\u0000\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005\u000b"+ + "\u0000\u0005\r\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0007A\u0000"+ + "\u0005\u0000\u0000\u0007\u0018\u0000\u0007B\u0000\u0007h\u0000\u0007!"+ + "\u0000\u0007\u001f\u0000\u0007L\u0000\u0007\u0019\u0000\u0007#\u0000\u0007"+ + "P\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007Z\u0000\u0007Y\u0000\u0007"+ + "D\u0000\u0007C\u0000\u0007X\u0000\u0005\f\u0000\u0005\u000e\u0000\u0007"+ + "\u001c\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index ae34d683403fb..b8a3b966fc45b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -23,7 +23,6 @@ null null null null -null '|' null null @@ -65,6 +64,7 @@ null '%' null null +null ']' null null @@ -141,7 +141,6 @@ STATS WHERE DEV_INLINESTATS DEV_LOOKUP -DEV_MATCH DEV_METRICS UNKNOWN_CMD LINE_COMMENT @@ -186,6 +185,7 @@ MINUS ASTERISK SLASH PERCENT +DEV_MATCH NAMED_OR_POSITIONAL_PARAM OPENING_BRACKET CLOSING_BRACKET @@ -257,6 +257,7 @@ valueExpression operatorExpression primaryExpression functionExpression +functionName dataType rowCommand fields @@ -306,4 +307,4 @@ inlinestatsCommand atn: -[4, 1, 120, 572, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 126, 8, 1, 10, 1, 12, 1, 129, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 137, 8, 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, 3, 3, 155, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 167, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 174, 8, 5, 10, 5, 12, 5, 177, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 184, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 190, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 198, 8, 5, 10, 5, 12, 5, 201, 9, 5, 1, 6, 1, 6, 3, 6, 205, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 212, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 217, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 228, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 234, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 242, 8, 9, 10, 9, 12, 9, 245, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 255, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 260, 8, 10, 10, 10, 12, 10, 263, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 271, 8, 11, 10, 11, 12, 11, 274, 9, 11, 3, 11, 276, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 5, 14, 288, 8, 14, 10, 14, 12, 14, 291, 9, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 298, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 304, 8, 16, 10, 16, 12, 16, 307, 9, 16, 1, 16, 3, 16, 310, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 317, 8, 17, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 325, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 331, 8, 21, 10, 21, 12, 21, 334, 9, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 344, 8, 23, 10, 23, 12, 23, 347, 9, 23, 1, 23, 3, 23, 350, 8, 23, 1, 23, 1, 23, 3, 23, 354, 8, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 3, 25, 361, 8, 25, 1, 25, 1, 25, 3, 25, 365, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 370, 8, 26, 10, 26, 12, 26, 373, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 378, 8, 27, 10, 27, 12, 27, 381, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 386, 8, 28, 10, 28, 12, 28, 389, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 408, 8, 31, 10, 31, 12, 31, 411, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 419, 8, 31, 10, 31, 12, 31, 422, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 430, 8, 31, 10, 31, 12, 31, 433, 9, 31, 1, 31, 1, 31, 3, 31, 437, 8, 31, 1, 32, 1, 32, 3, 32, 441, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 450, 8, 34, 10, 34, 12, 34, 453, 9, 34, 1, 35, 1, 35, 3, 35, 457, 8, 35, 1, 35, 1, 35, 3, 35, 461, 8, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 473, 8, 38, 10, 38, 12, 38, 476, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 486, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 5, 43, 498, 8, 43, 10, 43, 12, 43, 501, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 511, 8, 46, 1, 47, 3, 47, 514, 8, 47, 1, 47, 1, 47, 1, 48, 3, 48, 519, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 541, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 547, 8, 54, 10, 54, 12, 54, 550, 9, 54, 3, 54, 552, 8, 54, 1, 55, 1, 55, 1, 55, 3, 55, 557, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 0, 4, 2, 10, 18, 20, 58, 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, 0, 8, 1, 0, 59, 60, 1, 0, 61, 63, 2, 0, 26, 26, 76, 76, 1, 0, 67, 68, 2, 0, 31, 31, 35, 35, 2, 0, 38, 38, 41, 41, 2, 0, 37, 37, 51, 51, 2, 0, 52, 52, 54, 58, 597, 0, 116, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 4, 136, 1, 0, 0, 0, 6, 154, 1, 0, 0, 0, 8, 156, 1, 0, 0, 0, 10, 189, 1, 0, 0, 0, 12, 216, 1, 0, 0, 0, 14, 218, 1, 0, 0, 0, 16, 227, 1, 0, 0, 0, 18, 233, 1, 0, 0, 0, 20, 254, 1, 0, 0, 0, 22, 264, 1, 0, 0, 0, 24, 279, 1, 0, 0, 0, 26, 281, 1, 0, 0, 0, 28, 284, 1, 0, 0, 0, 30, 297, 1, 0, 0, 0, 32, 299, 1, 0, 0, 0, 34, 316, 1, 0, 0, 0, 36, 318, 1, 0, 0, 0, 38, 320, 1, 0, 0, 0, 40, 324, 1, 0, 0, 0, 42, 326, 1, 0, 0, 0, 44, 335, 1, 0, 0, 0, 46, 339, 1, 0, 0, 0, 48, 355, 1, 0, 0, 0, 50, 358, 1, 0, 0, 0, 52, 366, 1, 0, 0, 0, 54, 374, 1, 0, 0, 0, 56, 382, 1, 0, 0, 0, 58, 390, 1, 0, 0, 0, 60, 392, 1, 0, 0, 0, 62, 436, 1, 0, 0, 0, 64, 440, 1, 0, 0, 0, 66, 442, 1, 0, 0, 0, 68, 445, 1, 0, 0, 0, 70, 454, 1, 0, 0, 0, 72, 462, 1, 0, 0, 0, 74, 465, 1, 0, 0, 0, 76, 468, 1, 0, 0, 0, 78, 477, 1, 0, 0, 0, 80, 481, 1, 0, 0, 0, 82, 487, 1, 0, 0, 0, 84, 491, 1, 0, 0, 0, 86, 494, 1, 0, 0, 0, 88, 502, 1, 0, 0, 0, 90, 506, 1, 0, 0, 0, 92, 510, 1, 0, 0, 0, 94, 513, 1, 0, 0, 0, 96, 518, 1, 0, 0, 0, 98, 522, 1, 0, 0, 0, 100, 524, 1, 0, 0, 0, 102, 526, 1, 0, 0, 0, 104, 529, 1, 0, 0, 0, 106, 533, 1, 0, 0, 0, 108, 536, 1, 0, 0, 0, 110, 556, 1, 0, 0, 0, 112, 560, 1, 0, 0, 0, 114, 565, 1, 0, 0, 0, 116, 117, 3, 2, 1, 0, 117, 118, 5, 0, 0, 1, 118, 1, 1, 0, 0, 0, 119, 120, 6, 1, -1, 0, 120, 121, 3, 4, 2, 0, 121, 127, 1, 0, 0, 0, 122, 123, 10, 1, 0, 0, 123, 124, 5, 25, 0, 0, 124, 126, 3, 6, 3, 0, 125, 122, 1, 0, 0, 0, 126, 129, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 3, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 130, 137, 3, 102, 51, 0, 131, 137, 3, 32, 16, 0, 132, 137, 3, 26, 13, 0, 133, 137, 3, 106, 53, 0, 134, 135, 4, 2, 1, 0, 135, 137, 3, 46, 23, 0, 136, 130, 1, 0, 0, 0, 136, 131, 1, 0, 0, 0, 136, 132, 1, 0, 0, 0, 136, 133, 1, 0, 0, 0, 136, 134, 1, 0, 0, 0, 137, 5, 1, 0, 0, 0, 138, 155, 3, 48, 24, 0, 139, 155, 3, 8, 4, 0, 140, 155, 3, 72, 36, 0, 141, 155, 3, 66, 33, 0, 142, 155, 3, 50, 25, 0, 143, 155, 3, 68, 34, 0, 144, 155, 3, 74, 37, 0, 145, 155, 3, 76, 38, 0, 146, 155, 3, 80, 40, 0, 147, 155, 3, 82, 41, 0, 148, 155, 3, 108, 54, 0, 149, 155, 3, 84, 42, 0, 150, 151, 4, 3, 2, 0, 151, 155, 3, 114, 57, 0, 152, 153, 4, 3, 3, 0, 153, 155, 3, 112, 56, 0, 154, 138, 1, 0, 0, 0, 154, 139, 1, 0, 0, 0, 154, 140, 1, 0, 0, 0, 154, 141, 1, 0, 0, 0, 154, 142, 1, 0, 0, 0, 154, 143, 1, 0, 0, 0, 154, 144, 1, 0, 0, 0, 154, 145, 1, 0, 0, 0, 154, 146, 1, 0, 0, 0, 154, 147, 1, 0, 0, 0, 154, 148, 1, 0, 0, 0, 154, 149, 1, 0, 0, 0, 154, 150, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 155, 7, 1, 0, 0, 0, 156, 157, 5, 16, 0, 0, 157, 158, 3, 10, 5, 0, 158, 9, 1, 0, 0, 0, 159, 160, 6, 5, -1, 0, 160, 161, 5, 44, 0, 0, 161, 190, 3, 10, 5, 8, 162, 190, 3, 16, 8, 0, 163, 190, 3, 12, 6, 0, 164, 166, 3, 16, 8, 0, 165, 167, 5, 44, 0, 0, 166, 165, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 169, 5, 39, 0, 0, 169, 170, 5, 43, 0, 0, 170, 175, 3, 16, 8, 0, 171, 172, 5, 34, 0, 0, 172, 174, 3, 16, 8, 0, 173, 171, 1, 0, 0, 0, 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 50, 0, 0, 179, 190, 1, 0, 0, 0, 180, 181, 3, 16, 8, 0, 181, 183, 5, 40, 0, 0, 182, 184, 5, 44, 0, 0, 183, 182, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 5, 45, 0, 0, 186, 190, 1, 0, 0, 0, 187, 188, 4, 5, 4, 0, 188, 190, 3, 14, 7, 0, 189, 159, 1, 0, 0, 0, 189, 162, 1, 0, 0, 0, 189, 163, 1, 0, 0, 0, 189, 164, 1, 0, 0, 0, 189, 180, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 190, 199, 1, 0, 0, 0, 191, 192, 10, 5, 0, 0, 192, 193, 5, 30, 0, 0, 193, 198, 3, 10, 5, 6, 194, 195, 10, 4, 0, 0, 195, 196, 5, 47, 0, 0, 196, 198, 3, 10, 5, 5, 197, 191, 1, 0, 0, 0, 197, 194, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 199, 200, 1, 0, 0, 0, 200, 11, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 202, 204, 3, 16, 8, 0, 203, 205, 5, 44, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 5, 42, 0, 0, 207, 208, 3, 98, 49, 0, 208, 217, 1, 0, 0, 0, 209, 211, 3, 16, 8, 0, 210, 212, 5, 44, 0, 0, 211, 210, 1, 0, 0, 0, 211, 212, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 214, 5, 49, 0, 0, 214, 215, 3, 98, 49, 0, 215, 217, 1, 0, 0, 0, 216, 202, 1, 0, 0, 0, 216, 209, 1, 0, 0, 0, 217, 13, 1, 0, 0, 0, 218, 219, 3, 16, 8, 0, 219, 220, 5, 19, 0, 0, 220, 221, 3, 98, 49, 0, 221, 15, 1, 0, 0, 0, 222, 228, 3, 18, 9, 0, 223, 224, 3, 18, 9, 0, 224, 225, 3, 100, 50, 0, 225, 226, 3, 18, 9, 0, 226, 228, 1, 0, 0, 0, 227, 222, 1, 0, 0, 0, 227, 223, 1, 0, 0, 0, 228, 17, 1, 0, 0, 0, 229, 230, 6, 9, -1, 0, 230, 234, 3, 20, 10, 0, 231, 232, 7, 0, 0, 0, 232, 234, 3, 18, 9, 3, 233, 229, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 234, 243, 1, 0, 0, 0, 235, 236, 10, 2, 0, 0, 236, 237, 7, 1, 0, 0, 237, 242, 3, 18, 9, 3, 238, 239, 10, 1, 0, 0, 239, 240, 7, 0, 0, 0, 240, 242, 3, 18, 9, 2, 241, 235, 1, 0, 0, 0, 241, 238, 1, 0, 0, 0, 242, 245, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 19, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 246, 247, 6, 10, -1, 0, 247, 255, 3, 62, 31, 0, 248, 255, 3, 52, 26, 0, 249, 255, 3, 22, 11, 0, 250, 251, 5, 43, 0, 0, 251, 252, 3, 10, 5, 0, 252, 253, 5, 50, 0, 0, 253, 255, 1, 0, 0, 0, 254, 246, 1, 0, 0, 0, 254, 248, 1, 0, 0, 0, 254, 249, 1, 0, 0, 0, 254, 250, 1, 0, 0, 0, 255, 261, 1, 0, 0, 0, 256, 257, 10, 1, 0, 0, 257, 258, 5, 33, 0, 0, 258, 260, 3, 24, 12, 0, 259, 256, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 21, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 265, 3, 58, 29, 0, 265, 275, 5, 43, 0, 0, 266, 276, 5, 61, 0, 0, 267, 272, 3, 10, 5, 0, 268, 269, 5, 34, 0, 0, 269, 271, 3, 10, 5, 0, 270, 268, 1, 0, 0, 0, 271, 274, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 275, 266, 1, 0, 0, 0, 275, 267, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 5, 50, 0, 0, 278, 23, 1, 0, 0, 0, 279, 280, 3, 58, 29, 0, 280, 25, 1, 0, 0, 0, 281, 282, 5, 12, 0, 0, 282, 283, 3, 28, 14, 0, 283, 27, 1, 0, 0, 0, 284, 289, 3, 30, 15, 0, 285, 286, 5, 34, 0, 0, 286, 288, 3, 30, 15, 0, 287, 285, 1, 0, 0, 0, 288, 291, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 29, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 292, 298, 3, 10, 5, 0, 293, 294, 3, 52, 26, 0, 294, 295, 5, 32, 0, 0, 295, 296, 3, 10, 5, 0, 296, 298, 1, 0, 0, 0, 297, 292, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 298, 31, 1, 0, 0, 0, 299, 300, 5, 6, 0, 0, 300, 305, 3, 34, 17, 0, 301, 302, 5, 34, 0, 0, 302, 304, 3, 34, 17, 0, 303, 301, 1, 0, 0, 0, 304, 307, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 309, 1, 0, 0, 0, 307, 305, 1, 0, 0, 0, 308, 310, 3, 40, 20, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 33, 1, 0, 0, 0, 311, 312, 3, 36, 18, 0, 312, 313, 5, 104, 0, 0, 313, 314, 3, 38, 19, 0, 314, 317, 1, 0, 0, 0, 315, 317, 3, 38, 19, 0, 316, 311, 1, 0, 0, 0, 316, 315, 1, 0, 0, 0, 317, 35, 1, 0, 0, 0, 318, 319, 5, 76, 0, 0, 319, 37, 1, 0, 0, 0, 320, 321, 7, 2, 0, 0, 321, 39, 1, 0, 0, 0, 322, 325, 3, 42, 21, 0, 323, 325, 3, 44, 22, 0, 324, 322, 1, 0, 0, 0, 324, 323, 1, 0, 0, 0, 325, 41, 1, 0, 0, 0, 326, 327, 5, 75, 0, 0, 327, 332, 5, 76, 0, 0, 328, 329, 5, 34, 0, 0, 329, 331, 5, 76, 0, 0, 330, 328, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 43, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 335, 336, 5, 65, 0, 0, 336, 337, 3, 42, 21, 0, 337, 338, 5, 66, 0, 0, 338, 45, 1, 0, 0, 0, 339, 340, 5, 20, 0, 0, 340, 345, 3, 34, 17, 0, 341, 342, 5, 34, 0, 0, 342, 344, 3, 34, 17, 0, 343, 341, 1, 0, 0, 0, 344, 347, 1, 0, 0, 0, 345, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 349, 1, 0, 0, 0, 347, 345, 1, 0, 0, 0, 348, 350, 3, 28, 14, 0, 349, 348, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 352, 5, 29, 0, 0, 352, 354, 3, 28, 14, 0, 353, 351, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 47, 1, 0, 0, 0, 355, 356, 5, 4, 0, 0, 356, 357, 3, 28, 14, 0, 357, 49, 1, 0, 0, 0, 358, 360, 5, 15, 0, 0, 359, 361, 3, 28, 14, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 364, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 365, 3, 28, 14, 0, 364, 362, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 51, 1, 0, 0, 0, 366, 371, 3, 58, 29, 0, 367, 368, 5, 36, 0, 0, 368, 370, 3, 58, 29, 0, 369, 367, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 53, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 379, 3, 60, 30, 0, 375, 376, 5, 36, 0, 0, 376, 378, 3, 60, 30, 0, 377, 375, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 55, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 387, 3, 54, 27, 0, 383, 384, 5, 34, 0, 0, 384, 386, 3, 54, 27, 0, 385, 383, 1, 0, 0, 0, 386, 389, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 57, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 390, 391, 7, 3, 0, 0, 391, 59, 1, 0, 0, 0, 392, 393, 5, 80, 0, 0, 393, 61, 1, 0, 0, 0, 394, 437, 5, 45, 0, 0, 395, 396, 3, 96, 48, 0, 396, 397, 5, 67, 0, 0, 397, 437, 1, 0, 0, 0, 398, 437, 3, 94, 47, 0, 399, 437, 3, 96, 48, 0, 400, 437, 3, 90, 45, 0, 401, 437, 3, 64, 32, 0, 402, 437, 3, 98, 49, 0, 403, 404, 5, 65, 0, 0, 404, 409, 3, 92, 46, 0, 405, 406, 5, 34, 0, 0, 406, 408, 3, 92, 46, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 412, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 413, 5, 66, 0, 0, 413, 437, 1, 0, 0, 0, 414, 415, 5, 65, 0, 0, 415, 420, 3, 90, 45, 0, 416, 417, 5, 34, 0, 0, 417, 419, 3, 90, 45, 0, 418, 416, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 423, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 424, 5, 66, 0, 0, 424, 437, 1, 0, 0, 0, 425, 426, 5, 65, 0, 0, 426, 431, 3, 98, 49, 0, 427, 428, 5, 34, 0, 0, 428, 430, 3, 98, 49, 0, 429, 427, 1, 0, 0, 0, 430, 433, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 434, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 434, 435, 5, 66, 0, 0, 435, 437, 1, 0, 0, 0, 436, 394, 1, 0, 0, 0, 436, 395, 1, 0, 0, 0, 436, 398, 1, 0, 0, 0, 436, 399, 1, 0, 0, 0, 436, 400, 1, 0, 0, 0, 436, 401, 1, 0, 0, 0, 436, 402, 1, 0, 0, 0, 436, 403, 1, 0, 0, 0, 436, 414, 1, 0, 0, 0, 436, 425, 1, 0, 0, 0, 437, 63, 1, 0, 0, 0, 438, 441, 5, 48, 0, 0, 439, 441, 5, 64, 0, 0, 440, 438, 1, 0, 0, 0, 440, 439, 1, 0, 0, 0, 441, 65, 1, 0, 0, 0, 442, 443, 5, 9, 0, 0, 443, 444, 5, 27, 0, 0, 444, 67, 1, 0, 0, 0, 445, 446, 5, 14, 0, 0, 446, 451, 3, 70, 35, 0, 447, 448, 5, 34, 0, 0, 448, 450, 3, 70, 35, 0, 449, 447, 1, 0, 0, 0, 450, 453, 1, 0, 0, 0, 451, 449, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 69, 1, 0, 0, 0, 453, 451, 1, 0, 0, 0, 454, 456, 3, 10, 5, 0, 455, 457, 7, 4, 0, 0, 456, 455, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 459, 5, 46, 0, 0, 459, 461, 7, 5, 0, 0, 460, 458, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 71, 1, 0, 0, 0, 462, 463, 5, 8, 0, 0, 463, 464, 3, 56, 28, 0, 464, 73, 1, 0, 0, 0, 465, 466, 5, 2, 0, 0, 466, 467, 3, 56, 28, 0, 467, 75, 1, 0, 0, 0, 468, 469, 5, 11, 0, 0, 469, 474, 3, 78, 39, 0, 470, 471, 5, 34, 0, 0, 471, 473, 3, 78, 39, 0, 472, 470, 1, 0, 0, 0, 473, 476, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 77, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 477, 478, 3, 54, 27, 0, 478, 479, 5, 84, 0, 0, 479, 480, 3, 54, 27, 0, 480, 79, 1, 0, 0, 0, 481, 482, 5, 1, 0, 0, 482, 483, 3, 20, 10, 0, 483, 485, 3, 98, 49, 0, 484, 486, 3, 86, 43, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 81, 1, 0, 0, 0, 487, 488, 5, 7, 0, 0, 488, 489, 3, 20, 10, 0, 489, 490, 3, 98, 49, 0, 490, 83, 1, 0, 0, 0, 491, 492, 5, 10, 0, 0, 492, 493, 3, 52, 26, 0, 493, 85, 1, 0, 0, 0, 494, 499, 3, 88, 44, 0, 495, 496, 5, 34, 0, 0, 496, 498, 3, 88, 44, 0, 497, 495, 1, 0, 0, 0, 498, 501, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 87, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 502, 503, 3, 58, 29, 0, 503, 504, 5, 32, 0, 0, 504, 505, 3, 62, 31, 0, 505, 89, 1, 0, 0, 0, 506, 507, 7, 6, 0, 0, 507, 91, 1, 0, 0, 0, 508, 511, 3, 94, 47, 0, 509, 511, 3, 96, 48, 0, 510, 508, 1, 0, 0, 0, 510, 509, 1, 0, 0, 0, 511, 93, 1, 0, 0, 0, 512, 514, 7, 0, 0, 0, 513, 512, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 5, 28, 0, 0, 516, 95, 1, 0, 0, 0, 517, 519, 7, 0, 0, 0, 518, 517, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 5, 27, 0, 0, 521, 97, 1, 0, 0, 0, 522, 523, 5, 26, 0, 0, 523, 99, 1, 0, 0, 0, 524, 525, 7, 7, 0, 0, 525, 101, 1, 0, 0, 0, 526, 527, 5, 5, 0, 0, 527, 528, 3, 104, 52, 0, 528, 103, 1, 0, 0, 0, 529, 530, 5, 65, 0, 0, 530, 531, 3, 2, 1, 0, 531, 532, 5, 66, 0, 0, 532, 105, 1, 0, 0, 0, 533, 534, 5, 13, 0, 0, 534, 535, 5, 100, 0, 0, 535, 107, 1, 0, 0, 0, 536, 537, 5, 3, 0, 0, 537, 540, 5, 90, 0, 0, 538, 539, 5, 88, 0, 0, 539, 541, 3, 54, 27, 0, 540, 538, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 551, 1, 0, 0, 0, 542, 543, 5, 89, 0, 0, 543, 548, 3, 110, 55, 0, 544, 545, 5, 34, 0, 0, 545, 547, 3, 110, 55, 0, 546, 544, 1, 0, 0, 0, 547, 550, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 552, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 551, 542, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 109, 1, 0, 0, 0, 553, 554, 3, 54, 27, 0, 554, 555, 5, 32, 0, 0, 555, 557, 1, 0, 0, 0, 556, 553, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 559, 3, 54, 27, 0, 559, 111, 1, 0, 0, 0, 560, 561, 5, 18, 0, 0, 561, 562, 3, 34, 17, 0, 562, 563, 5, 88, 0, 0, 563, 564, 3, 56, 28, 0, 564, 113, 1, 0, 0, 0, 565, 566, 5, 17, 0, 0, 566, 569, 3, 28, 14, 0, 567, 568, 5, 29, 0, 0, 568, 570, 3, 28, 14, 0, 569, 567, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 115, 1, 0, 0, 0, 54, 127, 136, 154, 166, 175, 183, 189, 197, 199, 204, 211, 216, 227, 233, 241, 243, 254, 261, 272, 275, 289, 297, 305, 309, 316, 324, 332, 345, 349, 353, 360, 364, 371, 379, 387, 409, 420, 431, 436, 440, 451, 456, 460, 474, 485, 499, 510, 513, 518, 540, 548, 551, 556, 569] \ No newline at end of file +[4, 1, 120, 579, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 128, 8, 1, 10, 1, 12, 1, 131, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 139, 8, 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, 3, 3, 157, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 169, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 176, 8, 5, 10, 5, 12, 5, 179, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 186, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 192, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 200, 8, 5, 10, 5, 12, 5, 203, 9, 5, 1, 6, 1, 6, 3, 6, 207, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 214, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 219, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 230, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 236, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 244, 8, 9, 10, 9, 12, 9, 247, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 257, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 262, 8, 10, 10, 10, 12, 10, 265, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 273, 8, 11, 10, 11, 12, 11, 276, 9, 11, 3, 11, 278, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 285, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 295, 8, 15, 10, 15, 12, 15, 298, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 305, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 311, 8, 17, 10, 17, 12, 17, 314, 9, 17, 1, 17, 3, 17, 317, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 324, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 332, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 338, 8, 22, 10, 22, 12, 22, 341, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 351, 8, 24, 10, 24, 12, 24, 354, 9, 24, 1, 24, 3, 24, 357, 8, 24, 1, 24, 1, 24, 3, 24, 361, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 368, 8, 26, 1, 26, 1, 26, 3, 26, 372, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 377, 8, 27, 10, 27, 12, 27, 380, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 385, 8, 28, 10, 28, 12, 28, 388, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 393, 8, 29, 10, 29, 12, 29, 396, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 415, 8, 32, 10, 32, 12, 32, 418, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 426, 8, 32, 10, 32, 12, 32, 429, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 437, 8, 32, 10, 32, 12, 32, 440, 9, 32, 1, 32, 1, 32, 3, 32, 444, 8, 32, 1, 33, 1, 33, 3, 33, 448, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 457, 8, 35, 10, 35, 12, 35, 460, 9, 35, 1, 36, 1, 36, 3, 36, 464, 8, 36, 1, 36, 1, 36, 3, 36, 468, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 480, 8, 39, 10, 39, 12, 39, 483, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 493, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 505, 8, 44, 10, 44, 12, 44, 508, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 518, 8, 47, 1, 48, 3, 48, 521, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 526, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 548, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 554, 8, 55, 10, 55, 12, 55, 557, 9, 55, 3, 55, 559, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 564, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 577, 8, 58, 1, 58, 0, 4, 2, 10, 18, 20, 59, 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, 0, 8, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 25, 25, 76, 76, 1, 0, 67, 68, 2, 0, 30, 30, 34, 34, 2, 0, 37, 37, 40, 40, 2, 0, 36, 36, 50, 50, 2, 0, 51, 51, 53, 57, 604, 0, 118, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 4, 138, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 191, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 220, 1, 0, 0, 0, 16, 229, 1, 0, 0, 0, 18, 235, 1, 0, 0, 0, 20, 256, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 284, 1, 0, 0, 0, 26, 286, 1, 0, 0, 0, 28, 288, 1, 0, 0, 0, 30, 291, 1, 0, 0, 0, 32, 304, 1, 0, 0, 0, 34, 306, 1, 0, 0, 0, 36, 323, 1, 0, 0, 0, 38, 325, 1, 0, 0, 0, 40, 327, 1, 0, 0, 0, 42, 331, 1, 0, 0, 0, 44, 333, 1, 0, 0, 0, 46, 342, 1, 0, 0, 0, 48, 346, 1, 0, 0, 0, 50, 362, 1, 0, 0, 0, 52, 365, 1, 0, 0, 0, 54, 373, 1, 0, 0, 0, 56, 381, 1, 0, 0, 0, 58, 389, 1, 0, 0, 0, 60, 397, 1, 0, 0, 0, 62, 399, 1, 0, 0, 0, 64, 443, 1, 0, 0, 0, 66, 447, 1, 0, 0, 0, 68, 449, 1, 0, 0, 0, 70, 452, 1, 0, 0, 0, 72, 461, 1, 0, 0, 0, 74, 469, 1, 0, 0, 0, 76, 472, 1, 0, 0, 0, 78, 475, 1, 0, 0, 0, 80, 484, 1, 0, 0, 0, 82, 488, 1, 0, 0, 0, 84, 494, 1, 0, 0, 0, 86, 498, 1, 0, 0, 0, 88, 501, 1, 0, 0, 0, 90, 509, 1, 0, 0, 0, 92, 513, 1, 0, 0, 0, 94, 517, 1, 0, 0, 0, 96, 520, 1, 0, 0, 0, 98, 525, 1, 0, 0, 0, 100, 529, 1, 0, 0, 0, 102, 531, 1, 0, 0, 0, 104, 533, 1, 0, 0, 0, 106, 536, 1, 0, 0, 0, 108, 540, 1, 0, 0, 0, 110, 543, 1, 0, 0, 0, 112, 563, 1, 0, 0, 0, 114, 567, 1, 0, 0, 0, 116, 572, 1, 0, 0, 0, 118, 119, 3, 2, 1, 0, 119, 120, 5, 0, 0, 1, 120, 1, 1, 0, 0, 0, 121, 122, 6, 1, -1, 0, 122, 123, 3, 4, 2, 0, 123, 129, 1, 0, 0, 0, 124, 125, 10, 1, 0, 0, 125, 126, 5, 24, 0, 0, 126, 128, 3, 6, 3, 0, 127, 124, 1, 0, 0, 0, 128, 131, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 3, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 139, 3, 104, 52, 0, 133, 139, 3, 34, 17, 0, 134, 139, 3, 28, 14, 0, 135, 139, 3, 108, 54, 0, 136, 137, 4, 2, 1, 0, 137, 139, 3, 48, 24, 0, 138, 132, 1, 0, 0, 0, 138, 133, 1, 0, 0, 0, 138, 134, 1, 0, 0, 0, 138, 135, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 139, 5, 1, 0, 0, 0, 140, 157, 3, 50, 25, 0, 141, 157, 3, 8, 4, 0, 142, 157, 3, 74, 37, 0, 143, 157, 3, 68, 34, 0, 144, 157, 3, 52, 26, 0, 145, 157, 3, 70, 35, 0, 146, 157, 3, 76, 38, 0, 147, 157, 3, 78, 39, 0, 148, 157, 3, 82, 41, 0, 149, 157, 3, 84, 42, 0, 150, 157, 3, 110, 55, 0, 151, 157, 3, 86, 43, 0, 152, 153, 4, 3, 2, 0, 153, 157, 3, 116, 58, 0, 154, 155, 4, 3, 3, 0, 155, 157, 3, 114, 57, 0, 156, 140, 1, 0, 0, 0, 156, 141, 1, 0, 0, 0, 156, 142, 1, 0, 0, 0, 156, 143, 1, 0, 0, 0, 156, 144, 1, 0, 0, 0, 156, 145, 1, 0, 0, 0, 156, 146, 1, 0, 0, 0, 156, 147, 1, 0, 0, 0, 156, 148, 1, 0, 0, 0, 156, 149, 1, 0, 0, 0, 156, 150, 1, 0, 0, 0, 156, 151, 1, 0, 0, 0, 156, 152, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 16, 0, 0, 159, 160, 3, 10, 5, 0, 160, 9, 1, 0, 0, 0, 161, 162, 6, 5, -1, 0, 162, 163, 5, 43, 0, 0, 163, 192, 3, 10, 5, 8, 164, 192, 3, 16, 8, 0, 165, 192, 3, 12, 6, 0, 166, 168, 3, 16, 8, 0, 167, 169, 5, 43, 0, 0, 168, 167, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 5, 38, 0, 0, 171, 172, 5, 42, 0, 0, 172, 177, 3, 16, 8, 0, 173, 174, 5, 33, 0, 0, 174, 176, 3, 16, 8, 0, 175, 173, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 49, 0, 0, 181, 192, 1, 0, 0, 0, 182, 183, 3, 16, 8, 0, 183, 185, 5, 39, 0, 0, 184, 186, 5, 43, 0, 0, 185, 184, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 5, 44, 0, 0, 188, 192, 1, 0, 0, 0, 189, 190, 4, 5, 4, 0, 190, 192, 3, 14, 7, 0, 191, 161, 1, 0, 0, 0, 191, 164, 1, 0, 0, 0, 191, 165, 1, 0, 0, 0, 191, 166, 1, 0, 0, 0, 191, 182, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 201, 1, 0, 0, 0, 193, 194, 10, 5, 0, 0, 194, 195, 5, 29, 0, 0, 195, 200, 3, 10, 5, 6, 196, 197, 10, 4, 0, 0, 197, 198, 5, 46, 0, 0, 198, 200, 3, 10, 5, 5, 199, 193, 1, 0, 0, 0, 199, 196, 1, 0, 0, 0, 200, 203, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 11, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, 206, 3, 16, 8, 0, 205, 207, 5, 43, 0, 0, 206, 205, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 41, 0, 0, 209, 210, 3, 100, 50, 0, 210, 219, 1, 0, 0, 0, 211, 213, 3, 16, 8, 0, 212, 214, 5, 43, 0, 0, 213, 212, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 216, 5, 48, 0, 0, 216, 217, 3, 100, 50, 0, 217, 219, 1, 0, 0, 0, 218, 204, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 219, 13, 1, 0, 0, 0, 220, 221, 3, 16, 8, 0, 221, 222, 5, 63, 0, 0, 222, 223, 3, 100, 50, 0, 223, 15, 1, 0, 0, 0, 224, 230, 3, 18, 9, 0, 225, 226, 3, 18, 9, 0, 226, 227, 3, 102, 51, 0, 227, 228, 3, 18, 9, 0, 228, 230, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 229, 225, 1, 0, 0, 0, 230, 17, 1, 0, 0, 0, 231, 232, 6, 9, -1, 0, 232, 236, 3, 20, 10, 0, 233, 234, 7, 0, 0, 0, 234, 236, 3, 18, 9, 3, 235, 231, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 236, 245, 1, 0, 0, 0, 237, 238, 10, 2, 0, 0, 238, 239, 7, 1, 0, 0, 239, 244, 3, 18, 9, 3, 240, 241, 10, 1, 0, 0, 241, 242, 7, 0, 0, 0, 242, 244, 3, 18, 9, 2, 243, 237, 1, 0, 0, 0, 243, 240, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 19, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 248, 249, 6, 10, -1, 0, 249, 257, 3, 64, 32, 0, 250, 257, 3, 54, 27, 0, 251, 257, 3, 22, 11, 0, 252, 253, 5, 42, 0, 0, 253, 254, 3, 10, 5, 0, 254, 255, 5, 49, 0, 0, 255, 257, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 263, 1, 0, 0, 0, 258, 259, 10, 1, 0, 0, 259, 260, 5, 32, 0, 0, 260, 262, 3, 26, 13, 0, 261, 258, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 21, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 267, 3, 24, 12, 0, 267, 277, 5, 42, 0, 0, 268, 278, 5, 60, 0, 0, 269, 274, 3, 10, 5, 0, 270, 271, 5, 33, 0, 0, 271, 273, 3, 10, 5, 0, 272, 270, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 268, 1, 0, 0, 0, 277, 269, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 280, 5, 49, 0, 0, 280, 23, 1, 0, 0, 0, 281, 282, 4, 12, 10, 0, 282, 285, 5, 63, 0, 0, 283, 285, 3, 60, 30, 0, 284, 281, 1, 0, 0, 0, 284, 283, 1, 0, 0, 0, 285, 25, 1, 0, 0, 0, 286, 287, 3, 60, 30, 0, 287, 27, 1, 0, 0, 0, 288, 289, 5, 12, 0, 0, 289, 290, 3, 30, 15, 0, 290, 29, 1, 0, 0, 0, 291, 296, 3, 32, 16, 0, 292, 293, 5, 33, 0, 0, 293, 295, 3, 32, 16, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 31, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 305, 3, 10, 5, 0, 300, 301, 3, 54, 27, 0, 301, 302, 5, 31, 0, 0, 302, 303, 3, 10, 5, 0, 303, 305, 1, 0, 0, 0, 304, 299, 1, 0, 0, 0, 304, 300, 1, 0, 0, 0, 305, 33, 1, 0, 0, 0, 306, 307, 5, 6, 0, 0, 307, 312, 3, 36, 18, 0, 308, 309, 5, 33, 0, 0, 309, 311, 3, 36, 18, 0, 310, 308, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 315, 317, 3, 42, 21, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 35, 1, 0, 0, 0, 318, 319, 3, 38, 19, 0, 319, 320, 5, 104, 0, 0, 320, 321, 3, 40, 20, 0, 321, 324, 1, 0, 0, 0, 322, 324, 3, 40, 20, 0, 323, 318, 1, 0, 0, 0, 323, 322, 1, 0, 0, 0, 324, 37, 1, 0, 0, 0, 325, 326, 5, 76, 0, 0, 326, 39, 1, 0, 0, 0, 327, 328, 7, 2, 0, 0, 328, 41, 1, 0, 0, 0, 329, 332, 3, 44, 22, 0, 330, 332, 3, 46, 23, 0, 331, 329, 1, 0, 0, 0, 331, 330, 1, 0, 0, 0, 332, 43, 1, 0, 0, 0, 333, 334, 5, 75, 0, 0, 334, 339, 5, 76, 0, 0, 335, 336, 5, 33, 0, 0, 336, 338, 5, 76, 0, 0, 337, 335, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 45, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 342, 343, 5, 65, 0, 0, 343, 344, 3, 44, 22, 0, 344, 345, 5, 66, 0, 0, 345, 47, 1, 0, 0, 0, 346, 347, 5, 19, 0, 0, 347, 352, 3, 36, 18, 0, 348, 349, 5, 33, 0, 0, 349, 351, 3, 36, 18, 0, 350, 348, 1, 0, 0, 0, 351, 354, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 357, 3, 30, 15, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 360, 1, 0, 0, 0, 358, 359, 5, 28, 0, 0, 359, 361, 3, 30, 15, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 49, 1, 0, 0, 0, 362, 363, 5, 4, 0, 0, 363, 364, 3, 30, 15, 0, 364, 51, 1, 0, 0, 0, 365, 367, 5, 15, 0, 0, 366, 368, 3, 30, 15, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 371, 1, 0, 0, 0, 369, 370, 5, 28, 0, 0, 370, 372, 3, 30, 15, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 53, 1, 0, 0, 0, 373, 378, 3, 60, 30, 0, 374, 375, 5, 35, 0, 0, 375, 377, 3, 60, 30, 0, 376, 374, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 55, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 386, 3, 62, 31, 0, 382, 383, 5, 35, 0, 0, 383, 385, 3, 62, 31, 0, 384, 382, 1, 0, 0, 0, 385, 388, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 57, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 394, 3, 56, 28, 0, 390, 391, 5, 33, 0, 0, 391, 393, 3, 56, 28, 0, 392, 390, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 59, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 7, 3, 0, 0, 398, 61, 1, 0, 0, 0, 399, 400, 5, 80, 0, 0, 400, 63, 1, 0, 0, 0, 401, 444, 5, 44, 0, 0, 402, 403, 3, 98, 49, 0, 403, 404, 5, 67, 0, 0, 404, 444, 1, 0, 0, 0, 405, 444, 3, 96, 48, 0, 406, 444, 3, 98, 49, 0, 407, 444, 3, 92, 46, 0, 408, 444, 3, 66, 33, 0, 409, 444, 3, 100, 50, 0, 410, 411, 5, 65, 0, 0, 411, 416, 3, 94, 47, 0, 412, 413, 5, 33, 0, 0, 413, 415, 3, 94, 47, 0, 414, 412, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 66, 0, 0, 420, 444, 1, 0, 0, 0, 421, 422, 5, 65, 0, 0, 422, 427, 3, 92, 46, 0, 423, 424, 5, 33, 0, 0, 424, 426, 3, 92, 46, 0, 425, 423, 1, 0, 0, 0, 426, 429, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 430, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 430, 431, 5, 66, 0, 0, 431, 444, 1, 0, 0, 0, 432, 433, 5, 65, 0, 0, 433, 438, 3, 100, 50, 0, 434, 435, 5, 33, 0, 0, 435, 437, 3, 100, 50, 0, 436, 434, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 66, 0, 0, 442, 444, 1, 0, 0, 0, 443, 401, 1, 0, 0, 0, 443, 402, 1, 0, 0, 0, 443, 405, 1, 0, 0, 0, 443, 406, 1, 0, 0, 0, 443, 407, 1, 0, 0, 0, 443, 408, 1, 0, 0, 0, 443, 409, 1, 0, 0, 0, 443, 410, 1, 0, 0, 0, 443, 421, 1, 0, 0, 0, 443, 432, 1, 0, 0, 0, 444, 65, 1, 0, 0, 0, 445, 448, 5, 47, 0, 0, 446, 448, 5, 64, 0, 0, 447, 445, 1, 0, 0, 0, 447, 446, 1, 0, 0, 0, 448, 67, 1, 0, 0, 0, 449, 450, 5, 9, 0, 0, 450, 451, 5, 26, 0, 0, 451, 69, 1, 0, 0, 0, 452, 453, 5, 14, 0, 0, 453, 458, 3, 72, 36, 0, 454, 455, 5, 33, 0, 0, 455, 457, 3, 72, 36, 0, 456, 454, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 71, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 461, 463, 3, 10, 5, 0, 462, 464, 7, 4, 0, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 466, 5, 45, 0, 0, 466, 468, 7, 5, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 73, 1, 0, 0, 0, 469, 470, 5, 8, 0, 0, 470, 471, 3, 58, 29, 0, 471, 75, 1, 0, 0, 0, 472, 473, 5, 2, 0, 0, 473, 474, 3, 58, 29, 0, 474, 77, 1, 0, 0, 0, 475, 476, 5, 11, 0, 0, 476, 481, 3, 80, 40, 0, 477, 478, 5, 33, 0, 0, 478, 480, 3, 80, 40, 0, 479, 477, 1, 0, 0, 0, 480, 483, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 79, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 484, 485, 3, 56, 28, 0, 485, 486, 5, 84, 0, 0, 486, 487, 3, 56, 28, 0, 487, 81, 1, 0, 0, 0, 488, 489, 5, 1, 0, 0, 489, 490, 3, 20, 10, 0, 490, 492, 3, 100, 50, 0, 491, 493, 3, 88, 44, 0, 492, 491, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 83, 1, 0, 0, 0, 494, 495, 5, 7, 0, 0, 495, 496, 3, 20, 10, 0, 496, 497, 3, 100, 50, 0, 497, 85, 1, 0, 0, 0, 498, 499, 5, 10, 0, 0, 499, 500, 3, 54, 27, 0, 500, 87, 1, 0, 0, 0, 501, 506, 3, 90, 45, 0, 502, 503, 5, 33, 0, 0, 503, 505, 3, 90, 45, 0, 504, 502, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 89, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 510, 3, 60, 30, 0, 510, 511, 5, 31, 0, 0, 511, 512, 3, 64, 32, 0, 512, 91, 1, 0, 0, 0, 513, 514, 7, 6, 0, 0, 514, 93, 1, 0, 0, 0, 515, 518, 3, 96, 48, 0, 516, 518, 3, 98, 49, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 95, 1, 0, 0, 0, 519, 521, 7, 0, 0, 0, 520, 519, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 5, 27, 0, 0, 523, 97, 1, 0, 0, 0, 524, 526, 7, 0, 0, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 5, 26, 0, 0, 528, 99, 1, 0, 0, 0, 529, 530, 5, 25, 0, 0, 530, 101, 1, 0, 0, 0, 531, 532, 7, 7, 0, 0, 532, 103, 1, 0, 0, 0, 533, 534, 5, 5, 0, 0, 534, 535, 3, 106, 53, 0, 535, 105, 1, 0, 0, 0, 536, 537, 5, 65, 0, 0, 537, 538, 3, 2, 1, 0, 538, 539, 5, 66, 0, 0, 539, 107, 1, 0, 0, 0, 540, 541, 5, 13, 0, 0, 541, 542, 5, 100, 0, 0, 542, 109, 1, 0, 0, 0, 543, 544, 5, 3, 0, 0, 544, 547, 5, 90, 0, 0, 545, 546, 5, 88, 0, 0, 546, 548, 3, 56, 28, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 558, 1, 0, 0, 0, 549, 550, 5, 89, 0, 0, 550, 555, 3, 112, 56, 0, 551, 552, 5, 33, 0, 0, 552, 554, 3, 112, 56, 0, 553, 551, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 549, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 111, 1, 0, 0, 0, 560, 561, 3, 56, 28, 0, 561, 562, 5, 31, 0, 0, 562, 564, 1, 0, 0, 0, 563, 560, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 3, 56, 28, 0, 566, 113, 1, 0, 0, 0, 567, 568, 5, 18, 0, 0, 568, 569, 3, 36, 18, 0, 569, 570, 5, 88, 0, 0, 570, 571, 3, 58, 29, 0, 571, 115, 1, 0, 0, 0, 572, 573, 5, 17, 0, 0, 573, 576, 3, 30, 15, 0, 574, 575, 5, 28, 0, 0, 575, 577, 3, 30, 15, 0, 576, 574, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 117, 1, 0, 0, 0, 55, 129, 138, 156, 168, 177, 185, 191, 199, 201, 206, 213, 218, 229, 235, 243, 245, 256, 263, 274, 277, 284, 296, 304, 312, 316, 323, 331, 339, 352, 356, 360, 367, 371, 378, 386, 394, 416, 427, 438, 443, 447, 458, 463, 467, 481, 492, 506, 517, 520, 525, 547, 555, 558, 563, 576] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index cf1c5fa691d1e..0afc77dc12f8b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -8,14 +8,26 @@ * 2.0. */ -import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.FailedPredicateException; +import org.antlr.v4.runtime.NoViableAltException; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.RuleContext; +import org.antlr.v4.runtime.RuntimeMetaData; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.Vocabulary; +import org.antlr.v4.runtime.VocabularyImpl; +import org.antlr.v4.runtime.atn.ATN; +import org.antlr.v4.runtime.atn.ATNDeserializer; +import org.antlr.v4.runtime.atn.ParserATNSimulator; +import org.antlr.v4.runtime.atn.PredictionContextCache; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; +import org.antlr.v4.runtime.tree.ParseTreeListener; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; +import org.antlr.v4.runtime.tree.TerminalNode; + import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) public class EsqlBaseParser extends ParserConfig { @@ -25,112 +37,113 @@ public class EsqlBaseParser extends ParserConfig { protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache(); public static final int - DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, - LIMIT=9, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, - WHERE=16, DEV_INLINESTATS=17, DEV_LOOKUP=18, DEV_MATCH=19, DEV_METRICS=20, - UNKNOWN_CMD=21, LINE_COMMENT=22, MULTILINE_COMMENT=23, WS=24, PIPE=25, - QUOTED_STRING=26, INTEGER_LITERAL=27, DECIMAL_LITERAL=28, BY=29, AND=30, - ASC=31, ASSIGN=32, CAST_OP=33, COMMA=34, DESC=35, DOT=36, FALSE=37, FIRST=38, - IN=39, IS=40, LAST=41, LIKE=42, LP=43, NOT=44, NULL=45, NULLS=46, OR=47, - PARAM=48, RLIKE=49, RP=50, TRUE=51, EQ=52, CIEQ=53, NEQ=54, LT=55, LTE=56, - GT=57, GTE=58, PLUS=59, MINUS=60, ASTERISK=61, SLASH=62, PERCENT=63, NAMED_OR_POSITIONAL_PARAM=64, - OPENING_BRACKET=65, CLOSING_BRACKET=66, UNQUOTED_IDENTIFIER=67, QUOTED_IDENTIFIER=68, - EXPR_LINE_COMMENT=69, EXPR_MULTILINE_COMMENT=70, EXPR_WS=71, EXPLAIN_WS=72, - EXPLAIN_LINE_COMMENT=73, EXPLAIN_MULTILINE_COMMENT=74, METADATA=75, UNQUOTED_SOURCE=76, - FROM_LINE_COMMENT=77, FROM_MULTILINE_COMMENT=78, FROM_WS=79, ID_PATTERN=80, - PROJECT_LINE_COMMENT=81, PROJECT_MULTILINE_COMMENT=82, PROJECT_WS=83, - AS=84, RENAME_LINE_COMMENT=85, RENAME_MULTILINE_COMMENT=86, RENAME_WS=87, - ON=88, WITH=89, ENRICH_POLICY_NAME=90, ENRICH_LINE_COMMENT=91, ENRICH_MULTILINE_COMMENT=92, - ENRICH_WS=93, ENRICH_FIELD_LINE_COMMENT=94, ENRICH_FIELD_MULTILINE_COMMENT=95, - ENRICH_FIELD_WS=96, MVEXPAND_LINE_COMMENT=97, MVEXPAND_MULTILINE_COMMENT=98, - MVEXPAND_WS=99, INFO=100, SHOW_LINE_COMMENT=101, SHOW_MULTILINE_COMMENT=102, - SHOW_WS=103, COLON=104, SETTING=105, SETTING_LINE_COMMENT=106, SETTTING_MULTILINE_COMMENT=107, - SETTING_WS=108, LOOKUP_LINE_COMMENT=109, LOOKUP_MULTILINE_COMMENT=110, - LOOKUP_WS=111, LOOKUP_FIELD_LINE_COMMENT=112, LOOKUP_FIELD_MULTILINE_COMMENT=113, - LOOKUP_FIELD_WS=114, METRICS_LINE_COMMENT=115, METRICS_MULTILINE_COMMENT=116, - METRICS_WS=117, CLOSING_METRICS_LINE_COMMENT=118, CLOSING_METRICS_MULTILINE_COMMENT=119, + DISSECT=1, DROP=2, ENRICH=3, EVAL=4, EXPLAIN=5, FROM=6, GROK=7, KEEP=8, + LIMIT=9, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, + WHERE=16, DEV_INLINESTATS=17, DEV_LOOKUP=18, DEV_METRICS=19, UNKNOWN_CMD=20, + LINE_COMMENT=21, MULTILINE_COMMENT=22, WS=23, PIPE=24, QUOTED_STRING=25, + INTEGER_LITERAL=26, DECIMAL_LITERAL=27, BY=28, AND=29, ASC=30, ASSIGN=31, + CAST_OP=32, COMMA=33, DESC=34, DOT=35, FALSE=36, FIRST=37, IN=38, IS=39, + LAST=40, LIKE=41, LP=42, NOT=43, NULL=44, NULLS=45, OR=46, PARAM=47, RLIKE=48, + RP=49, TRUE=50, EQ=51, CIEQ=52, NEQ=53, LT=54, LTE=55, GT=56, GTE=57, + PLUS=58, MINUS=59, ASTERISK=60, SLASH=61, PERCENT=62, DEV_MATCH=63, NAMED_OR_POSITIONAL_PARAM=64, + OPENING_BRACKET=65, CLOSING_BRACKET=66, UNQUOTED_IDENTIFIER=67, QUOTED_IDENTIFIER=68, + EXPR_LINE_COMMENT=69, EXPR_MULTILINE_COMMENT=70, EXPR_WS=71, EXPLAIN_WS=72, + EXPLAIN_LINE_COMMENT=73, EXPLAIN_MULTILINE_COMMENT=74, METADATA=75, UNQUOTED_SOURCE=76, + FROM_LINE_COMMENT=77, FROM_MULTILINE_COMMENT=78, FROM_WS=79, ID_PATTERN=80, + PROJECT_LINE_COMMENT=81, PROJECT_MULTILINE_COMMENT=82, PROJECT_WS=83, + AS=84, RENAME_LINE_COMMENT=85, RENAME_MULTILINE_COMMENT=86, RENAME_WS=87, + ON=88, WITH=89, ENRICH_POLICY_NAME=90, ENRICH_LINE_COMMENT=91, ENRICH_MULTILINE_COMMENT=92, + ENRICH_WS=93, ENRICH_FIELD_LINE_COMMENT=94, ENRICH_FIELD_MULTILINE_COMMENT=95, + ENRICH_FIELD_WS=96, MVEXPAND_LINE_COMMENT=97, MVEXPAND_MULTILINE_COMMENT=98, + MVEXPAND_WS=99, INFO=100, SHOW_LINE_COMMENT=101, SHOW_MULTILINE_COMMENT=102, + SHOW_WS=103, COLON=104, SETTING=105, SETTING_LINE_COMMENT=106, SETTTING_MULTILINE_COMMENT=107, + SETTING_WS=108, LOOKUP_LINE_COMMENT=109, LOOKUP_MULTILINE_COMMENT=110, + LOOKUP_WS=111, LOOKUP_FIELD_LINE_COMMENT=112, LOOKUP_FIELD_MULTILINE_COMMENT=113, + LOOKUP_FIELD_WS=114, METRICS_LINE_COMMENT=115, METRICS_MULTILINE_COMMENT=116, + METRICS_WS=117, CLOSING_METRICS_LINE_COMMENT=118, CLOSING_METRICS_MULTILINE_COMMENT=119, CLOSING_METRICS_WS=120; public static final int - RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, - RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, - RULE_matchBooleanExpression = 7, RULE_valueExpression = 8, RULE_operatorExpression = 9, - RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_dataType = 12, - RULE_rowCommand = 13, RULE_fields = 14, RULE_field = 15, RULE_fromCommand = 16, - RULE_indexPattern = 17, RULE_clusterString = 18, RULE_indexString = 19, - RULE_metadata = 20, RULE_metadataOption = 21, RULE_deprecated_metadata = 22, - RULE_metricsCommand = 23, RULE_evalCommand = 24, RULE_statsCommand = 25, - RULE_qualifiedName = 26, RULE_qualifiedNamePattern = 27, RULE_qualifiedNamePatterns = 28, - RULE_identifier = 29, RULE_identifierPattern = 30, RULE_constant = 31, - RULE_params = 32, RULE_limitCommand = 33, RULE_sortCommand = 34, RULE_orderExpression = 35, - RULE_keepCommand = 36, RULE_dropCommand = 37, RULE_renameCommand = 38, - RULE_renameClause = 39, RULE_dissectCommand = 40, RULE_grokCommand = 41, - RULE_mvExpandCommand = 42, RULE_commandOptions = 43, RULE_commandOption = 44, - RULE_booleanValue = 45, RULE_numericValue = 46, RULE_decimalValue = 47, - RULE_integerValue = 48, RULE_string = 49, RULE_comparisonOperator = 50, - RULE_explainCommand = 51, RULE_subqueryExpression = 52, RULE_showCommand = 53, - RULE_enrichCommand = 54, RULE_enrichWithClause = 55, RULE_lookupCommand = 56, - RULE_inlinestatsCommand = 57; + RULE_singleStatement = 0, RULE_query = 1, RULE_sourceCommand = 2, RULE_processingCommand = 3, + RULE_whereCommand = 4, RULE_booleanExpression = 5, RULE_regexBooleanExpression = 6, + RULE_matchBooleanExpression = 7, RULE_valueExpression = 8, RULE_operatorExpression = 9, + RULE_primaryExpression = 10, RULE_functionExpression = 11, RULE_functionName = 12, + RULE_dataType = 13, RULE_rowCommand = 14, RULE_fields = 15, RULE_field = 16, + RULE_fromCommand = 17, RULE_indexPattern = 18, RULE_clusterString = 19, + RULE_indexString = 20, RULE_metadata = 21, RULE_metadataOption = 22, RULE_deprecated_metadata = 23, + RULE_metricsCommand = 24, RULE_evalCommand = 25, RULE_statsCommand = 26, + RULE_qualifiedName = 27, RULE_qualifiedNamePattern = 28, RULE_qualifiedNamePatterns = 29, + RULE_identifier = 30, RULE_identifierPattern = 31, RULE_constant = 32, + RULE_params = 33, RULE_limitCommand = 34, RULE_sortCommand = 35, RULE_orderExpression = 36, + RULE_keepCommand = 37, RULE_dropCommand = 38, RULE_renameCommand = 39, + RULE_renameClause = 40, RULE_dissectCommand = 41, RULE_grokCommand = 42, + RULE_mvExpandCommand = 43, RULE_commandOptions = 44, RULE_commandOption = 45, + RULE_booleanValue = 46, RULE_numericValue = 47, RULE_decimalValue = 48, + RULE_integerValue = 49, RULE_string = 50, RULE_comparisonOperator = 51, + RULE_explainCommand = 52, RULE_subqueryExpression = 53, RULE_showCommand = 54, + RULE_enrichCommand = 55, RULE_enrichWithClause = 56, RULE_lookupCommand = 57, + RULE_inlinestatsCommand = 58; private static String[] makeRuleNames() { return new String[] { - "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", - "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", - "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", - "dataType", "rowCommand", "fields", "field", "fromCommand", "indexPattern", - "clusterString", "indexString", "metadata", "metadataOption", "deprecated_metadata", - "metricsCommand", "evalCommand", "statsCommand", "qualifiedName", "qualifiedNamePattern", - "qualifiedNamePatterns", "identifier", "identifierPattern", "constant", - "params", "limitCommand", "sortCommand", "orderExpression", "keepCommand", - "dropCommand", "renameCommand", "renameClause", "dissectCommand", "grokCommand", - "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", - "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", - "explainCommand", "subqueryExpression", "showCommand", "enrichCommand", - "enrichWithClause", "lookupCommand", "inlinestatsCommand" + "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", + "booleanExpression", "regexBooleanExpression", "matchBooleanExpression", + "valueExpression", "operatorExpression", "primaryExpression", "functionExpression", + "functionName", "dataType", "rowCommand", "fields", "field", "fromCommand", + "indexPattern", "clusterString", "indexString", "metadata", "metadataOption", + "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", + "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", "identifier", + "identifierPattern", "constant", "params", "limitCommand", "sortCommand", + "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", + "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", + "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", + "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "showCommand", "enrichCommand", "enrichWithClause", "lookupCommand", + "inlinestatsCommand" }; } public static final String[] ruleNames = makeRuleNames(); private static String[] makeLiteralNames() { return new String[] { - null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", - "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", - "'sort'", "'stats'", "'where'", null, null, null, null, null, null, null, - null, "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", "'::'", - "','", "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", "'last'", - "'like'", "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", "'rlike'", - "')'", "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", - "'+'", "'-'", "'*'", "'/'", "'%'", null, null, "']'", null, null, null, - null, null, null, null, null, "'metadata'", null, null, null, null, null, - null, null, null, "'as'", null, null, null, "'on'", "'with'", null, null, - null, null, null, null, null, null, null, null, "'info'", null, null, + null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", + "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", + "'sort'", "'stats'", "'where'", null, null, null, null, null, null, null, + "'|'", null, null, null, "'by'", "'and'", "'asc'", "'='", "'::'", "','", + "'desc'", "'.'", "'false'", "'first'", "'in'", "'is'", "'last'", "'like'", + "'('", "'not'", "'null'", "'nulls'", "'or'", "'?'", "'rlike'", "')'", + "'true'", "'=='", "'=~'", "'!='", "'<'", "'<='", "'>'", "'>='", "'+'", + "'-'", "'*'", "'/'", "'%'", null, null, null, "']'", null, null, null, + null, null, null, null, null, "'metadata'", null, null, null, null, null, + null, null, null, "'as'", null, null, null, "'on'", "'with'", null, null, + null, null, null, null, null, null, null, null, "'info'", null, null, null, "':'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { - null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", - "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", - "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_MATCH", "DEV_METRICS", - "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", - "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", - "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", - "CIEQ", "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", - "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", - "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", - "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", - "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", "SHOW_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", - "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", + "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", + "WHERE", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "UNKNOWN_CMD", + "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", + "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COMMA", + "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", "LP", "NOT", + "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", "CIEQ", + "NEQ", "LT", "LTE", "GT", "GTE", "PLUS", "MINUS", "ASTERISK", "SLASH", + "PERCENT", "DEV_MATCH", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", + "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", "EXPR_WS", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", "METADATA", "UNQUOTED_SOURCE", "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", "FROM_WS", "ID_PATTERN", "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ON", "WITH", "ENRICH_POLICY_NAME", + "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "COLON", "SETTING", "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", + "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS" }; } @@ -218,9 +231,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(116); + setState(118); query(0); - setState(117); + setState(119); match(EOF); } } @@ -242,7 +255,7 @@ public QueryContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_query; } - + @SuppressWarnings("this-escape") public QueryContext() { } public void copyFrom(QueryContext ctx) { @@ -316,11 +329,11 @@ private QueryContext query(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(120); + setState(122); sourceCommand(); } _ctx.stop = _input.LT(-1); - setState(127); + setState(129); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -331,16 +344,16 @@ private QueryContext query(int _p) throws RecognitionException { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(122); + setState(124); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(123); + setState(125); match(PIPE); - setState(124); + setState(126); processingCommand(); } - } + } } - setState(129); + setState(131); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } @@ -398,43 +411,43 @@ public final SourceCommandContext sourceCommand() throws RecognitionException { SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); enterRule(_localctx, 4, RULE_sourceCommand); try { - setState(136); + setState(138); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(130); + setState(132); explainCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(131); + setState(133); fromCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(132); + setState(134); rowCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(133); + setState(135); showCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(134); + setState(136); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(135); + setState(137); metricsCommand(); } break; @@ -519,108 +532,108 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); enterRule(_localctx, 6, RULE_processingCommand); try { - setState(154); + setState(156); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(138); + setState(140); evalCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(139); + setState(141); whereCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(140); + setState(142); keepCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(141); + setState(143); limitCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(142); + setState(144); statsCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(143); + setState(145); sortCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(144); + setState(146); dropCommand(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(145); + setState(147); renameCommand(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(146); + setState(148); dissectCommand(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(147); + setState(149); grokCommand(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(148); + setState(150); enrichCommand(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(149); + setState(151); mvExpandCommand(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(150); + setState(152); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(151); + setState(153); inlinestatsCommand(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(152); + setState(154); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(153); + setState(155); lookupCommand(); } break; @@ -669,9 +682,9 @@ public final WhereCommandContext whereCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(156); + setState(158); match(WHERE); - setState(157); + setState(159); booleanExpression(0); } } @@ -693,7 +706,7 @@ public BooleanExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_booleanExpression; } - + @SuppressWarnings("this-escape") public BooleanExpressionContext() { } public void copyFrom(BooleanExpressionContext ctx) { @@ -887,7 +900,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(189); + setState(191); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: @@ -896,9 +909,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(160); + setState(162); match(NOT); - setState(161); + setState(163); booleanExpression(8); } break; @@ -907,7 +920,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(162); + setState(164); valueExpression(); } break; @@ -916,7 +929,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(163); + setState(165); regexBooleanExpression(); } break; @@ -925,41 +938,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(164); - valueExpression(); setState(166); + valueExpression(); + setState(168); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(165); + setState(167); match(NOT); } } - setState(168); + setState(170); match(IN); - setState(169); + setState(171); match(LP); - setState(170); + setState(172); valueExpression(); - setState(175); + setState(177); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(171); + setState(173); match(COMMA); - setState(172); + setState(174); valueExpression(); } } - setState(177); + setState(179); _errHandler.sync(this); _la = _input.LA(1); } - setState(178); + setState(180); match(RP); } break; @@ -968,21 +981,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(180); + setState(182); valueExpression(); - setState(181); - match(IS); setState(183); + match(IS); + setState(185); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(182); + setState(184); match(NOT); } } - setState(185); + setState(187); match(NULL); } break; @@ -991,15 +1004,15 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(187); + setState(189); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(188); + setState(190); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(199); + setState(201); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1007,7 +1020,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(197); + setState(199); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: @@ -1015,11 +1028,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(191); + setState(193); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(192); + setState(194); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(193); + setState(195); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -1028,18 +1041,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(194); + setState(196); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(195); + setState(197); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(196); + setState(198); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } - } + } } - setState(201); + setState(203); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } @@ -1094,48 +1107,48 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog enterRule(_localctx, 12, RULE_regexBooleanExpression); int _la; try { - setState(216); + setState(218); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(202); - valueExpression(); setState(204); + valueExpression(); + setState(206); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(203); + setState(205); match(NOT); } } - setState(206); + setState(208); ((RegexBooleanExpressionContext)_localctx).kind = match(LIKE); - setState(207); + setState(209); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(209); - valueExpression(); setState(211); + valueExpression(); + setState(213); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(210); + setState(212); match(NOT); } } - setState(213); + setState(215); ((RegexBooleanExpressionContext)_localctx).kind = match(RLIKE); - setState(214); + setState(216); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; @@ -1188,11 +1201,11 @@ public final MatchBooleanExpressionContext matchBooleanExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(218); + setState(220); valueExpression(); - setState(219); + setState(221); match(DEV_MATCH); - setState(220); + setState(222); ((MatchBooleanExpressionContext)_localctx).queryString = string(); } } @@ -1214,7 +1227,7 @@ public ValueExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_valueExpression; } - + @SuppressWarnings("this-escape") public ValueExpressionContext() { } public void copyFrom(ValueExpressionContext ctx) { @@ -1276,14 +1289,14 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); enterRule(_localctx, 16, RULE_valueExpression); try { - setState(227); + setState(229); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(222); + setState(224); operatorExpression(0); } break; @@ -1291,11 +1304,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(223); + setState(225); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(224); + setState(226); comparisonOperator(); - setState(225); + setState(227); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -1319,7 +1332,7 @@ public OperatorExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_operatorExpression; } - + @SuppressWarnings("this-escape") public OperatorExpressionContext() { } public void copyFrom(OperatorExpressionContext ctx) { @@ -1420,7 +1433,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _alt; enterOuterAlt(_localctx, 1); { - setState(233); + setState(235); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: @@ -1429,7 +1442,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _ctx = _localctx; _prevctx = _localctx; - setState(230); + setState(232); primaryExpression(0); } break; @@ -1438,7 +1451,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(231); + setState(233); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1449,13 +1462,13 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(232); + setState(234); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(243); + setState(245); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1463,7 +1476,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(241); + setState(243); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: @@ -1471,12 +1484,12 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(235); + setState(237); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(236); + setState(238); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & -2305843009213693952L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070450532247928832L) != 0)) ) { ((ArithmeticBinaryContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1484,7 +1497,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(237); + setState(239); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -1493,9 +1506,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(238); + setState(240); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(239); + setState(241); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1506,14 +1519,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(240); + setState(242); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } - } + } } - setState(245); + setState(247); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } @@ -1537,7 +1550,7 @@ public PrimaryExpressionContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_primaryExpression; } - + @SuppressWarnings("this-escape") public PrimaryExpressionContext() { } public void copyFrom(PrimaryExpressionContext ctx) { @@ -1671,7 +1684,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(254); + setState(256); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1680,7 +1693,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(247); + setState(249); constant(); } break; @@ -1689,7 +1702,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(248); + setState(250); qualifiedName(); } break; @@ -1698,7 +1711,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(249); + setState(251); functionExpression(); } break; @@ -1707,17 +1720,17 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(250); + setState(252); match(LP); - setState(251); + setState(253); booleanExpression(0); - setState(252); + setState(254); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(261); + setState(263); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1728,16 +1741,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(256); + setState(258); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(257); + setState(259); match(CAST_OP); - setState(258); + setState(260); dataType(); } - } + } } - setState(263); + setState(265); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1756,8 +1769,8 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc @SuppressWarnings("CheckReturnValue") public static class FunctionExpressionContext extends ParserRuleContext { - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); + public FunctionNameContext functionName() { + return getRuleContext(FunctionNameContext.class,0); } public TerminalNode LP() { return getToken(EsqlBaseParser.LP, 0); } public TerminalNode RP() { return getToken(EsqlBaseParser.RP, 0); } @@ -1799,37 +1812,37 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(264); - identifier(); - setState(265); + setState(266); + functionName(); + setState(267); match(LP); - setState(275); + setState(277); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: { - setState(266); + setState(268); match(ASTERISK); } break; case 2: { { - setState(267); + setState(269); booleanExpression(0); - setState(272); + setState(274); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(268); + setState(270); match(COMMA); - setState(269); + setState(271); booleanExpression(0); } } - setState(274); + setState(276); _errHandler.sync(this); _la = _input.LA(1); } @@ -1837,7 +1850,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(277); + setState(279); match(RP); } } @@ -1852,6 +1865,68 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class FunctionNameContext extends ParserRuleContext { + public TerminalNode DEV_MATCH() { return getToken(EsqlBaseParser.DEV_MATCH, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + @SuppressWarnings("this-escape") + public FunctionNameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionName; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterFunctionName(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitFunctionName(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitFunctionName(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionNameContext functionName() throws RecognitionException { + FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_functionName); + try { + setState(284); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(281); + if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); + setState(282); + match(DEV_MATCH); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(283); + identifier(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class DataTypeContext extends ParserRuleContext { @SuppressWarnings("this-escape") @@ -1859,7 +1934,7 @@ public DataTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_dataType; } - + @SuppressWarnings("this-escape") public DataTypeContext() { } public void copyFrom(DataTypeContext ctx) { @@ -1890,12 +1965,12 @@ public T accept(ParseTreeVisitor visitor) { public final DataTypeContext dataType() throws RecognitionException { DataTypeContext _localctx = new DataTypeContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_dataType); + enterRule(_localctx, 26, RULE_dataType); try { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(279); + setState(286); identifier(); } } @@ -1938,13 +2013,13 @@ public T accept(ParseTreeVisitor visitor) { public final RowCommandContext rowCommand() throws RecognitionException { RowCommandContext _localctx = new RowCommandContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_rowCommand); + enterRule(_localctx, 28, RULE_rowCommand); try { enterOuterAlt(_localctx, 1); { - setState(281); + setState(288); match(ROW); - setState(282); + setState(289); fields(); } } @@ -1993,30 +2068,30 @@ public T accept(ParseTreeVisitor visitor) { public final FieldsContext fields() throws RecognitionException { FieldsContext _localctx = new FieldsContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_fields); + enterRule(_localctx, 30, RULE_fields); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(284); + setState(291); field(); - setState(289); + setState(296); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(285); + setState(292); match(COMMA); - setState(286); + setState(293); field(); } - } + } } - setState(291); + setState(298); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,21,_ctx); } } } @@ -2062,26 +2137,26 @@ public T accept(ParseTreeVisitor visitor) { public final FieldContext field() throws RecognitionException { FieldContext _localctx = new FieldContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_field); + enterRule(_localctx, 32, RULE_field); try { - setState(297); + setState(304); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(292); + setState(299); booleanExpression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(293); + setState(300); qualifiedName(); - setState(294); + setState(301); match(ASSIGN); - setState(295); + setState(302); booleanExpression(0); } break; @@ -2136,39 +2211,39 @@ public T accept(ParseTreeVisitor visitor) { public final FromCommandContext fromCommand() throws RecognitionException { FromCommandContext _localctx = new FromCommandContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_fromCommand); + enterRule(_localctx, 34, RULE_fromCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(299); + setState(306); match(FROM); - setState(300); + setState(307); indexPattern(); - setState(305); + setState(312); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,22,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(301); + setState(308); match(COMMA); - setState(302); + setState(309); indexPattern(); } - } + } } - setState(307); + setState(314); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,22,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(309); + setState(316); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - setState(308); + setState(315); metadata(); } break; @@ -2217,26 +2292,26 @@ public T accept(ParseTreeVisitor visitor) { public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_indexPattern); + enterRule(_localctx, 36, RULE_indexPattern); try { - setState(316); + setState(323); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(311); + setState(318); clusterString(); - setState(312); + setState(319); match(COLON); - setState(313); + setState(320); indexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(315); + setState(322); indexString(); } break; @@ -2278,11 +2353,11 @@ public T accept(ParseTreeVisitor visitor) { public final ClusterStringContext clusterString() throws RecognitionException { ClusterStringContext _localctx = new ClusterStringContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_clusterString); + enterRule(_localctx, 38, RULE_clusterString); try { enterOuterAlt(_localctx, 1); { - setState(318); + setState(325); match(UNQUOTED_SOURCE); } } @@ -2323,12 +2398,12 @@ public T accept(ParseTreeVisitor visitor) { public final IndexStringContext indexString() throws RecognitionException { IndexStringContext _localctx = new IndexStringContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_indexString); + enterRule(_localctx, 40, RULE_indexString); int _la; try { enterOuterAlt(_localctx, 1); { - setState(320); + setState(327); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -2381,22 +2456,22 @@ public T accept(ParseTreeVisitor visitor) { public final MetadataContext metadata() throws RecognitionException { MetadataContext _localctx = new MetadataContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_metadata); + enterRule(_localctx, 42, RULE_metadata); try { - setState(324); + setState(331); _errHandler.sync(this); switch (_input.LA(1)) { case METADATA: enterOuterAlt(_localctx, 1); { - setState(322); + setState(329); metadataOption(); } break; case OPENING_BRACKET: enterOuterAlt(_localctx, 2); { - setState(323); + setState(330); deprecated_metadata(); } break; @@ -2448,32 +2523,32 @@ public T accept(ParseTreeVisitor visitor) { public final MetadataOptionContext metadataOption() throws RecognitionException { MetadataOptionContext _localctx = new MetadataOptionContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_metadataOption); + enterRule(_localctx, 44, RULE_metadataOption); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(326); + setState(333); match(METADATA); - setState(327); + setState(334); match(UNQUOTED_SOURCE); - setState(332); + setState(339); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(328); + setState(335); match(COMMA); - setState(329); + setState(336); match(UNQUOTED_SOURCE); } - } + } } - setState(334); + setState(341); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,26,_ctx); + _alt = getInterpreter().adaptivePredict(_input,27,_ctx); } } } @@ -2516,15 +2591,15 @@ public T accept(ParseTreeVisitor visitor) { public final Deprecated_metadataContext deprecated_metadata() throws RecognitionException { Deprecated_metadataContext _localctx = new Deprecated_metadataContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_deprecated_metadata); + enterRule(_localctx, 46, RULE_deprecated_metadata); try { enterOuterAlt(_localctx, 1); { - setState(335); + setState(342); match(OPENING_BRACKET); - setState(336); + setState(343); metadataOption(); - setState(337); + setState(344); match(CLOSING_BRACKET); } } @@ -2583,51 +2658,51 @@ public T accept(ParseTreeVisitor visitor) { public final MetricsCommandContext metricsCommand() throws RecognitionException { MetricsCommandContext _localctx = new MetricsCommandContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_metricsCommand); + enterRule(_localctx, 48, RULE_metricsCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(339); + setState(346); match(DEV_METRICS); - setState(340); + setState(347); indexPattern(); - setState(345); + setState(352); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(341); + setState(348); match(COMMA); - setState(342); + setState(349); indexPattern(); } - } + } } - setState(347); + setState(354); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,27,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } - setState(349); + setState(356); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: { - setState(348); + setState(355); ((MetricsCommandContext)_localctx).aggregates = fields(); } break; } - setState(353); + setState(360); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { - setState(351); + setState(358); match(BY); - setState(352); + setState(359); ((MetricsCommandContext)_localctx).grouping = fields(); } break; @@ -2673,13 +2748,13 @@ public T accept(ParseTreeVisitor visitor) { public final EvalCommandContext evalCommand() throws RecognitionException { EvalCommandContext _localctx = new EvalCommandContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_evalCommand); + enterRule(_localctx, 50, RULE_evalCommand); try { enterOuterAlt(_localctx, 1); { - setState(355); + setState(362); match(EVAL); - setState(356); + setState(363); fields(); } } @@ -2728,30 +2803,30 @@ public T accept(ParseTreeVisitor visitor) { public final StatsCommandContext statsCommand() throws RecognitionException { StatsCommandContext _localctx = new StatsCommandContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_statsCommand); + enterRule(_localctx, 52, RULE_statsCommand); try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(365); match(STATS); - setState(360); + setState(367); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(359); + setState(366); ((StatsCommandContext)_localctx).stats = fields(); } break; } - setState(364); + setState(371); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(362); + setState(369); match(BY); - setState(363); + setState(370); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2803,30 +2878,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNameContext qualifiedName() throws RecognitionException { QualifiedNameContext _localctx = new QualifiedNameContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_qualifiedName); + enterRule(_localctx, 54, RULE_qualifiedName); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(366); + setState(373); identifier(); - setState(371); + setState(378); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(367); + setState(374); match(DOT); - setState(368); + setState(375); identifier(); } - } + } } - setState(373); + setState(380); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } } } @@ -2875,30 +2950,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNamePatternContext qualifiedNamePattern() throws RecognitionException { QualifiedNamePatternContext _localctx = new QualifiedNamePatternContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_qualifiedNamePattern); + enterRule(_localctx, 56, RULE_qualifiedNamePattern); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(374); + setState(381); identifierPattern(); - setState(379); + setState(386); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(375); + setState(382); match(DOT); - setState(376); + setState(383); identifierPattern(); } - } + } } - setState(381); + setState(388); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } } } @@ -2947,30 +3022,30 @@ public T accept(ParseTreeVisitor visitor) { public final QualifiedNamePatternsContext qualifiedNamePatterns() throws RecognitionException { QualifiedNamePatternsContext _localctx = new QualifiedNamePatternsContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_qualifiedNamePatterns); + enterRule(_localctx, 58, RULE_qualifiedNamePatterns); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(382); + setState(389); qualifiedNamePattern(); - setState(387); + setState(394); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(383); + setState(390); match(COMMA); - setState(384); + setState(391); qualifiedNamePattern(); } - } + } } - setState(389); + setState(396); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } } } @@ -3011,12 +3086,12 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierContext identifier() throws RecognitionException { IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_identifier); + enterRule(_localctx, 60, RULE_identifier); int _la; try { enterOuterAlt(_localctx, 1); { - setState(390); + setState(397); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -3064,11 +3139,11 @@ public T accept(ParseTreeVisitor visitor) { public final IdentifierPatternContext identifierPattern() throws RecognitionException { IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_identifierPattern); + enterRule(_localctx, 62, RULE_identifierPattern); try { enterOuterAlt(_localctx, 1); { - setState(392); + setState(399); match(ID_PATTERN); } } @@ -3090,7 +3165,7 @@ public ConstantContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_constant; } - + @SuppressWarnings("this-escape") public ConstantContext() { } public void copyFrom(ConstantContext ctx) { @@ -3336,17 +3411,17 @@ public T accept(ParseTreeVisitor visitor) { public final ConstantContext constant() throws RecognitionException { ConstantContext _localctx = new ConstantContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_constant); + enterRule(_localctx, 64, RULE_constant); int _la; try { - setState(436); + setState(443); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(394); + setState(401); match(NULL); } break; @@ -3354,9 +3429,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(395); + setState(402); integerValue(); - setState(396); + setState(403); match(UNQUOTED_IDENTIFIER); } break; @@ -3364,7 +3439,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(398); + setState(405); decimalValue(); } break; @@ -3372,7 +3447,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(399); + setState(406); integerValue(); } break; @@ -3380,7 +3455,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(400); + setState(407); booleanValue(); } break; @@ -3388,7 +3463,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new InputParamsContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(401); + setState(408); params(); } break; @@ -3396,7 +3471,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(402); + setState(409); string(); } break; @@ -3404,27 +3479,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(403); + setState(410); match(OPENING_BRACKET); - setState(404); + setState(411); numericValue(); - setState(409); + setState(416); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(405); + setState(412); match(COMMA); - setState(406); + setState(413); numericValue(); } } - setState(411); + setState(418); _errHandler.sync(this); _la = _input.LA(1); } - setState(412); + setState(419); match(CLOSING_BRACKET); } break; @@ -3432,27 +3507,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(414); + setState(421); match(OPENING_BRACKET); - setState(415); + setState(422); booleanValue(); - setState(420); + setState(427); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(416); + setState(423); match(COMMA); - setState(417); + setState(424); booleanValue(); } } - setState(422); + setState(429); _errHandler.sync(this); _la = _input.LA(1); } - setState(423); + setState(430); match(CLOSING_BRACKET); } break; @@ -3460,27 +3535,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(425); + setState(432); match(OPENING_BRACKET); - setState(426); + setState(433); string(); - setState(431); + setState(438); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(427); + setState(434); match(COMMA); - setState(428); + setState(435); string(); } } - setState(433); + setState(440); _errHandler.sync(this); _la = _input.LA(1); } - setState(434); + setState(441); match(CLOSING_BRACKET); } break; @@ -3504,7 +3579,7 @@ public ParamsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_params; } - + @SuppressWarnings("this-escape") public ParamsContext() { } public void copyFrom(ParamsContext ctx) { @@ -3552,16 +3627,16 @@ public T accept(ParseTreeVisitor visitor) { public final ParamsContext params() throws RecognitionException { ParamsContext _localctx = new ParamsContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_params); + enterRule(_localctx, 66, RULE_params); try { - setState(440); + setState(447); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(438); + setState(445); match(PARAM); } break; @@ -3569,7 +3644,7 @@ public final ParamsContext params() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(439); + setState(446); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -3614,13 +3689,13 @@ public T accept(ParseTreeVisitor visitor) { public final LimitCommandContext limitCommand() throws RecognitionException { LimitCommandContext _localctx = new LimitCommandContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_limitCommand); + enterRule(_localctx, 68, RULE_limitCommand); try { enterOuterAlt(_localctx, 1); { - setState(442); + setState(449); match(LIMIT); - setState(443); + setState(450); match(INTEGER_LITERAL); } } @@ -3670,32 +3745,32 @@ public T accept(ParseTreeVisitor visitor) { public final SortCommandContext sortCommand() throws RecognitionException { SortCommandContext _localctx = new SortCommandContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_sortCommand); + enterRule(_localctx, 70, RULE_sortCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(445); + setState(452); match(SORT); - setState(446); + setState(453); orderExpression(); - setState(451); + setState(458); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(447); + setState(454); match(COMMA); - setState(448); + setState(455); orderExpression(); } - } + } } - setState(453); + setState(460); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + _alt = getInterpreter().adaptivePredict(_input,41,_ctx); } } } @@ -3744,19 +3819,19 @@ public T accept(ParseTreeVisitor visitor) { public final OrderExpressionContext orderExpression() throws RecognitionException { OrderExpressionContext _localctx = new OrderExpressionContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_orderExpression); + enterRule(_localctx, 72, RULE_orderExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(454); + setState(461); booleanExpression(0); - setState(456); + setState(463); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { case 1: { - setState(455); + setState(462); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3770,14 +3845,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(460); + setState(467); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(458); + setState(465); match(NULLS); - setState(459); + setState(466); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3832,13 +3907,13 @@ public T accept(ParseTreeVisitor visitor) { public final KeepCommandContext keepCommand() throws RecognitionException { KeepCommandContext _localctx = new KeepCommandContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_keepCommand); + enterRule(_localctx, 74, RULE_keepCommand); try { enterOuterAlt(_localctx, 1); { - setState(462); + setState(469); match(KEEP); - setState(463); + setState(470); qualifiedNamePatterns(); } } @@ -3881,13 +3956,13 @@ public T accept(ParseTreeVisitor visitor) { public final DropCommandContext dropCommand() throws RecognitionException { DropCommandContext _localctx = new DropCommandContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_dropCommand); + enterRule(_localctx, 76, RULE_dropCommand); try { enterOuterAlt(_localctx, 1); { - setState(465); + setState(472); match(DROP); - setState(466); + setState(473); qualifiedNamePatterns(); } } @@ -3937,32 +4012,32 @@ public T accept(ParseTreeVisitor visitor) { public final RenameCommandContext renameCommand() throws RecognitionException { RenameCommandContext _localctx = new RenameCommandContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_renameCommand); + enterRule(_localctx, 78, RULE_renameCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(468); + setState(475); match(RENAME); - setState(469); + setState(476); renameClause(); - setState(474); + setState(481); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(470); + setState(477); match(COMMA); - setState(471); + setState(478); renameClause(); } - } + } } - setState(476); + setState(483); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } } } @@ -4010,15 +4085,15 @@ public T accept(ParseTreeVisitor visitor) { public final RenameClauseContext renameClause() throws RecognitionException { RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_renameClause); + enterRule(_localctx, 80, RULE_renameClause); try { enterOuterAlt(_localctx, 1); { - setState(477); + setState(484); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(478); + setState(485); match(AS); - setState(479); + setState(486); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } } @@ -4067,22 +4142,22 @@ public T accept(ParseTreeVisitor visitor) { public final DissectCommandContext dissectCommand() throws RecognitionException { DissectCommandContext _localctx = new DissectCommandContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_dissectCommand); + enterRule(_localctx, 82, RULE_dissectCommand); try { enterOuterAlt(_localctx, 1); { - setState(481); + setState(488); match(DISSECT); - setState(482); + setState(489); primaryExpression(0); - setState(483); + setState(490); string(); - setState(485); + setState(492); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(484); + setState(491); commandOptions(); } break; @@ -4131,15 +4206,15 @@ public T accept(ParseTreeVisitor visitor) { public final GrokCommandContext grokCommand() throws RecognitionException { GrokCommandContext _localctx = new GrokCommandContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_grokCommand); + enterRule(_localctx, 84, RULE_grokCommand); try { enterOuterAlt(_localctx, 1); { - setState(487); + setState(494); match(GROK); - setState(488); + setState(495); primaryExpression(0); - setState(489); + setState(496); string(); } } @@ -4182,13 +4257,13 @@ public T accept(ParseTreeVisitor visitor) { public final MvExpandCommandContext mvExpandCommand() throws RecognitionException { MvExpandCommandContext _localctx = new MvExpandCommandContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_mvExpandCommand); + enterRule(_localctx, 86, RULE_mvExpandCommand); try { enterOuterAlt(_localctx, 1); { - setState(491); + setState(498); match(MV_EXPAND); - setState(492); + setState(499); qualifiedName(); } } @@ -4237,30 +4312,30 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionsContext commandOptions() throws RecognitionException { CommandOptionsContext _localctx = new CommandOptionsContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_commandOptions); + enterRule(_localctx, 88, RULE_commandOptions); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(494); + setState(501); commandOption(); - setState(499); + setState(506); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(495); + setState(502); match(COMMA); - setState(496); + setState(503); commandOption(); } - } + } } - setState(501); + setState(508); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,45,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } } } @@ -4306,15 +4381,15 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionContext commandOption() throws RecognitionException { CommandOptionContext _localctx = new CommandOptionContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_commandOption); + enterRule(_localctx, 90, RULE_commandOption); try { enterOuterAlt(_localctx, 1); { - setState(502); + setState(509); identifier(); - setState(503); + setState(510); match(ASSIGN); - setState(504); + setState(511); constant(); } } @@ -4355,12 +4430,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_booleanValue); + enterRule(_localctx, 92, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(506); + setState(513); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -4413,22 +4488,22 @@ public T accept(ParseTreeVisitor visitor) { public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_numericValue); + enterRule(_localctx, 94, RULE_numericValue); try { - setState(510); + setState(517); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,46,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(508); + setState(515); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(509); + setState(516); integerValue(); } break; @@ -4472,17 +4547,17 @@ public T accept(ParseTreeVisitor visitor) { public final DecimalValueContext decimalValue() throws RecognitionException { DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_decimalValue); + enterRule(_localctx, 96, RULE_decimalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(513); + setState(520); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(512); + setState(519); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4495,7 +4570,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(515); + setState(522); match(DECIMAL_LITERAL); } } @@ -4537,17 +4612,17 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerValueContext integerValue() throws RecognitionException { IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_integerValue); + enterRule(_localctx, 98, RULE_integerValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(518); + setState(525); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(517); + setState(524); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4560,7 +4635,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(520); + setState(527); match(INTEGER_LITERAL); } } @@ -4600,11 +4675,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_string); + enterRule(_localctx, 100, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(522); + setState(529); match(QUOTED_STRING); } } @@ -4649,14 +4724,14 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_comparisonOperator); + enterRule(_localctx, 102, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(524); + setState(531); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 562949953421312000L) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 281474976710656000L) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -4705,13 +4780,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplainCommandContext explainCommand() throws RecognitionException { ExplainCommandContext _localctx = new ExplainCommandContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_explainCommand); + enterRule(_localctx, 104, RULE_explainCommand); try { enterOuterAlt(_localctx, 1); { - setState(526); + setState(533); match(EXPLAIN); - setState(527); + setState(534); subqueryExpression(); } } @@ -4755,15 +4830,15 @@ public T accept(ParseTreeVisitor visitor) { public final SubqueryExpressionContext subqueryExpression() throws RecognitionException { SubqueryExpressionContext _localctx = new SubqueryExpressionContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_subqueryExpression); + enterRule(_localctx, 106, RULE_subqueryExpression); try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(536); match(OPENING_BRACKET); - setState(530); + setState(537); query(0); - setState(531); + setState(538); match(CLOSING_BRACKET); } } @@ -4785,7 +4860,7 @@ public ShowCommandContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_showCommand; } - + @SuppressWarnings("this-escape") public ShowCommandContext() { } public void copyFrom(ShowCommandContext ctx) { @@ -4815,14 +4890,14 @@ public T accept(ParseTreeVisitor visitor) { public final ShowCommandContext showCommand() throws RecognitionException { ShowCommandContext _localctx = new ShowCommandContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_showCommand); + enterRule(_localctx, 108, RULE_showCommand); try { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(533); + setState(540); match(SHOW); - setState(534); + setState(541); match(INFO); } } @@ -4880,53 +4955,53 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichCommandContext enrichCommand() throws RecognitionException { EnrichCommandContext _localctx = new EnrichCommandContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_enrichCommand); + enterRule(_localctx, 110, RULE_enrichCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(536); + setState(543); match(ENRICH); - setState(537); + setState(544); ((EnrichCommandContext)_localctx).policyName = match(ENRICH_POLICY_NAME); - setState(540); + setState(547); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { case 1: { - setState(538); + setState(545); match(ON); - setState(539); + setState(546); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(551); + setState(558); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(542); + setState(549); match(WITH); - setState(543); + setState(550); enrichWithClause(); - setState(548); + setState(555); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(544); + setState(551); match(COMMA); - setState(545); + setState(552); enrichWithClause(); } - } + } } - setState(550); + setState(557); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,50,_ctx); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); } } break; @@ -4977,23 +5052,23 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichWithClauseContext enrichWithClause() throws RecognitionException { EnrichWithClauseContext _localctx = new EnrichWithClauseContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_enrichWithClause); + enterRule(_localctx, 112, RULE_enrichWithClause); try { enterOuterAlt(_localctx, 1); { - setState(556); + setState(563); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { - setState(553); + setState(560); ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(554); + setState(561); match(ASSIGN); } break; } - setState(558); + setState(565); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -5042,17 +5117,17 @@ public T accept(ParseTreeVisitor visitor) { public final LookupCommandContext lookupCommand() throws RecognitionException { LookupCommandContext _localctx = new LookupCommandContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_lookupCommand); + enterRule(_localctx, 114, RULE_lookupCommand); try { enterOuterAlt(_localctx, 1); { - setState(560); + setState(567); match(DEV_LOOKUP); - setState(561); + setState(568); ((LookupCommandContext)_localctx).tableName = indexPattern(); - setState(562); + setState(569); match(ON); - setState(563); + setState(570); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5101,22 +5176,22 @@ public T accept(ParseTreeVisitor visitor) { public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_inlinestatsCommand); + enterRule(_localctx, 116, RULE_inlinestatsCommand); try { enterOuterAlt(_localctx, 1); { - setState(565); + setState(572); match(DEV_INLINESTATS); - setState(566); + setState(573); ((InlinestatsCommandContext)_localctx).stats = fields(); - setState(569); + setState(576); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(567); + setState(574); match(BY); - setState(568); + setState(575); ((InlinestatsCommandContext)_localctx).grouping = fields(); } break; @@ -5148,6 +5223,8 @@ public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { return operatorExpression_sempred((OperatorExpressionContext)_localctx, predIndex); case 10: return primaryExpression_sempred((PrimaryExpressionContext)_localctx, predIndex); + case 12: + return functionName_sempred((FunctionNameContext)_localctx, predIndex); } return true; } @@ -5201,9 +5278,16 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in } return true; } + private boolean functionName_sempred(FunctionNameContext _localctx, int predIndex) { + switch (predIndex) { + case 10: + return this.isDevVersion(); + } + return true; + } public static final String _serializedATN = - "\u0004\u0001x\u023c\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001x\u0243\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -5218,355 +5302,357 @@ private boolean primaryExpression_sempred(PrimaryExpressionContext _localctx, in "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ - "7\u00077\u00028\u00078\u00029\u00079\u0001\u0000\u0001\u0000\u0001\u0000"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0005\u0001~\b\u0001\n\u0001\f\u0001\u0081\t\u0001\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002\u0089"+ - "\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001\u0080\b\u0001\n\u0001\f\u0001\u0083\t\u0001\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003"+ + "\u0002\u008b\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u009b"+ - "\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00a7"+ - "\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005"+ - "\u0005\u00ae\b\u0005\n\u0005\f\u0005\u00b1\t\u0005\u0001\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00b8\b\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00be\b\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0005\u0005"+ - "\u00c6\b\u0005\n\u0005\f\u0005\u00c9\t\u0005\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u00cd\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u00d4\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ - "\u0006\u00d9\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e4\b\b\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0003\t\u00ea\b\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0005\t\u00f2\b\t\n\t\f\t\u00f5\t\t\u0001\n\u0001\n\u0001\n\u0001\n"+ - "\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u00ff\b\n\u0001\n\u0001\n\u0001"+ - "\n\u0005\n\u0104\b\n\n\n\f\n\u0107\t\n\u0001\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u010f\b\u000b\n\u000b"+ - "\f\u000b\u0112\t\u000b\u0003\u000b\u0114\b\u000b\u0001\u000b\u0001\u000b"+ - "\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001"+ - "\u000e\u0005\u000e\u0120\b\u000e\n\u000e\f\u000e\u0123\t\u000e\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u012a\b\u000f"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0005\u0010\u0130\b\u0010"+ - "\n\u0010\f\u0010\u0133\t\u0010\u0001\u0010\u0003\u0010\u0136\b\u0010\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u013d"+ - "\b\u0011\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001"+ - "\u0014\u0003\u0014\u0145\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ - "\u0015\u0005\u0015\u014b\b\u0015\n\u0015\f\u0015\u014e\t\u0015\u0001\u0016"+ - "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0005\u0017\u0158\b\u0017\n\u0017\f\u0017\u015b\t\u0017\u0001"+ - "\u0017\u0003\u0017\u015e\b\u0017\u0001\u0017\u0001\u0017\u0003\u0017\u0162"+ - "\b\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0003"+ - "\u0019\u0169\b\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u016d\b\u0019"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u0172\b\u001a\n\u001a"+ - "\f\u001a\u0175\t\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b"+ - "\u017a\b\u001b\n\u001b\f\u001b\u017d\t\u001b\u0001\u001c\u0001\u001c\u0001"+ - "\u001c\u0005\u001c\u0182\b\u001c\n\u001c\f\u001c\u0185\t\u001c\u0001\u001d"+ - "\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u0198\b\u001f"+ - "\n\u001f\f\u001f\u019b\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ - "\u001f\u0001\u001f\u0001\u001f\u0005\u001f\u01a3\b\u001f\n\u001f\f\u001f"+ - "\u01a6\t\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ - "\u0001\u001f\u0005\u001f\u01ae\b\u001f\n\u001f\f\u001f\u01b1\t\u001f\u0001"+ - "\u001f\u0001\u001f\u0003\u001f\u01b5\b\u001f\u0001 \u0001 \u0003 \u01b9"+ - "\b \u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0005\"\u01c2"+ - "\b\"\n\"\f\"\u01c5\t\"\u0001#\u0001#\u0003#\u01c9\b#\u0001#\u0001#\u0003"+ - "#\u01cd\b#\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001"+ - "&\u0001&\u0005&\u01d9\b&\n&\f&\u01dc\t&\u0001\'\u0001\'\u0001\'\u0001"+ - "\'\u0001(\u0001(\u0001(\u0001(\u0003(\u01e6\b(\u0001)\u0001)\u0001)\u0001"+ - ")\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0005+\u01f2\b+\n+\f+\u01f5"+ - "\t+\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001.\u0001.\u0003.\u01ff"+ - "\b.\u0001/\u0003/\u0202\b/\u0001/\u0001/\u00010\u00030\u0207\b0\u0001"+ - "0\u00010\u00011\u00011\u00012\u00012\u00013\u00013\u00013\u00014\u0001"+ - "4\u00014\u00014\u00015\u00015\u00015\u00016\u00016\u00016\u00016\u0003"+ - "6\u021d\b6\u00016\u00016\u00016\u00016\u00056\u0223\b6\n6\f6\u0226\t6"+ - "\u00036\u0228\b6\u00017\u00017\u00017\u00037\u022d\b7\u00017\u00017\u0001"+ - "8\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u00039\u023a"+ - "\b9\u00019\u0000\u0004\u0002\n\u0012\u0014:\u0000\u0002\u0004\u0006\b"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003"+ + "\u0003\u009d\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u00a9\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0005\u0005\u00b0\b\u0005\n\u0005\f\u0005\u00b3\t\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00ba\b\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00c0\b\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0005\u0005\u00c8\b\u0005\n\u0005\f\u0005\u00cb\t\u0005\u0001\u0006\u0001"+ + "\u0006\u0003\u0006\u00cf\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0003\u0006\u00d6\b\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0003\u0006\u00db\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e6\b\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0003\t\u00ec\b\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0005\t\u00f4\b\t\n\t\f\t\u00f7\t\t\u0001\n\u0001\n"+ + "\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0101\b\n\u0001"+ + "\n\u0001\n\u0001\n\u0005\n\u0106\b\n\n\n\f\n\u0109\t\n\u0001\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0111"+ + "\b\u000b\n\u000b\f\u000b\u0114\t\u000b\u0003\u000b\u0116\b\u000b\u0001"+ + "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0003\f\u011d\b\f\u0001\r\u0001"+ + "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0005\u000f\u0127\b\u000f\n\u000f\f\u000f\u012a\t\u000f\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0131\b\u0010\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u0137\b\u0011\n"+ + "\u0011\f\u0011\u013a\t\u0011\u0001\u0011\u0003\u0011\u013d\b\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0144"+ + "\b\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+ + "\u0015\u0003\u0015\u014c\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0005\u0016\u0152\b\u0016\n\u0016\f\u0016\u0155\t\u0016\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0005\u0018\u015f\b\u0018\n\u0018\f\u0018\u0162\t\u0018\u0001"+ + "\u0018\u0003\u0018\u0165\b\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u0169"+ + "\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0003"+ + "\u001a\u0170\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u0174\b\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u0179\b\u001b\n\u001b"+ + "\f\u001b\u017c\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c"+ + "\u0181\b\u001c\n\u001c\f\u001c\u0184\t\u001c\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0005\u001d\u0189\b\u001d\n\u001d\f\u001d\u018c\t\u001d\u0001\u001e"+ + "\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u019f"+ + "\b \n \f \u01a2\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01aa"+ + "\b \n \f \u01ad\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01b5"+ + "\b \n \f \u01b8\t \u0001 \u0001 \u0003 \u01bc\b \u0001!\u0001!\u0003!"+ + "\u01c0\b!\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0005#\u01c9"+ + "\b#\n#\f#\u01cc\t#\u0001$\u0001$\u0003$\u01d0\b$\u0001$\u0001$\u0003$"+ + "\u01d4\b$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0005\'\u01e0\b\'\n\'\f\'\u01e3\t\'\u0001(\u0001(\u0001(\u0001"+ + "(\u0001)\u0001)\u0001)\u0001)\u0003)\u01ed\b)\u0001*\u0001*\u0001*\u0001"+ + "*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0005,\u01f9\b,\n,\f,\u01fc"+ + "\t,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u0003/\u0206"+ + "\b/\u00010\u00030\u0209\b0\u00010\u00010\u00011\u00031\u020e\b1\u0001"+ + "1\u00011\u00012\u00012\u00013\u00013\u00014\u00014\u00014\u00015\u0001"+ + "5\u00015\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0003"+ + "7\u0224\b7\u00017\u00017\u00017\u00017\u00057\u022a\b7\n7\f7\u022d\t7"+ + "\u00037\u022f\b7\u00018\u00018\u00018\u00038\u0234\b8\u00018\u00018\u0001"+ + "9\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0003:\u0241"+ + "\b:\u0001:\u0000\u0004\u0002\n\u0012\u0014;\u0000\u0002\u0004\u0006\b"+ "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ - "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnpr\u0000\b\u0001\u0000;<\u0001\u0000=?"+ - "\u0002\u0000\u001a\u001aLL\u0001\u0000CD\u0002\u0000\u001f\u001f##\u0002"+ - "\u0000&&))\u0002\u0000%%33\u0002\u0000446:\u0255\u0000t\u0001\u0000\u0000"+ - "\u0000\u0002w\u0001\u0000\u0000\u0000\u0004\u0088\u0001\u0000\u0000\u0000"+ - "\u0006\u009a\u0001\u0000\u0000\u0000\b\u009c\u0001\u0000\u0000\u0000\n"+ - "\u00bd\u0001\u0000\u0000\u0000\f\u00d8\u0001\u0000\u0000\u0000\u000e\u00da"+ - "\u0001\u0000\u0000\u0000\u0010\u00e3\u0001\u0000\u0000\u0000\u0012\u00e9"+ - "\u0001\u0000\u0000\u0000\u0014\u00fe\u0001\u0000\u0000\u0000\u0016\u0108"+ - "\u0001\u0000\u0000\u0000\u0018\u0117\u0001\u0000\u0000\u0000\u001a\u0119"+ - "\u0001\u0000\u0000\u0000\u001c\u011c\u0001\u0000\u0000\u0000\u001e\u0129"+ - "\u0001\u0000\u0000\u0000 \u012b\u0001\u0000\u0000\u0000\"\u013c\u0001"+ - "\u0000\u0000\u0000$\u013e\u0001\u0000\u0000\u0000&\u0140\u0001\u0000\u0000"+ - "\u0000(\u0144\u0001\u0000\u0000\u0000*\u0146\u0001\u0000\u0000\u0000,"+ - "\u014f\u0001\u0000\u0000\u0000.\u0153\u0001\u0000\u0000\u00000\u0163\u0001"+ - "\u0000\u0000\u00002\u0166\u0001\u0000\u0000\u00004\u016e\u0001\u0000\u0000"+ - "\u00006\u0176\u0001\u0000\u0000\u00008\u017e\u0001\u0000\u0000\u0000:"+ - "\u0186\u0001\u0000\u0000\u0000<\u0188\u0001\u0000\u0000\u0000>\u01b4\u0001"+ - "\u0000\u0000\u0000@\u01b8\u0001\u0000\u0000\u0000B\u01ba\u0001\u0000\u0000"+ - "\u0000D\u01bd\u0001\u0000\u0000\u0000F\u01c6\u0001\u0000\u0000\u0000H"+ - "\u01ce\u0001\u0000\u0000\u0000J\u01d1\u0001\u0000\u0000\u0000L\u01d4\u0001"+ - "\u0000\u0000\u0000N\u01dd\u0001\u0000\u0000\u0000P\u01e1\u0001\u0000\u0000"+ - "\u0000R\u01e7\u0001\u0000\u0000\u0000T\u01eb\u0001\u0000\u0000\u0000V"+ - "\u01ee\u0001\u0000\u0000\u0000X\u01f6\u0001\u0000\u0000\u0000Z\u01fa\u0001"+ - "\u0000\u0000\u0000\\\u01fe\u0001\u0000\u0000\u0000^\u0201\u0001\u0000"+ - "\u0000\u0000`\u0206\u0001\u0000\u0000\u0000b\u020a\u0001\u0000\u0000\u0000"+ - "d\u020c\u0001\u0000\u0000\u0000f\u020e\u0001\u0000\u0000\u0000h\u0211"+ - "\u0001\u0000\u0000\u0000j\u0215\u0001\u0000\u0000\u0000l\u0218\u0001\u0000"+ - "\u0000\u0000n\u022c\u0001\u0000\u0000\u0000p\u0230\u0001\u0000\u0000\u0000"+ - "r\u0235\u0001\u0000\u0000\u0000tu\u0003\u0002\u0001\u0000uv\u0005\u0000"+ - "\u0000\u0001v\u0001\u0001\u0000\u0000\u0000wx\u0006\u0001\uffff\uffff"+ - "\u0000xy\u0003\u0004\u0002\u0000y\u007f\u0001\u0000\u0000\u0000z{\n\u0001"+ - "\u0000\u0000{|\u0005\u0019\u0000\u0000|~\u0003\u0006\u0003\u0000}z\u0001"+ - "\u0000\u0000\u0000~\u0081\u0001\u0000\u0000\u0000\u007f}\u0001\u0000\u0000"+ - "\u0000\u007f\u0080\u0001\u0000\u0000\u0000\u0080\u0003\u0001\u0000\u0000"+ - "\u0000\u0081\u007f\u0001\u0000\u0000\u0000\u0082\u0089\u0003f3\u0000\u0083"+ - "\u0089\u0003 \u0010\u0000\u0084\u0089\u0003\u001a\r\u0000\u0085\u0089"+ - "\u0003j5\u0000\u0086\u0087\u0004\u0002\u0001\u0000\u0087\u0089\u0003."+ - "\u0017\u0000\u0088\u0082\u0001\u0000\u0000\u0000\u0088\u0083\u0001\u0000"+ - "\u0000\u0000\u0088\u0084\u0001\u0000\u0000\u0000\u0088\u0085\u0001\u0000"+ - "\u0000\u0000\u0088\u0086\u0001\u0000\u0000\u0000\u0089\u0005\u0001\u0000"+ - "\u0000\u0000\u008a\u009b\u00030\u0018\u0000\u008b\u009b\u0003\b\u0004"+ - "\u0000\u008c\u009b\u0003H$\u0000\u008d\u009b\u0003B!\u0000\u008e\u009b"+ - "\u00032\u0019\u0000\u008f\u009b\u0003D\"\u0000\u0090\u009b\u0003J%\u0000"+ - "\u0091\u009b\u0003L&\u0000\u0092\u009b\u0003P(\u0000\u0093\u009b\u0003"+ - "R)\u0000\u0094\u009b\u0003l6\u0000\u0095\u009b\u0003T*\u0000\u0096\u0097"+ - "\u0004\u0003\u0002\u0000\u0097\u009b\u0003r9\u0000\u0098\u0099\u0004\u0003"+ - "\u0003\u0000\u0099\u009b\u0003p8\u0000\u009a\u008a\u0001\u0000\u0000\u0000"+ - "\u009a\u008b\u0001\u0000\u0000\u0000\u009a\u008c\u0001\u0000\u0000\u0000"+ - "\u009a\u008d\u0001\u0000\u0000\u0000\u009a\u008e\u0001\u0000\u0000\u0000"+ - "\u009a\u008f\u0001\u0000\u0000\u0000\u009a\u0090\u0001\u0000\u0000\u0000"+ - "\u009a\u0091\u0001\u0000\u0000\u0000\u009a\u0092\u0001\u0000\u0000\u0000"+ - "\u009a\u0093\u0001\u0000\u0000\u0000\u009a\u0094\u0001\u0000\u0000\u0000"+ - "\u009a\u0095\u0001\u0000\u0000\u0000\u009a\u0096\u0001\u0000\u0000\u0000"+ - "\u009a\u0098\u0001\u0000\u0000\u0000\u009b\u0007\u0001\u0000\u0000\u0000"+ - "\u009c\u009d\u0005\u0010\u0000\u0000\u009d\u009e\u0003\n\u0005\u0000\u009e"+ - "\t\u0001\u0000\u0000\u0000\u009f\u00a0\u0006\u0005\uffff\uffff\u0000\u00a0"+ - "\u00a1\u0005,\u0000\u0000\u00a1\u00be\u0003\n\u0005\b\u00a2\u00be\u0003"+ - "\u0010\b\u0000\u00a3\u00be\u0003\f\u0006\u0000\u00a4\u00a6\u0003\u0010"+ - "\b\u0000\u00a5\u00a7\u0005,\u0000\u0000\u00a6\u00a5\u0001\u0000\u0000"+ - "\u0000\u00a6\u00a7\u0001\u0000\u0000\u0000\u00a7\u00a8\u0001\u0000\u0000"+ - "\u0000\u00a8\u00a9\u0005\'\u0000\u0000\u00a9\u00aa\u0005+\u0000\u0000"+ - "\u00aa\u00af\u0003\u0010\b\u0000\u00ab\u00ac\u0005\"\u0000\u0000\u00ac"+ - "\u00ae\u0003\u0010\b\u0000\u00ad\u00ab\u0001\u0000\u0000\u0000\u00ae\u00b1"+ - "\u0001\u0000\u0000\u0000\u00af\u00ad\u0001\u0000\u0000\u0000\u00af\u00b0"+ - "\u0001\u0000\u0000\u0000\u00b0\u00b2\u0001\u0000\u0000\u0000\u00b1\u00af"+ - "\u0001\u0000\u0000\u0000\u00b2\u00b3\u00052\u0000\u0000\u00b3\u00be\u0001"+ - "\u0000\u0000\u0000\u00b4\u00b5\u0003\u0010\b\u0000\u00b5\u00b7\u0005("+ - "\u0000\u0000\u00b6\u00b8\u0005,\u0000\u0000\u00b7\u00b6\u0001\u0000\u0000"+ - "\u0000\u00b7\u00b8\u0001\u0000\u0000\u0000\u00b8\u00b9\u0001\u0000\u0000"+ - "\u0000\u00b9\u00ba\u0005-\u0000\u0000\u00ba\u00be\u0001\u0000\u0000\u0000"+ - "\u00bb\u00bc\u0004\u0005\u0004\u0000\u00bc\u00be\u0003\u000e\u0007\u0000"+ - "\u00bd\u009f\u0001\u0000\u0000\u0000\u00bd\u00a2\u0001\u0000\u0000\u0000"+ - "\u00bd\u00a3\u0001\u0000\u0000\u0000\u00bd\u00a4\u0001\u0000\u0000\u0000"+ - "\u00bd\u00b4\u0001\u0000\u0000\u0000\u00bd\u00bb\u0001\u0000\u0000\u0000"+ - "\u00be\u00c7\u0001\u0000\u0000\u0000\u00bf\u00c0\n\u0005\u0000\u0000\u00c0"+ - "\u00c1\u0005\u001e\u0000\u0000\u00c1\u00c6\u0003\n\u0005\u0006\u00c2\u00c3"+ - "\n\u0004\u0000\u0000\u00c3\u00c4\u0005/\u0000\u0000\u00c4\u00c6\u0003"+ - "\n\u0005\u0005\u00c5\u00bf\u0001\u0000\u0000\u0000\u00c5\u00c2\u0001\u0000"+ - "\u0000\u0000\u00c6\u00c9\u0001\u0000\u0000\u0000\u00c7\u00c5\u0001\u0000"+ - "\u0000\u0000\u00c7\u00c8\u0001\u0000\u0000\u0000\u00c8\u000b\u0001\u0000"+ - "\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000\u00ca\u00cc\u0003\u0010"+ - "\b\u0000\u00cb\u00cd\u0005,\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000"+ - "\u0000\u00cc\u00cd\u0001\u0000\u0000\u0000\u00cd\u00ce\u0001\u0000\u0000"+ - "\u0000\u00ce\u00cf\u0005*\u0000\u0000\u00cf\u00d0\u0003b1\u0000\u00d0"+ - "\u00d9\u0001\u0000\u0000\u0000\u00d1\u00d3\u0003\u0010\b\u0000\u00d2\u00d4"+ - "\u0005,\u0000\u0000\u00d3\u00d2\u0001\u0000\u0000\u0000\u00d3\u00d4\u0001"+ - "\u0000\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5\u00d6\u0005"+ - "1\u0000\u0000\u00d6\u00d7\u0003b1\u0000\u00d7\u00d9\u0001\u0000\u0000"+ - "\u0000\u00d8\u00ca\u0001\u0000\u0000\u0000\u00d8\u00d1\u0001\u0000\u0000"+ - "\u0000\u00d9\r\u0001\u0000\u0000\u0000\u00da\u00db\u0003\u0010\b\u0000"+ - "\u00db\u00dc\u0005\u0013\u0000\u0000\u00dc\u00dd\u0003b1\u0000\u00dd\u000f"+ - "\u0001\u0000\u0000\u0000\u00de\u00e4\u0003\u0012\t\u0000\u00df\u00e0\u0003"+ - "\u0012\t\u0000\u00e0\u00e1\u0003d2\u0000\u00e1\u00e2\u0003\u0012\t\u0000"+ - "\u00e2\u00e4\u0001\u0000\u0000\u0000\u00e3\u00de\u0001\u0000\u0000\u0000"+ - "\u00e3\u00df\u0001\u0000\u0000\u0000\u00e4\u0011\u0001\u0000\u0000\u0000"+ - "\u00e5\u00e6\u0006\t\uffff\uffff\u0000\u00e6\u00ea\u0003\u0014\n\u0000"+ - "\u00e7\u00e8\u0007\u0000\u0000\u0000\u00e8\u00ea\u0003\u0012\t\u0003\u00e9"+ - "\u00e5\u0001\u0000\u0000\u0000\u00e9\u00e7\u0001\u0000\u0000\u0000\u00ea"+ - "\u00f3\u0001\u0000\u0000\u0000\u00eb\u00ec\n\u0002\u0000\u0000\u00ec\u00ed"+ - "\u0007\u0001\u0000\u0000\u00ed\u00f2\u0003\u0012\t\u0003\u00ee\u00ef\n"+ - "\u0001\u0000\u0000\u00ef\u00f0\u0007\u0000\u0000\u0000\u00f0\u00f2\u0003"+ - "\u0012\t\u0002\u00f1\u00eb\u0001\u0000\u0000\u0000\u00f1\u00ee\u0001\u0000"+ - "\u0000\u0000\u00f2\u00f5\u0001\u0000\u0000\u0000\u00f3\u00f1\u0001\u0000"+ - "\u0000\u0000\u00f3\u00f4\u0001\u0000\u0000\u0000\u00f4\u0013\u0001\u0000"+ - "\u0000\u0000\u00f5\u00f3\u0001\u0000\u0000\u0000\u00f6\u00f7\u0006\n\uffff"+ - "\uffff\u0000\u00f7\u00ff\u0003>\u001f\u0000\u00f8\u00ff\u00034\u001a\u0000"+ - "\u00f9\u00ff\u0003\u0016\u000b\u0000\u00fa\u00fb\u0005+\u0000\u0000\u00fb"+ - "\u00fc\u0003\n\u0005\u0000\u00fc\u00fd\u00052\u0000\u0000\u00fd\u00ff"+ - "\u0001\u0000\u0000\u0000\u00fe\u00f6\u0001\u0000\u0000\u0000\u00fe\u00f8"+ - "\u0001\u0000\u0000\u0000\u00fe\u00f9\u0001\u0000\u0000\u0000\u00fe\u00fa"+ - "\u0001\u0000\u0000\u0000\u00ff\u0105\u0001\u0000\u0000\u0000\u0100\u0101"+ - "\n\u0001\u0000\u0000\u0101\u0102\u0005!\u0000\u0000\u0102\u0104\u0003"+ - "\u0018\f\u0000\u0103\u0100\u0001\u0000\u0000\u0000\u0104\u0107\u0001\u0000"+ - "\u0000\u0000\u0105\u0103\u0001\u0000\u0000\u0000\u0105\u0106\u0001\u0000"+ - "\u0000\u0000\u0106\u0015\u0001\u0000\u0000\u0000\u0107\u0105\u0001\u0000"+ - "\u0000\u0000\u0108\u0109\u0003:\u001d\u0000\u0109\u0113\u0005+\u0000\u0000"+ - "\u010a\u0114\u0005=\u0000\u0000\u010b\u0110\u0003\n\u0005\u0000\u010c"+ - "\u010d\u0005\"\u0000\u0000\u010d\u010f\u0003\n\u0005\u0000\u010e\u010c"+ - "\u0001\u0000\u0000\u0000\u010f\u0112\u0001\u0000\u0000\u0000\u0110\u010e"+ - "\u0001\u0000\u0000\u0000\u0110\u0111\u0001\u0000\u0000\u0000\u0111\u0114"+ - "\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000\u0000\u0000\u0113\u010a"+ - "\u0001\u0000\u0000\u0000\u0113\u010b\u0001\u0000\u0000\u0000\u0113\u0114"+ - "\u0001\u0000\u0000\u0000\u0114\u0115\u0001\u0000\u0000\u0000\u0115\u0116"+ - "\u00052\u0000\u0000\u0116\u0017\u0001\u0000\u0000\u0000\u0117\u0118\u0003"+ - ":\u001d\u0000\u0118\u0019\u0001\u0000\u0000\u0000\u0119\u011a\u0005\f"+ - "\u0000\u0000\u011a\u011b\u0003\u001c\u000e\u0000\u011b\u001b\u0001\u0000"+ - "\u0000\u0000\u011c\u0121\u0003\u001e\u000f\u0000\u011d\u011e\u0005\"\u0000"+ - "\u0000\u011e\u0120\u0003\u001e\u000f\u0000\u011f\u011d\u0001\u0000\u0000"+ - "\u0000\u0120\u0123\u0001\u0000\u0000\u0000\u0121\u011f\u0001\u0000\u0000"+ - "\u0000\u0121\u0122\u0001\u0000\u0000\u0000\u0122\u001d\u0001\u0000\u0000"+ - "\u0000\u0123\u0121\u0001\u0000\u0000\u0000\u0124\u012a\u0003\n\u0005\u0000"+ - "\u0125\u0126\u00034\u001a\u0000\u0126\u0127\u0005 \u0000\u0000\u0127\u0128"+ - "\u0003\n\u0005\u0000\u0128\u012a\u0001\u0000\u0000\u0000\u0129\u0124\u0001"+ - "\u0000\u0000\u0000\u0129\u0125\u0001\u0000\u0000\u0000\u012a\u001f\u0001"+ - "\u0000\u0000\u0000\u012b\u012c\u0005\u0006\u0000\u0000\u012c\u0131\u0003"+ - "\"\u0011\u0000\u012d\u012e\u0005\"\u0000\u0000\u012e\u0130\u0003\"\u0011"+ - "\u0000\u012f\u012d\u0001\u0000\u0000\u0000\u0130\u0133\u0001\u0000\u0000"+ - "\u0000\u0131\u012f\u0001\u0000\u0000\u0000\u0131\u0132\u0001\u0000\u0000"+ - "\u0000\u0132\u0135\u0001\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000"+ - "\u0000\u0134\u0136\u0003(\u0014\u0000\u0135\u0134\u0001\u0000\u0000\u0000"+ - "\u0135\u0136\u0001\u0000\u0000\u0000\u0136!\u0001\u0000\u0000\u0000\u0137"+ - "\u0138\u0003$\u0012\u0000\u0138\u0139\u0005h\u0000\u0000\u0139\u013a\u0003"+ - "&\u0013\u0000\u013a\u013d\u0001\u0000\u0000\u0000\u013b\u013d\u0003&\u0013"+ - "\u0000\u013c\u0137\u0001\u0000\u0000\u0000\u013c\u013b\u0001\u0000\u0000"+ - "\u0000\u013d#\u0001\u0000\u0000\u0000\u013e\u013f\u0005L\u0000\u0000\u013f"+ - "%\u0001\u0000\u0000\u0000\u0140\u0141\u0007\u0002\u0000\u0000\u0141\'"+ - "\u0001\u0000\u0000\u0000\u0142\u0145\u0003*\u0015\u0000\u0143\u0145\u0003"+ - ",\u0016\u0000\u0144\u0142\u0001\u0000\u0000\u0000\u0144\u0143\u0001\u0000"+ - "\u0000\u0000\u0145)\u0001\u0000\u0000\u0000\u0146\u0147\u0005K\u0000\u0000"+ - "\u0147\u014c\u0005L\u0000\u0000\u0148\u0149\u0005\"\u0000\u0000\u0149"+ - "\u014b\u0005L\u0000\u0000\u014a\u0148\u0001\u0000\u0000\u0000\u014b\u014e"+ - "\u0001\u0000\u0000\u0000\u014c\u014a\u0001\u0000\u0000\u0000\u014c\u014d"+ - "\u0001\u0000\u0000\u0000\u014d+\u0001\u0000\u0000\u0000\u014e\u014c\u0001"+ - "\u0000\u0000\u0000\u014f\u0150\u0005A\u0000\u0000\u0150\u0151\u0003*\u0015"+ - "\u0000\u0151\u0152\u0005B\u0000\u0000\u0152-\u0001\u0000\u0000\u0000\u0153"+ - "\u0154\u0005\u0014\u0000\u0000\u0154\u0159\u0003\"\u0011\u0000\u0155\u0156"+ - "\u0005\"\u0000\u0000\u0156\u0158\u0003\"\u0011\u0000\u0157\u0155\u0001"+ - "\u0000\u0000\u0000\u0158\u015b\u0001\u0000\u0000\u0000\u0159\u0157\u0001"+ - "\u0000\u0000\u0000\u0159\u015a\u0001\u0000\u0000\u0000\u015a\u015d\u0001"+ - "\u0000\u0000\u0000\u015b\u0159\u0001\u0000\u0000\u0000\u015c\u015e\u0003"+ - "\u001c\u000e\u0000\u015d\u015c\u0001\u0000\u0000\u0000\u015d\u015e\u0001"+ - "\u0000\u0000\u0000\u015e\u0161\u0001\u0000\u0000\u0000\u015f\u0160\u0005"+ - "\u001d\u0000\u0000\u0160\u0162\u0003\u001c\u000e\u0000\u0161\u015f\u0001"+ - "\u0000\u0000\u0000\u0161\u0162\u0001\u0000\u0000\u0000\u0162/\u0001\u0000"+ - "\u0000\u0000\u0163\u0164\u0005\u0004\u0000\u0000\u0164\u0165\u0003\u001c"+ - "\u000e\u0000\u01651\u0001\u0000\u0000\u0000\u0166\u0168\u0005\u000f\u0000"+ - "\u0000\u0167\u0169\u0003\u001c\u000e\u0000\u0168\u0167\u0001\u0000\u0000"+ - "\u0000\u0168\u0169\u0001\u0000\u0000\u0000\u0169\u016c\u0001\u0000\u0000"+ - "\u0000\u016a\u016b\u0005\u001d\u0000\u0000\u016b\u016d\u0003\u001c\u000e"+ - "\u0000\u016c\u016a\u0001\u0000\u0000\u0000\u016c\u016d\u0001\u0000\u0000"+ - "\u0000\u016d3\u0001\u0000\u0000\u0000\u016e\u0173\u0003:\u001d\u0000\u016f"+ - "\u0170\u0005$\u0000\u0000\u0170\u0172\u0003:\u001d\u0000\u0171\u016f\u0001"+ - "\u0000\u0000\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0171\u0001"+ - "\u0000\u0000\u0000\u0173\u0174\u0001\u0000\u0000\u0000\u01745\u0001\u0000"+ - "\u0000\u0000\u0175\u0173\u0001\u0000\u0000\u0000\u0176\u017b\u0003<\u001e"+ - "\u0000\u0177\u0178\u0005$\u0000\u0000\u0178\u017a\u0003<\u001e\u0000\u0179"+ - "\u0177\u0001\u0000\u0000\u0000\u017a\u017d\u0001\u0000\u0000\u0000\u017b"+ - "\u0179\u0001\u0000\u0000\u0000\u017b\u017c\u0001\u0000\u0000\u0000\u017c"+ - "7\u0001\u0000\u0000\u0000\u017d\u017b\u0001\u0000\u0000\u0000\u017e\u0183"+ - "\u00036\u001b\u0000\u017f\u0180\u0005\"\u0000\u0000\u0180\u0182\u0003"+ - "6\u001b\u0000\u0181\u017f\u0001\u0000\u0000\u0000\u0182\u0185\u0001\u0000"+ - "\u0000\u0000\u0183\u0181\u0001\u0000\u0000\u0000\u0183\u0184\u0001\u0000"+ - "\u0000\u0000\u01849\u0001\u0000\u0000\u0000\u0185\u0183\u0001\u0000\u0000"+ - "\u0000\u0186\u0187\u0007\u0003\u0000\u0000\u0187;\u0001\u0000\u0000\u0000"+ - "\u0188\u0189\u0005P\u0000\u0000\u0189=\u0001\u0000\u0000\u0000\u018a\u01b5"+ - "\u0005-\u0000\u0000\u018b\u018c\u0003`0\u0000\u018c\u018d\u0005C\u0000"+ - "\u0000\u018d\u01b5\u0001\u0000\u0000\u0000\u018e\u01b5\u0003^/\u0000\u018f"+ - "\u01b5\u0003`0\u0000\u0190\u01b5\u0003Z-\u0000\u0191\u01b5\u0003@ \u0000"+ - "\u0192\u01b5\u0003b1\u0000\u0193\u0194\u0005A\u0000\u0000\u0194\u0199"+ - "\u0003\\.\u0000\u0195\u0196\u0005\"\u0000\u0000\u0196\u0198\u0003\\.\u0000"+ - "\u0197\u0195\u0001\u0000\u0000\u0000\u0198\u019b\u0001\u0000\u0000\u0000"+ - "\u0199\u0197\u0001\u0000\u0000\u0000\u0199\u019a\u0001\u0000\u0000\u0000"+ - "\u019a\u019c\u0001\u0000\u0000\u0000\u019b\u0199\u0001\u0000\u0000\u0000"+ - "\u019c\u019d\u0005B\u0000\u0000\u019d\u01b5\u0001\u0000\u0000\u0000\u019e"+ - "\u019f\u0005A\u0000\u0000\u019f\u01a4\u0003Z-\u0000\u01a0\u01a1\u0005"+ - "\"\u0000\u0000\u01a1\u01a3\u0003Z-\u0000\u01a2\u01a0\u0001\u0000\u0000"+ - "\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2\u0001\u0000\u0000"+ - "\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01a7\u0001\u0000\u0000"+ - "\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005B\u0000\u0000"+ - "\u01a8\u01b5\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005A\u0000\u0000\u01aa"+ - "\u01af\u0003b1\u0000\u01ab\u01ac\u0005\"\u0000\u0000\u01ac\u01ae\u0003"+ - "b1\u0000\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ae\u01b1\u0001\u0000\u0000"+ - "\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01af\u01b0\u0001\u0000\u0000"+ - "\u0000\u01b0\u01b2\u0001\u0000\u0000\u0000\u01b1\u01af\u0001\u0000\u0000"+ - "\u0000\u01b2\u01b3\u0005B\u0000\u0000\u01b3\u01b5\u0001\u0000\u0000\u0000"+ - "\u01b4\u018a\u0001\u0000\u0000\u0000\u01b4\u018b\u0001\u0000\u0000\u0000"+ - "\u01b4\u018e\u0001\u0000\u0000\u0000\u01b4\u018f\u0001\u0000\u0000\u0000"+ - "\u01b4\u0190\u0001\u0000\u0000\u0000\u01b4\u0191\u0001\u0000\u0000\u0000"+ - "\u01b4\u0192\u0001\u0000\u0000\u0000\u01b4\u0193\u0001\u0000\u0000\u0000"+ - "\u01b4\u019e\u0001\u0000\u0000\u0000\u01b4\u01a9\u0001\u0000\u0000\u0000"+ - "\u01b5?\u0001\u0000\u0000\u0000\u01b6\u01b9\u00050\u0000\u0000\u01b7\u01b9"+ - "\u0005@\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b7\u0001"+ - "\u0000\u0000\u0000\u01b9A\u0001\u0000\u0000\u0000\u01ba\u01bb\u0005\t"+ - "\u0000\u0000\u01bb\u01bc\u0005\u001b\u0000\u0000\u01bcC\u0001\u0000\u0000"+ - "\u0000\u01bd\u01be\u0005\u000e\u0000\u0000\u01be\u01c3\u0003F#\u0000\u01bf"+ - "\u01c0\u0005\"\u0000\u0000\u01c0\u01c2\u0003F#\u0000\u01c1\u01bf\u0001"+ - "\u0000\u0000\u0000\u01c2\u01c5\u0001\u0000\u0000\u0000\u01c3\u01c1\u0001"+ - "\u0000\u0000\u0000\u01c3\u01c4\u0001\u0000\u0000\u0000\u01c4E\u0001\u0000"+ - "\u0000\u0000\u01c5\u01c3\u0001\u0000\u0000\u0000\u01c6\u01c8\u0003\n\u0005"+ - "\u0000\u01c7\u01c9\u0007\u0004\u0000\u0000\u01c8\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9\u01cc\u0001\u0000\u0000"+ - "\u0000\u01ca\u01cb\u0005.\u0000\u0000\u01cb\u01cd\u0007\u0005\u0000\u0000"+ - "\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cc\u01cd\u0001\u0000\u0000\u0000"+ - "\u01cdG\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005\b\u0000\u0000\u01cf"+ - "\u01d0\u00038\u001c\u0000\u01d0I\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005"+ - "\u0002\u0000\u0000\u01d2\u01d3\u00038\u001c\u0000\u01d3K\u0001\u0000\u0000"+ - "\u0000\u01d4\u01d5\u0005\u000b\u0000\u0000\u01d5\u01da\u0003N\'\u0000"+ - "\u01d6\u01d7\u0005\"\u0000\u0000\u01d7\u01d9\u0003N\'\u0000\u01d8\u01d6"+ - "\u0001\u0000\u0000\u0000\u01d9\u01dc\u0001\u0000\u0000\u0000\u01da\u01d8"+ - "\u0001\u0000\u0000\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01dbM\u0001"+ - "\u0000\u0000\u0000\u01dc\u01da\u0001\u0000\u0000\u0000\u01dd\u01de\u0003"+ - "6\u001b\u0000\u01de\u01df\u0005T\u0000\u0000\u01df\u01e0\u00036\u001b"+ - "\u0000\u01e0O\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005\u0001\u0000\u0000"+ - "\u01e2\u01e3\u0003\u0014\n\u0000\u01e3\u01e5\u0003b1\u0000\u01e4\u01e6"+ - "\u0003V+\u0000\u01e5\u01e4\u0001\u0000\u0000\u0000\u01e5\u01e6\u0001\u0000"+ - "\u0000\u0000\u01e6Q\u0001\u0000\u0000\u0000\u01e7\u01e8\u0005\u0007\u0000"+ - "\u0000\u01e8\u01e9\u0003\u0014\n\u0000\u01e9\u01ea\u0003b1\u0000\u01ea"+ - "S\u0001\u0000\u0000\u0000\u01eb\u01ec\u0005\n\u0000\u0000\u01ec\u01ed"+ - "\u00034\u001a\u0000\u01edU\u0001\u0000\u0000\u0000\u01ee\u01f3\u0003X"+ - ",\u0000\u01ef\u01f0\u0005\"\u0000\u0000\u01f0\u01f2\u0003X,\u0000\u01f1"+ - "\u01ef\u0001\u0000\u0000\u0000\u01f2\u01f5\u0001\u0000\u0000\u0000\u01f3"+ - "\u01f1\u0001\u0000\u0000\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4"+ - "W\u0001\u0000\u0000\u0000\u01f5\u01f3\u0001\u0000\u0000\u0000\u01f6\u01f7"+ - "\u0003:\u001d\u0000\u01f7\u01f8\u0005 \u0000\u0000\u01f8\u01f9\u0003>"+ - "\u001f\u0000\u01f9Y\u0001\u0000\u0000\u0000\u01fa\u01fb\u0007\u0006\u0000"+ - "\u0000\u01fb[\u0001\u0000\u0000\u0000\u01fc\u01ff\u0003^/\u0000\u01fd"+ - "\u01ff\u0003`0\u0000\u01fe\u01fc\u0001\u0000\u0000\u0000\u01fe\u01fd\u0001"+ - "\u0000\u0000\u0000\u01ff]\u0001\u0000\u0000\u0000\u0200\u0202\u0007\u0000"+ - "\u0000\u0000\u0201\u0200\u0001\u0000\u0000\u0000\u0201\u0202\u0001\u0000"+ - "\u0000\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203\u0204\u0005\u001c"+ - "\u0000\u0000\u0204_\u0001\u0000\u0000\u0000\u0205\u0207\u0007\u0000\u0000"+ - "\u0000\u0206\u0205\u0001\u0000\u0000\u0000\u0206\u0207\u0001\u0000\u0000"+ - "\u0000\u0207\u0208\u0001\u0000\u0000\u0000\u0208\u0209\u0005\u001b\u0000"+ - "\u0000\u0209a\u0001\u0000\u0000\u0000\u020a\u020b\u0005\u001a\u0000\u0000"+ - "\u020bc\u0001\u0000\u0000\u0000\u020c\u020d\u0007\u0007\u0000\u0000\u020d"+ - "e\u0001\u0000\u0000\u0000\u020e\u020f\u0005\u0005\u0000\u0000\u020f\u0210"+ - "\u0003h4\u0000\u0210g\u0001\u0000\u0000\u0000\u0211\u0212\u0005A\u0000"+ - "\u0000\u0212\u0213\u0003\u0002\u0001\u0000\u0213\u0214\u0005B\u0000\u0000"+ - "\u0214i\u0001\u0000\u0000\u0000\u0215\u0216\u0005\r\u0000\u0000\u0216"+ - "\u0217\u0005d\u0000\u0000\u0217k\u0001\u0000\u0000\u0000\u0218\u0219\u0005"+ - "\u0003\u0000\u0000\u0219\u021c\u0005Z\u0000\u0000\u021a\u021b\u0005X\u0000"+ - "\u0000\u021b\u021d\u00036\u001b\u0000\u021c\u021a\u0001\u0000\u0000\u0000"+ - "\u021c\u021d\u0001\u0000\u0000\u0000\u021d\u0227\u0001\u0000\u0000\u0000"+ - "\u021e\u021f\u0005Y\u0000\u0000\u021f\u0224\u0003n7\u0000\u0220\u0221"+ - "\u0005\"\u0000\u0000\u0221\u0223\u0003n7\u0000\u0222\u0220\u0001\u0000"+ - "\u0000\u0000\u0223\u0226\u0001\u0000\u0000\u0000\u0224\u0222\u0001\u0000"+ - "\u0000\u0000\u0224\u0225\u0001\u0000\u0000\u0000\u0225\u0228\u0001\u0000"+ - "\u0000\u0000\u0226\u0224\u0001\u0000\u0000\u0000\u0227\u021e\u0001\u0000"+ - "\u0000\u0000\u0227\u0228\u0001\u0000\u0000\u0000\u0228m\u0001\u0000\u0000"+ - "\u0000\u0229\u022a\u00036\u001b\u0000\u022a\u022b\u0005 \u0000\u0000\u022b"+ - "\u022d\u0001\u0000\u0000\u0000\u022c\u0229\u0001\u0000\u0000\u0000\u022c"+ - "\u022d\u0001\u0000\u0000\u0000\u022d\u022e\u0001\u0000\u0000\u0000\u022e"+ - "\u022f\u00036\u001b\u0000\u022fo\u0001\u0000\u0000\u0000\u0230\u0231\u0005"+ - "\u0012\u0000\u0000\u0231\u0232\u0003\"\u0011\u0000\u0232\u0233\u0005X"+ - "\u0000\u0000\u0233\u0234\u00038\u001c\u0000\u0234q\u0001\u0000\u0000\u0000"+ - "\u0235\u0236\u0005\u0011\u0000\u0000\u0236\u0239\u0003\u001c\u000e\u0000"+ - "\u0237\u0238\u0005\u001d\u0000\u0000\u0238\u023a\u0003\u001c\u000e\u0000"+ - "\u0239\u0237\u0001\u0000\u0000\u0000\u0239\u023a\u0001\u0000\u0000\u0000"+ - "\u023as\u0001\u0000\u0000\u00006\u007f\u0088\u009a\u00a6\u00af\u00b7\u00bd"+ - "\u00c5\u00c7\u00cc\u00d3\u00d8\u00e3\u00e9\u00f1\u00f3\u00fe\u0105\u0110"+ - "\u0113\u0121\u0129\u0131\u0135\u013c\u0144\u014c\u0159\u015d\u0161\u0168"+ - "\u016c\u0173\u017b\u0183\u0199\u01a4\u01af\u01b4\u01b8\u01c3\u01c8\u01cc"+ - "\u01da\u01e5\u01f3\u01fe\u0201\u0206\u021c\u0224\u0227\u022c\u0239"; + "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprt\u0000\b\u0001\u0000:;\u0001\u0000<"+ + ">\u0002\u0000\u0019\u0019LL\u0001\u0000CD\u0002\u0000\u001e\u001e\"\""+ + "\u0002\u0000%%((\u0002\u0000$$22\u0002\u00003359\u025c\u0000v\u0001\u0000"+ + "\u0000\u0000\u0002y\u0001\u0000\u0000\u0000\u0004\u008a\u0001\u0000\u0000"+ + "\u0000\u0006\u009c\u0001\u0000\u0000\u0000\b\u009e\u0001\u0000\u0000\u0000"+ + "\n\u00bf\u0001\u0000\u0000\u0000\f\u00da\u0001\u0000\u0000\u0000\u000e"+ + "\u00dc\u0001\u0000\u0000\u0000\u0010\u00e5\u0001\u0000\u0000\u0000\u0012"+ + "\u00eb\u0001\u0000\u0000\u0000\u0014\u0100\u0001\u0000\u0000\u0000\u0016"+ + "\u010a\u0001\u0000\u0000\u0000\u0018\u011c\u0001\u0000\u0000\u0000\u001a"+ + "\u011e\u0001\u0000\u0000\u0000\u001c\u0120\u0001\u0000\u0000\u0000\u001e"+ + "\u0123\u0001\u0000\u0000\u0000 \u0130\u0001\u0000\u0000\u0000\"\u0132"+ + "\u0001\u0000\u0000\u0000$\u0143\u0001\u0000\u0000\u0000&\u0145\u0001\u0000"+ + "\u0000\u0000(\u0147\u0001\u0000\u0000\u0000*\u014b\u0001\u0000\u0000\u0000"+ + ",\u014d\u0001\u0000\u0000\u0000.\u0156\u0001\u0000\u0000\u00000\u015a"+ + "\u0001\u0000\u0000\u00002\u016a\u0001\u0000\u0000\u00004\u016d\u0001\u0000"+ + "\u0000\u00006\u0175\u0001\u0000\u0000\u00008\u017d\u0001\u0000\u0000\u0000"+ + ":\u0185\u0001\u0000\u0000\u0000<\u018d\u0001\u0000\u0000\u0000>\u018f"+ + "\u0001\u0000\u0000\u0000@\u01bb\u0001\u0000\u0000\u0000B\u01bf\u0001\u0000"+ + "\u0000\u0000D\u01c1\u0001\u0000\u0000\u0000F\u01c4\u0001\u0000\u0000\u0000"+ + "H\u01cd\u0001\u0000\u0000\u0000J\u01d5\u0001\u0000\u0000\u0000L\u01d8"+ + "\u0001\u0000\u0000\u0000N\u01db\u0001\u0000\u0000\u0000P\u01e4\u0001\u0000"+ + "\u0000\u0000R\u01e8\u0001\u0000\u0000\u0000T\u01ee\u0001\u0000\u0000\u0000"+ + "V\u01f2\u0001\u0000\u0000\u0000X\u01f5\u0001\u0000\u0000\u0000Z\u01fd"+ + "\u0001\u0000\u0000\u0000\\\u0201\u0001\u0000\u0000\u0000^\u0205\u0001"+ + "\u0000\u0000\u0000`\u0208\u0001\u0000\u0000\u0000b\u020d\u0001\u0000\u0000"+ + "\u0000d\u0211\u0001\u0000\u0000\u0000f\u0213\u0001\u0000\u0000\u0000h"+ + "\u0215\u0001\u0000\u0000\u0000j\u0218\u0001\u0000\u0000\u0000l\u021c\u0001"+ + "\u0000\u0000\u0000n\u021f\u0001\u0000\u0000\u0000p\u0233\u0001\u0000\u0000"+ + "\u0000r\u0237\u0001\u0000\u0000\u0000t\u023c\u0001\u0000\u0000\u0000v"+ + "w\u0003\u0002\u0001\u0000wx\u0005\u0000\u0000\u0001x\u0001\u0001\u0000"+ + "\u0000\u0000yz\u0006\u0001\uffff\uffff\u0000z{\u0003\u0004\u0002\u0000"+ + "{\u0081\u0001\u0000\u0000\u0000|}\n\u0001\u0000\u0000}~\u0005\u0018\u0000"+ + "\u0000~\u0080\u0003\u0006\u0003\u0000\u007f|\u0001\u0000\u0000\u0000\u0080"+ + "\u0083\u0001\u0000\u0000\u0000\u0081\u007f\u0001\u0000\u0000\u0000\u0081"+ + "\u0082\u0001\u0000\u0000\u0000\u0082\u0003\u0001\u0000\u0000\u0000\u0083"+ + "\u0081\u0001\u0000\u0000\u0000\u0084\u008b\u0003h4\u0000\u0085\u008b\u0003"+ + "\"\u0011\u0000\u0086\u008b\u0003\u001c\u000e\u0000\u0087\u008b\u0003l"+ + "6\u0000\u0088\u0089\u0004\u0002\u0001\u0000\u0089\u008b\u00030\u0018\u0000"+ + "\u008a\u0084\u0001\u0000\u0000\u0000\u008a\u0085\u0001\u0000\u0000\u0000"+ + "\u008a\u0086\u0001\u0000\u0000\u0000\u008a\u0087\u0001\u0000\u0000\u0000"+ + "\u008a\u0088\u0001\u0000\u0000\u0000\u008b\u0005\u0001\u0000\u0000\u0000"+ + "\u008c\u009d\u00032\u0019\u0000\u008d\u009d\u0003\b\u0004\u0000\u008e"+ + "\u009d\u0003J%\u0000\u008f\u009d\u0003D\"\u0000\u0090\u009d\u00034\u001a"+ + "\u0000\u0091\u009d\u0003F#\u0000\u0092\u009d\u0003L&\u0000\u0093\u009d"+ + "\u0003N\'\u0000\u0094\u009d\u0003R)\u0000\u0095\u009d\u0003T*\u0000\u0096"+ + "\u009d\u0003n7\u0000\u0097\u009d\u0003V+\u0000\u0098\u0099\u0004\u0003"+ + "\u0002\u0000\u0099\u009d\u0003t:\u0000\u009a\u009b\u0004\u0003\u0003\u0000"+ + "\u009b\u009d\u0003r9\u0000\u009c\u008c\u0001\u0000\u0000\u0000\u009c\u008d"+ + "\u0001\u0000\u0000\u0000\u009c\u008e\u0001\u0000\u0000\u0000\u009c\u008f"+ + "\u0001\u0000\u0000\u0000\u009c\u0090\u0001\u0000\u0000\u0000\u009c\u0091"+ + "\u0001\u0000\u0000\u0000\u009c\u0092\u0001\u0000\u0000\u0000\u009c\u0093"+ + "\u0001\u0000\u0000\u0000\u009c\u0094\u0001\u0000\u0000\u0000\u009c\u0095"+ + "\u0001\u0000\u0000\u0000\u009c\u0096\u0001\u0000\u0000\u0000\u009c\u0097"+ + "\u0001\u0000\u0000\u0000\u009c\u0098\u0001\u0000\u0000\u0000\u009c\u009a"+ + "\u0001\u0000\u0000\u0000\u009d\u0007\u0001\u0000\u0000\u0000\u009e\u009f"+ + "\u0005\u0010\u0000\u0000\u009f\u00a0\u0003\n\u0005\u0000\u00a0\t\u0001"+ + "\u0000\u0000\u0000\u00a1\u00a2\u0006\u0005\uffff\uffff\u0000\u00a2\u00a3"+ + "\u0005+\u0000\u0000\u00a3\u00c0\u0003\n\u0005\b\u00a4\u00c0\u0003\u0010"+ + "\b\u0000\u00a5\u00c0\u0003\f\u0006\u0000\u00a6\u00a8\u0003\u0010\b\u0000"+ + "\u00a7\u00a9\u0005+\u0000\u0000\u00a8\u00a7\u0001\u0000\u0000\u0000\u00a8"+ + "\u00a9\u0001\u0000\u0000\u0000\u00a9\u00aa\u0001\u0000\u0000\u0000\u00aa"+ + "\u00ab\u0005&\u0000\u0000\u00ab\u00ac\u0005*\u0000\u0000\u00ac\u00b1\u0003"+ + "\u0010\b\u0000\u00ad\u00ae\u0005!\u0000\u0000\u00ae\u00b0\u0003\u0010"+ + "\b\u0000\u00af\u00ad\u0001\u0000\u0000\u0000\u00b0\u00b3\u0001\u0000\u0000"+ + "\u0000\u00b1\u00af\u0001\u0000\u0000\u0000\u00b1\u00b2\u0001\u0000\u0000"+ + "\u0000\u00b2\u00b4\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000"+ + "\u0000\u00b4\u00b5\u00051\u0000\u0000\u00b5\u00c0\u0001\u0000\u0000\u0000"+ + "\u00b6\u00b7\u0003\u0010\b\u0000\u00b7\u00b9\u0005\'\u0000\u0000\u00b8"+ + "\u00ba\u0005+\u0000\u0000\u00b9\u00b8\u0001\u0000\u0000\u0000\u00b9\u00ba"+ + "\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000\u0000\u0000\u00bb\u00bc"+ + "\u0005,\u0000\u0000\u00bc\u00c0\u0001\u0000\u0000\u0000\u00bd\u00be\u0004"+ + "\u0005\u0004\u0000\u00be\u00c0\u0003\u000e\u0007\u0000\u00bf\u00a1\u0001"+ + "\u0000\u0000\u0000\u00bf\u00a4\u0001\u0000\u0000\u0000\u00bf\u00a5\u0001"+ + "\u0000\u0000\u0000\u00bf\u00a6\u0001\u0000\u0000\u0000\u00bf\u00b6\u0001"+ + "\u0000\u0000\u0000\u00bf\u00bd\u0001\u0000\u0000\u0000\u00c0\u00c9\u0001"+ + "\u0000\u0000\u0000\u00c1\u00c2\n\u0005\u0000\u0000\u00c2\u00c3\u0005\u001d"+ + "\u0000\u0000\u00c3\u00c8\u0003\n\u0005\u0006\u00c4\u00c5\n\u0004\u0000"+ + "\u0000\u00c5\u00c6\u0005.\u0000\u0000\u00c6\u00c8\u0003\n\u0005\u0005"+ + "\u00c7\u00c1\u0001\u0000\u0000\u0000\u00c7\u00c4\u0001\u0000\u0000\u0000"+ + "\u00c8\u00cb\u0001\u0000\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000"+ + "\u00c9\u00ca\u0001\u0000\u0000\u0000\u00ca\u000b\u0001\u0000\u0000\u0000"+ + "\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cc\u00ce\u0003\u0010\b\u0000\u00cd"+ + "\u00cf\u0005+\u0000\u0000\u00ce\u00cd\u0001\u0000\u0000\u0000\u00ce\u00cf"+ + "\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001\u0000\u0000\u0000\u00d0\u00d1"+ + "\u0005)\u0000\u0000\u00d1\u00d2\u0003d2\u0000\u00d2\u00db\u0001\u0000"+ + "\u0000\u0000\u00d3\u00d5\u0003\u0010\b\u0000\u00d4\u00d6\u0005+\u0000"+ + "\u0000\u00d5\u00d4\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001\u0000\u0000"+ + "\u0000\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u00d8\u00050\u0000\u0000"+ + "\u00d8\u00d9\u0003d2\u0000\u00d9\u00db\u0001\u0000\u0000\u0000\u00da\u00cc"+ + "\u0001\u0000\u0000\u0000\u00da\u00d3\u0001\u0000\u0000\u0000\u00db\r\u0001"+ + "\u0000\u0000\u0000\u00dc\u00dd\u0003\u0010\b\u0000\u00dd\u00de\u0005?"+ + "\u0000\u0000\u00de\u00df\u0003d2\u0000\u00df\u000f\u0001\u0000\u0000\u0000"+ + "\u00e0\u00e6\u0003\u0012\t\u0000\u00e1\u00e2\u0003\u0012\t\u0000\u00e2"+ + "\u00e3\u0003f3\u0000\u00e3\u00e4\u0003\u0012\t\u0000\u00e4\u00e6\u0001"+ + "\u0000\u0000\u0000\u00e5\u00e0\u0001\u0000\u0000\u0000\u00e5\u00e1\u0001"+ + "\u0000\u0000\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e8\u0006"+ + "\t\uffff\uffff\u0000\u00e8\u00ec\u0003\u0014\n\u0000\u00e9\u00ea\u0007"+ + "\u0000\u0000\u0000\u00ea\u00ec\u0003\u0012\t\u0003\u00eb\u00e7\u0001\u0000"+ + "\u0000\u0000\u00eb\u00e9\u0001\u0000\u0000\u0000\u00ec\u00f5\u0001\u0000"+ + "\u0000\u0000\u00ed\u00ee\n\u0002\u0000\u0000\u00ee\u00ef\u0007\u0001\u0000"+ + "\u0000\u00ef\u00f4\u0003\u0012\t\u0003\u00f0\u00f1\n\u0001\u0000\u0000"+ + "\u00f1\u00f2\u0007\u0000\u0000\u0000\u00f2\u00f4\u0003\u0012\t\u0002\u00f3"+ + "\u00ed\u0001\u0000\u0000\u0000\u00f3\u00f0\u0001\u0000\u0000\u0000\u00f4"+ + "\u00f7\u0001\u0000\u0000\u0000\u00f5\u00f3\u0001\u0000\u0000\u0000\u00f5"+ + "\u00f6\u0001\u0000\u0000\u0000\u00f6\u0013\u0001\u0000\u0000\u0000\u00f7"+ + "\u00f5\u0001\u0000\u0000\u0000\u00f8\u00f9\u0006\n\uffff\uffff\u0000\u00f9"+ + "\u0101\u0003@ \u0000\u00fa\u0101\u00036\u001b\u0000\u00fb\u0101\u0003"+ + "\u0016\u000b\u0000\u00fc\u00fd\u0005*\u0000\u0000\u00fd\u00fe\u0003\n"+ + "\u0005\u0000\u00fe\u00ff\u00051\u0000\u0000\u00ff\u0101\u0001\u0000\u0000"+ + "\u0000\u0100\u00f8\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000"+ + "\u0000\u0100\u00fb\u0001\u0000\u0000\u0000\u0100\u00fc\u0001\u0000\u0000"+ + "\u0000\u0101\u0107\u0001\u0000\u0000\u0000\u0102\u0103\n\u0001\u0000\u0000"+ + "\u0103\u0104\u0005 \u0000\u0000\u0104\u0106\u0003\u001a\r\u0000\u0105"+ + "\u0102\u0001\u0000\u0000\u0000\u0106\u0109\u0001\u0000\u0000\u0000\u0107"+ + "\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000\u0108"+ + "\u0015\u0001\u0000\u0000\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u010a"+ + "\u010b\u0003\u0018\f\u0000\u010b\u0115\u0005*\u0000\u0000\u010c\u0116"+ + "\u0005<\u0000\u0000\u010d\u0112\u0003\n\u0005\u0000\u010e\u010f\u0005"+ + "!\u0000\u0000\u010f\u0111\u0003\n\u0005\u0000\u0110\u010e\u0001\u0000"+ + "\u0000\u0000\u0111\u0114\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000"+ + "\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0116\u0001\u0000"+ + "\u0000\u0000\u0114\u0112\u0001\u0000\u0000\u0000\u0115\u010c\u0001\u0000"+ + "\u0000\u0000\u0115\u010d\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000"+ + "\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117\u0118\u00051\u0000"+ + "\u0000\u0118\u0017\u0001\u0000\u0000\u0000\u0119\u011a\u0004\f\n\u0000"+ + "\u011a\u011d\u0005?\u0000\u0000\u011b\u011d\u0003<\u001e\u0000\u011c\u0119"+ + "\u0001\u0000\u0000\u0000\u011c\u011b\u0001\u0000\u0000\u0000\u011d\u0019"+ + "\u0001\u0000\u0000\u0000\u011e\u011f\u0003<\u001e\u0000\u011f\u001b\u0001"+ + "\u0000\u0000\u0000\u0120\u0121\u0005\f\u0000\u0000\u0121\u0122\u0003\u001e"+ + "\u000f\u0000\u0122\u001d\u0001\u0000\u0000\u0000\u0123\u0128\u0003 \u0010"+ + "\u0000\u0124\u0125\u0005!\u0000\u0000\u0125\u0127\u0003 \u0010\u0000\u0126"+ + "\u0124\u0001\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128"+ + "\u0126\u0001\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129"+ + "\u001f\u0001\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b"+ + "\u0131\u0003\n\u0005\u0000\u012c\u012d\u00036\u001b\u0000\u012d\u012e"+ + "\u0005\u001f\u0000\u0000\u012e\u012f\u0003\n\u0005\u0000\u012f\u0131\u0001"+ + "\u0000\u0000\u0000\u0130\u012b\u0001\u0000\u0000\u0000\u0130\u012c\u0001"+ + "\u0000\u0000\u0000\u0131!\u0001\u0000\u0000\u0000\u0132\u0133\u0005\u0006"+ + "\u0000\u0000\u0133\u0138\u0003$\u0012\u0000\u0134\u0135\u0005!\u0000\u0000"+ + "\u0135\u0137\u0003$\u0012\u0000\u0136\u0134\u0001\u0000\u0000\u0000\u0137"+ + "\u013a\u0001\u0000\u0000\u0000\u0138\u0136\u0001\u0000\u0000\u0000\u0138"+ + "\u0139\u0001\u0000\u0000\u0000\u0139\u013c\u0001\u0000\u0000\u0000\u013a"+ + "\u0138\u0001\u0000\u0000\u0000\u013b\u013d\u0003*\u0015\u0000\u013c\u013b"+ + "\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d#\u0001"+ + "\u0000\u0000\u0000\u013e\u013f\u0003&\u0013\u0000\u013f\u0140\u0005h\u0000"+ + "\u0000\u0140\u0141\u0003(\u0014\u0000\u0141\u0144\u0001\u0000\u0000\u0000"+ + "\u0142\u0144\u0003(\u0014\u0000\u0143\u013e\u0001\u0000\u0000\u0000\u0143"+ + "\u0142\u0001\u0000\u0000\u0000\u0144%\u0001\u0000\u0000\u0000\u0145\u0146"+ + "\u0005L\u0000\u0000\u0146\'\u0001\u0000\u0000\u0000\u0147\u0148\u0007"+ + "\u0002\u0000\u0000\u0148)\u0001\u0000\u0000\u0000\u0149\u014c\u0003,\u0016"+ + "\u0000\u014a\u014c\u0003.\u0017\u0000\u014b\u0149\u0001\u0000\u0000\u0000"+ + "\u014b\u014a\u0001\u0000\u0000\u0000\u014c+\u0001\u0000\u0000\u0000\u014d"+ + "\u014e\u0005K\u0000\u0000\u014e\u0153\u0005L\u0000\u0000\u014f\u0150\u0005"+ + "!\u0000\u0000\u0150\u0152\u0005L\u0000\u0000\u0151\u014f\u0001\u0000\u0000"+ + "\u0000\u0152\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000"+ + "\u0000\u0153\u0154\u0001\u0000\u0000\u0000\u0154-\u0001\u0000\u0000\u0000"+ + "\u0155\u0153\u0001\u0000\u0000\u0000\u0156\u0157\u0005A\u0000\u0000\u0157"+ + "\u0158\u0003,\u0016\u0000\u0158\u0159\u0005B\u0000\u0000\u0159/\u0001"+ + "\u0000\u0000\u0000\u015a\u015b\u0005\u0013\u0000\u0000\u015b\u0160\u0003"+ + "$\u0012\u0000\u015c\u015d\u0005!\u0000\u0000\u015d\u015f\u0003$\u0012"+ + "\u0000\u015e\u015c\u0001\u0000\u0000\u0000\u015f\u0162\u0001\u0000\u0000"+ + "\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0160\u0161\u0001\u0000\u0000"+ + "\u0000\u0161\u0164\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000"+ + "\u0000\u0163\u0165\u0003\u001e\u000f\u0000\u0164\u0163\u0001\u0000\u0000"+ + "\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0168\u0001\u0000\u0000"+ + "\u0000\u0166\u0167\u0005\u001c\u0000\u0000\u0167\u0169\u0003\u001e\u000f"+ + "\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000"+ + "\u0000\u01691\u0001\u0000\u0000\u0000\u016a\u016b\u0005\u0004\u0000\u0000"+ + "\u016b\u016c\u0003\u001e\u000f\u0000\u016c3\u0001\u0000\u0000\u0000\u016d"+ + "\u016f\u0005\u000f\u0000\u0000\u016e\u0170\u0003\u001e\u000f\u0000\u016f"+ + "\u016e\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170"+ + "\u0173\u0001\u0000\u0000\u0000\u0171\u0172\u0005\u001c\u0000\u0000\u0172"+ + "\u0174\u0003\u001e\u000f\u0000\u0173\u0171\u0001\u0000\u0000\u0000\u0173"+ + "\u0174\u0001\u0000\u0000\u0000\u01745\u0001\u0000\u0000\u0000\u0175\u017a"+ + "\u0003<\u001e\u0000\u0176\u0177\u0005#\u0000\u0000\u0177\u0179\u0003<"+ + "\u001e\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179\u017c\u0001\u0000"+ + "\u0000\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000"+ + "\u0000\u0000\u017b7\u0001\u0000\u0000\u0000\u017c\u017a\u0001\u0000\u0000"+ + "\u0000\u017d\u0182\u0003>\u001f\u0000\u017e\u017f\u0005#\u0000\u0000\u017f"+ + "\u0181\u0003>\u001f\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0184"+ + "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ + "\u0001\u0000\u0000\u0000\u01839\u0001\u0000\u0000\u0000\u0184\u0182\u0001"+ + "\u0000\u0000\u0000\u0185\u018a\u00038\u001c\u0000\u0186\u0187\u0005!\u0000"+ + "\u0000\u0187\u0189\u00038\u001c\u0000\u0188\u0186\u0001\u0000\u0000\u0000"+ + "\u0189\u018c\u0001\u0000\u0000\u0000\u018a\u0188\u0001\u0000\u0000\u0000"+ + "\u018a\u018b\u0001\u0000\u0000\u0000\u018b;\u0001\u0000\u0000\u0000\u018c"+ + "\u018a\u0001\u0000\u0000\u0000\u018d\u018e\u0007\u0003\u0000\u0000\u018e"+ + "=\u0001\u0000\u0000\u0000\u018f\u0190\u0005P\u0000\u0000\u0190?\u0001"+ + "\u0000\u0000\u0000\u0191\u01bc\u0005,\u0000\u0000\u0192\u0193\u0003b1"+ + "\u0000\u0193\u0194\u0005C\u0000\u0000\u0194\u01bc\u0001\u0000\u0000\u0000"+ + "\u0195\u01bc\u0003`0\u0000\u0196\u01bc\u0003b1\u0000\u0197\u01bc\u0003"+ + "\\.\u0000\u0198\u01bc\u0003B!\u0000\u0199\u01bc\u0003d2\u0000\u019a\u019b"+ + "\u0005A\u0000\u0000\u019b\u01a0\u0003^/\u0000\u019c\u019d\u0005!\u0000"+ + "\u0000\u019d\u019f\u0003^/\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019f"+ + "\u01a2\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000\u0000\u0000\u01a0"+ + "\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2"+ + "\u01a0\u0001\u0000\u0000\u0000\u01a3\u01a4\u0005B\u0000\u0000\u01a4\u01bc"+ + "\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005A\u0000\u0000\u01a6\u01ab\u0003"+ + "\\.\u0000\u01a7\u01a8\u0005!\u0000\u0000\u01a8\u01aa\u0003\\.\u0000\u01a9"+ + "\u01a7\u0001\u0000\u0000\u0000\u01aa\u01ad\u0001\u0000\u0000\u0000\u01ab"+ + "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+ + "\u01ae\u0001\u0000\u0000\u0000\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ae"+ + "\u01af\u0005B\u0000\u0000\u01af\u01bc\u0001\u0000\u0000\u0000\u01b0\u01b1"+ + "\u0005A\u0000\u0000\u01b1\u01b6\u0003d2\u0000\u01b2\u01b3\u0005!\u0000"+ + "\u0000\u01b3\u01b5\u0003d2\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b5"+ + "\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b6"+ + "\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b9\u0001\u0000\u0000\u0000\u01b8"+ + "\u01b6\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005B\u0000\u0000\u01ba\u01bc"+ + "\u0001\u0000\u0000\u0000\u01bb\u0191\u0001\u0000\u0000\u0000\u01bb\u0192"+ + "\u0001\u0000\u0000\u0000\u01bb\u0195\u0001\u0000\u0000\u0000\u01bb\u0196"+ + "\u0001\u0000\u0000\u0000\u01bb\u0197\u0001\u0000\u0000\u0000\u01bb\u0198"+ + "\u0001\u0000\u0000\u0000\u01bb\u0199\u0001\u0000\u0000\u0000\u01bb\u019a"+ + "\u0001\u0000\u0000\u0000\u01bb\u01a5\u0001\u0000\u0000\u0000\u01bb\u01b0"+ + "\u0001\u0000\u0000\u0000\u01bcA\u0001\u0000\u0000\u0000\u01bd\u01c0\u0005"+ + "/\u0000\u0000\u01be\u01c0\u0005@\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000"+ + "\u0000\u01bf\u01be\u0001\u0000\u0000\u0000\u01c0C\u0001\u0000\u0000\u0000"+ + "\u01c1\u01c2\u0005\t\u0000\u0000\u01c2\u01c3\u0005\u001a\u0000\u0000\u01c3"+ + "E\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\u000e\u0000\u0000\u01c5\u01ca"+ + "\u0003H$\u0000\u01c6\u01c7\u0005!\u0000\u0000\u01c7\u01c9\u0003H$\u0000"+ + "\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cc\u0001\u0000\u0000\u0000"+ + "\u01ca\u01c8\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000\u0000"+ + "\u01cbG\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cd"+ + "\u01cf\u0003\n\u0005\u0000\u01ce\u01d0\u0007\u0004\u0000\u0000\u01cf\u01ce"+ + "\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000\u01d0\u01d3"+ + "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005-\u0000\u0000\u01d2\u01d4\u0007"+ + "\u0005\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ + "\u0000\u0000\u0000\u01d4I\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005\b"+ + "\u0000\u0000\u01d6\u01d7\u0003:\u001d\u0000\u01d7K\u0001\u0000\u0000\u0000"+ + "\u01d8\u01d9\u0005\u0002\u0000\u0000\u01d9\u01da\u0003:\u001d\u0000\u01da"+ + "M\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u000b\u0000\u0000\u01dc\u01e1"+ + "\u0003P(\u0000\u01dd\u01de\u0005!\u0000\u0000\u01de\u01e0\u0003P(\u0000"+ + "\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001\u0000\u0000\u0000"+ + "\u01e1\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000"+ + "\u01e2O\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e4"+ + "\u01e5\u00038\u001c\u0000\u01e5\u01e6\u0005T\u0000\u0000\u01e6\u01e7\u0003"+ + "8\u001c\u0000\u01e7Q\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\u0001\u0000"+ + "\u0000\u01e9\u01ea\u0003\u0014\n\u0000\u01ea\u01ec\u0003d2\u0000\u01eb"+ + "\u01ed\u0003X,\u0000\u01ec\u01eb\u0001\u0000\u0000\u0000\u01ec\u01ed\u0001"+ + "\u0000\u0000\u0000\u01edS\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005\u0007"+ + "\u0000\u0000\u01ef\u01f0\u0003\u0014\n\u0000\u01f0\u01f1\u0003d2\u0000"+ + "\u01f1U\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005\n\u0000\u0000\u01f3"+ + "\u01f4\u00036\u001b\u0000\u01f4W\u0001\u0000\u0000\u0000\u01f5\u01fa\u0003"+ + "Z-\u0000\u01f6\u01f7\u0005!\u0000\u0000\u01f7\u01f9\u0003Z-\u0000\u01f8"+ + "\u01f6\u0001\u0000\u0000\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000\u01fa"+ + "\u01f8\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb"+ + "Y\u0001\u0000\u0000\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000\u01fd\u01fe"+ + "\u0003<\u001e\u0000\u01fe\u01ff\u0005\u001f\u0000\u0000\u01ff\u0200\u0003"+ + "@ \u0000\u0200[\u0001\u0000\u0000\u0000\u0201\u0202\u0007\u0006\u0000"+ + "\u0000\u0202]\u0001\u0000\u0000\u0000\u0203\u0206\u0003`0\u0000\u0204"+ + "\u0206\u0003b1\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0205\u0204\u0001"+ + "\u0000\u0000\u0000\u0206_\u0001\u0000\u0000\u0000\u0207\u0209\u0007\u0000"+ + "\u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000"+ + "\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b\u0005\u001b"+ + "\u0000\u0000\u020ba\u0001\u0000\u0000\u0000\u020c\u020e\u0007\u0000\u0000"+ + "\u0000\u020d\u020c\u0001\u0000\u0000\u0000\u020d\u020e\u0001\u0000\u0000"+ + "\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020f\u0210\u0005\u001a\u0000"+ + "\u0000\u0210c\u0001\u0000\u0000\u0000\u0211\u0212\u0005\u0019\u0000\u0000"+ + "\u0212e\u0001\u0000\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000\u0214"+ + "g\u0001\u0000\u0000\u0000\u0215\u0216\u0005\u0005\u0000\u0000\u0216\u0217"+ + "\u0003j5\u0000\u0217i\u0001\u0000\u0000\u0000\u0218\u0219\u0005A\u0000"+ + "\u0000\u0219\u021a\u0003\u0002\u0001\u0000\u021a\u021b\u0005B\u0000\u0000"+ + "\u021bk\u0001\u0000\u0000\u0000\u021c\u021d\u0005\r\u0000\u0000\u021d"+ + "\u021e\u0005d\u0000\u0000\u021em\u0001\u0000\u0000\u0000\u021f\u0220\u0005"+ + "\u0003\u0000\u0000\u0220\u0223\u0005Z\u0000\u0000\u0221\u0222\u0005X\u0000"+ + "\u0000\u0222\u0224\u00038\u001c\u0000\u0223\u0221\u0001\u0000\u0000\u0000"+ + "\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u022e\u0001\u0000\u0000\u0000"+ + "\u0225\u0226\u0005Y\u0000\u0000\u0226\u022b\u0003p8\u0000\u0227\u0228"+ + "\u0005!\u0000\u0000\u0228\u022a\u0003p8\u0000\u0229\u0227\u0001\u0000"+ + "\u0000\u0000\u022a\u022d\u0001\u0000\u0000\u0000\u022b\u0229\u0001\u0000"+ + "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\u022f\u0001\u0000"+ + "\u0000\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022e\u0225\u0001\u0000"+ + "\u0000\u0000\u022e\u022f\u0001\u0000\u0000\u0000\u022fo\u0001\u0000\u0000"+ + "\u0000\u0230\u0231\u00038\u001c\u0000\u0231\u0232\u0005\u001f\u0000\u0000"+ + "\u0232\u0234\u0001\u0000\u0000\u0000\u0233\u0230\u0001\u0000\u0000\u0000"+ + "\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000"+ + "\u0235\u0236\u00038\u001c\u0000\u0236q\u0001\u0000\u0000\u0000\u0237\u0238"+ + "\u0005\u0012\u0000\u0000\u0238\u0239\u0003$\u0012\u0000\u0239\u023a\u0005"+ + "X\u0000\u0000\u023a\u023b\u0003:\u001d\u0000\u023bs\u0001\u0000\u0000"+ + "\u0000\u023c\u023d\u0005\u0011\u0000\u0000\u023d\u0240\u0003\u001e\u000f"+ + "\u0000\u023e\u023f\u0005\u001c\u0000\u0000\u023f\u0241\u0003\u001e\u000f"+ + "\u0000\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000"+ + "\u0000\u0241u\u0001\u0000\u0000\u00007\u0081\u008a\u009c\u00a8\u00b1\u00b9"+ + "\u00bf\u00c7\u00c9\u00ce\u00d5\u00da\u00e5\u00eb\u00f3\u00f5\u0100\u0107"+ + "\u0112\u0115\u011c\u0128\u0130\u0138\u013c\u0143\u014b\u0153\u0160\u0164"+ + "\u0168\u016f\u0173\u017a\u0182\u018a\u01a0\u01ab\u01b6\u01bb\u01bf\u01ca"+ + "\u01cf\u01d3\u01e1\u01ec\u01fa\u0205\u0208\u020d\u0223\u022b\u022e\u0233"+ + "\u0240"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { From 43d2463bb678b5653396b54a85529256a019fc02 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 12:44:21 +0200 Subject: [PATCH 87/93] Additional assumeTrue that were missing --- .../elasticsearch/xpack/esql/analysis/VerifierTests.java | 8 ++++++++ .../esql/optimizer/LocalPhysicalPlanOptimizerTests.java | 2 +- .../xpack/esql/optimizer/LogicalPlanOptimizerTests.java | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 56f6e0673600a..8ed06408e8c63 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1197,10 +1197,14 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { } public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { + assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); + checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); } public void testMatchWithDisjunctionsThatCannotBePushedDown() { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); } @@ -1232,10 +1236,14 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St } public void testQueryStringFunctionWithNonBooleanFunctions() { + assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); + checkFullTextFunctionsWithNonBooleanFunctions("QSTR", "qstr(\"first_name: Anna\")"); } public void testMatchFunctionWithNonBooleanFunctions() { + assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + checkFullTextFunctionsWithNonBooleanFunctions("MATCH", "match(first_name, \"Anna\")"); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index b12465ff9dde3..c5ce84737520b 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -616,7 +616,7 @@ public void testMatchFunction() { * "source":"emp_no > 10010@2:39"}}],"boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] */ public void testMatchFunctionConjunctionWhereOperands() { - assumeTrue("skipping because QSTR_FUNCTION is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); String queryText = """ from test | where match(last_name, "Smith") and emp_no > 10010 diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index e166ab468d64f..d8e7d0bb211d9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -18,6 +18,7 @@ import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.TestBlockFactory; import org.elasticsearch.xpack.esql.VerificationException; +import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; import org.elasticsearch.xpack.esql.analysis.AnalyzerContext; import org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils; @@ -5567,8 +5568,9 @@ public void testToDatePeriodToTimeDurationWithField() { // These should pass eventually once we lift some restrictions on match function public void testMatchWithNonIndexedColumnCurrentlyUnsupported() { - final String header = "Found 1 problem\nline "; + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + final String header = "Found 1 problem\nline "; VerificationException e = expectThrows(VerificationException.class, () -> plan(""" from test | eval initial = substring(first_name, 1) | where match(initial, "A")""")); assertTrue(e.getMessage().startsWith("Found ")); From 0dd782c2799b4d5f3c6c9e2d0d3d771dc298bf45 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 17:37:08 +0200 Subject: [PATCH 88/93] Full text functions can't be used as part of OR conditions --- .../main/resources/match-function.csv-spec | 39 +--- .../src/main/resources/qstr-function.csv-spec | 15 -- .../xpack/esql/analysis/Verifier.java | 27 ++- .../xpack/esql/analysis/VerifierTests.java | 25 ++- .../LocalPhysicalPlanOptimizerTests.java | 170 ------------------ 5 files changed, 31 insertions(+), 245 deletions(-) diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec index 96481e15e3ee9..b0578aa1a4ed0 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/match-function.csv-spec @@ -102,21 +102,6 @@ book_no:keyword | author:text | stars: 3293 | Danny Faulkner | 2 ; -matchWithPushableDisjunction -required_capability: match_function - -from books -| where match(title, "Return") or book_no == "7140" or year > 2020 -| keep book_no, title; -ignoreOrder:true - -book_no:keyword | title:text -2714 | Return of the King Being the Third Part of The Lord of the Rings -7350 | Return of the Shadow -7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) -6818 | Hadji Murad -; - matchWithConjunction required_capability: match_function @@ -151,7 +136,7 @@ from books ignoreOrder:true book_no:keyword | title:text -4023 |A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings +4023 | A Tolkien Compass: Including J. R. R. Tolkien's Guide to the Names in The Lord of the Rings ; matchWithMultipleWhereClauses @@ -191,30 +176,12 @@ testMultiValuedFieldWithConjunction required_capability: match_function from employees -| where (match(job_positions, "Data Scientist") or match(job_positions, "Support Engineer")) and gender == "F" +| where match(job_positions, "Data Scientist") and match(job_positions, "Support Engineer") | keep emp_no, first_name, last_name; ignoreOrder:true emp_no:integer | first_name:keyword | last_name:keyword -10023 | Bojan | Montemayor -10041 | Uri | Lenart -10044 | Mingsen | Casley -10053 | Sanjiv | Zschoche -10069 | Margareta | Bierman -; - -testFieldWithKeywordComparisonDisjunction -required_capability: match_function - -from employees -| where match(last_name, "Kalloufi") or last_name == "Piveteau" -| keep emp_no, first_name, last_name; -ignoreOrder:true - -emp_no:integer | first_name:keyword | last_name:keyword -10008 | Saniya | Kalloufi -10010 | Duangkaew | Piveteau -10084 | Tuval | Kalloufi +10043 | Yishay | Tzvieli ; testMatchAndQueryStringFunctions diff --git a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec index 5ab569c8b48fd..6dc03d0debcfa 100644 --- a/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec +++ b/x-pack/plugin/esql/qa/testFixtures/src/main/resources/qstr-function.csv-spec @@ -49,21 +49,6 @@ book_no:keyword | title:text 7350 | Return of the Shadow ; -qstrWithPushableDisjunction -required_capability: qstr_function - -from books -| where qstr("title:Return") or book_no == "7140" or year > 2020 -| keep book_no, title; -ignoreOrder:true - -book_no:keyword | title:text -2714 | Return of the King Being the Third Part of The Lord of the Rings -7350 | Return of the Shadow -7140 | The Lord of the Rings Poster Collection: Six Paintings by Alan Lee (No. 1) -6818 | Hadji Murad -; - qstrWithConjunction required_capability: qstr_function diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index ca536d9972d1e..601a86120dce7 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -698,26 +698,21 @@ private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expressio private static void checkFullTextFunctionsConditions(Expression condition, Set failures) { condition.forEachUp(Or.class, or -> { - Expression left = or.left(); - Expression right = or.right(); - checkDisjunction(failures, or, left, right); - checkDisjunction(failures, or, right, left); + checkFullTextFunctionInDisjunction(failures, or, or.left()); + checkFullTextFunctionInDisjunction(failures, or, or.right()); }); } - private static void checkDisjunction(Set failures, Or or, Expression left, Expression right) { + private static void checkFullTextFunctionInDisjunction(Set failures, Or or, Expression left) { left.forEachDown(FullTextFunction.class, ftf -> { - if (canPushToSource(right, x -> false) == false) { - failures.add( - fail( - or, - "Invalid condition [{}]. Function {} can't be used as part of an or condition that includes [{}]", - or.sourceText(), - ftf.functionName(), - right.sourceText() - ) - ); - } + failures.add( + fail( + or, + "Invalid condition [{}]. Function {} can't be used as part of an or condition", + or.sourceText(), + ftf.functionName() + ) + ); }); } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java index 8ed06408e8c63..b319b2c069588 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java @@ -1196,24 +1196,23 @@ public void testQueryStringFunctionArgNotNullOrConstant() throws Exception { // Other value types are tested in QueryStringFunctionTests } - public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { + public void testQueryStringWithDisjunctions() { assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); + checkWithDisjunctions("QSTR", "qstr(\"first_name: Anna\")"); } - public void testMatchWithDisjunctionsThatCannotBePushedDown() { + public void testMatchWithDisjunctions() { assumeTrue("skipping because MATCH is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); + checkWithDisjunctions("MATCH", "match(first_name, \"Anna\")"); } - private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { + private void checkWithDisjunctions(String functionName, String functionInvocation) { assertEquals( LoggerMessageFormat.format( null, - "1:19: Invalid condition [{} or length(first_name) > 12]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", + "1:19: Invalid condition [{} or length(first_name) > 12]. " + "Function {} can't be used as part of an or condition", functionInvocation, functionName ), @@ -1223,7 +1222,7 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St LoggerMessageFormat.format( null, "1:19: Invalid condition [({} and first_name is not null) or (length(first_name) > 12 and first_name is null)]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and first_name is null]", + + "Function {} can't be used as part of an or condition", functionInvocation, functionName ), @@ -1233,6 +1232,16 @@ private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, St + " and first_name is not null) or (length(first_name) > 12 and first_name is null)" ) ); + assertEquals( + LoggerMessageFormat.format( + null, + "1:19: Invalid condition [({} and first_name is not null) or first_name is null]. " + + "Function {} can't be used as part of an or condition", + functionInvocation, + functionName + ), + error("from test | where (" + functionInvocation + " and first_name is not null) or first_name is null") + ); } public void testQueryStringFunctionWithNonBooleanFunctions() { diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index c5ce84737520b..5f3fc06afc6d3 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -11,7 +11,6 @@ import org.apache.lucene.search.IndexSearcher; import org.elasticsearch.Build; -import org.elasticsearch.common.logging.LoggerMessageFormat; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.core.Tuple; import org.elasticsearch.index.IndexMode; @@ -437,40 +436,6 @@ public void testQueryStringFunctionConjunctionWhereOperands() { assertThat(query.query().toString(), is(expected.toString())); } - /** - * Expecting - * LimitExec[1000[INTEGER]] - * \_ExchangeExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8],false] - * \_ProjectExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8]] - * \_FieldExtractExec[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gen] - * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"should":[{"query_string":{"query":"last_name: Smith","fields":[]}}, - * {"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"gt":10010,"boost":1.0}}},"source":"emp_no > 10010@2:37"}}], - * "boost":1.0}}][_doc{f}#13], limit[1000], sort[] estimatedRowSize[324] - */ - public void testQueryStringFunctionDisjunctionWhereClauses() { - assumeTrue("skipping because QSTR_FUNCTION is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - String queryText = """ - from test - | where qstr("last_name: Smith") or emp_no > 10010 - """; - var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); - - var limit = as(plan, LimitExec.class); - var exchange = as(limit.child(), ExchangeExec.class); - var project = as(exchange.child(), ProjectExec.class); - var field = as(project.child(), FieldExtractExec.class); - var query = as(field.child(), EsQueryExec.class); - assertThat(query.limit().fold(), is(1000)); - - Source filterSource = new Source(2, 36, "emp_no > 10000"); - var range = wrapWithSingleQuery(queryText, QueryBuilders.rangeQuery("emp_no").gt(10010), "emp_no", filterSource); - var queryString = QueryBuilders.queryStringQuery("last_name: Smith"); - var expected = QueryBuilders.boolQuery().should(queryString).should(range); - assertThat(query.query().toString(), is(expected.toString())); - } - /** * Expecting * LimitExec[1000[INTEGER]] @@ -637,40 +602,6 @@ public void testMatchFunctionConjunctionWhereOperands() { assertThat(query.query().toString(), is(expected.toString())); } - /** - * Expecting - * LimitExec[1000[INTEGER]] - * \_ExchangeExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8],false] - * \_ProjectExec[[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gender{f}#5, job{f}#10, job.raw{f}#11, languages{f}#6, last_n - * ame{f}#7, long_noidx{f}#12, salary{f}#8]] - * \_FieldExtractExec[_meta_field{f}#9, emp_no{f}#3, first_name{f}#4, gen] - * \_EsQueryExec[test], indexMode[standard], query[{"bool":{"should":[{"match":{"last_name":{"query":"Smith"}}}, - * {"esql_single_value":{"field":"emp_no","next":{"range":{"emp_no":{"gt":10010,"boost":1.0}}},"source":"emp_no > 10010@2:38"}}], - * "boost":1.0}}][_doc{f}#14], limit[1000], sort[] estimatedRowSize[324] - */ - public void testMatchFunctionDisjunctionWhereClauses() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - String queryText = """ - from test - | where match(last_name, "Smith") or emp_no > 10010 - """; - var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); - - var limit = as(plan, LimitExec.class); - var exchange = as(limit.child(), ExchangeExec.class); - var project = as(exchange.child(), ProjectExec.class); - var field = as(project.child(), FieldExtractExec.class); - var query = as(field.child(), EsQueryExec.class); - assertThat(query.limit().fold(), is(1000)); - - Source filterSource = new Source(2, 37, "emp_no > 10000"); - var range = wrapWithSingleQuery(queryText, QueryBuilders.rangeQuery("emp_no").gt(10010), "emp_no", filterSource); - var queryString = QueryBuilders.matchQuery("last_name", "Smith"); - var expected = QueryBuilders.boolQuery().should(queryString).should(range); - assertThat(query.query().toString(), is(expected.toString())); - } - /** * Expecting * LimitExec[1000[INTEGER]] @@ -742,73 +673,6 @@ public void testMatchFunctionMultipleWhereClauses() { assertThat(query.query().toString(), is(expected.toString())); } - public void testQueryStringWithDisjunctionsThatCannotBePushedDown() { - assumeTrue("skipping because QSTR is not enabled", EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()); - - checkWithDisjunctionsThatCannotBePushedDown("QSTR", "qstr(\"first_name: Anna\")"); - } - - public void testMatchWithDisjunctionsThatCannotBePushedDown() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - - checkWithDisjunctionsThatCannotBePushedDown("MATCH", "match(first_name, \"Anna\")"); - } - - private void checkWithDisjunctionsThatCannotBePushedDown(String functionName, String functionInvocation) { - VerificationException ve = expectThrows( - VerificationException.class, - () -> plannerOptimizer.plan("from test | where " + functionInvocation + " or length(first_name) > 12", IS_SV_STATS) - ); - assertThat( - ve.getMessage(), - containsString( - LoggerMessageFormat.format( - null, - "1:19: Invalid condition [{} or length(first_name) > 12]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12]", - functionInvocation, - functionName - ) - ) - ); - ve = expectThrows( - VerificationException.class, - () -> plannerOptimizer.plan( - "from test | where (" + functionInvocation + " and emp_no < 1000) or (length(first_name) > 12 and emp_no > 1000)", - IS_SV_STATS - ) - ); - assertThat( - ve.getMessage(), - containsString( - LoggerMessageFormat.format( - null, - "1:19: Invalid condition [({} and emp_no < 1000) or (length(first_name) > 12 and emp_no > 1000)]. " - + "Function {} can't be used as part of an or condition that includes [length(first_name) > 12 and emp_no > 1000]", - functionInvocation, - functionName - ) - ) - ); - } - - public void testMatchFunctionDisjunctionNonPushableClauses() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - String queryText = """ - from test - | where match(first_name, "Peter") or length(last_name) > 10 - """; - - VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); - assertThat( - ve.getMessage(), - containsString( - "Invalid condition [match(first_name, \"Peter\") or length(last_name) > 10]. " - + "Function MATCH can't be used as part of an or condition that includes [length(last_name) > 10]" - ) - ); - } - public void testMatchFunctionIsNotNullable() { assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); @@ -823,40 +687,6 @@ public void testMatchFunctionIsNotNullable() { ); } - /** - * Expected: - * LimitExec[1000[INTEGER]] - * \_ExchangeExec[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, job{f}#11, job.raw{f}#12, languages{f}#7, last_ - * name{f}#8, long_noidx{f}#13, salary{f}#9],false] - * \_ProjectExec[[_meta_field{f}#10, emp_no{f}#4, first_name{f}#5, gender{f}#6, job{f}#11, job.raw{f}#12, languages{f}#7, last_ - * name{f}#8, long_noidx{f}#13, salary{f}#9]] - * \_FieldExtractExec[_meta_field{f}#10, emp_no{f}#4, first_name{f} - * \_EsQueryExec[test], indexMode[standard], - * query[{"bool":{"should":[{"match":{"first_name":{"query":"Peter"}}},{"esql_single_value":{"field":"last_name", - * "next":{"term":{"last_name":{"value":"Griffin"}}},"source":"last_name == \"Griffin\"@2:39"}}],"boost":1.0}}] - */ - public void testMatchFunctionDisjunctionPushableClauses() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - String queryText = """ - from test - | where match(first_name, "Peter") or last_name == "Griffin" - """; - var plan = plannerOptimizer.plan(queryText, IS_SV_STATS); - - var limit = as(plan, LimitExec.class); - var exchange = as(limit.child(), ExchangeExec.class); - var project = as(exchange.child(), ProjectExec.class); - var field = as(project.child(), FieldExtractExec.class); - var query = as(field.child(), EsQueryExec.class); - assertThat(query.limit().fold(), is(1000)); - - var queryStringLeft = QueryBuilders.matchQuery("first_name", "Peter"); - Source termSource = new Source(2, 38, "last_name == \"Griffin\""); - var queryStringRight = wrapWithSingleQuery(queryText, QueryBuilders.termQuery("last_name", "Griffin"), "last_name", termSource); - var expected = QueryBuilders.boolQuery().should(queryStringLeft).should(queryStringRight); - assertThat(query.query().toString(), is(expected.toString())); - } - /** * Expecting * LimitExec[1000[INTEGER]] From d4e625696529e6b81231b1bbc3691b095344b6b0 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 17:40:04 +0200 Subject: [PATCH 89/93] Change QueryStringFunction and MatchFunction to QueryString and Match --- ...ringFunctionIT.java => QueryStringIT.java} | 2 +- .../xpack/esql/analysis/Verifier.java | 8 +++---- .../function/EsqlFunctionRegistry.java | 8 +++---- .../function/fulltext/FullTextFunction.java | 4 ++-- .../{MatchFunction.java => Match.java} | 21 ++++++------------- ...ryStringFunction.java => QueryString.java} | 16 ++++++-------- .../physical/local/PushFiltersToSource.java | 8 +++---- .../planner/EsqlExpressionTranslators.java | 16 +++++++------- ...atchFunctionTests.java => MatchTests.java} | 13 ++++-------- ...nctionTests.java => QueryStringTests.java} | 6 +++--- 10 files changed, 42 insertions(+), 60 deletions(-) rename x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/{QueryStringFunctionIT.java => QueryStringIT.java} (98%) rename x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/{MatchFunction.java => Match.java} (88%) rename x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/{QueryStringFunction.java => QueryString.java} (84%) rename x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/{MatchFunctionTests.java => MatchTests.java} (89%) rename x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/{QueryStringFunctionTests.java => QueryStringTests.java} (92%) diff --git a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringFunctionIT.java b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringIT.java similarity index 98% rename from x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringFunctionIT.java rename to x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringIT.java index e6f11ca1f44d2..53b833c7e8a15 100644 --- a/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringFunctionIT.java +++ b/x-pack/plugin/esql/src/internalClusterTest/java/org/elasticsearch/xpack/esql/plugin/QueryStringIT.java @@ -29,7 +29,7 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.Matchers.equalTo; -public class QueryStringFunctionIT extends AbstractEsqlIntegTestCase { +public class QueryStringIT extends AbstractEsqlIntegTestCase { @Before public void setupIndex() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index 601a86120dce7..cbbbdf6af6548 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -32,8 +32,8 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.AggregateFunction; import org.elasticsearch.xpack.esql.expression.function.aggregate.Rate; import org.elasticsearch.xpack.esql.expression.function.fulltext.FullTextFunction; -import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; -import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.Match; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryString; import org.elasticsearch.xpack.esql.expression.function.grouping.GroupingFunction; import org.elasticsearch.xpack.esql.expression.predicate.operator.arithmetic.Neg; import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.Equals; @@ -663,7 +663,7 @@ private static void checkFullTextQueryFunctions(LogicalPlan plan, Set f } private static void checkCommandsBeforeQueryStringFunction(LogicalPlan plan, Expression condition, Set failures) { - condition.forEachDown(QueryStringFunction.class, qsf -> { + condition.forEachDown(QueryString.class, qsf -> { plan.forEachDown(LogicalPlan.class, lp -> { if ((lp instanceof Filter || lp instanceof OrderBy || lp instanceof EsRelation) == false) { failures.add( @@ -680,7 +680,7 @@ private static void checkCommandsBeforeQueryStringFunction(LogicalPlan plan, Exp } private static void checkCommandsBeforeMatchFunction(LogicalPlan plan, Expression condition, Set failures) { - condition.forEachDown(MatchFunction.class, qsf -> { + condition.forEachDown(Match.class, qsf -> { plan.forEachDown(LogicalPlan.class, lp -> { if (lp instanceof Limit) { failures.add( diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java index ccb6fb2609621..22c81c9a3a041 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/EsqlFunctionRegistry.java @@ -32,8 +32,8 @@ import org.elasticsearch.xpack.esql.expression.function.aggregate.Top; import org.elasticsearch.xpack.esql.expression.function.aggregate.Values; import org.elasticsearch.xpack.esql.expression.function.aggregate.WeightedAvg; -import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; -import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.Match; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryString; import org.elasticsearch.xpack.esql.expression.function.grouping.Bucket; import org.elasticsearch.xpack.esql.expression.function.grouping.Categorize; import org.elasticsearch.xpack.esql.expression.function.scalar.conditional.Case; @@ -394,8 +394,8 @@ private static FunctionDefinition[][] snapshotFunctions() { def(Categorize.class, Categorize::new, "categorize"), def(Rate.class, Rate::withUnresolvedTimestamp, "rate"), // Full text functions - def(QueryStringFunction.class, QueryStringFunction::new, "qstr"), - def(MatchFunction.class, MatchFunction::new, "match") } }; + def(QueryString.class, QueryString::new, "qstr"), + def(Match.class, Match::new, "match") } }; } public EsqlFunctionRegistry snapshotRegistry() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java index 4f672b5492c01..a39c0d7bc6b50 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/FullTextFunction.java @@ -34,10 +34,10 @@ public abstract class FullTextFunction extends Function { public static List getNamedWriteables() { List entries = new ArrayList<>(); if (EsqlCapabilities.Cap.QSTR_FUNCTION.isEnabled()) { - entries.add(QueryStringFunction.ENTRY); + entries.add(QueryString.ENTRY); } if (EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()) { - entries.add(MatchFunction.ENTRY); + entries.add(Match.ENTRY); } return entries; } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/Match.java similarity index 88% rename from x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java rename to x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/Match.java index 5970c647379b6..b4e0f3c743216 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/Match.java @@ -35,13 +35,9 @@ /** * Full text function that performs a {@link QueryStringQuery} . */ -public class MatchFunction extends FullTextFunction implements Validatable { +public class Match extends FullTextFunction implements Validatable { - public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( - Expression.class, - "Match", - MatchFunction::new - ); + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "Match", Match::new); private final Expression field; @@ -51,7 +47,7 @@ public class MatchFunction extends FullTextFunction implements Validatable { description = "Performs a match query on the specified field. Returns true if the provided query matches the row.", examples = { @Example(file = "match-function", tag = "match-with-field") } ) - public MatchFunction( + public Match( Source source, @Param(name = "field", type = { "keyword", "text" }, description = "Field that the query will target.") Expression field, @Param( @@ -64,7 +60,7 @@ public MatchFunction( this.field = field; } - private MatchFunction(StreamInput in) throws IOException { + private Match(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class), in.readNamedWriteable(Expression.class)); } @@ -80,11 +76,6 @@ public String getWriteableName() { return ENTRY.name; } - @Override - public String functionName() { - return "MATCH"; - } - @Override protected TypeResolution resolveNonQueryParamTypes() { return isNotNull(field, sourceText(), FIRST).and(isString(field, sourceText(), FIRST)).and(super.resolveNonQueryParamTypes()); @@ -107,12 +98,12 @@ public void validate(Failures failures) { @Override public Expression replaceChildren(List newChildren) { // Query is the first child, field is the second child - return new MatchFunction(source(), newChildren.get(0), newChildren.get(1)); + return new Match(source(), newChildren.get(0), newChildren.get(1)); } @Override protected NodeInfo info() { - return NodeInfo.create(this, MatchFunction::new, field, query()); + return NodeInfo.create(this, Match::new, field, query()); } protected TypeResolutions.ParamOrdinal queryParamOrdinal() { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryString.java similarity index 84% rename from x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java rename to x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryString.java index 7bc871d5442fd..0d7d15a13dd80 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunction.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryString.java @@ -25,13 +25,9 @@ /** * Full text function that performs a {@link QueryStringQuery} . */ -public class QueryStringFunction extends FullTextFunction { +public class QueryString extends FullTextFunction { - public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry( - Expression.class, - "QStr", - QueryStringFunction::new - ); + public static final NamedWriteableRegistry.Entry ENTRY = new NamedWriteableRegistry.Entry(Expression.class, "QStr", QueryString::new); @FunctionInfo( returnType = "boolean", @@ -39,7 +35,7 @@ public class QueryStringFunction extends FullTextFunction { description = "Performs a query string query. Returns true if the provided query string matches the row.", examples = { @Example(file = "qstr-function", tag = "qstr-with-field") } ) - public QueryStringFunction( + public QueryString( Source source, @Param( name = "query", @@ -50,7 +46,7 @@ public QueryStringFunction( super(source, queryString, List.of(queryString)); } - private QueryStringFunction(StreamInput in) throws IOException { + private QueryString(StreamInput in) throws IOException { this(Source.readFrom((PlanStreamInput) in), in.readNamedWriteable(Expression.class)); } @@ -72,12 +68,12 @@ public String functionName() { @Override public Expression replaceChildren(List newChildren) { - return new QueryStringFunction(source(), newChildren.get(0)); + return new QueryString(source(), newChildren.get(0)); } @Override protected NodeInfo info() { - return NodeInfo.create(this, QueryStringFunction::new, query()); + return NodeInfo.create(this, QueryString::new, query()); } } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java index df41a9070551d..84f0021c41e81 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/optimizer/rules/physical/local/PushFiltersToSource.java @@ -28,8 +28,8 @@ import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.CollectionUtils; import org.elasticsearch.xpack.esql.core.util.Queries; -import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; -import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.Match; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryString; import org.elasticsearch.xpack.esql.expression.function.scalar.ip.CIDRMatch; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesFunction; import org.elasticsearch.xpack.esql.expression.predicate.operator.comparison.Equals; @@ -196,9 +196,9 @@ public static boolean canPushToSource(Expression exp, Predicate return mqp.field() instanceof FieldAttribute && DataType.isString(mqp.field().dataType()); } else if (exp instanceof StringQueryPredicate) { return true; - } else if (exp instanceof QueryStringFunction) { + } else if (exp instanceof QueryString) { return true; - } else if (exp instanceof MatchFunction mf) { + } else if (exp instanceof Match mf) { return mf.field() instanceof FieldAttribute && DataType.isString(mf.field().dataType()); } return false; diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java index e57d66969676e..2c8604a7c4a80 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/EsqlExpressionTranslators.java @@ -34,8 +34,8 @@ import org.elasticsearch.xpack.esql.core.tree.Source; import org.elasticsearch.xpack.esql.core.type.DataType; import org.elasticsearch.xpack.esql.core.util.Check; -import org.elasticsearch.xpack.esql.expression.function.fulltext.MatchFunction; -import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryStringFunction; +import org.elasticsearch.xpack.esql.expression.function.fulltext.Match; +import org.elasticsearch.xpack.esql.expression.function.fulltext.QueryString; import org.elasticsearch.xpack.esql.expression.function.scalar.ip.CIDRMatch; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesFunction; import org.elasticsearch.xpack.esql.expression.function.scalar.spatial.SpatialRelatesUtils; @@ -527,17 +527,17 @@ private static RangeQuery translate(Range r, TranslatorHandler handler) { } } - public static class MatchFunctionTranslator extends ExpressionTranslator { + public static class MatchFunctionTranslator extends ExpressionTranslator { @Override - protected Query asQuery(MatchFunction matchFunction, TranslatorHandler handler) { - return new MatchQuery(matchFunction.source(), ((FieldAttribute) matchFunction.field()).name(), matchFunction.queryAsText()); + protected Query asQuery(Match match, TranslatorHandler handler) { + return new MatchQuery(match.source(), ((FieldAttribute) match.field()).name(), match.queryAsText()); } } - public static class QueryStringFunctionTranslator extends ExpressionTranslator { + public static class QueryStringFunctionTranslator extends ExpressionTranslator { @Override - protected Query asQuery(QueryStringFunction queryStringFunction, TranslatorHandler handler) { - return new QueryStringQuery(queryStringFunction.source(), queryStringFunction.queryAsText(), Map.of(), null); + protected Query asQuery(QueryString queryString, TranslatorHandler handler) { + return new QueryStringQuery(queryString.source(), queryString.queryAsText(), Map.of(), null); } } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchTests.java similarity index 89% rename from x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java rename to x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchTests.java index 5c4e48d14f501..f04e9bd495a49 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/MatchTests.java @@ -31,14 +31,14 @@ import static org.hamcrest.Matchers.equalTo; @FunctionName("match") -public class MatchFunctionTests extends AbstractFunctionTestCase { +public class MatchTests extends AbstractFunctionTestCase { @BeforeClass public static void checkFunctionEnabled() { assumeTrue("MATCH function should be enabled ", MATCH_FUNCTION.isEnabled()); } - public MatchFunctionTests(@Name("TestCase") Supplier testCaseSupplier) { + public MatchTests(@Name("TestCase") Supplier testCaseSupplier) { this.testCase = testCaseSupplier.get(); } @@ -60,12 +60,7 @@ public static Iterable parameters() { new TestCaseSupplier( "<" + fieldType + "-non ES field, " + queryType + ">", List.of(fieldType, queryType), - typeErrorSupplier( - true, - supportedPerPosition, - List.of(fieldType, queryType), - MatchFunctionTests::matchTypeErrorSupplier - ) + typeErrorSupplier(true, supportedPerPosition, List.of(fieldType, queryType), MatchTests::matchTypeErrorSupplier) ) ); } @@ -107,6 +102,6 @@ private static TestCaseSupplier.TestCase testCase( @Override protected Expression build(Source source, List args) { - return new MatchFunction(source, args.get(0), args.get(1)); + return new Match(source, args.get(0), args.get(1)); } } diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunctionTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringTests.java similarity index 92% rename from x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunctionTests.java rename to x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringTests.java index 37e16a2499cd9..8b0e4f10b8d54 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringFunctionTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/expression/function/fulltext/QueryStringTests.java @@ -29,14 +29,14 @@ import static org.hamcrest.Matchers.equalTo; @FunctionName("qstr") -public class QueryStringFunctionTests extends AbstractFunctionTestCase { +public class QueryStringTests extends AbstractFunctionTestCase { @BeforeClass public static void checkFunctionEnabled() { assumeTrue("QSTR capability should be enabled ", QSTR_FUNCTION.isEnabled()); } - public QueryStringFunctionTests(@Name("TestCase") Supplier testCaseSupplier) { + public QueryStringTests(@Name("TestCase") Supplier testCaseSupplier) { this.testCase = testCaseSupplier.get(); } @@ -77,6 +77,6 @@ private static TestCaseSupplier.TestCase testCase(DataType strType, String str, @Override protected Expression build(Source source, List args) { - return new QueryStringFunction(source, args.get(0)); + return new QueryString(source, args.get(0)); } } From 03a02460b9934204812c91d3da300afb7c19fc13 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 17:50:55 +0200 Subject: [PATCH 90/93] Moved forEachParent method from Node to Verifier --- .../xpack/esql/core/tree/Node.java | 22 ----------------- .../xpack/esql/analysis/Verifier.java | 24 ++++++++++++++++++- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java index e9cda41dec1b7..feeba39756373 100644 --- a/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java +++ b/x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/tree/Node.java @@ -14,7 +14,6 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; @@ -95,27 +94,6 @@ public void forEachUp(Class typeToken, Consumer acti }); } - /** - * Executes the action on every parent of the specified typeToken. - * - * @param typeToken the type of the node to search for - * @param action the action to execute for each parent of the specified typeToken - */ - @SuppressWarnings("unchecked") - public E forEachParent(Class typeToken, BiConsumer action) { - if (typeToken.isInstance(this)) { - return (E) this; - } - for (Node child : children()) { - E foundMatchingChild = child.forEachParent(typeToken, action); - if (foundMatchingChild != null) { - action.accept(foundMatchingChild, (T) this); - return foundMatchingChild; - } - } - return null; - } - public void forEachPropertyOnly(Class typeToken, Consumer rule) { forEachProperty(typeToken, rule); } diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index cbbbdf6af6548..633eeebb9e8a2 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -61,6 +61,7 @@ import java.util.List; import java.util.Locale; import java.util.Set; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Stream; @@ -717,7 +718,7 @@ private static void checkFullTextFunctionInDisjunction(Set failures, Or } private static void checkFullTextFunctionsParents(Expression condition, Set failures) { - condition.forEachParent(FullTextFunction.class, (ftf, parent) -> { + forEachParent(condition, FullTextFunction.class, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) && (parent instanceof BinaryLogic == false) && (parent instanceof Not == false)) { @@ -733,4 +734,25 @@ private static void checkFullTextFunctionsParents(Expression condition, Set T forEachParent(Expression condition, Class typeToken, BiConsumer action) { + if (typeToken.isInstance(condition)) { + return (T) condition; + } + for (Expression child : condition.children()) { + T foundMatchingChild = forEachParent(child, typeToken, action); + if (foundMatchingChild != null) { + action.accept(foundMatchingChild, condition); + return foundMatchingChild; + } + } + return null; + } } From 87807ed508002848138e2871620fe2a7c6ce61fc Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 17:54:14 +0200 Subject: [PATCH 91/93] Moved verification tests to LogicalPlanOptimizerTests --- .../LocalPhysicalPlanOptimizerTests.java | 16 ---------------- .../optimizer/LogicalPlanOptimizerTests.java | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java index 5f3fc06afc6d3..3dd0828b82eed 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LocalPhysicalPlanOptimizerTests.java @@ -25,7 +25,6 @@ import org.elasticsearch.xpack.core.enrich.EnrichPolicy; import org.elasticsearch.xpack.esql.EsqlTestUtils; import org.elasticsearch.xpack.esql.EsqlTestUtils.TestSearchStats; -import org.elasticsearch.xpack.esql.VerificationException; import org.elasticsearch.xpack.esql.action.EsqlCapabilities; import org.elasticsearch.xpack.esql.analysis.Analyzer; import org.elasticsearch.xpack.esql.analysis.AnalyzerContext; @@ -77,7 +76,6 @@ import static org.elasticsearch.xpack.esql.EsqlTestUtils.withDefaultLimitWarning; import static org.elasticsearch.xpack.esql.plan.physical.EsStatsQueryExec.StatsType; import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.instanceOf; @@ -673,20 +671,6 @@ public void testMatchFunctionMultipleWhereClauses() { assertThat(query.query().toString(), is(expected.toString())); } - public void testMatchFunctionIsNotNullable() { - assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); - - String queryText = """ - row n = null | eval text = n + 5 | where match(text::keyword, "Anna") - """; - - VerificationException ve = expectThrows(VerificationException.class, () -> plannerOptimizer.plan(queryText, IS_SV_STATS)); - assertThat( - ve.getMessage(), - containsString("[MATCH] cannot operate on [text::keyword], which is not a field from an index mapping") - ); - } - /** * Expecting * LimitExec[1000[INTEGER]] diff --git a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java index d8e7d0bb211d9..e8980c99a61f9 100644 --- a/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java +++ b/x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/optimizer/LogicalPlanOptimizerTests.java @@ -5588,6 +5588,20 @@ public void testMatchWithNonIndexedColumnCurrentlyUnsupported() { ); } + public void testMatchFunctionIsNotNullable() { + assumeTrue("skipping because MATCH function is not enabled", EsqlCapabilities.Cap.MATCH_FUNCTION.isEnabled()); + + String queryText = """ + row n = null | eval text = n + 5 | where match(text::keyword, "Anna") + """; + + VerificationException ve = expectThrows(VerificationException.class, () -> plan(queryText)); + assertThat( + ve.getMessage(), + containsString("[MATCH] cannot operate on [text::keyword], which is not a field from an index mapping") + ); + } + private Literal nullOf(DataType dataType) { return new Literal(Source.EMPTY, null, dataType); } From 2e5ce4ede88f199eab5d218646c43f7db4436e26 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Wed, 9 Oct 2024 18:37:17 +0200 Subject: [PATCH 92/93] Simplified checking of full text function parents --- .../xpack/esql/analysis/Verifier.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java index 633eeebb9e8a2..69571649a30fa 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/analysis/Verifier.java @@ -718,7 +718,7 @@ private static void checkFullTextFunctionInDisjunction(Set failures, Or } private static void checkFullTextFunctionsParents(Expression condition, Set failures) { - forEachParent(condition, FullTextFunction.class, (ftf, parent) -> { + forEachFullTextFunctionParent(condition, (ftf, parent) -> { if ((parent instanceof FullTextFunction == false) && (parent instanceof BinaryLogic == false) && (parent instanceof Not == false)) { @@ -736,18 +736,16 @@ private static void checkFullTextFunctionsParents(Expression condition, Set T forEachParent(Expression condition, Class typeToken, BiConsumer action) { - if (typeToken.isInstance(condition)) { - return (T) condition; + private static FullTextFunction forEachFullTextFunctionParent(Expression condition, BiConsumer action) { + if (condition instanceof FullTextFunction ftf) { + return ftf; } for (Expression child : condition.children()) { - T foundMatchingChild = forEachParent(child, typeToken, action); + FullTextFunction foundMatchingChild = forEachFullTextFunctionParent(child, action); if (foundMatchingChild != null) { action.accept(foundMatchingChild, condition); return foundMatchingChild; From 38a6136056b83a3950746d171fe55d711a1a20c7 Mon Sep 17 00:00:00 2001 From: carlosdelest Date: Fri, 11 Oct 2024 09:55:26 +0200 Subject: [PATCH 93/93] Fix merge --- .../xpack/esql/parser/EsqlBaseLexer.interp | 10 +- .../xpack/esql/parser/EsqlBaseLexer.java | 1641 +++++++++-------- .../xpack/esql/parser/EsqlBaseParser.interp | 5 +- .../xpack/esql/parser/EsqlBaseParser.java | 1641 +++++++++-------- .../xpack/esql/parser/ExpressionBuilder.java | 137 +- .../xpack/esql/parser/IdentifierBuilder.java | 8 - 6 files changed, 1844 insertions(+), 1598 deletions(-) diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp index 9b8cfc9319fff..e9e6f45bdc30f 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp @@ -349,6 +349,8 @@ FROM_WS PROJECT_PIPE PROJECT_DOT PROJECT_COMMA +PROJECT_PARAM +PROJECT_NAMED_OR_POSITIONAL_PARAM UNQUOTED_ID_BODY_WITH_PATTERN UNQUOTED_ID_PATTERN ID_PATTERN @@ -359,6 +361,8 @@ RENAME_PIPE RENAME_ASSIGN RENAME_COMMA RENAME_DOT +RENAME_PARAM +RENAME_NAMED_OR_POSITIONAL_PARAM AS RENAME_ID_PATTERN RENAME_LINE_COMMENT @@ -381,11 +385,15 @@ ENRICH_FIELD_DOT ENRICH_FIELD_WITH ENRICH_FIELD_ID_PATTERN ENRICH_FIELD_QUOTED_IDENTIFIER +ENRICH_FIELD_PARAM +ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM ENRICH_FIELD_LINE_COMMENT ENRICH_FIELD_MULTILINE_COMMENT ENRICH_FIELD_WS MVEXPAND_PIPE MVEXPAND_DOT +MVEXPAND_PARAM +MVEXPAND_NAMED_OR_POSITIONAL_PARAM MVEXPAND_QUOTED_IDENTIFIER MVEXPAND_UNQUOTED_IDENTIFIER MVEXPAND_LINE_COMMENT @@ -457,4 +465,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 120, 1418, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 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, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 560, 8, 19, 11, 19, 12, 19, 561, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 570, 8, 20, 10, 20, 12, 20, 573, 9, 20, 1, 20, 3, 20, 576, 8, 20, 1, 20, 3, 20, 579, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 588, 8, 21, 10, 21, 12, 21, 591, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 599, 8, 22, 11, 22, 12, 22, 600, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 620, 8, 28, 1, 28, 4, 28, 623, 8, 28, 11, 28, 12, 28, 624, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 634, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 641, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 646, 8, 34, 10, 34, 12, 34, 649, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 657, 8, 34, 10, 34, 12, 34, 660, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 667, 8, 34, 1, 34, 3, 34, 670, 8, 34, 3, 34, 672, 8, 34, 1, 35, 4, 35, 675, 8, 35, 11, 35, 12, 35, 676, 1, 36, 4, 36, 680, 8, 36, 11, 36, 12, 36, 681, 1, 36, 1, 36, 5, 36, 686, 8, 36, 10, 36, 12, 36, 689, 9, 36, 1, 36, 1, 36, 4, 36, 693, 8, 36, 11, 36, 12, 36, 694, 1, 36, 4, 36, 698, 8, 36, 11, 36, 12, 36, 699, 1, 36, 1, 36, 5, 36, 704, 8, 36, 10, 36, 12, 36, 707, 9, 36, 3, 36, 709, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 4, 36, 715, 8, 36, 11, 36, 12, 36, 716, 1, 36, 1, 36, 3, 36, 721, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 3, 73, 850, 8, 73, 1, 73, 5, 73, 853, 8, 73, 10, 73, 12, 73, 856, 9, 73, 1, 73, 1, 73, 4, 73, 860, 8, 73, 11, 73, 12, 73, 861, 3, 73, 864, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 5, 76, 878, 8, 76, 10, 76, 12, 76, 881, 9, 76, 1, 76, 1, 76, 3, 76, 885, 8, 76, 1, 76, 4, 76, 888, 8, 76, 11, 76, 12, 76, 889, 3, 76, 892, 8, 76, 1, 77, 1, 77, 4, 77, 896, 8, 77, 11, 77, 12, 77, 897, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 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, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 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, 94, 1, 94, 1, 94, 3, 94, 975, 8, 94, 1, 95, 4, 95, 978, 8, 95, 11, 95, 12, 95, 979, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1019, 8, 104, 1, 105, 1, 105, 3, 105, 1023, 8, 105, 1, 105, 5, 105, 1026, 8, 105, 10, 105, 12, 105, 1029, 9, 105, 1, 105, 1, 105, 3, 105, 1033, 8, 105, 1, 105, 4, 105, 1036, 8, 105, 11, 105, 12, 105, 1037, 3, 105, 1040, 8, 105, 1, 106, 1, 106, 4, 106, 1044, 8, 106, 11, 106, 12, 106, 1045, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 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, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 4, 124, 1121, 8, 124, 11, 124, 12, 124, 1122, 1, 124, 1, 124, 3, 124, 1127, 8, 124, 1, 124, 4, 124, 1130, 8, 124, 11, 124, 12, 124, 1131, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 4, 153, 1255, 8, 153, 11, 153, 12, 153, 1256, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 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, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 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, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 2, 589, 658, 0, 189, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 25, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 66, 167, 67, 169, 0, 171, 68, 173, 69, 175, 70, 177, 71, 179, 0, 181, 0, 183, 72, 185, 73, 187, 74, 189, 0, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 75, 203, 0, 205, 76, 207, 0, 209, 0, 211, 77, 213, 78, 215, 79, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 80, 229, 81, 231, 82, 233, 83, 235, 0, 237, 0, 239, 0, 241, 0, 243, 84, 245, 0, 247, 85, 249, 86, 251, 87, 253, 0, 255, 0, 257, 88, 259, 89, 261, 0, 263, 90, 265, 0, 267, 91, 269, 92, 271, 93, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 94, 289, 95, 291, 96, 293, 0, 295, 0, 297, 0, 299, 0, 301, 97, 303, 98, 305, 99, 307, 0, 309, 100, 311, 101, 313, 102, 315, 103, 317, 0, 319, 104, 321, 105, 323, 106, 325, 107, 327, 108, 329, 0, 331, 0, 333, 0, 335, 0, 337, 0, 339, 0, 341, 0, 343, 109, 345, 110, 347, 111, 349, 0, 351, 0, 353, 0, 355, 0, 357, 112, 359, 113, 361, 114, 363, 0, 365, 0, 367, 0, 369, 115, 371, 116, 373, 117, 375, 0, 377, 0, 379, 118, 381, 119, 383, 120, 385, 0, 387, 0, 389, 0, 391, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1446, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 1, 83, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 171, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 2, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 205, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 4, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 227, 1, 0, 0, 0, 4, 229, 1, 0, 0, 0, 4, 231, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 5, 235, 1, 0, 0, 0, 5, 237, 1, 0, 0, 0, 5, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 6, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 6, 257, 1, 0, 0, 0, 6, 259, 1, 0, 0, 0, 6, 263, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 269, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 7, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 7, 277, 1, 0, 0, 0, 7, 279, 1, 0, 0, 0, 7, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 8, 293, 1, 0, 0, 0, 8, 295, 1, 0, 0, 0, 8, 297, 1, 0, 0, 0, 8, 299, 1, 0, 0, 0, 8, 301, 1, 0, 0, 0, 8, 303, 1, 0, 0, 0, 8, 305, 1, 0, 0, 0, 9, 307, 1, 0, 0, 0, 9, 309, 1, 0, 0, 0, 9, 311, 1, 0, 0, 0, 9, 313, 1, 0, 0, 0, 9, 315, 1, 0, 0, 0, 10, 317, 1, 0, 0, 0, 10, 319, 1, 0, 0, 0, 10, 321, 1, 0, 0, 0, 10, 323, 1, 0, 0, 0, 10, 325, 1, 0, 0, 0, 10, 327, 1, 0, 0, 0, 11, 329, 1, 0, 0, 0, 11, 331, 1, 0, 0, 0, 11, 333, 1, 0, 0, 0, 11, 335, 1, 0, 0, 0, 11, 337, 1, 0, 0, 0, 11, 339, 1, 0, 0, 0, 11, 341, 1, 0, 0, 0, 11, 343, 1, 0, 0, 0, 11, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 12, 349, 1, 0, 0, 0, 12, 351, 1, 0, 0, 0, 12, 353, 1, 0, 0, 0, 12, 355, 1, 0, 0, 0, 12, 357, 1, 0, 0, 0, 12, 359, 1, 0, 0, 0, 12, 361, 1, 0, 0, 0, 13, 363, 1, 0, 0, 0, 13, 365, 1, 0, 0, 0, 13, 367, 1, 0, 0, 0, 13, 369, 1, 0, 0, 0, 13, 371, 1, 0, 0, 0, 13, 373, 1, 0, 0, 0, 14, 375, 1, 0, 0, 0, 14, 377, 1, 0, 0, 0, 14, 379, 1, 0, 0, 0, 14, 381, 1, 0, 0, 0, 14, 383, 1, 0, 0, 0, 14, 385, 1, 0, 0, 0, 14, 387, 1, 0, 0, 0, 14, 389, 1, 0, 0, 0, 14, 391, 1, 0, 0, 0, 15, 393, 1, 0, 0, 0, 17, 403, 1, 0, 0, 0, 19, 410, 1, 0, 0, 0, 21, 419, 1, 0, 0, 0, 23, 426, 1, 0, 0, 0, 25, 436, 1, 0, 0, 0, 27, 443, 1, 0, 0, 0, 29, 450, 1, 0, 0, 0, 31, 457, 1, 0, 0, 0, 33, 465, 1, 0, 0, 0, 35, 477, 1, 0, 0, 0, 37, 486, 1, 0, 0, 0, 39, 492, 1, 0, 0, 0, 41, 499, 1, 0, 0, 0, 43, 506, 1, 0, 0, 0, 45, 514, 1, 0, 0, 0, 47, 522, 1, 0, 0, 0, 49, 537, 1, 0, 0, 0, 51, 547, 1, 0, 0, 0, 53, 559, 1, 0, 0, 0, 55, 565, 1, 0, 0, 0, 57, 582, 1, 0, 0, 0, 59, 598, 1, 0, 0, 0, 61, 604, 1, 0, 0, 0, 63, 608, 1, 0, 0, 0, 65, 610, 1, 0, 0, 0, 67, 612, 1, 0, 0, 0, 69, 615, 1, 0, 0, 0, 71, 617, 1, 0, 0, 0, 73, 626, 1, 0, 0, 0, 75, 628, 1, 0, 0, 0, 77, 633, 1, 0, 0, 0, 79, 635, 1, 0, 0, 0, 81, 640, 1, 0, 0, 0, 83, 671, 1, 0, 0, 0, 85, 674, 1, 0, 0, 0, 87, 720, 1, 0, 0, 0, 89, 722, 1, 0, 0, 0, 91, 725, 1, 0, 0, 0, 93, 729, 1, 0, 0, 0, 95, 733, 1, 0, 0, 0, 97, 735, 1, 0, 0, 0, 99, 738, 1, 0, 0, 0, 101, 740, 1, 0, 0, 0, 103, 745, 1, 0, 0, 0, 105, 747, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 759, 1, 0, 0, 0, 111, 762, 1, 0, 0, 0, 113, 765, 1, 0, 0, 0, 115, 770, 1, 0, 0, 0, 117, 775, 1, 0, 0, 0, 119, 777, 1, 0, 0, 0, 121, 781, 1, 0, 0, 0, 123, 786, 1, 0, 0, 0, 125, 792, 1, 0, 0, 0, 127, 795, 1, 0, 0, 0, 129, 797, 1, 0, 0, 0, 131, 803, 1, 0, 0, 0, 133, 805, 1, 0, 0, 0, 135, 810, 1, 0, 0, 0, 137, 813, 1, 0, 0, 0, 139, 816, 1, 0, 0, 0, 141, 819, 1, 0, 0, 0, 143, 821, 1, 0, 0, 0, 145, 824, 1, 0, 0, 0, 147, 826, 1, 0, 0, 0, 149, 829, 1, 0, 0, 0, 151, 831, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 835, 1, 0, 0, 0, 157, 837, 1, 0, 0, 0, 159, 839, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 865, 1, 0, 0, 0, 165, 870, 1, 0, 0, 0, 167, 891, 1, 0, 0, 0, 169, 893, 1, 0, 0, 0, 171, 901, 1, 0, 0, 0, 173, 903, 1, 0, 0, 0, 175, 907, 1, 0, 0, 0, 177, 911, 1, 0, 0, 0, 179, 915, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 925, 1, 0, 0, 0, 185, 929, 1, 0, 0, 0, 187, 933, 1, 0, 0, 0, 189, 937, 1, 0, 0, 0, 191, 942, 1, 0, 0, 0, 193, 946, 1, 0, 0, 0, 195, 950, 1, 0, 0, 0, 197, 954, 1, 0, 0, 0, 199, 958, 1, 0, 0, 0, 201, 962, 1, 0, 0, 0, 203, 974, 1, 0, 0, 0, 205, 977, 1, 0, 0, 0, 207, 981, 1, 0, 0, 0, 209, 985, 1, 0, 0, 0, 211, 989, 1, 0, 0, 0, 213, 993, 1, 0, 0, 0, 215, 997, 1, 0, 0, 0, 217, 1001, 1, 0, 0, 0, 219, 1006, 1, 0, 0, 0, 221, 1010, 1, 0, 0, 0, 223, 1018, 1, 0, 0, 0, 225, 1039, 1, 0, 0, 0, 227, 1043, 1, 0, 0, 0, 229, 1047, 1, 0, 0, 0, 231, 1051, 1, 0, 0, 0, 233, 1055, 1, 0, 0, 0, 235, 1059, 1, 0, 0, 0, 237, 1064, 1, 0, 0, 0, 239, 1068, 1, 0, 0, 0, 241, 1072, 1, 0, 0, 0, 243, 1076, 1, 0, 0, 0, 245, 1079, 1, 0, 0, 0, 247, 1083, 1, 0, 0, 0, 249, 1087, 1, 0, 0, 0, 251, 1091, 1, 0, 0, 0, 253, 1095, 1, 0, 0, 0, 255, 1100, 1, 0, 0, 0, 257, 1105, 1, 0, 0, 0, 259, 1110, 1, 0, 0, 0, 261, 1117, 1, 0, 0, 0, 263, 1126, 1, 0, 0, 0, 265, 1133, 1, 0, 0, 0, 267, 1137, 1, 0, 0, 0, 269, 1141, 1, 0, 0, 0, 271, 1145, 1, 0, 0, 0, 273, 1149, 1, 0, 0, 0, 275, 1155, 1, 0, 0, 0, 277, 1159, 1, 0, 0, 0, 279, 1163, 1, 0, 0, 0, 281, 1167, 1, 0, 0, 0, 283, 1171, 1, 0, 0, 0, 285, 1175, 1, 0, 0, 0, 287, 1179, 1, 0, 0, 0, 289, 1183, 1, 0, 0, 0, 291, 1187, 1, 0, 0, 0, 293, 1191, 1, 0, 0, 0, 295, 1196, 1, 0, 0, 0, 297, 1200, 1, 0, 0, 0, 299, 1204, 1, 0, 0, 0, 301, 1208, 1, 0, 0, 0, 303, 1212, 1, 0, 0, 0, 305, 1216, 1, 0, 0, 0, 307, 1220, 1, 0, 0, 0, 309, 1225, 1, 0, 0, 0, 311, 1230, 1, 0, 0, 0, 313, 1234, 1, 0, 0, 0, 315, 1238, 1, 0, 0, 0, 317, 1242, 1, 0, 0, 0, 319, 1247, 1, 0, 0, 0, 321, 1254, 1, 0, 0, 0, 323, 1258, 1, 0, 0, 0, 325, 1262, 1, 0, 0, 0, 327, 1266, 1, 0, 0, 0, 329, 1270, 1, 0, 0, 0, 331, 1275, 1, 0, 0, 0, 333, 1279, 1, 0, 0, 0, 335, 1283, 1, 0, 0, 0, 337, 1287, 1, 0, 0, 0, 339, 1292, 1, 0, 0, 0, 341, 1296, 1, 0, 0, 0, 343, 1300, 1, 0, 0, 0, 345, 1304, 1, 0, 0, 0, 347, 1308, 1, 0, 0, 0, 349, 1312, 1, 0, 0, 0, 351, 1318, 1, 0, 0, 0, 353, 1322, 1, 0, 0, 0, 355, 1326, 1, 0, 0, 0, 357, 1330, 1, 0, 0, 0, 359, 1334, 1, 0, 0, 0, 361, 1338, 1, 0, 0, 0, 363, 1342, 1, 0, 0, 0, 365, 1347, 1, 0, 0, 0, 367, 1353, 1, 0, 0, 0, 369, 1359, 1, 0, 0, 0, 371, 1363, 1, 0, 0, 0, 373, 1367, 1, 0, 0, 0, 375, 1371, 1, 0, 0, 0, 377, 1377, 1, 0, 0, 0, 379, 1383, 1, 0, 0, 0, 381, 1387, 1, 0, 0, 0, 383, 1391, 1, 0, 0, 0, 385, 1395, 1, 0, 0, 0, 387, 1401, 1, 0, 0, 0, 389, 1407, 1, 0, 0, 0, 391, 1413, 1, 0, 0, 0, 393, 394, 7, 0, 0, 0, 394, 395, 7, 1, 0, 0, 395, 396, 7, 2, 0, 0, 396, 397, 7, 2, 0, 0, 397, 398, 7, 3, 0, 0, 398, 399, 7, 4, 0, 0, 399, 400, 7, 5, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 6, 0, 0, 0, 402, 16, 1, 0, 0, 0, 403, 404, 7, 0, 0, 0, 404, 405, 7, 6, 0, 0, 405, 406, 7, 7, 0, 0, 406, 407, 7, 8, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 1, 1, 0, 409, 18, 1, 0, 0, 0, 410, 411, 7, 3, 0, 0, 411, 412, 7, 9, 0, 0, 412, 413, 7, 6, 0, 0, 413, 414, 7, 1, 0, 0, 414, 415, 7, 4, 0, 0, 415, 416, 7, 10, 0, 0, 416, 417, 1, 0, 0, 0, 417, 418, 6, 2, 2, 0, 418, 20, 1, 0, 0, 0, 419, 420, 7, 3, 0, 0, 420, 421, 7, 11, 0, 0, 421, 422, 7, 12, 0, 0, 422, 423, 7, 13, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 6, 3, 0, 0, 425, 22, 1, 0, 0, 0, 426, 427, 7, 3, 0, 0, 427, 428, 7, 14, 0, 0, 428, 429, 7, 8, 0, 0, 429, 430, 7, 13, 0, 0, 430, 431, 7, 12, 0, 0, 431, 432, 7, 1, 0, 0, 432, 433, 7, 9, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 6, 4, 3, 0, 435, 24, 1, 0, 0, 0, 436, 437, 7, 15, 0, 0, 437, 438, 7, 6, 0, 0, 438, 439, 7, 7, 0, 0, 439, 440, 7, 16, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 6, 5, 4, 0, 442, 26, 1, 0, 0, 0, 443, 444, 7, 17, 0, 0, 444, 445, 7, 6, 0, 0, 445, 446, 7, 7, 0, 0, 446, 447, 7, 18, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 6, 6, 0, 0, 449, 28, 1, 0, 0, 0, 450, 451, 7, 18, 0, 0, 451, 452, 7, 3, 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 8, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 6, 7, 1, 0, 456, 30, 1, 0, 0, 0, 457, 458, 7, 13, 0, 0, 458, 459, 7, 1, 0, 0, 459, 460, 7, 16, 0, 0, 460, 461, 7, 1, 0, 0, 461, 462, 7, 5, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 8, 0, 0, 464, 32, 1, 0, 0, 0, 465, 466, 7, 16, 0, 0, 466, 467, 7, 11, 0, 0, 467, 468, 5, 95, 0, 0, 468, 469, 7, 3, 0, 0, 469, 470, 7, 14, 0, 0, 470, 471, 7, 8, 0, 0, 471, 472, 7, 12, 0, 0, 472, 473, 7, 9, 0, 0, 473, 474, 7, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 6, 9, 5, 0, 476, 34, 1, 0, 0, 0, 477, 478, 7, 6, 0, 0, 478, 479, 7, 3, 0, 0, 479, 480, 7, 9, 0, 0, 480, 481, 7, 12, 0, 0, 481, 482, 7, 16, 0, 0, 482, 483, 7, 3, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 6, 10, 6, 0, 485, 36, 1, 0, 0, 0, 486, 487, 7, 6, 0, 0, 487, 488, 7, 7, 0, 0, 488, 489, 7, 19, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 6, 11, 0, 0, 491, 38, 1, 0, 0, 0, 492, 493, 7, 2, 0, 0, 493, 494, 7, 10, 0, 0, 494, 495, 7, 7, 0, 0, 495, 496, 7, 19, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 12, 7, 0, 498, 40, 1, 0, 0, 0, 499, 500, 7, 2, 0, 0, 500, 501, 7, 7, 0, 0, 501, 502, 7, 6, 0, 0, 502, 503, 7, 5, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 6, 13, 0, 0, 505, 42, 1, 0, 0, 0, 506, 507, 7, 2, 0, 0, 507, 508, 7, 5, 0, 0, 508, 509, 7, 12, 0, 0, 509, 510, 7, 5, 0, 0, 510, 511, 7, 2, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 6, 14, 0, 0, 513, 44, 1, 0, 0, 0, 514, 515, 7, 19, 0, 0, 515, 516, 7, 10, 0, 0, 516, 517, 7, 3, 0, 0, 517, 518, 7, 6, 0, 0, 518, 519, 7, 3, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 15, 0, 0, 521, 46, 1, 0, 0, 0, 522, 523, 4, 16, 0, 0, 523, 524, 7, 1, 0, 0, 524, 525, 7, 9, 0, 0, 525, 526, 7, 13, 0, 0, 526, 527, 7, 1, 0, 0, 527, 528, 7, 9, 0, 0, 528, 529, 7, 3, 0, 0, 529, 530, 7, 2, 0, 0, 530, 531, 7, 5, 0, 0, 531, 532, 7, 12, 0, 0, 532, 533, 7, 5, 0, 0, 533, 534, 7, 2, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 6, 16, 0, 0, 536, 48, 1, 0, 0, 0, 537, 538, 4, 17, 1, 0, 538, 539, 7, 13, 0, 0, 539, 540, 7, 7, 0, 0, 540, 541, 7, 7, 0, 0, 541, 542, 7, 18, 0, 0, 542, 543, 7, 20, 0, 0, 543, 544, 7, 8, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 6, 17, 8, 0, 546, 50, 1, 0, 0, 0, 547, 548, 4, 18, 2, 0, 548, 549, 7, 16, 0, 0, 549, 550, 7, 3, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 6, 0, 0, 552, 553, 7, 1, 0, 0, 553, 554, 7, 4, 0, 0, 554, 555, 7, 2, 0, 0, 555, 556, 1, 0, 0, 0, 556, 557, 6, 18, 9, 0, 557, 52, 1, 0, 0, 0, 558, 560, 8, 21, 0, 0, 559, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 562, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 19, 0, 0, 564, 54, 1, 0, 0, 0, 565, 566, 5, 47, 0, 0, 566, 567, 5, 47, 0, 0, 567, 571, 1, 0, 0, 0, 568, 570, 8, 22, 0, 0, 569, 568, 1, 0, 0, 0, 570, 573, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 575, 1, 0, 0, 0, 573, 571, 1, 0, 0, 0, 574, 576, 5, 13, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 578, 1, 0, 0, 0, 577, 579, 5, 10, 0, 0, 578, 577, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 6, 20, 10, 0, 581, 56, 1, 0, 0, 0, 582, 583, 5, 47, 0, 0, 583, 584, 5, 42, 0, 0, 584, 589, 1, 0, 0, 0, 585, 588, 3, 57, 21, 0, 586, 588, 9, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 586, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 592, 593, 5, 42, 0, 0, 593, 594, 5, 47, 0, 0, 594, 595, 1, 0, 0, 0, 595, 596, 6, 21, 10, 0, 596, 58, 1, 0, 0, 0, 597, 599, 7, 23, 0, 0, 598, 597, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 598, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 6, 22, 10, 0, 603, 60, 1, 0, 0, 0, 604, 605, 5, 124, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 6, 23, 11, 0, 607, 62, 1, 0, 0, 0, 608, 609, 7, 24, 0, 0, 609, 64, 1, 0, 0, 0, 610, 611, 7, 25, 0, 0, 611, 66, 1, 0, 0, 0, 612, 613, 5, 92, 0, 0, 613, 614, 7, 26, 0, 0, 614, 68, 1, 0, 0, 0, 615, 616, 8, 27, 0, 0, 616, 70, 1, 0, 0, 0, 617, 619, 7, 3, 0, 0, 618, 620, 7, 28, 0, 0, 619, 618, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 622, 1, 0, 0, 0, 621, 623, 3, 63, 24, 0, 622, 621, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 72, 1, 0, 0, 0, 626, 627, 5, 64, 0, 0, 627, 74, 1, 0, 0, 0, 628, 629, 5, 96, 0, 0, 629, 76, 1, 0, 0, 0, 630, 634, 8, 29, 0, 0, 631, 632, 5, 96, 0, 0, 632, 634, 5, 96, 0, 0, 633, 630, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 634, 78, 1, 0, 0, 0, 635, 636, 5, 95, 0, 0, 636, 80, 1, 0, 0, 0, 637, 641, 3, 65, 25, 0, 638, 641, 3, 63, 24, 0, 639, 641, 3, 79, 32, 0, 640, 637, 1, 0, 0, 0, 640, 638, 1, 0, 0, 0, 640, 639, 1, 0, 0, 0, 641, 82, 1, 0, 0, 0, 642, 647, 5, 34, 0, 0, 643, 646, 3, 67, 26, 0, 644, 646, 3, 69, 27, 0, 645, 643, 1, 0, 0, 0, 645, 644, 1, 0, 0, 0, 646, 649, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 672, 5, 34, 0, 0, 651, 652, 5, 34, 0, 0, 652, 653, 5, 34, 0, 0, 653, 654, 5, 34, 0, 0, 654, 658, 1, 0, 0, 0, 655, 657, 8, 22, 0, 0, 656, 655, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 662, 5, 34, 0, 0, 662, 663, 5, 34, 0, 0, 663, 664, 5, 34, 0, 0, 664, 666, 1, 0, 0, 0, 665, 667, 5, 34, 0, 0, 666, 665, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 670, 5, 34, 0, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 642, 1, 0, 0, 0, 671, 651, 1, 0, 0, 0, 672, 84, 1, 0, 0, 0, 673, 675, 3, 63, 24, 0, 674, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 674, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 86, 1, 0, 0, 0, 678, 680, 3, 63, 24, 0, 679, 678, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 687, 3, 103, 44, 0, 684, 686, 3, 63, 24, 0, 685, 684, 1, 0, 0, 0, 686, 689, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 721, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 690, 692, 3, 103, 44, 0, 691, 693, 3, 63, 24, 0, 692, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 721, 1, 0, 0, 0, 696, 698, 3, 63, 24, 0, 697, 696, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 708, 1, 0, 0, 0, 701, 705, 3, 103, 44, 0, 702, 704, 3, 63, 24, 0, 703, 702, 1, 0, 0, 0, 704, 707, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 701, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 3, 71, 28, 0, 711, 721, 1, 0, 0, 0, 712, 714, 3, 103, 44, 0, 713, 715, 3, 63, 24, 0, 714, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 718, 1, 0, 0, 0, 718, 719, 3, 71, 28, 0, 719, 721, 1, 0, 0, 0, 720, 679, 1, 0, 0, 0, 720, 690, 1, 0, 0, 0, 720, 697, 1, 0, 0, 0, 720, 712, 1, 0, 0, 0, 721, 88, 1, 0, 0, 0, 722, 723, 7, 30, 0, 0, 723, 724, 7, 31, 0, 0, 724, 90, 1, 0, 0, 0, 725, 726, 7, 12, 0, 0, 726, 727, 7, 9, 0, 0, 727, 728, 7, 0, 0, 0, 728, 92, 1, 0, 0, 0, 729, 730, 7, 12, 0, 0, 730, 731, 7, 2, 0, 0, 731, 732, 7, 4, 0, 0, 732, 94, 1, 0, 0, 0, 733, 734, 5, 61, 0, 0, 734, 96, 1, 0, 0, 0, 735, 736, 5, 58, 0, 0, 736, 737, 5, 58, 0, 0, 737, 98, 1, 0, 0, 0, 738, 739, 5, 44, 0, 0, 739, 100, 1, 0, 0, 0, 740, 741, 7, 0, 0, 0, 741, 742, 7, 3, 0, 0, 742, 743, 7, 2, 0, 0, 743, 744, 7, 4, 0, 0, 744, 102, 1, 0, 0, 0, 745, 746, 5, 46, 0, 0, 746, 104, 1, 0, 0, 0, 747, 748, 7, 15, 0, 0, 748, 749, 7, 12, 0, 0, 749, 750, 7, 13, 0, 0, 750, 751, 7, 2, 0, 0, 751, 752, 7, 3, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 7, 15, 0, 0, 754, 755, 7, 1, 0, 0, 755, 756, 7, 6, 0, 0, 756, 757, 7, 2, 0, 0, 757, 758, 7, 5, 0, 0, 758, 108, 1, 0, 0, 0, 759, 760, 7, 1, 0, 0, 760, 761, 7, 9, 0, 0, 761, 110, 1, 0, 0, 0, 762, 763, 7, 1, 0, 0, 763, 764, 7, 2, 0, 0, 764, 112, 1, 0, 0, 0, 765, 766, 7, 13, 0, 0, 766, 767, 7, 12, 0, 0, 767, 768, 7, 2, 0, 0, 768, 769, 7, 5, 0, 0, 769, 114, 1, 0, 0, 0, 770, 771, 7, 13, 0, 0, 771, 772, 7, 1, 0, 0, 772, 773, 7, 18, 0, 0, 773, 774, 7, 3, 0, 0, 774, 116, 1, 0, 0, 0, 775, 776, 5, 40, 0, 0, 776, 118, 1, 0, 0, 0, 777, 778, 7, 9, 0, 0, 778, 779, 7, 7, 0, 0, 779, 780, 7, 5, 0, 0, 780, 120, 1, 0, 0, 0, 781, 782, 7, 9, 0, 0, 782, 783, 7, 20, 0, 0, 783, 784, 7, 13, 0, 0, 784, 785, 7, 13, 0, 0, 785, 122, 1, 0, 0, 0, 786, 787, 7, 9, 0, 0, 787, 788, 7, 20, 0, 0, 788, 789, 7, 13, 0, 0, 789, 790, 7, 13, 0, 0, 790, 791, 7, 2, 0, 0, 791, 124, 1, 0, 0, 0, 792, 793, 7, 7, 0, 0, 793, 794, 7, 6, 0, 0, 794, 126, 1, 0, 0, 0, 795, 796, 5, 63, 0, 0, 796, 128, 1, 0, 0, 0, 797, 798, 7, 6, 0, 0, 798, 799, 7, 13, 0, 0, 799, 800, 7, 1, 0, 0, 800, 801, 7, 18, 0, 0, 801, 802, 7, 3, 0, 0, 802, 130, 1, 0, 0, 0, 803, 804, 5, 41, 0, 0, 804, 132, 1, 0, 0, 0, 805, 806, 7, 5, 0, 0, 806, 807, 7, 6, 0, 0, 807, 808, 7, 20, 0, 0, 808, 809, 7, 3, 0, 0, 809, 134, 1, 0, 0, 0, 810, 811, 5, 61, 0, 0, 811, 812, 5, 61, 0, 0, 812, 136, 1, 0, 0, 0, 813, 814, 5, 61, 0, 0, 814, 815, 5, 126, 0, 0, 815, 138, 1, 0, 0, 0, 816, 817, 5, 33, 0, 0, 817, 818, 5, 61, 0, 0, 818, 140, 1, 0, 0, 0, 819, 820, 5, 60, 0, 0, 820, 142, 1, 0, 0, 0, 821, 822, 5, 60, 0, 0, 822, 823, 5, 61, 0, 0, 823, 144, 1, 0, 0, 0, 824, 825, 5, 62, 0, 0, 825, 146, 1, 0, 0, 0, 826, 827, 5, 62, 0, 0, 827, 828, 5, 61, 0, 0, 828, 148, 1, 0, 0, 0, 829, 830, 5, 43, 0, 0, 830, 150, 1, 0, 0, 0, 831, 832, 5, 45, 0, 0, 832, 152, 1, 0, 0, 0, 833, 834, 5, 42, 0, 0, 834, 154, 1, 0, 0, 0, 835, 836, 5, 47, 0, 0, 836, 156, 1, 0, 0, 0, 837, 838, 5, 37, 0, 0, 838, 158, 1, 0, 0, 0, 839, 840, 4, 72, 3, 0, 840, 841, 7, 16, 0, 0, 841, 842, 7, 12, 0, 0, 842, 843, 7, 5, 0, 0, 843, 844, 7, 4, 0, 0, 844, 845, 7, 10, 0, 0, 845, 160, 1, 0, 0, 0, 846, 849, 3, 127, 56, 0, 847, 850, 3, 65, 25, 0, 848, 850, 3, 79, 32, 0, 849, 847, 1, 0, 0, 0, 849, 848, 1, 0, 0, 0, 850, 854, 1, 0, 0, 0, 851, 853, 3, 81, 33, 0, 852, 851, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 864, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 857, 859, 3, 127, 56, 0, 858, 860, 3, 63, 24, 0, 859, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 846, 1, 0, 0, 0, 863, 857, 1, 0, 0, 0, 864, 162, 1, 0, 0, 0, 865, 866, 5, 91, 0, 0, 866, 867, 1, 0, 0, 0, 867, 868, 6, 74, 0, 0, 868, 869, 6, 74, 0, 0, 869, 164, 1, 0, 0, 0, 870, 871, 5, 93, 0, 0, 871, 872, 1, 0, 0, 0, 872, 873, 6, 75, 11, 0, 873, 874, 6, 75, 11, 0, 874, 166, 1, 0, 0, 0, 875, 879, 3, 65, 25, 0, 876, 878, 3, 81, 33, 0, 877, 876, 1, 0, 0, 0, 878, 881, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 892, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 882, 885, 3, 79, 32, 0, 883, 885, 3, 73, 29, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 885, 887, 1, 0, 0, 0, 886, 888, 3, 81, 33, 0, 887, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 875, 1, 0, 0, 0, 891, 884, 1, 0, 0, 0, 892, 168, 1, 0, 0, 0, 893, 895, 3, 75, 30, 0, 894, 896, 3, 77, 31, 0, 895, 894, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 895, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 3, 75, 30, 0, 900, 170, 1, 0, 0, 0, 901, 902, 3, 169, 77, 0, 902, 172, 1, 0, 0, 0, 903, 904, 3, 55, 20, 0, 904, 905, 1, 0, 0, 0, 905, 906, 6, 79, 10, 0, 906, 174, 1, 0, 0, 0, 907, 908, 3, 57, 21, 0, 908, 909, 1, 0, 0, 0, 909, 910, 6, 80, 10, 0, 910, 176, 1, 0, 0, 0, 911, 912, 3, 59, 22, 0, 912, 913, 1, 0, 0, 0, 913, 914, 6, 81, 10, 0, 914, 178, 1, 0, 0, 0, 915, 916, 3, 163, 74, 0, 916, 917, 1, 0, 0, 0, 917, 918, 6, 82, 12, 0, 918, 919, 6, 82, 13, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 61, 23, 0, 921, 922, 1, 0, 0, 0, 922, 923, 6, 83, 14, 0, 923, 924, 6, 83, 11, 0, 924, 182, 1, 0, 0, 0, 925, 926, 3, 59, 22, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 84, 10, 0, 928, 184, 1, 0, 0, 0, 929, 930, 3, 55, 20, 0, 930, 931, 1, 0, 0, 0, 931, 932, 6, 85, 10, 0, 932, 186, 1, 0, 0, 0, 933, 934, 3, 57, 21, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 86, 10, 0, 936, 188, 1, 0, 0, 0, 937, 938, 3, 61, 23, 0, 938, 939, 1, 0, 0, 0, 939, 940, 6, 87, 14, 0, 940, 941, 6, 87, 11, 0, 941, 190, 1, 0, 0, 0, 942, 943, 3, 163, 74, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 88, 12, 0, 945, 192, 1, 0, 0, 0, 946, 947, 3, 165, 75, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 89, 15, 0, 949, 194, 1, 0, 0, 0, 950, 951, 3, 319, 152, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 90, 16, 0, 953, 196, 1, 0, 0, 0, 954, 955, 3, 99, 42, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 91, 17, 0, 957, 198, 1, 0, 0, 0, 958, 959, 3, 95, 40, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 92, 18, 0, 961, 200, 1, 0, 0, 0, 962, 963, 7, 16, 0, 0, 963, 964, 7, 3, 0, 0, 964, 965, 7, 5, 0, 0, 965, 966, 7, 12, 0, 0, 966, 967, 7, 0, 0, 0, 967, 968, 7, 12, 0, 0, 968, 969, 7, 5, 0, 0, 969, 970, 7, 12, 0, 0, 970, 202, 1, 0, 0, 0, 971, 975, 8, 32, 0, 0, 972, 973, 5, 47, 0, 0, 973, 975, 8, 33, 0, 0, 974, 971, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 204, 1, 0, 0, 0, 976, 978, 3, 203, 94, 0, 977, 976, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 977, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 206, 1, 0, 0, 0, 981, 982, 3, 205, 95, 0, 982, 983, 1, 0, 0, 0, 983, 984, 6, 96, 19, 0, 984, 208, 1, 0, 0, 0, 985, 986, 3, 83, 34, 0, 986, 987, 1, 0, 0, 0, 987, 988, 6, 97, 20, 0, 988, 210, 1, 0, 0, 0, 989, 990, 3, 55, 20, 0, 990, 991, 1, 0, 0, 0, 991, 992, 6, 98, 10, 0, 992, 212, 1, 0, 0, 0, 993, 994, 3, 57, 21, 0, 994, 995, 1, 0, 0, 0, 995, 996, 6, 99, 10, 0, 996, 214, 1, 0, 0, 0, 997, 998, 3, 59, 22, 0, 998, 999, 1, 0, 0, 0, 999, 1000, 6, 100, 10, 0, 1000, 216, 1, 0, 0, 0, 1001, 1002, 3, 61, 23, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 101, 14, 0, 1004, 1005, 6, 101, 11, 0, 1005, 218, 1, 0, 0, 0, 1006, 1007, 3, 103, 44, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 102, 21, 0, 1009, 220, 1, 0, 0, 0, 1010, 1011, 3, 99, 42, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 103, 17, 0, 1013, 222, 1, 0, 0, 0, 1014, 1019, 3, 65, 25, 0, 1015, 1019, 3, 63, 24, 0, 1016, 1019, 3, 79, 32, 0, 1017, 1019, 3, 153, 69, 0, 1018, 1014, 1, 0, 0, 0, 1018, 1015, 1, 0, 0, 0, 1018, 1016, 1, 0, 0, 0, 1018, 1017, 1, 0, 0, 0, 1019, 224, 1, 0, 0, 0, 1020, 1023, 3, 65, 25, 0, 1021, 1023, 3, 153, 69, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1021, 1, 0, 0, 0, 1023, 1027, 1, 0, 0, 0, 1024, 1026, 3, 223, 104, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1040, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1033, 3, 79, 32, 0, 1031, 1033, 3, 73, 29, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1031, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1036, 3, 223, 104, 0, 1035, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1040, 1, 0, 0, 0, 1039, 1022, 1, 0, 0, 0, 1039, 1032, 1, 0, 0, 0, 1040, 226, 1, 0, 0, 0, 1041, 1044, 3, 225, 105, 0, 1042, 1044, 3, 169, 77, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 228, 1, 0, 0, 0, 1047, 1048, 3, 55, 20, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1050, 6, 107, 10, 0, 1050, 230, 1, 0, 0, 0, 1051, 1052, 3, 57, 21, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1054, 6, 108, 10, 0, 1054, 232, 1, 0, 0, 0, 1055, 1056, 3, 59, 22, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1058, 6, 109, 10, 0, 1058, 234, 1, 0, 0, 0, 1059, 1060, 3, 61, 23, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1062, 6, 110, 14, 0, 1062, 1063, 6, 110, 11, 0, 1063, 236, 1, 0, 0, 0, 1064, 1065, 3, 95, 40, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 111, 18, 0, 1067, 238, 1, 0, 0, 0, 1068, 1069, 3, 99, 42, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 112, 17, 0, 1071, 240, 1, 0, 0, 0, 1072, 1073, 3, 103, 44, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 113, 21, 0, 1075, 242, 1, 0, 0, 0, 1076, 1077, 7, 12, 0, 0, 1077, 1078, 7, 2, 0, 0, 1078, 244, 1, 0, 0, 0, 1079, 1080, 3, 227, 106, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 115, 22, 0, 1082, 246, 1, 0, 0, 0, 1083, 1084, 3, 55, 20, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 116, 10, 0, 1086, 248, 1, 0, 0, 0, 1087, 1088, 3, 57, 21, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 117, 10, 0, 1090, 250, 1, 0, 0, 0, 1091, 1092, 3, 59, 22, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 6, 118, 10, 0, 1094, 252, 1, 0, 0, 0, 1095, 1096, 3, 61, 23, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 6, 119, 14, 0, 1098, 1099, 6, 119, 11, 0, 1099, 254, 1, 0, 0, 0, 1100, 1101, 3, 163, 74, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 120, 12, 0, 1103, 1104, 6, 120, 23, 0, 1104, 256, 1, 0, 0, 0, 1105, 1106, 7, 7, 0, 0, 1106, 1107, 7, 9, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 121, 24, 0, 1109, 258, 1, 0, 0, 0, 1110, 1111, 7, 19, 0, 0, 1111, 1112, 7, 1, 0, 0, 1112, 1113, 7, 5, 0, 0, 1113, 1114, 7, 10, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 6, 122, 24, 0, 1116, 260, 1, 0, 0, 0, 1117, 1118, 8, 34, 0, 0, 1118, 262, 1, 0, 0, 0, 1119, 1121, 3, 261, 123, 0, 1120, 1119, 1, 0, 0, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1122, 1123, 1, 0, 0, 0, 1123, 1124, 1, 0, 0, 0, 1124, 1125, 3, 319, 152, 0, 1125, 1127, 1, 0, 0, 0, 1126, 1120, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1129, 1, 0, 0, 0, 1128, 1130, 3, 261, 123, 0, 1129, 1128, 1, 0, 0, 0, 1130, 1131, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 264, 1, 0, 0, 0, 1133, 1134, 3, 263, 124, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 6, 125, 25, 0, 1136, 266, 1, 0, 0, 0, 1137, 1138, 3, 55, 20, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1140, 6, 126, 10, 0, 1140, 268, 1, 0, 0, 0, 1141, 1142, 3, 57, 21, 0, 1142, 1143, 1, 0, 0, 0, 1143, 1144, 6, 127, 10, 0, 1144, 270, 1, 0, 0, 0, 1145, 1146, 3, 59, 22, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 128, 10, 0, 1148, 272, 1, 0, 0, 0, 1149, 1150, 3, 61, 23, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1152, 6, 129, 14, 0, 1152, 1153, 6, 129, 11, 0, 1153, 1154, 6, 129, 11, 0, 1154, 274, 1, 0, 0, 0, 1155, 1156, 3, 95, 40, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1158, 6, 130, 18, 0, 1158, 276, 1, 0, 0, 0, 1159, 1160, 3, 99, 42, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 131, 17, 0, 1162, 278, 1, 0, 0, 0, 1163, 1164, 3, 103, 44, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 6, 132, 21, 0, 1166, 280, 1, 0, 0, 0, 1167, 1168, 3, 259, 122, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 6, 133, 26, 0, 1170, 282, 1, 0, 0, 0, 1171, 1172, 3, 227, 106, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 6, 134, 22, 0, 1174, 284, 1, 0, 0, 0, 1175, 1176, 3, 171, 78, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 6, 135, 27, 0, 1178, 286, 1, 0, 0, 0, 1179, 1180, 3, 55, 20, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1182, 6, 136, 10, 0, 1182, 288, 1, 0, 0, 0, 1183, 1184, 3, 57, 21, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 6, 137, 10, 0, 1186, 290, 1, 0, 0, 0, 1187, 1188, 3, 59, 22, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 138, 10, 0, 1190, 292, 1, 0, 0, 0, 1191, 1192, 3, 61, 23, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 139, 14, 0, 1194, 1195, 6, 139, 11, 0, 1195, 294, 1, 0, 0, 0, 1196, 1197, 3, 103, 44, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 140, 21, 0, 1199, 296, 1, 0, 0, 0, 1200, 1201, 3, 171, 78, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 6, 141, 27, 0, 1203, 298, 1, 0, 0, 0, 1204, 1205, 3, 167, 76, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 6, 142, 28, 0, 1207, 300, 1, 0, 0, 0, 1208, 1209, 3, 55, 20, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 6, 143, 10, 0, 1211, 302, 1, 0, 0, 0, 1212, 1213, 3, 57, 21, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 6, 144, 10, 0, 1215, 304, 1, 0, 0, 0, 1216, 1217, 3, 59, 22, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 6, 145, 10, 0, 1219, 306, 1, 0, 0, 0, 1220, 1221, 3, 61, 23, 0, 1221, 1222, 1, 0, 0, 0, 1222, 1223, 6, 146, 14, 0, 1223, 1224, 6, 146, 11, 0, 1224, 308, 1, 0, 0, 0, 1225, 1226, 7, 1, 0, 0, 1226, 1227, 7, 9, 0, 0, 1227, 1228, 7, 15, 0, 0, 1228, 1229, 7, 7, 0, 0, 1229, 310, 1, 0, 0, 0, 1230, 1231, 3, 55, 20, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 148, 10, 0, 1233, 312, 1, 0, 0, 0, 1234, 1235, 3, 57, 21, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 149, 10, 0, 1237, 314, 1, 0, 0, 0, 1238, 1239, 3, 59, 22, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 150, 10, 0, 1241, 316, 1, 0, 0, 0, 1242, 1243, 3, 165, 75, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1245, 6, 151, 15, 0, 1245, 1246, 6, 151, 11, 0, 1246, 318, 1, 0, 0, 0, 1247, 1248, 5, 58, 0, 0, 1248, 320, 1, 0, 0, 0, 1249, 1255, 3, 73, 29, 0, 1250, 1255, 3, 63, 24, 0, 1251, 1255, 3, 103, 44, 0, 1252, 1255, 3, 65, 25, 0, 1253, 1255, 3, 79, 32, 0, 1254, 1249, 1, 0, 0, 0, 1254, 1250, 1, 0, 0, 0, 1254, 1251, 1, 0, 0, 0, 1254, 1252, 1, 0, 0, 0, 1254, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 322, 1, 0, 0, 0, 1258, 1259, 3, 55, 20, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 6, 154, 10, 0, 1261, 324, 1, 0, 0, 0, 1262, 1263, 3, 57, 21, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 6, 155, 10, 0, 1265, 326, 1, 0, 0, 0, 1266, 1267, 3, 59, 22, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 6, 156, 10, 0, 1269, 328, 1, 0, 0, 0, 1270, 1271, 3, 61, 23, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1273, 6, 157, 14, 0, 1273, 1274, 6, 157, 11, 0, 1274, 330, 1, 0, 0, 0, 1275, 1276, 3, 319, 152, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 6, 158, 16, 0, 1278, 332, 1, 0, 0, 0, 1279, 1280, 3, 99, 42, 0, 1280, 1281, 1, 0, 0, 0, 1281, 1282, 6, 159, 17, 0, 1282, 334, 1, 0, 0, 0, 1283, 1284, 3, 103, 44, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 6, 160, 21, 0, 1286, 336, 1, 0, 0, 0, 1287, 1288, 3, 257, 121, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 6, 161, 29, 0, 1290, 1291, 6, 161, 30, 0, 1291, 338, 1, 0, 0, 0, 1292, 1293, 3, 205, 95, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 6, 162, 19, 0, 1295, 340, 1, 0, 0, 0, 1296, 1297, 3, 83, 34, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 6, 163, 20, 0, 1299, 342, 1, 0, 0, 0, 1300, 1301, 3, 55, 20, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 6, 164, 10, 0, 1303, 344, 1, 0, 0, 0, 1304, 1305, 3, 57, 21, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 6, 165, 10, 0, 1307, 346, 1, 0, 0, 0, 1308, 1309, 3, 59, 22, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 6, 166, 10, 0, 1311, 348, 1, 0, 0, 0, 1312, 1313, 3, 61, 23, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 167, 14, 0, 1315, 1316, 6, 167, 11, 0, 1316, 1317, 6, 167, 11, 0, 1317, 350, 1, 0, 0, 0, 1318, 1319, 3, 99, 42, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 168, 17, 0, 1321, 352, 1, 0, 0, 0, 1322, 1323, 3, 103, 44, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 169, 21, 0, 1325, 354, 1, 0, 0, 0, 1326, 1327, 3, 227, 106, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 170, 22, 0, 1329, 356, 1, 0, 0, 0, 1330, 1331, 3, 55, 20, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1333, 6, 171, 10, 0, 1333, 358, 1, 0, 0, 0, 1334, 1335, 3, 57, 21, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 172, 10, 0, 1337, 360, 1, 0, 0, 0, 1338, 1339, 3, 59, 22, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 173, 10, 0, 1341, 362, 1, 0, 0, 0, 1342, 1343, 3, 61, 23, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 174, 14, 0, 1345, 1346, 6, 174, 11, 0, 1346, 364, 1, 0, 0, 0, 1347, 1348, 3, 205, 95, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1350, 6, 175, 19, 0, 1350, 1351, 6, 175, 11, 0, 1351, 1352, 6, 175, 31, 0, 1352, 366, 1, 0, 0, 0, 1353, 1354, 3, 83, 34, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 176, 20, 0, 1356, 1357, 6, 176, 11, 0, 1357, 1358, 6, 176, 31, 0, 1358, 368, 1, 0, 0, 0, 1359, 1360, 3, 55, 20, 0, 1360, 1361, 1, 0, 0, 0, 1361, 1362, 6, 177, 10, 0, 1362, 370, 1, 0, 0, 0, 1363, 1364, 3, 57, 21, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 178, 10, 0, 1366, 372, 1, 0, 0, 0, 1367, 1368, 3, 59, 22, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 6, 179, 10, 0, 1370, 374, 1, 0, 0, 0, 1371, 1372, 3, 319, 152, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1374, 6, 180, 16, 0, 1374, 1375, 6, 180, 11, 0, 1375, 1376, 6, 180, 9, 0, 1376, 376, 1, 0, 0, 0, 1377, 1378, 3, 99, 42, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 181, 17, 0, 1380, 1381, 6, 181, 11, 0, 1381, 1382, 6, 181, 9, 0, 1382, 378, 1, 0, 0, 0, 1383, 1384, 3, 55, 20, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 6, 182, 10, 0, 1386, 380, 1, 0, 0, 0, 1387, 1388, 3, 57, 21, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 183, 10, 0, 1390, 382, 1, 0, 0, 0, 1391, 1392, 3, 59, 22, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 184, 10, 0, 1394, 384, 1, 0, 0, 0, 1395, 1396, 3, 171, 78, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 185, 11, 0, 1398, 1399, 6, 185, 0, 0, 1399, 1400, 6, 185, 27, 0, 1400, 386, 1, 0, 0, 0, 1401, 1402, 3, 167, 76, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 6, 186, 11, 0, 1404, 1405, 6, 186, 0, 0, 1405, 1406, 6, 186, 28, 0, 1406, 388, 1, 0, 0, 0, 1407, 1408, 3, 89, 37, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 187, 11, 0, 1410, 1411, 6, 187, 0, 0, 1411, 1412, 6, 187, 32, 0, 1412, 390, 1, 0, 0, 0, 1413, 1414, 3, 61, 23, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1416, 6, 188, 14, 0, 1416, 1417, 6, 188, 11, 0, 1417, 392, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 561, 571, 575, 578, 587, 589, 600, 619, 624, 633, 640, 645, 647, 658, 666, 669, 671, 676, 681, 687, 694, 699, 705, 708, 716, 720, 849, 854, 861, 863, 879, 884, 889, 891, 897, 974, 979, 1018, 1022, 1027, 1032, 1037, 1039, 1043, 1045, 1122, 1126, 1131, 1254, 1256, 33, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 65, 0, 5, 0, 0, 7, 24, 0, 7, 66, 0, 7, 104, 0, 7, 33, 0, 7, 31, 0, 7, 76, 0, 7, 25, 0, 7, 35, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 28, 0] \ No newline at end of file +[4, 0, 120, 1466, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 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, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 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, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 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, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 4, 19, 576, 8, 19, 11, 19, 12, 19, 577, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 586, 8, 20, 10, 20, 12, 20, 589, 9, 20, 1, 20, 3, 20, 592, 8, 20, 1, 20, 3, 20, 595, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 604, 8, 21, 10, 21, 12, 21, 607, 9, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 4, 22, 615, 8, 22, 11, 22, 12, 22, 616, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 3, 28, 636, 8, 28, 1, 28, 4, 28, 639, 8, 28, 11, 28, 12, 28, 640, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 650, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 657, 8, 33, 1, 34, 1, 34, 1, 34, 5, 34, 662, 8, 34, 10, 34, 12, 34, 665, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 673, 8, 34, 10, 34, 12, 34, 676, 9, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 683, 8, 34, 1, 34, 3, 34, 686, 8, 34, 3, 34, 688, 8, 34, 1, 35, 4, 35, 691, 8, 35, 11, 35, 12, 35, 692, 1, 36, 4, 36, 696, 8, 36, 11, 36, 12, 36, 697, 1, 36, 1, 36, 5, 36, 702, 8, 36, 10, 36, 12, 36, 705, 9, 36, 1, 36, 1, 36, 4, 36, 709, 8, 36, 11, 36, 12, 36, 710, 1, 36, 4, 36, 714, 8, 36, 11, 36, 12, 36, 715, 1, 36, 1, 36, 5, 36, 720, 8, 36, 10, 36, 12, 36, 723, 9, 36, 3, 36, 725, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 4, 36, 731, 8, 36, 11, 36, 12, 36, 732, 1, 36, 1, 36, 3, 36, 737, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 3, 73, 866, 8, 73, 1, 73, 5, 73, 869, 8, 73, 10, 73, 12, 73, 872, 9, 73, 1, 73, 1, 73, 4, 73, 876, 8, 73, 11, 73, 12, 73, 877, 3, 73, 880, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 5, 76, 894, 8, 76, 10, 76, 12, 76, 897, 9, 76, 1, 76, 1, 76, 3, 76, 901, 8, 76, 1, 76, 4, 76, 904, 8, 76, 11, 76, 12, 76, 905, 3, 76, 908, 8, 76, 1, 77, 1, 77, 4, 77, 912, 8, 77, 11, 77, 12, 77, 913, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 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, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 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, 94, 1, 94, 1, 94, 3, 94, 991, 8, 94, 1, 95, 4, 95, 994, 8, 95, 11, 95, 12, 95, 995, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1043, 8, 106, 1, 107, 1, 107, 3, 107, 1047, 8, 107, 1, 107, 5, 107, 1050, 8, 107, 10, 107, 12, 107, 1053, 9, 107, 1, 107, 1, 107, 3, 107, 1057, 8, 107, 1, 107, 4, 107, 1060, 8, 107, 11, 107, 12, 107, 1061, 3, 107, 1064, 8, 107, 1, 108, 1, 108, 4, 108, 1068, 8, 108, 11, 108, 12, 108, 1069, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 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, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 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, 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, 128, 4, 128, 1153, 8, 128, 11, 128, 12, 128, 1154, 1, 128, 1, 128, 3, 128, 1159, 8, 128, 1, 128, 4, 128, 1162, 8, 128, 11, 128, 12, 128, 1163, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 4, 161, 1303, 8, 161, 11, 161, 12, 161, 1304, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 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, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 194, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 195, 1, 196, 1, 196, 1, 196, 1, 196, 1, 196, 2, 605, 674, 0, 197, 15, 1, 17, 2, 19, 3, 21, 4, 23, 5, 25, 6, 27, 7, 29, 8, 31, 9, 33, 10, 35, 11, 37, 12, 39, 13, 41, 14, 43, 15, 45, 16, 47, 17, 49, 18, 51, 19, 53, 20, 55, 21, 57, 22, 59, 23, 61, 24, 63, 0, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 25, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 66, 167, 67, 169, 0, 171, 68, 173, 69, 175, 70, 177, 71, 179, 0, 181, 0, 183, 72, 185, 73, 187, 74, 189, 0, 191, 0, 193, 0, 195, 0, 197, 0, 199, 0, 201, 75, 203, 0, 205, 76, 207, 0, 209, 0, 211, 77, 213, 78, 215, 79, 217, 0, 219, 0, 221, 0, 223, 0, 225, 0, 227, 0, 229, 0, 231, 80, 233, 81, 235, 82, 237, 83, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 84, 253, 0, 255, 85, 257, 86, 259, 87, 261, 0, 263, 0, 265, 88, 267, 89, 269, 0, 271, 90, 273, 0, 275, 91, 277, 92, 279, 93, 281, 0, 283, 0, 285, 0, 287, 0, 289, 0, 291, 0, 293, 0, 295, 0, 297, 0, 299, 94, 301, 95, 303, 96, 305, 0, 307, 0, 309, 0, 311, 0, 313, 0, 315, 0, 317, 97, 319, 98, 321, 99, 323, 0, 325, 100, 327, 101, 329, 102, 331, 103, 333, 0, 335, 104, 337, 105, 339, 106, 341, 107, 343, 108, 345, 0, 347, 0, 349, 0, 351, 0, 353, 0, 355, 0, 357, 0, 359, 109, 361, 110, 363, 111, 365, 0, 367, 0, 369, 0, 371, 0, 373, 112, 375, 113, 377, 114, 379, 0, 381, 0, 383, 0, 385, 115, 387, 116, 389, 117, 391, 0, 393, 0, 395, 118, 397, 119, 399, 120, 401, 0, 403, 0, 405, 0, 407, 0, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 2, 0, 85, 85, 117, 117, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1494, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 1, 83, 1, 0, 0, 0, 1, 85, 1, 0, 0, 0, 1, 87, 1, 0, 0, 0, 1, 89, 1, 0, 0, 0, 1, 91, 1, 0, 0, 0, 1, 93, 1, 0, 0, 0, 1, 95, 1, 0, 0, 0, 1, 97, 1, 0, 0, 0, 1, 99, 1, 0, 0, 0, 1, 101, 1, 0, 0, 0, 1, 103, 1, 0, 0, 0, 1, 105, 1, 0, 0, 0, 1, 107, 1, 0, 0, 0, 1, 109, 1, 0, 0, 0, 1, 111, 1, 0, 0, 0, 1, 113, 1, 0, 0, 0, 1, 115, 1, 0, 0, 0, 1, 117, 1, 0, 0, 0, 1, 119, 1, 0, 0, 0, 1, 121, 1, 0, 0, 0, 1, 123, 1, 0, 0, 0, 1, 125, 1, 0, 0, 0, 1, 127, 1, 0, 0, 0, 1, 129, 1, 0, 0, 0, 1, 131, 1, 0, 0, 0, 1, 133, 1, 0, 0, 0, 1, 135, 1, 0, 0, 0, 1, 137, 1, 0, 0, 0, 1, 139, 1, 0, 0, 0, 1, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 1, 145, 1, 0, 0, 0, 1, 147, 1, 0, 0, 0, 1, 149, 1, 0, 0, 0, 1, 151, 1, 0, 0, 0, 1, 153, 1, 0, 0, 0, 1, 155, 1, 0, 0, 0, 1, 157, 1, 0, 0, 0, 1, 159, 1, 0, 0, 0, 1, 161, 1, 0, 0, 0, 1, 163, 1, 0, 0, 0, 1, 165, 1, 0, 0, 0, 1, 167, 1, 0, 0, 0, 1, 171, 1, 0, 0, 0, 1, 173, 1, 0, 0, 0, 1, 175, 1, 0, 0, 0, 1, 177, 1, 0, 0, 0, 2, 179, 1, 0, 0, 0, 2, 181, 1, 0, 0, 0, 2, 183, 1, 0, 0, 0, 2, 185, 1, 0, 0, 0, 2, 187, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 3, 199, 1, 0, 0, 0, 3, 201, 1, 0, 0, 0, 3, 205, 1, 0, 0, 0, 3, 207, 1, 0, 0, 0, 3, 209, 1, 0, 0, 0, 3, 211, 1, 0, 0, 0, 3, 213, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 4, 217, 1, 0, 0, 0, 4, 219, 1, 0, 0, 0, 4, 221, 1, 0, 0, 0, 4, 223, 1, 0, 0, 0, 4, 225, 1, 0, 0, 0, 4, 231, 1, 0, 0, 0, 4, 233, 1, 0, 0, 0, 4, 235, 1, 0, 0, 0, 4, 237, 1, 0, 0, 0, 5, 239, 1, 0, 0, 0, 5, 241, 1, 0, 0, 0, 5, 243, 1, 0, 0, 0, 5, 245, 1, 0, 0, 0, 5, 247, 1, 0, 0, 0, 5, 249, 1, 0, 0, 0, 5, 251, 1, 0, 0, 0, 5, 253, 1, 0, 0, 0, 5, 255, 1, 0, 0, 0, 5, 257, 1, 0, 0, 0, 5, 259, 1, 0, 0, 0, 6, 261, 1, 0, 0, 0, 6, 263, 1, 0, 0, 0, 6, 265, 1, 0, 0, 0, 6, 267, 1, 0, 0, 0, 6, 271, 1, 0, 0, 0, 6, 273, 1, 0, 0, 0, 6, 275, 1, 0, 0, 0, 6, 277, 1, 0, 0, 0, 6, 279, 1, 0, 0, 0, 7, 281, 1, 0, 0, 0, 7, 283, 1, 0, 0, 0, 7, 285, 1, 0, 0, 0, 7, 287, 1, 0, 0, 0, 7, 289, 1, 0, 0, 0, 7, 291, 1, 0, 0, 0, 7, 293, 1, 0, 0, 0, 7, 295, 1, 0, 0, 0, 7, 297, 1, 0, 0, 0, 7, 299, 1, 0, 0, 0, 7, 301, 1, 0, 0, 0, 7, 303, 1, 0, 0, 0, 8, 305, 1, 0, 0, 0, 8, 307, 1, 0, 0, 0, 8, 309, 1, 0, 0, 0, 8, 311, 1, 0, 0, 0, 8, 313, 1, 0, 0, 0, 8, 315, 1, 0, 0, 0, 8, 317, 1, 0, 0, 0, 8, 319, 1, 0, 0, 0, 8, 321, 1, 0, 0, 0, 9, 323, 1, 0, 0, 0, 9, 325, 1, 0, 0, 0, 9, 327, 1, 0, 0, 0, 9, 329, 1, 0, 0, 0, 9, 331, 1, 0, 0, 0, 10, 333, 1, 0, 0, 0, 10, 335, 1, 0, 0, 0, 10, 337, 1, 0, 0, 0, 10, 339, 1, 0, 0, 0, 10, 341, 1, 0, 0, 0, 10, 343, 1, 0, 0, 0, 11, 345, 1, 0, 0, 0, 11, 347, 1, 0, 0, 0, 11, 349, 1, 0, 0, 0, 11, 351, 1, 0, 0, 0, 11, 353, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 11, 357, 1, 0, 0, 0, 11, 359, 1, 0, 0, 0, 11, 361, 1, 0, 0, 0, 11, 363, 1, 0, 0, 0, 12, 365, 1, 0, 0, 0, 12, 367, 1, 0, 0, 0, 12, 369, 1, 0, 0, 0, 12, 371, 1, 0, 0, 0, 12, 373, 1, 0, 0, 0, 12, 375, 1, 0, 0, 0, 12, 377, 1, 0, 0, 0, 13, 379, 1, 0, 0, 0, 13, 381, 1, 0, 0, 0, 13, 383, 1, 0, 0, 0, 13, 385, 1, 0, 0, 0, 13, 387, 1, 0, 0, 0, 13, 389, 1, 0, 0, 0, 14, 391, 1, 0, 0, 0, 14, 393, 1, 0, 0, 0, 14, 395, 1, 0, 0, 0, 14, 397, 1, 0, 0, 0, 14, 399, 1, 0, 0, 0, 14, 401, 1, 0, 0, 0, 14, 403, 1, 0, 0, 0, 14, 405, 1, 0, 0, 0, 14, 407, 1, 0, 0, 0, 15, 409, 1, 0, 0, 0, 17, 419, 1, 0, 0, 0, 19, 426, 1, 0, 0, 0, 21, 435, 1, 0, 0, 0, 23, 442, 1, 0, 0, 0, 25, 452, 1, 0, 0, 0, 27, 459, 1, 0, 0, 0, 29, 466, 1, 0, 0, 0, 31, 473, 1, 0, 0, 0, 33, 481, 1, 0, 0, 0, 35, 493, 1, 0, 0, 0, 37, 502, 1, 0, 0, 0, 39, 508, 1, 0, 0, 0, 41, 515, 1, 0, 0, 0, 43, 522, 1, 0, 0, 0, 45, 530, 1, 0, 0, 0, 47, 538, 1, 0, 0, 0, 49, 553, 1, 0, 0, 0, 51, 563, 1, 0, 0, 0, 53, 575, 1, 0, 0, 0, 55, 581, 1, 0, 0, 0, 57, 598, 1, 0, 0, 0, 59, 614, 1, 0, 0, 0, 61, 620, 1, 0, 0, 0, 63, 624, 1, 0, 0, 0, 65, 626, 1, 0, 0, 0, 67, 628, 1, 0, 0, 0, 69, 631, 1, 0, 0, 0, 71, 633, 1, 0, 0, 0, 73, 642, 1, 0, 0, 0, 75, 644, 1, 0, 0, 0, 77, 649, 1, 0, 0, 0, 79, 651, 1, 0, 0, 0, 81, 656, 1, 0, 0, 0, 83, 687, 1, 0, 0, 0, 85, 690, 1, 0, 0, 0, 87, 736, 1, 0, 0, 0, 89, 738, 1, 0, 0, 0, 91, 741, 1, 0, 0, 0, 93, 745, 1, 0, 0, 0, 95, 749, 1, 0, 0, 0, 97, 751, 1, 0, 0, 0, 99, 754, 1, 0, 0, 0, 101, 756, 1, 0, 0, 0, 103, 761, 1, 0, 0, 0, 105, 763, 1, 0, 0, 0, 107, 769, 1, 0, 0, 0, 109, 775, 1, 0, 0, 0, 111, 778, 1, 0, 0, 0, 113, 781, 1, 0, 0, 0, 115, 786, 1, 0, 0, 0, 117, 791, 1, 0, 0, 0, 119, 793, 1, 0, 0, 0, 121, 797, 1, 0, 0, 0, 123, 802, 1, 0, 0, 0, 125, 808, 1, 0, 0, 0, 127, 811, 1, 0, 0, 0, 129, 813, 1, 0, 0, 0, 131, 819, 1, 0, 0, 0, 133, 821, 1, 0, 0, 0, 135, 826, 1, 0, 0, 0, 137, 829, 1, 0, 0, 0, 139, 832, 1, 0, 0, 0, 141, 835, 1, 0, 0, 0, 143, 837, 1, 0, 0, 0, 145, 840, 1, 0, 0, 0, 147, 842, 1, 0, 0, 0, 149, 845, 1, 0, 0, 0, 151, 847, 1, 0, 0, 0, 153, 849, 1, 0, 0, 0, 155, 851, 1, 0, 0, 0, 157, 853, 1, 0, 0, 0, 159, 855, 1, 0, 0, 0, 161, 879, 1, 0, 0, 0, 163, 881, 1, 0, 0, 0, 165, 886, 1, 0, 0, 0, 167, 907, 1, 0, 0, 0, 169, 909, 1, 0, 0, 0, 171, 917, 1, 0, 0, 0, 173, 919, 1, 0, 0, 0, 175, 923, 1, 0, 0, 0, 177, 927, 1, 0, 0, 0, 179, 931, 1, 0, 0, 0, 181, 936, 1, 0, 0, 0, 183, 941, 1, 0, 0, 0, 185, 945, 1, 0, 0, 0, 187, 949, 1, 0, 0, 0, 189, 953, 1, 0, 0, 0, 191, 958, 1, 0, 0, 0, 193, 962, 1, 0, 0, 0, 195, 966, 1, 0, 0, 0, 197, 970, 1, 0, 0, 0, 199, 974, 1, 0, 0, 0, 201, 978, 1, 0, 0, 0, 203, 990, 1, 0, 0, 0, 205, 993, 1, 0, 0, 0, 207, 997, 1, 0, 0, 0, 209, 1001, 1, 0, 0, 0, 211, 1005, 1, 0, 0, 0, 213, 1009, 1, 0, 0, 0, 215, 1013, 1, 0, 0, 0, 217, 1017, 1, 0, 0, 0, 219, 1022, 1, 0, 0, 0, 221, 1026, 1, 0, 0, 0, 223, 1030, 1, 0, 0, 0, 225, 1034, 1, 0, 0, 0, 227, 1042, 1, 0, 0, 0, 229, 1063, 1, 0, 0, 0, 231, 1067, 1, 0, 0, 0, 233, 1071, 1, 0, 0, 0, 235, 1075, 1, 0, 0, 0, 237, 1079, 1, 0, 0, 0, 239, 1083, 1, 0, 0, 0, 241, 1088, 1, 0, 0, 0, 243, 1092, 1, 0, 0, 0, 245, 1096, 1, 0, 0, 0, 247, 1100, 1, 0, 0, 0, 249, 1104, 1, 0, 0, 0, 251, 1108, 1, 0, 0, 0, 253, 1111, 1, 0, 0, 0, 255, 1115, 1, 0, 0, 0, 257, 1119, 1, 0, 0, 0, 259, 1123, 1, 0, 0, 0, 261, 1127, 1, 0, 0, 0, 263, 1132, 1, 0, 0, 0, 265, 1137, 1, 0, 0, 0, 267, 1142, 1, 0, 0, 0, 269, 1149, 1, 0, 0, 0, 271, 1158, 1, 0, 0, 0, 273, 1165, 1, 0, 0, 0, 275, 1169, 1, 0, 0, 0, 277, 1173, 1, 0, 0, 0, 279, 1177, 1, 0, 0, 0, 281, 1181, 1, 0, 0, 0, 283, 1187, 1, 0, 0, 0, 285, 1191, 1, 0, 0, 0, 287, 1195, 1, 0, 0, 0, 289, 1199, 1, 0, 0, 0, 291, 1203, 1, 0, 0, 0, 293, 1207, 1, 0, 0, 0, 295, 1211, 1, 0, 0, 0, 297, 1215, 1, 0, 0, 0, 299, 1219, 1, 0, 0, 0, 301, 1223, 1, 0, 0, 0, 303, 1227, 1, 0, 0, 0, 305, 1231, 1, 0, 0, 0, 307, 1236, 1, 0, 0, 0, 309, 1240, 1, 0, 0, 0, 311, 1244, 1, 0, 0, 0, 313, 1248, 1, 0, 0, 0, 315, 1252, 1, 0, 0, 0, 317, 1256, 1, 0, 0, 0, 319, 1260, 1, 0, 0, 0, 321, 1264, 1, 0, 0, 0, 323, 1268, 1, 0, 0, 0, 325, 1273, 1, 0, 0, 0, 327, 1278, 1, 0, 0, 0, 329, 1282, 1, 0, 0, 0, 331, 1286, 1, 0, 0, 0, 333, 1290, 1, 0, 0, 0, 335, 1295, 1, 0, 0, 0, 337, 1302, 1, 0, 0, 0, 339, 1306, 1, 0, 0, 0, 341, 1310, 1, 0, 0, 0, 343, 1314, 1, 0, 0, 0, 345, 1318, 1, 0, 0, 0, 347, 1323, 1, 0, 0, 0, 349, 1327, 1, 0, 0, 0, 351, 1331, 1, 0, 0, 0, 353, 1335, 1, 0, 0, 0, 355, 1340, 1, 0, 0, 0, 357, 1344, 1, 0, 0, 0, 359, 1348, 1, 0, 0, 0, 361, 1352, 1, 0, 0, 0, 363, 1356, 1, 0, 0, 0, 365, 1360, 1, 0, 0, 0, 367, 1366, 1, 0, 0, 0, 369, 1370, 1, 0, 0, 0, 371, 1374, 1, 0, 0, 0, 373, 1378, 1, 0, 0, 0, 375, 1382, 1, 0, 0, 0, 377, 1386, 1, 0, 0, 0, 379, 1390, 1, 0, 0, 0, 381, 1395, 1, 0, 0, 0, 383, 1401, 1, 0, 0, 0, 385, 1407, 1, 0, 0, 0, 387, 1411, 1, 0, 0, 0, 389, 1415, 1, 0, 0, 0, 391, 1419, 1, 0, 0, 0, 393, 1425, 1, 0, 0, 0, 395, 1431, 1, 0, 0, 0, 397, 1435, 1, 0, 0, 0, 399, 1439, 1, 0, 0, 0, 401, 1443, 1, 0, 0, 0, 403, 1449, 1, 0, 0, 0, 405, 1455, 1, 0, 0, 0, 407, 1461, 1, 0, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 7, 1, 0, 0, 411, 412, 7, 2, 0, 0, 412, 413, 7, 2, 0, 0, 413, 414, 7, 3, 0, 0, 414, 415, 7, 4, 0, 0, 415, 416, 7, 5, 0, 0, 416, 417, 1, 0, 0, 0, 417, 418, 6, 0, 0, 0, 418, 16, 1, 0, 0, 0, 419, 420, 7, 0, 0, 0, 420, 421, 7, 6, 0, 0, 421, 422, 7, 7, 0, 0, 422, 423, 7, 8, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 6, 1, 1, 0, 425, 18, 1, 0, 0, 0, 426, 427, 7, 3, 0, 0, 427, 428, 7, 9, 0, 0, 428, 429, 7, 6, 0, 0, 429, 430, 7, 1, 0, 0, 430, 431, 7, 4, 0, 0, 431, 432, 7, 10, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 6, 2, 2, 0, 434, 20, 1, 0, 0, 0, 435, 436, 7, 3, 0, 0, 436, 437, 7, 11, 0, 0, 437, 438, 7, 12, 0, 0, 438, 439, 7, 13, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 6, 3, 0, 0, 441, 22, 1, 0, 0, 0, 442, 443, 7, 3, 0, 0, 443, 444, 7, 14, 0, 0, 444, 445, 7, 8, 0, 0, 445, 446, 7, 13, 0, 0, 446, 447, 7, 12, 0, 0, 447, 448, 7, 1, 0, 0, 448, 449, 7, 9, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 6, 4, 3, 0, 451, 24, 1, 0, 0, 0, 452, 453, 7, 15, 0, 0, 453, 454, 7, 6, 0, 0, 454, 455, 7, 7, 0, 0, 455, 456, 7, 16, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 6, 5, 4, 0, 458, 26, 1, 0, 0, 0, 459, 460, 7, 17, 0, 0, 460, 461, 7, 6, 0, 0, 461, 462, 7, 7, 0, 0, 462, 463, 7, 18, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 6, 6, 0, 0, 465, 28, 1, 0, 0, 0, 466, 467, 7, 18, 0, 0, 467, 468, 7, 3, 0, 0, 468, 469, 7, 3, 0, 0, 469, 470, 7, 8, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 6, 7, 1, 0, 472, 30, 1, 0, 0, 0, 473, 474, 7, 13, 0, 0, 474, 475, 7, 1, 0, 0, 475, 476, 7, 16, 0, 0, 476, 477, 7, 1, 0, 0, 477, 478, 7, 5, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 6, 8, 0, 0, 480, 32, 1, 0, 0, 0, 481, 482, 7, 16, 0, 0, 482, 483, 7, 11, 0, 0, 483, 484, 5, 95, 0, 0, 484, 485, 7, 3, 0, 0, 485, 486, 7, 14, 0, 0, 486, 487, 7, 8, 0, 0, 487, 488, 7, 12, 0, 0, 488, 489, 7, 9, 0, 0, 489, 490, 7, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 6, 9, 5, 0, 492, 34, 1, 0, 0, 0, 493, 494, 7, 6, 0, 0, 494, 495, 7, 3, 0, 0, 495, 496, 7, 9, 0, 0, 496, 497, 7, 12, 0, 0, 497, 498, 7, 16, 0, 0, 498, 499, 7, 3, 0, 0, 499, 500, 1, 0, 0, 0, 500, 501, 6, 10, 6, 0, 501, 36, 1, 0, 0, 0, 502, 503, 7, 6, 0, 0, 503, 504, 7, 7, 0, 0, 504, 505, 7, 19, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 11, 0, 0, 507, 38, 1, 0, 0, 0, 508, 509, 7, 2, 0, 0, 509, 510, 7, 10, 0, 0, 510, 511, 7, 7, 0, 0, 511, 512, 7, 19, 0, 0, 512, 513, 1, 0, 0, 0, 513, 514, 6, 12, 7, 0, 514, 40, 1, 0, 0, 0, 515, 516, 7, 2, 0, 0, 516, 517, 7, 7, 0, 0, 517, 518, 7, 6, 0, 0, 518, 519, 7, 5, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 13, 0, 0, 521, 42, 1, 0, 0, 0, 522, 523, 7, 2, 0, 0, 523, 524, 7, 5, 0, 0, 524, 525, 7, 12, 0, 0, 525, 526, 7, 5, 0, 0, 526, 527, 7, 2, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 6, 14, 0, 0, 529, 44, 1, 0, 0, 0, 530, 531, 7, 19, 0, 0, 531, 532, 7, 10, 0, 0, 532, 533, 7, 3, 0, 0, 533, 534, 7, 6, 0, 0, 534, 535, 7, 3, 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 6, 15, 0, 0, 537, 46, 1, 0, 0, 0, 538, 539, 4, 16, 0, 0, 539, 540, 7, 1, 0, 0, 540, 541, 7, 9, 0, 0, 541, 542, 7, 13, 0, 0, 542, 543, 7, 1, 0, 0, 543, 544, 7, 9, 0, 0, 544, 545, 7, 3, 0, 0, 545, 546, 7, 2, 0, 0, 546, 547, 7, 5, 0, 0, 547, 548, 7, 12, 0, 0, 548, 549, 7, 5, 0, 0, 549, 550, 7, 2, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 6, 16, 0, 0, 552, 48, 1, 0, 0, 0, 553, 554, 4, 17, 1, 0, 554, 555, 7, 13, 0, 0, 555, 556, 7, 7, 0, 0, 556, 557, 7, 7, 0, 0, 557, 558, 7, 18, 0, 0, 558, 559, 7, 20, 0, 0, 559, 560, 7, 8, 0, 0, 560, 561, 1, 0, 0, 0, 561, 562, 6, 17, 8, 0, 562, 50, 1, 0, 0, 0, 563, 564, 4, 18, 2, 0, 564, 565, 7, 16, 0, 0, 565, 566, 7, 3, 0, 0, 566, 567, 7, 5, 0, 0, 567, 568, 7, 6, 0, 0, 568, 569, 7, 1, 0, 0, 569, 570, 7, 4, 0, 0, 570, 571, 7, 2, 0, 0, 571, 572, 1, 0, 0, 0, 572, 573, 6, 18, 9, 0, 573, 52, 1, 0, 0, 0, 574, 576, 8, 21, 0, 0, 575, 574, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 575, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 6, 19, 0, 0, 580, 54, 1, 0, 0, 0, 581, 582, 5, 47, 0, 0, 582, 583, 5, 47, 0, 0, 583, 587, 1, 0, 0, 0, 584, 586, 8, 22, 0, 0, 585, 584, 1, 0, 0, 0, 586, 589, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 591, 1, 0, 0, 0, 589, 587, 1, 0, 0, 0, 590, 592, 5, 13, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 595, 5, 10, 0, 0, 594, 593, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 6, 20, 10, 0, 597, 56, 1, 0, 0, 0, 598, 599, 5, 47, 0, 0, 599, 600, 5, 42, 0, 0, 600, 605, 1, 0, 0, 0, 601, 604, 3, 57, 21, 0, 602, 604, 9, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 607, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 609, 5, 42, 0, 0, 609, 610, 5, 47, 0, 0, 610, 611, 1, 0, 0, 0, 611, 612, 6, 21, 10, 0, 612, 58, 1, 0, 0, 0, 613, 615, 7, 23, 0, 0, 614, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 6, 22, 10, 0, 619, 60, 1, 0, 0, 0, 620, 621, 5, 124, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 6, 23, 11, 0, 623, 62, 1, 0, 0, 0, 624, 625, 7, 24, 0, 0, 625, 64, 1, 0, 0, 0, 626, 627, 7, 25, 0, 0, 627, 66, 1, 0, 0, 0, 628, 629, 5, 92, 0, 0, 629, 630, 7, 26, 0, 0, 630, 68, 1, 0, 0, 0, 631, 632, 8, 27, 0, 0, 632, 70, 1, 0, 0, 0, 633, 635, 7, 3, 0, 0, 634, 636, 7, 28, 0, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 63, 24, 0, 638, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 638, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 72, 1, 0, 0, 0, 642, 643, 5, 64, 0, 0, 643, 74, 1, 0, 0, 0, 644, 645, 5, 96, 0, 0, 645, 76, 1, 0, 0, 0, 646, 650, 8, 29, 0, 0, 647, 648, 5, 96, 0, 0, 648, 650, 5, 96, 0, 0, 649, 646, 1, 0, 0, 0, 649, 647, 1, 0, 0, 0, 650, 78, 1, 0, 0, 0, 651, 652, 5, 95, 0, 0, 652, 80, 1, 0, 0, 0, 653, 657, 3, 65, 25, 0, 654, 657, 3, 63, 24, 0, 655, 657, 3, 79, 32, 0, 656, 653, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 655, 1, 0, 0, 0, 657, 82, 1, 0, 0, 0, 658, 663, 5, 34, 0, 0, 659, 662, 3, 67, 26, 0, 660, 662, 3, 69, 27, 0, 661, 659, 1, 0, 0, 0, 661, 660, 1, 0, 0, 0, 662, 665, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 663, 1, 0, 0, 0, 666, 688, 5, 34, 0, 0, 667, 668, 5, 34, 0, 0, 668, 669, 5, 34, 0, 0, 669, 670, 5, 34, 0, 0, 670, 674, 1, 0, 0, 0, 671, 673, 8, 22, 0, 0, 672, 671, 1, 0, 0, 0, 673, 676, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 677, 1, 0, 0, 0, 676, 674, 1, 0, 0, 0, 677, 678, 5, 34, 0, 0, 678, 679, 5, 34, 0, 0, 679, 680, 5, 34, 0, 0, 680, 682, 1, 0, 0, 0, 681, 683, 5, 34, 0, 0, 682, 681, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 685, 1, 0, 0, 0, 684, 686, 5, 34, 0, 0, 685, 684, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 688, 1, 0, 0, 0, 687, 658, 1, 0, 0, 0, 687, 667, 1, 0, 0, 0, 688, 84, 1, 0, 0, 0, 689, 691, 3, 63, 24, 0, 690, 689, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 690, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 86, 1, 0, 0, 0, 694, 696, 3, 63, 24, 0, 695, 694, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 699, 1, 0, 0, 0, 699, 703, 3, 103, 44, 0, 700, 702, 3, 63, 24, 0, 701, 700, 1, 0, 0, 0, 702, 705, 1, 0, 0, 0, 703, 701, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 737, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 706, 708, 3, 103, 44, 0, 707, 709, 3, 63, 24, 0, 708, 707, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 708, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 737, 1, 0, 0, 0, 712, 714, 3, 63, 24, 0, 713, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 724, 1, 0, 0, 0, 717, 721, 3, 103, 44, 0, 718, 720, 3, 63, 24, 0, 719, 718, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 717, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 3, 71, 28, 0, 727, 737, 1, 0, 0, 0, 728, 730, 3, 103, 44, 0, 729, 731, 3, 63, 24, 0, 730, 729, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 735, 3, 71, 28, 0, 735, 737, 1, 0, 0, 0, 736, 695, 1, 0, 0, 0, 736, 706, 1, 0, 0, 0, 736, 713, 1, 0, 0, 0, 736, 728, 1, 0, 0, 0, 737, 88, 1, 0, 0, 0, 738, 739, 7, 30, 0, 0, 739, 740, 7, 31, 0, 0, 740, 90, 1, 0, 0, 0, 741, 742, 7, 12, 0, 0, 742, 743, 7, 9, 0, 0, 743, 744, 7, 0, 0, 0, 744, 92, 1, 0, 0, 0, 745, 746, 7, 12, 0, 0, 746, 747, 7, 2, 0, 0, 747, 748, 7, 4, 0, 0, 748, 94, 1, 0, 0, 0, 749, 750, 5, 61, 0, 0, 750, 96, 1, 0, 0, 0, 751, 752, 5, 58, 0, 0, 752, 753, 5, 58, 0, 0, 753, 98, 1, 0, 0, 0, 754, 755, 5, 44, 0, 0, 755, 100, 1, 0, 0, 0, 756, 757, 7, 0, 0, 0, 757, 758, 7, 3, 0, 0, 758, 759, 7, 2, 0, 0, 759, 760, 7, 4, 0, 0, 760, 102, 1, 0, 0, 0, 761, 762, 5, 46, 0, 0, 762, 104, 1, 0, 0, 0, 763, 764, 7, 15, 0, 0, 764, 765, 7, 12, 0, 0, 765, 766, 7, 13, 0, 0, 766, 767, 7, 2, 0, 0, 767, 768, 7, 3, 0, 0, 768, 106, 1, 0, 0, 0, 769, 770, 7, 15, 0, 0, 770, 771, 7, 1, 0, 0, 771, 772, 7, 6, 0, 0, 772, 773, 7, 2, 0, 0, 773, 774, 7, 5, 0, 0, 774, 108, 1, 0, 0, 0, 775, 776, 7, 1, 0, 0, 776, 777, 7, 9, 0, 0, 777, 110, 1, 0, 0, 0, 778, 779, 7, 1, 0, 0, 779, 780, 7, 2, 0, 0, 780, 112, 1, 0, 0, 0, 781, 782, 7, 13, 0, 0, 782, 783, 7, 12, 0, 0, 783, 784, 7, 2, 0, 0, 784, 785, 7, 5, 0, 0, 785, 114, 1, 0, 0, 0, 786, 787, 7, 13, 0, 0, 787, 788, 7, 1, 0, 0, 788, 789, 7, 18, 0, 0, 789, 790, 7, 3, 0, 0, 790, 116, 1, 0, 0, 0, 791, 792, 5, 40, 0, 0, 792, 118, 1, 0, 0, 0, 793, 794, 7, 9, 0, 0, 794, 795, 7, 7, 0, 0, 795, 796, 7, 5, 0, 0, 796, 120, 1, 0, 0, 0, 797, 798, 7, 9, 0, 0, 798, 799, 7, 20, 0, 0, 799, 800, 7, 13, 0, 0, 800, 801, 7, 13, 0, 0, 801, 122, 1, 0, 0, 0, 802, 803, 7, 9, 0, 0, 803, 804, 7, 20, 0, 0, 804, 805, 7, 13, 0, 0, 805, 806, 7, 13, 0, 0, 806, 807, 7, 2, 0, 0, 807, 124, 1, 0, 0, 0, 808, 809, 7, 7, 0, 0, 809, 810, 7, 6, 0, 0, 810, 126, 1, 0, 0, 0, 811, 812, 5, 63, 0, 0, 812, 128, 1, 0, 0, 0, 813, 814, 7, 6, 0, 0, 814, 815, 7, 13, 0, 0, 815, 816, 7, 1, 0, 0, 816, 817, 7, 18, 0, 0, 817, 818, 7, 3, 0, 0, 818, 130, 1, 0, 0, 0, 819, 820, 5, 41, 0, 0, 820, 132, 1, 0, 0, 0, 821, 822, 7, 5, 0, 0, 822, 823, 7, 6, 0, 0, 823, 824, 7, 20, 0, 0, 824, 825, 7, 3, 0, 0, 825, 134, 1, 0, 0, 0, 826, 827, 5, 61, 0, 0, 827, 828, 5, 61, 0, 0, 828, 136, 1, 0, 0, 0, 829, 830, 5, 61, 0, 0, 830, 831, 5, 126, 0, 0, 831, 138, 1, 0, 0, 0, 832, 833, 5, 33, 0, 0, 833, 834, 5, 61, 0, 0, 834, 140, 1, 0, 0, 0, 835, 836, 5, 60, 0, 0, 836, 142, 1, 0, 0, 0, 837, 838, 5, 60, 0, 0, 838, 839, 5, 61, 0, 0, 839, 144, 1, 0, 0, 0, 840, 841, 5, 62, 0, 0, 841, 146, 1, 0, 0, 0, 842, 843, 5, 62, 0, 0, 843, 844, 5, 61, 0, 0, 844, 148, 1, 0, 0, 0, 845, 846, 5, 43, 0, 0, 846, 150, 1, 0, 0, 0, 847, 848, 5, 45, 0, 0, 848, 152, 1, 0, 0, 0, 849, 850, 5, 42, 0, 0, 850, 154, 1, 0, 0, 0, 851, 852, 5, 47, 0, 0, 852, 156, 1, 0, 0, 0, 853, 854, 5, 37, 0, 0, 854, 158, 1, 0, 0, 0, 855, 856, 4, 72, 3, 0, 856, 857, 7, 16, 0, 0, 857, 858, 7, 12, 0, 0, 858, 859, 7, 5, 0, 0, 859, 860, 7, 4, 0, 0, 860, 861, 7, 10, 0, 0, 861, 160, 1, 0, 0, 0, 862, 865, 3, 127, 56, 0, 863, 866, 3, 65, 25, 0, 864, 866, 3, 79, 32, 0, 865, 863, 1, 0, 0, 0, 865, 864, 1, 0, 0, 0, 866, 870, 1, 0, 0, 0, 867, 869, 3, 81, 33, 0, 868, 867, 1, 0, 0, 0, 869, 872, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 880, 1, 0, 0, 0, 872, 870, 1, 0, 0, 0, 873, 875, 3, 127, 56, 0, 874, 876, 3, 63, 24, 0, 875, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 875, 1, 0, 0, 0, 877, 878, 1, 0, 0, 0, 878, 880, 1, 0, 0, 0, 879, 862, 1, 0, 0, 0, 879, 873, 1, 0, 0, 0, 880, 162, 1, 0, 0, 0, 881, 882, 5, 91, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 6, 74, 0, 0, 884, 885, 6, 74, 0, 0, 885, 164, 1, 0, 0, 0, 886, 887, 5, 93, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 6, 75, 11, 0, 889, 890, 6, 75, 11, 0, 890, 166, 1, 0, 0, 0, 891, 895, 3, 65, 25, 0, 892, 894, 3, 81, 33, 0, 893, 892, 1, 0, 0, 0, 894, 897, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 908, 1, 0, 0, 0, 897, 895, 1, 0, 0, 0, 898, 901, 3, 79, 32, 0, 899, 901, 3, 73, 29, 0, 900, 898, 1, 0, 0, 0, 900, 899, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 904, 3, 81, 33, 0, 903, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 908, 1, 0, 0, 0, 907, 891, 1, 0, 0, 0, 907, 900, 1, 0, 0, 0, 908, 168, 1, 0, 0, 0, 909, 911, 3, 75, 30, 0, 910, 912, 3, 77, 31, 0, 911, 910, 1, 0, 0, 0, 912, 913, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 916, 3, 75, 30, 0, 916, 170, 1, 0, 0, 0, 917, 918, 3, 169, 77, 0, 918, 172, 1, 0, 0, 0, 919, 920, 3, 55, 20, 0, 920, 921, 1, 0, 0, 0, 921, 922, 6, 79, 10, 0, 922, 174, 1, 0, 0, 0, 923, 924, 3, 57, 21, 0, 924, 925, 1, 0, 0, 0, 925, 926, 6, 80, 10, 0, 926, 176, 1, 0, 0, 0, 927, 928, 3, 59, 22, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 81, 10, 0, 930, 178, 1, 0, 0, 0, 931, 932, 3, 163, 74, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 82, 12, 0, 934, 935, 6, 82, 13, 0, 935, 180, 1, 0, 0, 0, 936, 937, 3, 61, 23, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 83, 14, 0, 939, 940, 6, 83, 11, 0, 940, 182, 1, 0, 0, 0, 941, 942, 3, 59, 22, 0, 942, 943, 1, 0, 0, 0, 943, 944, 6, 84, 10, 0, 944, 184, 1, 0, 0, 0, 945, 946, 3, 55, 20, 0, 946, 947, 1, 0, 0, 0, 947, 948, 6, 85, 10, 0, 948, 186, 1, 0, 0, 0, 949, 950, 3, 57, 21, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 86, 10, 0, 952, 188, 1, 0, 0, 0, 953, 954, 3, 61, 23, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 87, 14, 0, 956, 957, 6, 87, 11, 0, 957, 190, 1, 0, 0, 0, 958, 959, 3, 163, 74, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 88, 12, 0, 961, 192, 1, 0, 0, 0, 962, 963, 3, 165, 75, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 89, 15, 0, 965, 194, 1, 0, 0, 0, 966, 967, 3, 335, 160, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 90, 16, 0, 969, 196, 1, 0, 0, 0, 970, 971, 3, 99, 42, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 91, 17, 0, 973, 198, 1, 0, 0, 0, 974, 975, 3, 95, 40, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 92, 18, 0, 977, 200, 1, 0, 0, 0, 978, 979, 7, 16, 0, 0, 979, 980, 7, 3, 0, 0, 980, 981, 7, 5, 0, 0, 981, 982, 7, 12, 0, 0, 982, 983, 7, 0, 0, 0, 983, 984, 7, 12, 0, 0, 984, 985, 7, 5, 0, 0, 985, 986, 7, 12, 0, 0, 986, 202, 1, 0, 0, 0, 987, 991, 8, 32, 0, 0, 988, 989, 5, 47, 0, 0, 989, 991, 8, 33, 0, 0, 990, 987, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 204, 1, 0, 0, 0, 992, 994, 3, 203, 94, 0, 993, 992, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 206, 1, 0, 0, 0, 997, 998, 3, 205, 95, 0, 998, 999, 1, 0, 0, 0, 999, 1000, 6, 96, 19, 0, 1000, 208, 1, 0, 0, 0, 1001, 1002, 3, 83, 34, 0, 1002, 1003, 1, 0, 0, 0, 1003, 1004, 6, 97, 20, 0, 1004, 210, 1, 0, 0, 0, 1005, 1006, 3, 55, 20, 0, 1006, 1007, 1, 0, 0, 0, 1007, 1008, 6, 98, 10, 0, 1008, 212, 1, 0, 0, 0, 1009, 1010, 3, 57, 21, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 6, 99, 10, 0, 1012, 214, 1, 0, 0, 0, 1013, 1014, 3, 59, 22, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 6, 100, 10, 0, 1016, 216, 1, 0, 0, 0, 1017, 1018, 3, 61, 23, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 6, 101, 14, 0, 1020, 1021, 6, 101, 11, 0, 1021, 218, 1, 0, 0, 0, 1022, 1023, 3, 103, 44, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 102, 21, 0, 1025, 220, 1, 0, 0, 0, 1026, 1027, 3, 99, 42, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 103, 17, 0, 1029, 222, 1, 0, 0, 0, 1030, 1031, 3, 127, 56, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 104, 22, 0, 1033, 224, 1, 0, 0, 0, 1034, 1035, 3, 161, 73, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 6, 105, 23, 0, 1037, 226, 1, 0, 0, 0, 1038, 1043, 3, 65, 25, 0, 1039, 1043, 3, 63, 24, 0, 1040, 1043, 3, 79, 32, 0, 1041, 1043, 3, 153, 69, 0, 1042, 1038, 1, 0, 0, 0, 1042, 1039, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1041, 1, 0, 0, 0, 1043, 228, 1, 0, 0, 0, 1044, 1047, 3, 65, 25, 0, 1045, 1047, 3, 153, 69, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1045, 1, 0, 0, 0, 1047, 1051, 1, 0, 0, 0, 1048, 1050, 3, 227, 106, 0, 1049, 1048, 1, 0, 0, 0, 1050, 1053, 1, 0, 0, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1064, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1054, 1057, 3, 79, 32, 0, 1055, 1057, 3, 73, 29, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1055, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1060, 3, 227, 106, 0, 1059, 1058, 1, 0, 0, 0, 1060, 1061, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1046, 1, 0, 0, 0, 1063, 1056, 1, 0, 0, 0, 1064, 230, 1, 0, 0, 0, 1065, 1068, 3, 229, 107, 0, 1066, 1068, 3, 169, 77, 0, 1067, 1065, 1, 0, 0, 0, 1067, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1067, 1, 0, 0, 0, 1069, 1070, 1, 0, 0, 0, 1070, 232, 1, 0, 0, 0, 1071, 1072, 3, 55, 20, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 109, 10, 0, 1074, 234, 1, 0, 0, 0, 1075, 1076, 3, 57, 21, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 110, 10, 0, 1078, 236, 1, 0, 0, 0, 1079, 1080, 3, 59, 22, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 111, 10, 0, 1082, 238, 1, 0, 0, 0, 1083, 1084, 3, 61, 23, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 112, 14, 0, 1086, 1087, 6, 112, 11, 0, 1087, 240, 1, 0, 0, 0, 1088, 1089, 3, 95, 40, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 113, 18, 0, 1091, 242, 1, 0, 0, 0, 1092, 1093, 3, 99, 42, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 114, 17, 0, 1095, 244, 1, 0, 0, 0, 1096, 1097, 3, 103, 44, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 115, 21, 0, 1099, 246, 1, 0, 0, 0, 1100, 1101, 3, 127, 56, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 116, 22, 0, 1103, 248, 1, 0, 0, 0, 1104, 1105, 3, 161, 73, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 6, 117, 23, 0, 1107, 250, 1, 0, 0, 0, 1108, 1109, 7, 12, 0, 0, 1109, 1110, 7, 2, 0, 0, 1110, 252, 1, 0, 0, 0, 1111, 1112, 3, 231, 108, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 119, 24, 0, 1114, 254, 1, 0, 0, 0, 1115, 1116, 3, 55, 20, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 120, 10, 0, 1118, 256, 1, 0, 0, 0, 1119, 1120, 3, 57, 21, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 121, 10, 0, 1122, 258, 1, 0, 0, 0, 1123, 1124, 3, 59, 22, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 122, 10, 0, 1126, 260, 1, 0, 0, 0, 1127, 1128, 3, 61, 23, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 123, 14, 0, 1130, 1131, 6, 123, 11, 0, 1131, 262, 1, 0, 0, 0, 1132, 1133, 3, 163, 74, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 6, 124, 12, 0, 1135, 1136, 6, 124, 25, 0, 1136, 264, 1, 0, 0, 0, 1137, 1138, 7, 7, 0, 0, 1138, 1139, 7, 9, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 125, 26, 0, 1141, 266, 1, 0, 0, 0, 1142, 1143, 7, 19, 0, 0, 1143, 1144, 7, 1, 0, 0, 1144, 1145, 7, 5, 0, 0, 1145, 1146, 7, 10, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 6, 126, 26, 0, 1148, 268, 1, 0, 0, 0, 1149, 1150, 8, 34, 0, 0, 1150, 270, 1, 0, 0, 0, 1151, 1153, 3, 269, 127, 0, 1152, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1152, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 3, 335, 160, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1152, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1161, 1, 0, 0, 0, 1160, 1162, 3, 269, 127, 0, 1161, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1161, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 272, 1, 0, 0, 0, 1165, 1166, 3, 271, 128, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 6, 129, 27, 0, 1168, 274, 1, 0, 0, 0, 1169, 1170, 3, 55, 20, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 6, 130, 10, 0, 1172, 276, 1, 0, 0, 0, 1173, 1174, 3, 57, 21, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 6, 131, 10, 0, 1176, 278, 1, 0, 0, 0, 1177, 1178, 3, 59, 22, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1180, 6, 132, 10, 0, 1180, 280, 1, 0, 0, 0, 1181, 1182, 3, 61, 23, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1184, 6, 133, 14, 0, 1184, 1185, 6, 133, 11, 0, 1185, 1186, 6, 133, 11, 0, 1186, 282, 1, 0, 0, 0, 1187, 1188, 3, 95, 40, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 134, 18, 0, 1190, 284, 1, 0, 0, 0, 1191, 1192, 3, 99, 42, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 135, 17, 0, 1194, 286, 1, 0, 0, 0, 1195, 1196, 3, 103, 44, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 136, 21, 0, 1198, 288, 1, 0, 0, 0, 1199, 1200, 3, 267, 126, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 6, 137, 28, 0, 1202, 290, 1, 0, 0, 0, 1203, 1204, 3, 231, 108, 0, 1204, 1205, 1, 0, 0, 0, 1205, 1206, 6, 138, 24, 0, 1206, 292, 1, 0, 0, 0, 1207, 1208, 3, 171, 78, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 6, 139, 29, 0, 1210, 294, 1, 0, 0, 0, 1211, 1212, 3, 127, 56, 0, 1212, 1213, 1, 0, 0, 0, 1213, 1214, 6, 140, 22, 0, 1214, 296, 1, 0, 0, 0, 1215, 1216, 3, 161, 73, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 6, 141, 23, 0, 1218, 298, 1, 0, 0, 0, 1219, 1220, 3, 55, 20, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1222, 6, 142, 10, 0, 1222, 300, 1, 0, 0, 0, 1223, 1224, 3, 57, 21, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1226, 6, 143, 10, 0, 1226, 302, 1, 0, 0, 0, 1227, 1228, 3, 59, 22, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1230, 6, 144, 10, 0, 1230, 304, 1, 0, 0, 0, 1231, 1232, 3, 61, 23, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1234, 6, 145, 14, 0, 1234, 1235, 6, 145, 11, 0, 1235, 306, 1, 0, 0, 0, 1236, 1237, 3, 103, 44, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 146, 21, 0, 1239, 308, 1, 0, 0, 0, 1240, 1241, 3, 127, 56, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 147, 22, 0, 1243, 310, 1, 0, 0, 0, 1244, 1245, 3, 161, 73, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 148, 23, 0, 1247, 312, 1, 0, 0, 0, 1248, 1249, 3, 171, 78, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 149, 29, 0, 1251, 314, 1, 0, 0, 0, 1252, 1253, 3, 167, 76, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 150, 30, 0, 1255, 316, 1, 0, 0, 0, 1256, 1257, 3, 55, 20, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 151, 10, 0, 1259, 318, 1, 0, 0, 0, 1260, 1261, 3, 57, 21, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1263, 6, 152, 10, 0, 1263, 320, 1, 0, 0, 0, 1264, 1265, 3, 59, 22, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 6, 153, 10, 0, 1267, 322, 1, 0, 0, 0, 1268, 1269, 3, 61, 23, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1271, 6, 154, 14, 0, 1271, 1272, 6, 154, 11, 0, 1272, 324, 1, 0, 0, 0, 1273, 1274, 7, 1, 0, 0, 1274, 1275, 7, 9, 0, 0, 1275, 1276, 7, 15, 0, 0, 1276, 1277, 7, 7, 0, 0, 1277, 326, 1, 0, 0, 0, 1278, 1279, 3, 55, 20, 0, 1279, 1280, 1, 0, 0, 0, 1280, 1281, 6, 156, 10, 0, 1281, 328, 1, 0, 0, 0, 1282, 1283, 3, 57, 21, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1285, 6, 157, 10, 0, 1285, 330, 1, 0, 0, 0, 1286, 1287, 3, 59, 22, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 6, 158, 10, 0, 1289, 332, 1, 0, 0, 0, 1290, 1291, 3, 165, 75, 0, 1291, 1292, 1, 0, 0, 0, 1292, 1293, 6, 159, 15, 0, 1293, 1294, 6, 159, 11, 0, 1294, 334, 1, 0, 0, 0, 1295, 1296, 5, 58, 0, 0, 1296, 336, 1, 0, 0, 0, 1297, 1303, 3, 73, 29, 0, 1298, 1303, 3, 63, 24, 0, 1299, 1303, 3, 103, 44, 0, 1300, 1303, 3, 65, 25, 0, 1301, 1303, 3, 79, 32, 0, 1302, 1297, 1, 0, 0, 0, 1302, 1298, 1, 0, 0, 0, 1302, 1299, 1, 0, 0, 0, 1302, 1300, 1, 0, 0, 0, 1302, 1301, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 1302, 1, 0, 0, 0, 1304, 1305, 1, 0, 0, 0, 1305, 338, 1, 0, 0, 0, 1306, 1307, 3, 55, 20, 0, 1307, 1308, 1, 0, 0, 0, 1308, 1309, 6, 162, 10, 0, 1309, 340, 1, 0, 0, 0, 1310, 1311, 3, 57, 21, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1313, 6, 163, 10, 0, 1313, 342, 1, 0, 0, 0, 1314, 1315, 3, 59, 22, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 6, 164, 10, 0, 1317, 344, 1, 0, 0, 0, 1318, 1319, 3, 61, 23, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 165, 14, 0, 1321, 1322, 6, 165, 11, 0, 1322, 346, 1, 0, 0, 0, 1323, 1324, 3, 335, 160, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1326, 6, 166, 16, 0, 1326, 348, 1, 0, 0, 0, 1327, 1328, 3, 99, 42, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1330, 6, 167, 17, 0, 1330, 350, 1, 0, 0, 0, 1331, 1332, 3, 103, 44, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 6, 168, 21, 0, 1334, 352, 1, 0, 0, 0, 1335, 1336, 3, 265, 125, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 6, 169, 31, 0, 1338, 1339, 6, 169, 32, 0, 1339, 354, 1, 0, 0, 0, 1340, 1341, 3, 205, 95, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1343, 6, 170, 19, 0, 1343, 356, 1, 0, 0, 0, 1344, 1345, 3, 83, 34, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 6, 171, 20, 0, 1347, 358, 1, 0, 0, 0, 1348, 1349, 3, 55, 20, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1351, 6, 172, 10, 0, 1351, 360, 1, 0, 0, 0, 1352, 1353, 3, 57, 21, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 6, 173, 10, 0, 1355, 362, 1, 0, 0, 0, 1356, 1357, 3, 59, 22, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1359, 6, 174, 10, 0, 1359, 364, 1, 0, 0, 0, 1360, 1361, 3, 61, 23, 0, 1361, 1362, 1, 0, 0, 0, 1362, 1363, 6, 175, 14, 0, 1363, 1364, 6, 175, 11, 0, 1364, 1365, 6, 175, 11, 0, 1365, 366, 1, 0, 0, 0, 1366, 1367, 3, 99, 42, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 6, 176, 17, 0, 1369, 368, 1, 0, 0, 0, 1370, 1371, 3, 103, 44, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 6, 177, 21, 0, 1373, 370, 1, 0, 0, 0, 1374, 1375, 3, 231, 108, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 178, 24, 0, 1377, 372, 1, 0, 0, 0, 1378, 1379, 3, 55, 20, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1381, 6, 179, 10, 0, 1381, 374, 1, 0, 0, 0, 1382, 1383, 3, 57, 21, 0, 1383, 1384, 1, 0, 0, 0, 1384, 1385, 6, 180, 10, 0, 1385, 376, 1, 0, 0, 0, 1386, 1387, 3, 59, 22, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 181, 10, 0, 1389, 378, 1, 0, 0, 0, 1390, 1391, 3, 61, 23, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 182, 14, 0, 1393, 1394, 6, 182, 11, 0, 1394, 380, 1, 0, 0, 0, 1395, 1396, 3, 205, 95, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 183, 19, 0, 1398, 1399, 6, 183, 11, 0, 1399, 1400, 6, 183, 33, 0, 1400, 382, 1, 0, 0, 0, 1401, 1402, 3, 83, 34, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 6, 184, 20, 0, 1404, 1405, 6, 184, 11, 0, 1405, 1406, 6, 184, 33, 0, 1406, 384, 1, 0, 0, 0, 1407, 1408, 3, 55, 20, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 185, 10, 0, 1410, 386, 1, 0, 0, 0, 1411, 1412, 3, 57, 21, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1414, 6, 186, 10, 0, 1414, 388, 1, 0, 0, 0, 1415, 1416, 3, 59, 22, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 6, 187, 10, 0, 1418, 390, 1, 0, 0, 0, 1419, 1420, 3, 335, 160, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1422, 6, 188, 16, 0, 1422, 1423, 6, 188, 11, 0, 1423, 1424, 6, 188, 9, 0, 1424, 392, 1, 0, 0, 0, 1425, 1426, 3, 99, 42, 0, 1426, 1427, 1, 0, 0, 0, 1427, 1428, 6, 189, 17, 0, 1428, 1429, 6, 189, 11, 0, 1429, 1430, 6, 189, 9, 0, 1430, 394, 1, 0, 0, 0, 1431, 1432, 3, 55, 20, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 190, 10, 0, 1434, 396, 1, 0, 0, 0, 1435, 1436, 3, 57, 21, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 191, 10, 0, 1438, 398, 1, 0, 0, 0, 1439, 1440, 3, 59, 22, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 6, 192, 10, 0, 1442, 400, 1, 0, 0, 0, 1443, 1444, 3, 171, 78, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 6, 193, 11, 0, 1446, 1447, 6, 193, 0, 0, 1447, 1448, 6, 193, 29, 0, 1448, 402, 1, 0, 0, 0, 1449, 1450, 3, 167, 76, 0, 1450, 1451, 1, 0, 0, 0, 1451, 1452, 6, 194, 11, 0, 1452, 1453, 6, 194, 0, 0, 1453, 1454, 6, 194, 30, 0, 1454, 404, 1, 0, 0, 0, 1455, 1456, 3, 89, 37, 0, 1456, 1457, 1, 0, 0, 0, 1457, 1458, 6, 195, 11, 0, 1458, 1459, 6, 195, 0, 0, 1459, 1460, 6, 195, 34, 0, 1460, 406, 1, 0, 0, 0, 1461, 1462, 3, 61, 23, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1464, 6, 196, 14, 0, 1464, 1465, 6, 196, 11, 0, 1465, 408, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 577, 587, 591, 594, 603, 605, 616, 635, 640, 649, 656, 661, 663, 674, 682, 685, 687, 692, 697, 703, 710, 715, 721, 724, 732, 736, 865, 870, 877, 879, 895, 900, 905, 907, 913, 990, 995, 1042, 1046, 1051, 1056, 1061, 1063, 1067, 1069, 1154, 1158, 1163, 1302, 1304, 35, 5, 1, 0, 5, 4, 0, 5, 6, 0, 5, 2, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 5, 11, 0, 5, 13, 0, 0, 1, 0, 4, 0, 0, 7, 65, 0, 5, 0, 0, 7, 24, 0, 7, 66, 0, 7, 104, 0, 7, 33, 0, 7, 31, 0, 7, 76, 0, 7, 25, 0, 7, 35, 0, 7, 47, 0, 7, 64, 0, 7, 80, 0, 5, 10, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 68, 0, 7, 67, 0, 7, 88, 0, 5, 12, 0, 5, 14, 0, 7, 28, 0] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java index 0dd7796e6e5d3..563e2418e7eff 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java @@ -85,27 +85,31 @@ private static String[] makeRuleNames() { "FROM_PIPE", "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", "FROM_COMMA", "FROM_ASSIGN", "METADATA", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", - "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", + "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", "PROJECT_PARAM", + "PROJECT_NAMED_OR_POSITIONAL_PARAM", "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", - "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", - "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", - "ENRICH_POLICY_NAME", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "LOOKUP_PIPE", "LOOKUP_COLON", - "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", "LOOKUP_UNQUOTED_SOURCE", - "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", - "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", - "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", - "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", + "RENAME_PARAM", "RENAME_NAMED_OR_POSITIONAL_PARAM", "AS", "RENAME_ID_PATTERN", + "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", + "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", + "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", + "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", + "ENRICH_FIELD_PARAM", "ENRICH_FIELD_NAMED_OR_POSITIONAL_PARAM", "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", "MVEXPAND_PIPE", + "MVEXPAND_DOT", "MVEXPAND_PARAM", "MVEXPAND_NAMED_OR_POSITIONAL_PARAM", + "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", + "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", "SETTING_WS", + "LOOKUP_PIPE", "LOOKUP_COLON", "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", + "LOOKUP_UNQUOTED_SOURCE", "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", + "LOOKUP_FIELD_DOT", "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "METRICS_PIPE", + "METRICS_UNQUOTED_SOURCE", "METRICS_QUOTED_SOURCE", "METRICS_LINE_COMMENT", + "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COLON", "CLOSING_METRICS_COMMA", + "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE" }; @@ -260,7 +264,7 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { } public static final String _serializedATN = - "\u0004\u0000x\u058a\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ + "\u0004\u0000x\u05ba\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ "\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff\uffff"+ @@ -313,54 +317,57 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { "\u00b1\u0007\u00b1\u0002\u00b2\u0007\u00b2\u0002\u00b3\u0007\u00b3\u0002"+ "\u00b4\u0007\u00b4\u0002\u00b5\u0007\u00b5\u0002\u00b6\u0007\u00b6\u0002"+ "\u00b7\u0007\u00b7\u0002\u00b8\u0007\u00b8\u0002\u00b9\u0007\u00b9\u0002"+ - "\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0001"+ + "\u00ba\u0007\u00ba\u0002\u00bb\u0007\u00bb\u0002\u00bc\u0007\u00bc\u0002"+ + "\u00bd\u0007\u00bd\u0002\u00be\u0007\u00be\u0002\u00bf\u0007\u00bf\u0002"+ + "\u00c0\u0007\u00c0\u0002\u00c1\u0007\u00c1\u0002\u00c2\u0007\u00c2\u0002"+ + "\u00c3\u0007\u00c3\u0002\u00c4\u0007\u00c4\u0001\u0000\u0001\u0000\u0001"+ "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ - "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001"+ + "\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ - "\u0002\u0001\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ - "\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001"+ - "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001"+ - "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b"+ - "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010"+ - "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ - "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012"+ "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ - "\u0001\u0013\u0004\u0013\u0230\b\u0013\u000b\u0013\f\u0013\u0231\u0001"+ - "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005"+ - "\u0014\u023a\b\u0014\n\u0014\f\u0014\u023d\t\u0014\u0001\u0014\u0003\u0014"+ - "\u0240\b\u0014\u0001\u0014\u0003\u0014\u0243\b\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005"+ - "\u0015\u024c\b\u0015\n\u0015\f\u0015\u024f\t\u0015\u0001\u0015\u0001\u0015"+ - "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0004\u0016\u0257\b\u0016"+ - "\u000b\u0016\f\u0016\u0258\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c"+ - "\u0001\u001c\u0003\u001c\u026c\b\u001c\u0001\u001c\u0004\u001c\u026f\b"+ - "\u001c\u000b\u001c\f\u001c\u0270\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+ - "\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u027a\b\u001f\u0001"+ - " \u0001 \u0001!\u0001!\u0001!\u0003!\u0281\b!\u0001\"\u0001\"\u0001\""+ - "\u0005\"\u0286\b\"\n\"\f\"\u0289\t\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ - "\"\u0001\"\u0005\"\u0291\b\"\n\"\f\"\u0294\t\"\u0001\"\u0001\"\u0001\""+ - "\u0001\"\u0001\"\u0003\"\u029b\b\"\u0001\"\u0003\"\u029e\b\"\u0003\"\u02a0"+ - "\b\"\u0001#\u0004#\u02a3\b#\u000b#\f#\u02a4\u0001$\u0004$\u02a8\b$\u000b"+ - "$\f$\u02a9\u0001$\u0001$\u0005$\u02ae\b$\n$\f$\u02b1\t$\u0001$\u0001$"+ - "\u0004$\u02b5\b$\u000b$\f$\u02b6\u0001$\u0004$\u02ba\b$\u000b$\f$\u02bb"+ - "\u0001$\u0001$\u0005$\u02c0\b$\n$\f$\u02c3\t$\u0003$\u02c5\b$\u0001$\u0001"+ - "$\u0001$\u0001$\u0004$\u02cb\b$\u000b$\f$\u02cc\u0001$\u0001$\u0003$\u02d1"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0004\u0013"+ + "\u0240\b\u0013\u000b\u0013\f\u0013\u0241\u0001\u0013\u0001\u0013\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u024a\b\u0014\n"+ + "\u0014\f\u0014\u024d\t\u0014\u0001\u0014\u0003\u0014\u0250\b\u0014\u0001"+ + "\u0014\u0003\u0014\u0253\b\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0005\u0015\u025c\b\u0015\n"+ + "\u0015\f\u0015\u025f\t\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0016\u0004\u0016\u0267\b\u0016\u000b\u0016\f"+ + "\u0016\u0268\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c"+ + "\u0003\u001c\u027c\b\u001c\u0001\u001c\u0004\u001c\u027f\b\u001c\u000b"+ + "\u001c\f\u001c\u0280\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u028a\b\u001f\u0001 \u0001"+ + " \u0001!\u0001!\u0001!\u0003!\u0291\b!\u0001\"\u0001\"\u0001\"\u0005\""+ + "\u0296\b\"\n\"\f\"\u0299\t\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0005\"\u02a1\b\"\n\"\f\"\u02a4\t\"\u0001\"\u0001\"\u0001\"\u0001\""+ + "\u0001\"\u0003\"\u02ab\b\"\u0001\"\u0003\"\u02ae\b\"\u0003\"\u02b0\b\""+ + "\u0001#\u0004#\u02b3\b#\u000b#\f#\u02b4\u0001$\u0004$\u02b8\b$\u000b$"+ + "\f$\u02b9\u0001$\u0001$\u0005$\u02be\b$\n$\f$\u02c1\t$\u0001$\u0001$\u0004"+ + "$\u02c5\b$\u000b$\f$\u02c6\u0001$\u0004$\u02ca\b$\u000b$\f$\u02cb\u0001"+ + "$\u0001$\u0005$\u02d0\b$\n$\f$\u02d3\t$\u0003$\u02d5\b$\u0001$\u0001$"+ + "\u0001$\u0001$\u0004$\u02db\b$\u000b$\f$\u02dc\u0001$\u0001$\u0003$\u02e1"+ "\b$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ "\'\u0001\'\u0001(\u0001(\u0001)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001"+ "+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001"+ @@ -373,12 +380,12 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { "<\u0001<\u0001=\u0001=\u0001=\u0001>\u0001>\u0001>\u0001?\u0001?\u0001"+ "@\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001"+ "D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001"+ - "H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0003I\u0352\bI\u0001"+ - "I\u0005I\u0355\bI\nI\fI\u0358\tI\u0001I\u0001I\u0004I\u035c\bI\u000bI"+ - "\fI\u035d\u0003I\u0360\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ - "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005L\u036e\bL\nL\fL\u0371\tL\u0001"+ - "L\u0001L\u0003L\u0375\bL\u0001L\u0004L\u0378\bL\u000bL\fL\u0379\u0003"+ - "L\u037c\bL\u0001M\u0001M\u0004M\u0380\bM\u000bM\fM\u0381\u0001M\u0001"+ + "H\u0001H\u0001H\u0001H\u0001H\u0001I\u0001I\u0001I\u0003I\u0362\bI\u0001"+ + "I\u0005I\u0365\bI\nI\fI\u0368\tI\u0001I\u0001I\u0004I\u036c\bI\u000bI"+ + "\fI\u036d\u0003I\u0370\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001L\u0001L\u0005L\u037e\bL\nL\fL\u0381\tL\u0001"+ + "L\u0001L\u0003L\u0385\bL\u0001L\u0004L\u0388\bL\u000bL\fL\u0389\u0003"+ + "L\u038c\bL\u0001M\u0001M\u0004M\u0390\bM\u000bM\fM\u0391\u0001M\u0001"+ "M\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001P\u0001"+ "P\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001R\u0001R\u0001"+ "S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001U\u0001"+ @@ -386,95 +393,102 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { "W\u0001W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001"+ "Z\u0001Z\u0001Z\u0001Z\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ "\\\u0001\\\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001]\u0001"+ - "]\u0001^\u0001^\u0001^\u0003^\u03cf\b^\u0001_\u0004_\u03d2\b_\u000b_\f"+ - "_\u03d3\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ + "]\u0001^\u0001^\u0001^\u0003^\u03df\b^\u0001_\u0004_\u03e2\b_\u000b_\f"+ + "_\u03e3\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001a\u0001"+ "b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001d\u0001"+ "d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0001"+ - "f\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0003h\u03fb"+ - "\bh\u0001i\u0001i\u0003i\u03ff\bi\u0001i\u0005i\u0402\bi\ni\fi\u0405\t"+ - "i\u0001i\u0001i\u0003i\u0409\bi\u0001i\u0004i\u040c\bi\u000bi\fi\u040d"+ - "\u0003i\u0410\bi\u0001j\u0001j\u0004j\u0414\bj\u000bj\fj\u0415\u0001k"+ - "\u0001k\u0001k\u0001k\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001"+ - "m\u0001m\u0001n\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001"+ - "o\u0001p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001"+ + "f\u0001g\u0001g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001"+ + "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0003j\u0413\bj\u0001k\u0001"+ + "k\u0003k\u0417\bk\u0001k\u0005k\u041a\bk\nk\fk\u041d\tk\u0001k\u0001k"+ + "\u0003k\u0421\bk\u0001k\u0004k\u0424\bk\u000bk\fk\u0425\u0003k\u0428\b"+ + "k\u0001l\u0001l\u0004l\u042c\bl\u000bl\fl\u042d\u0001m\u0001m\u0001m\u0001"+ + "m\u0001n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001"+ + "p\u0001p\u0001p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001"+ "r\u0001r\u0001s\u0001s\u0001s\u0001s\u0001t\u0001t\u0001t\u0001t\u0001"+ - "u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001w\u0001"+ - "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001"+ - "y\u0001y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001z\u0001"+ - "{\u0001{\u0001|\u0004|\u0461\b|\u000b|\f|\u0462\u0001|\u0001|\u0003|\u0467"+ - "\b|\u0001|\u0004|\u046a\b|\u000b|\f|\u046b\u0001}\u0001}\u0001}\u0001"+ - "}\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u007f\u0001"+ - "\u007f\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0080\u0001\u0081\u0001"+ - "\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0082\u0001"+ - "\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001\u0083\u0001"+ - "\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0085\u0001"+ - "\u0085\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001"+ - "\u0086\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0087\u0001\u0088\u0001"+ - "\u0088\u0001\u0088\u0001\u0088\u0001\u0089\u0001\u0089\u0001\u0089\u0001"+ - "\u0089\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008a\u0001\u008b\u0001"+ - "\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008c\u0001\u008c\u0001"+ - "\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001\u008d\u0001\u008d\u0001"+ - "\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008f\u0001\u008f\u0001"+ - "\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001\u0090\u0001\u0090\u0001"+ - "\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0092\u0001\u0092\u0001"+ - "\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001\u0093\u0001\u0093\u0001"+ - "\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ - "\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001\u0096\u0001"+ - "\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ - "\u0097\u0001\u0098\u0001\u0098\u0001\u0099\u0001\u0099\u0001\u0099\u0001"+ - "\u0099\u0001\u0099\u0004\u0099\u04e7\b\u0099\u000b\u0099\f\u0099\u04e8"+ - "\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009a\u0001\u009b\u0001\u009b"+ - "\u0001\u009b\u0001\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c"+ - "\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009d\u0001\u009e"+ - "\u0001\u009e\u0001\u009e\u0001\u009e\u0001\u009f\u0001\u009f\u0001\u009f"+ - "\u0001\u009f\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a0\u0001\u00a1"+ - "\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a2\u0001\u00a2"+ - "\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ - "\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5\u0001\u00a5"+ - "\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6\u0001\u00a6\u0001\u00a6"+ - "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ + "u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001w\u0001w\u0001w\u0001"+ + "w\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001y\u0001y\u0001z\u0001"+ + "z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001{\u0001|\u0001|\u0001"+ + "|\u0001|\u0001|\u0001}\u0001}\u0001}\u0001}\u0001}\u0001~\u0001~\u0001"+ + "~\u0001~\u0001~\u0001~\u0001~\u0001\u007f\u0001\u007f\u0001\u0080\u0004"+ + "\u0080\u0481\b\u0080\u000b\u0080\f\u0080\u0482\u0001\u0080\u0001\u0080"+ + "\u0003\u0080\u0487\b\u0080\u0001\u0080\u0004\u0080\u048a\b\u0080\u000b"+ + "\u0080\f\u0080\u048b\u0001\u0081\u0001\u0081\u0001\u0081\u0001\u0081\u0001"+ + "\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083\u0001"+ + "\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084\u0001"+ + "\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001"+ + "\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001"+ + "\u0087\u0001\u0087\u0001\u0088\u0001\u0088\u0001\u0088\u0001\u0088\u0001"+ + "\u0089\u0001\u0089\u0001\u0089\u0001\u0089\u0001\u008a\u0001\u008a\u0001"+ + "\u008a\u0001\u008a\u0001\u008b\u0001\u008b\u0001\u008b\u0001\u008b\u0001"+ + "\u008c\u0001\u008c\u0001\u008c\u0001\u008c\u0001\u008d\u0001\u008d\u0001"+ + "\u008d\u0001\u008d\u0001\u008e\u0001\u008e\u0001\u008e\u0001\u008e\u0001"+ + "\u008f\u0001\u008f\u0001\u008f\u0001\u008f\u0001\u0090\u0001\u0090\u0001"+ + "\u0090\u0001\u0090\u0001\u0091\u0001\u0091\u0001\u0091\u0001\u0091\u0001"+ + "\u0091\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0092\u0001\u0093\u0001"+ + "\u0093\u0001\u0093\u0001\u0093\u0001\u0094\u0001\u0094\u0001\u0094\u0001"+ + "\u0094\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0095\u0001\u0096\u0001"+ + "\u0096\u0001\u0096\u0001\u0096\u0001\u0097\u0001\u0097\u0001\u0097\u0001"+ + "\u0097\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0098\u0001\u0099\u0001"+ + "\u0099\u0001\u0099\u0001\u0099\u0001\u009a\u0001\u009a\u0001\u009a\u0001"+ + "\u009a\u0001\u009a\u0001\u009b\u0001\u009b\u0001\u009b\u0001\u009b\u0001"+ + "\u009b\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009c\u0001\u009d\u0001"+ + "\u009d\u0001\u009d\u0001\u009d\u0001\u009e\u0001\u009e\u0001\u009e\u0001"+ + "\u009e\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001\u009f\u0001"+ + "\u00a0\u0001\u00a0\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001\u00a1\u0001"+ + "\u00a1\u0004\u00a1\u0517\b\u00a1\u000b\u00a1\f\u00a1\u0518\u0001\u00a2"+ + "\u0001\u00a2\u0001\u00a2\u0001\u00a2\u0001\u00a3\u0001\u00a3\u0001\u00a3"+ + "\u0001\u00a3\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a4\u0001\u00a5"+ + "\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a5\u0001\u00a6\u0001\u00a6"+ + "\u0001\u00a6\u0001\u00a6\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a7"+ "\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a8\u0001\u00a9\u0001\u00a9"+ - "\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ - "\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac\u0001\u00ac"+ - "\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ - "\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ + "\u0001\u00a9\u0001\u00a9\u0001\u00a9\u0001\u00aa\u0001\u00aa\u0001\u00aa"+ + "\u0001\u00aa\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ab\u0001\u00ac"+ + "\u0001\u00ac\u0001\u00ac\u0001\u00ac\u0001\u00ad\u0001\u00ad\u0001\u00ad"+ + "\u0001\u00ad\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00ae\u0001\u00af"+ "\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00af\u0001\u00b0"+ - "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1"+ - "\u0001\u00b1\u0001\u00b1\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2"+ - "\u0001\u00b2\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4"+ - "\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b4\u0001\u00b5"+ - "\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ - "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7\u0001\u00b7"+ - "\u0001\u00b7\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9"+ - "\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00b9\u0001\u00ba"+ - "\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00bb"+ - "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc"+ - "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0002\u024d\u0292\u0000"+ - "\u00bd\u000f\u0001\u0011\u0002\u0013\u0003\u0015\u0004\u0017\u0005\u0019"+ - "\u0006\u001b\u0007\u001d\b\u001f\t!\n#\u000b%\f\'\r)\u000e+\u000f-\u0010"+ - "/\u00111\u00123\u00135\u00147\u00159\u0016;\u0017=\u0018?\u0000A\u0000"+ - "C\u0000E\u0000G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0019U\u001a"+ - "W\u001bY\u001c[\u001d]\u001e_\u001fa c!e\"g#i$k%m&o\'q(s)u*w+y,{-}.\u007f"+ - "/\u00810\u00831\u00852\u00873\u00894\u008b5\u008d6\u008f7\u00918\u0093"+ - "9\u0095:\u0097;\u0099<\u009b=\u009d>\u009f?\u00a1@\u00a3A\u00a5B\u00a7"+ - "C\u00a9\u0000\u00abD\u00adE\u00afF\u00b1G\u00b3\u0000\u00b5\u0000\u00b7"+ - "H\u00b9I\u00bbJ\u00bd\u0000\u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5"+ - "\u0000\u00c7\u0000\u00c9K\u00cb\u0000\u00cdL\u00cf\u0000\u00d1\u0000\u00d3"+ - "M\u00d5N\u00d7O\u00d9\u0000\u00db\u0000\u00dd\u0000\u00df\u0000\u00e1"+ - "\u0000\u00e3P\u00e5Q\u00e7R\u00e9S\u00eb\u0000\u00ed\u0000\u00ef\u0000"+ - "\u00f1\u0000\u00f3T\u00f5\u0000\u00f7U\u00f9V\u00fbW\u00fd\u0000\u00ff"+ - "\u0000\u0101X\u0103Y\u0105\u0000\u0107Z\u0109\u0000\u010b[\u010d\\\u010f"+ - "]\u0111\u0000\u0113\u0000\u0115\u0000\u0117\u0000\u0119\u0000\u011b\u0000"+ - "\u011d\u0000\u011f^\u0121_\u0123`\u0125\u0000\u0127\u0000\u0129\u0000"+ - "\u012b\u0000\u012da\u012fb\u0131c\u0133\u0000\u0135d\u0137e\u0139f\u013b"+ - "g\u013d\u0000\u013fh\u0141i\u0143j\u0145k\u0147l\u0149\u0000\u014b\u0000"+ - "\u014d\u0000\u014f\u0000\u0151\u0000\u0153\u0000\u0155\u0000\u0157m\u0159"+ - "n\u015bo\u015d\u0000\u015f\u0000\u0161\u0000\u0163\u0000\u0165p\u0167"+ - "q\u0169r\u016b\u0000\u016d\u0000\u016f\u0000\u0171s\u0173t\u0175u\u0177"+ - "\u0000\u0179\u0000\u017bv\u017dw\u017fx\u0181\u0000\u0183\u0000\u0185"+ - "\u0000\u0187\u0000\u000f\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"+ - "\b\t\n\u000b\f\r\u000e#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000SS"+ - "ss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+ + "\u0001\u00b0\u0001\u00b0\u0001\u00b0\u0001\u00b1\u0001\u00b1\u0001\u00b1"+ + "\u0001\u00b1\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b2\u0001\u00b3"+ + "\u0001\u00b3\u0001\u00b3\u0001\u00b3\u0001\u00b4\u0001\u00b4\u0001\u00b4"+ + "\u0001\u00b4\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b5\u0001\u00b6"+ + "\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b6\u0001\u00b7\u0001\u00b7"+ + "\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b7\u0001\u00b8\u0001\u00b8"+ + "\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b8\u0001\u00b9\u0001\u00b9"+ + "\u0001\u00b9\u0001\u00b9\u0001\u00ba\u0001\u00ba\u0001\u00ba\u0001\u00ba"+ + "\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc"+ + "\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd"+ + "\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00be\u0001\u00be"+ + "\u0001\u00be\u0001\u00be\u0001\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00bf"+ + "\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001\u00c1\u0001\u00c1"+ + "\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2"+ + "\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3"+ + "\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4"+ + "\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0002\u025d\u02a2\u0000\u00c5\u000f"+ + "\u0001\u0011\u0002\u0013\u0003\u0015\u0004\u0017\u0005\u0019\u0006\u001b"+ + "\u0007\u001d\b\u001f\t!\n#\u000b%\f\'\r)\u000e+\u000f-\u0010/\u00111\u0012"+ + "3\u00135\u00147\u00159\u0016;\u0017=\u0018?\u0000A\u0000C\u0000E\u0000"+ + "G\u0000I\u0000K\u0000M\u0000O\u0000Q\u0000S\u0019U\u001aW\u001bY\u001c"+ + "[\u001d]\u001e_\u001fa c!e\"g#i$k%m&o\'q(s)u*w+y,{-}.\u007f/\u00810\u0083"+ + "1\u00852\u00873\u00894\u008b5\u008d6\u008f7\u00918\u00939\u0095:\u0097"+ + ";\u0099<\u009b=\u009d>\u009f?\u00a1@\u00a3A\u00a5B\u00a7C\u00a9\u0000"+ + "\u00abD\u00adE\u00afF\u00b1G\u00b3\u0000\u00b5\u0000\u00b7H\u00b9I\u00bb"+ + "J\u00bd\u0000\u00bf\u0000\u00c1\u0000\u00c3\u0000\u00c5\u0000\u00c7\u0000"+ + "\u00c9K\u00cb\u0000\u00cdL\u00cf\u0000\u00d1\u0000\u00d3M\u00d5N\u00d7"+ + "O\u00d9\u0000\u00db\u0000\u00dd\u0000\u00df\u0000\u00e1\u0000\u00e3\u0000"+ + "\u00e5\u0000\u00e7P\u00e9Q\u00ebR\u00edS\u00ef\u0000\u00f1\u0000\u00f3"+ + "\u0000\u00f5\u0000\u00f7\u0000\u00f9\u0000\u00fbT\u00fd\u0000\u00ffU\u0101"+ + "V\u0103W\u0105\u0000\u0107\u0000\u0109X\u010bY\u010d\u0000\u010fZ\u0111"+ + "\u0000\u0113[\u0115\\\u0117]\u0119\u0000\u011b\u0000\u011d\u0000\u011f"+ + "\u0000\u0121\u0000\u0123\u0000\u0125\u0000\u0127\u0000\u0129\u0000\u012b"+ + "^\u012d_\u012f`\u0131\u0000\u0133\u0000\u0135\u0000\u0137\u0000\u0139"+ + "\u0000\u013b\u0000\u013da\u013fb\u0141c\u0143\u0000\u0145d\u0147e\u0149"+ + "f\u014bg\u014d\u0000\u014fh\u0151i\u0153j\u0155k\u0157l\u0159\u0000\u015b"+ + "\u0000\u015d\u0000\u015f\u0000\u0161\u0000\u0163\u0000\u0165\u0000\u0167"+ + "m\u0169n\u016bo\u016d\u0000\u016f\u0000\u0171\u0000\u0173\u0000\u0175"+ + "p\u0177q\u0179r\u017b\u0000\u017d\u0000\u017f\u0000\u0181s\u0183t\u0185"+ + "u\u0187\u0000\u0189\u0000\u018bv\u018dw\u018fx\u0191\u0000\u0193\u0000"+ + "\u0195\u0000\u0197\u0000\u000f\u0000\u0001\u0002\u0003\u0004\u0005\u0006"+ + "\u0007\b\t\n\u000b\f\r\u000e#\u0002\u0000DDdd\u0002\u0000IIii\u0002\u0000"+ + "SSss\u0002\u0000EEee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002"+ "\u0000OOoo\u0002\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000"+ "VVvv\u0002\u0000AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002"+ "\u0000MMmm\u0002\u0000GGgg\u0002\u0000KKkk\u0002\u0000WWww\u0002\u0000"+ @@ -482,7 +496,7 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { "\r \u0001\u000009\u0002\u0000AZaz\b\u0000\"\"NNRRTT\\\\nnrrtt\u0004\u0000"+ "\n\n\r\r\"\"\\\\\u0002\u0000++--\u0001\u0000``\u0002\u0000BBbb\u0002\u0000"+ "YYyy\u000b\u0000\t\n\r\r \"\",,//::==[[]]||\u0002\u0000**//\u000b\u0000"+ - "\t\n\r\r \"#,,//::<<>?\\\\||\u05a6\u0000\u000f\u0001\u0000\u0000\u0000"+ + "\t\n\r\r \"#,,//::<<>?\\\\||\u05d6\u0000\u000f\u0001\u0000\u0000\u0000"+ "\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000\u0000"+ "\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000\u0000"+ "\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000\u0000"+ @@ -526,659 +540,682 @@ private boolean DEV_MATCH_sempred(RuleContext _localctx, int predIndex) { "\u00d3\u0001\u0000\u0000\u0000\u0003\u00d5\u0001\u0000\u0000\u0000\u0003"+ "\u00d7\u0001\u0000\u0000\u0000\u0004\u00d9\u0001\u0000\u0000\u0000\u0004"+ "\u00db\u0001\u0000\u0000\u0000\u0004\u00dd\u0001\u0000\u0000\u0000\u0004"+ - "\u00e3\u0001\u0000\u0000\u0000\u0004\u00e5\u0001\u0000\u0000\u0000\u0004"+ - "\u00e7\u0001\u0000\u0000\u0000\u0004\u00e9\u0001\u0000\u0000\u0000\u0005"+ - "\u00eb\u0001\u0000\u0000\u0000\u0005\u00ed\u0001\u0000\u0000\u0000\u0005"+ + "\u00df\u0001\u0000\u0000\u0000\u0004\u00e1\u0001\u0000\u0000\u0000\u0004"+ + "\u00e7\u0001\u0000\u0000\u0000\u0004\u00e9\u0001\u0000\u0000\u0000\u0004"+ + "\u00eb\u0001\u0000\u0000\u0000\u0004\u00ed\u0001\u0000\u0000\u0000\u0005"+ "\u00ef\u0001\u0000\u0000\u0000\u0005\u00f1\u0001\u0000\u0000\u0000\u0005"+ "\u00f3\u0001\u0000\u0000\u0000\u0005\u00f5\u0001\u0000\u0000\u0000\u0005"+ "\u00f7\u0001\u0000\u0000\u0000\u0005\u00f9\u0001\u0000\u0000\u0000\u0005"+ - "\u00fb\u0001\u0000\u0000\u0000\u0006\u00fd\u0001\u0000\u0000\u0000\u0006"+ - "\u00ff\u0001\u0000\u0000\u0000\u0006\u0101\u0001\u0000\u0000\u0000\u0006"+ - "\u0103\u0001\u0000\u0000\u0000\u0006\u0107\u0001\u0000\u0000\u0000\u0006"+ - "\u0109\u0001\u0000\u0000\u0000\u0006\u010b\u0001\u0000\u0000\u0000\u0006"+ - "\u010d\u0001\u0000\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\u0007"+ - "\u0111\u0001\u0000\u0000\u0000\u0007\u0113\u0001\u0000\u0000\u0000\u0007"+ - "\u0115\u0001\u0000\u0000\u0000\u0007\u0117\u0001\u0000\u0000\u0000\u0007"+ + "\u00fb\u0001\u0000\u0000\u0000\u0005\u00fd\u0001\u0000\u0000\u0000\u0005"+ + "\u00ff\u0001\u0000\u0000\u0000\u0005\u0101\u0001\u0000\u0000\u0000\u0005"+ + "\u0103\u0001\u0000\u0000\u0000\u0006\u0105\u0001\u0000\u0000\u0000\u0006"+ + "\u0107\u0001\u0000\u0000\u0000\u0006\u0109\u0001\u0000\u0000\u0000\u0006"+ + "\u010b\u0001\u0000\u0000\u0000\u0006\u010f\u0001\u0000\u0000\u0000\u0006"+ + "\u0111\u0001\u0000\u0000\u0000\u0006\u0113\u0001\u0000\u0000\u0000\u0006"+ + "\u0115\u0001\u0000\u0000\u0000\u0006\u0117\u0001\u0000\u0000\u0000\u0007"+ "\u0119\u0001\u0000\u0000\u0000\u0007\u011b\u0001\u0000\u0000\u0000\u0007"+ "\u011d\u0001\u0000\u0000\u0000\u0007\u011f\u0001\u0000\u0000\u0000\u0007"+ - "\u0121\u0001\u0000\u0000\u0000\u0007\u0123\u0001\u0000\u0000\u0000\b\u0125"+ - "\u0001\u0000\u0000\u0000\b\u0127\u0001\u0000\u0000\u0000\b\u0129\u0001"+ - "\u0000\u0000\u0000\b\u012b\u0001\u0000\u0000\u0000\b\u012d\u0001\u0000"+ - "\u0000\u0000\b\u012f\u0001\u0000\u0000\u0000\b\u0131\u0001\u0000\u0000"+ - "\u0000\t\u0133\u0001\u0000\u0000\u0000\t\u0135\u0001\u0000\u0000\u0000"+ - "\t\u0137\u0001\u0000\u0000\u0000\t\u0139\u0001\u0000\u0000\u0000\t\u013b"+ - "\u0001\u0000\u0000\u0000\n\u013d\u0001\u0000\u0000\u0000\n\u013f\u0001"+ - "\u0000\u0000\u0000\n\u0141\u0001\u0000\u0000\u0000\n\u0143\u0001\u0000"+ - "\u0000\u0000\n\u0145\u0001\u0000\u0000\u0000\n\u0147\u0001\u0000\u0000"+ - "\u0000\u000b\u0149\u0001\u0000\u0000\u0000\u000b\u014b\u0001\u0000\u0000"+ - "\u0000\u000b\u014d\u0001\u0000\u0000\u0000\u000b\u014f\u0001\u0000\u0000"+ - "\u0000\u000b\u0151\u0001\u0000\u0000\u0000\u000b\u0153\u0001\u0000\u0000"+ - "\u0000\u000b\u0155\u0001\u0000\u0000\u0000\u000b\u0157\u0001\u0000\u0000"+ - "\u0000\u000b\u0159\u0001\u0000\u0000\u0000\u000b\u015b\u0001\u0000\u0000"+ - "\u0000\f\u015d\u0001\u0000\u0000\u0000\f\u015f\u0001\u0000\u0000\u0000"+ - "\f\u0161\u0001\u0000\u0000\u0000\f\u0163\u0001\u0000\u0000\u0000\f\u0165"+ - "\u0001\u0000\u0000\u0000\f\u0167\u0001\u0000\u0000\u0000\f\u0169\u0001"+ - "\u0000\u0000\u0000\r\u016b\u0001\u0000\u0000\u0000\r\u016d\u0001\u0000"+ - "\u0000\u0000\r\u016f\u0001\u0000\u0000\u0000\r\u0171\u0001\u0000\u0000"+ - "\u0000\r\u0173\u0001\u0000\u0000\u0000\r\u0175\u0001\u0000\u0000\u0000"+ - "\u000e\u0177\u0001\u0000\u0000\u0000\u000e\u0179\u0001\u0000\u0000\u0000"+ - "\u000e\u017b\u0001\u0000\u0000\u0000\u000e\u017d\u0001\u0000\u0000\u0000"+ - "\u000e\u017f\u0001\u0000\u0000\u0000\u000e\u0181\u0001\u0000\u0000\u0000"+ - "\u000e\u0183\u0001\u0000\u0000\u0000\u000e\u0185\u0001\u0000\u0000\u0000"+ - "\u000e\u0187\u0001\u0000\u0000\u0000\u000f\u0189\u0001\u0000\u0000\u0000"+ - "\u0011\u0193\u0001\u0000\u0000\u0000\u0013\u019a\u0001\u0000\u0000\u0000"+ - "\u0015\u01a3\u0001\u0000\u0000\u0000\u0017\u01aa\u0001\u0000\u0000\u0000"+ - "\u0019\u01b4\u0001\u0000\u0000\u0000\u001b\u01bb\u0001\u0000\u0000\u0000"+ - "\u001d\u01c2\u0001\u0000\u0000\u0000\u001f\u01c9\u0001\u0000\u0000\u0000"+ - "!\u01d1\u0001\u0000\u0000\u0000#\u01dd\u0001\u0000\u0000\u0000%\u01e6"+ - "\u0001\u0000\u0000\u0000\'\u01ec\u0001\u0000\u0000\u0000)\u01f3\u0001"+ - "\u0000\u0000\u0000+\u01fa\u0001\u0000\u0000\u0000-\u0202\u0001\u0000\u0000"+ - "\u0000/\u020a\u0001\u0000\u0000\u00001\u0219\u0001\u0000\u0000\u00003"+ - "\u0223\u0001\u0000\u0000\u00005\u022f\u0001\u0000\u0000\u00007\u0235\u0001"+ - "\u0000\u0000\u00009\u0246\u0001\u0000\u0000\u0000;\u0256\u0001\u0000\u0000"+ - "\u0000=\u025c\u0001\u0000\u0000\u0000?\u0260\u0001\u0000\u0000\u0000A"+ - "\u0262\u0001\u0000\u0000\u0000C\u0264\u0001\u0000\u0000\u0000E\u0267\u0001"+ - "\u0000\u0000\u0000G\u0269\u0001\u0000\u0000\u0000I\u0272\u0001\u0000\u0000"+ - "\u0000K\u0274\u0001\u0000\u0000\u0000M\u0279\u0001\u0000\u0000\u0000O"+ - "\u027b\u0001\u0000\u0000\u0000Q\u0280\u0001\u0000\u0000\u0000S\u029f\u0001"+ - "\u0000\u0000\u0000U\u02a2\u0001\u0000\u0000\u0000W\u02d0\u0001\u0000\u0000"+ - "\u0000Y\u02d2\u0001\u0000\u0000\u0000[\u02d5\u0001\u0000\u0000\u0000]"+ - "\u02d9\u0001\u0000\u0000\u0000_\u02dd\u0001\u0000\u0000\u0000a\u02df\u0001"+ - "\u0000\u0000\u0000c\u02e2\u0001\u0000\u0000\u0000e\u02e4\u0001\u0000\u0000"+ - "\u0000g\u02e9\u0001\u0000\u0000\u0000i\u02eb\u0001\u0000\u0000\u0000k"+ - "\u02f1\u0001\u0000\u0000\u0000m\u02f7\u0001\u0000\u0000\u0000o\u02fa\u0001"+ - "\u0000\u0000\u0000q\u02fd\u0001\u0000\u0000\u0000s\u0302\u0001\u0000\u0000"+ - "\u0000u\u0307\u0001\u0000\u0000\u0000w\u0309\u0001\u0000\u0000\u0000y"+ - "\u030d\u0001\u0000\u0000\u0000{\u0312\u0001\u0000\u0000\u0000}\u0318\u0001"+ - "\u0000\u0000\u0000\u007f\u031b\u0001\u0000\u0000\u0000\u0081\u031d\u0001"+ - "\u0000\u0000\u0000\u0083\u0323\u0001\u0000\u0000\u0000\u0085\u0325\u0001"+ - "\u0000\u0000\u0000\u0087\u032a\u0001\u0000\u0000\u0000\u0089\u032d\u0001"+ - "\u0000\u0000\u0000\u008b\u0330\u0001\u0000\u0000\u0000\u008d\u0333\u0001"+ - "\u0000\u0000\u0000\u008f\u0335\u0001\u0000\u0000\u0000\u0091\u0338\u0001"+ - "\u0000\u0000\u0000\u0093\u033a\u0001\u0000\u0000\u0000\u0095\u033d\u0001"+ - "\u0000\u0000\u0000\u0097\u033f\u0001\u0000\u0000\u0000\u0099\u0341\u0001"+ - "\u0000\u0000\u0000\u009b\u0343\u0001\u0000\u0000\u0000\u009d\u0345\u0001"+ - "\u0000\u0000\u0000\u009f\u0347\u0001\u0000\u0000\u0000\u00a1\u035f\u0001"+ - "\u0000\u0000\u0000\u00a3\u0361\u0001\u0000\u0000\u0000\u00a5\u0366\u0001"+ - "\u0000\u0000\u0000\u00a7\u037b\u0001\u0000\u0000\u0000\u00a9\u037d\u0001"+ - "\u0000\u0000\u0000\u00ab\u0385\u0001\u0000\u0000\u0000\u00ad\u0387\u0001"+ - "\u0000\u0000\u0000\u00af\u038b\u0001\u0000\u0000\u0000\u00b1\u038f\u0001"+ - "\u0000\u0000\u0000\u00b3\u0393\u0001\u0000\u0000\u0000\u00b5\u0398\u0001"+ - "\u0000\u0000\u0000\u00b7\u039d\u0001\u0000\u0000\u0000\u00b9\u03a1\u0001"+ - "\u0000\u0000\u0000\u00bb\u03a5\u0001\u0000\u0000\u0000\u00bd\u03a9\u0001"+ - "\u0000\u0000\u0000\u00bf\u03ae\u0001\u0000\u0000\u0000\u00c1\u03b2\u0001"+ - "\u0000\u0000\u0000\u00c3\u03b6\u0001\u0000\u0000\u0000\u00c5\u03ba\u0001"+ - "\u0000\u0000\u0000\u00c7\u03be\u0001\u0000\u0000\u0000\u00c9\u03c2\u0001"+ - "\u0000\u0000\u0000\u00cb\u03ce\u0001\u0000\u0000\u0000\u00cd\u03d1\u0001"+ - "\u0000\u0000\u0000\u00cf\u03d5\u0001\u0000\u0000\u0000\u00d1\u03d9\u0001"+ - "\u0000\u0000\u0000\u00d3\u03dd\u0001\u0000\u0000\u0000\u00d5\u03e1\u0001"+ - "\u0000\u0000\u0000\u00d7\u03e5\u0001\u0000\u0000\u0000\u00d9\u03e9\u0001"+ - "\u0000\u0000\u0000\u00db\u03ee\u0001\u0000\u0000\u0000\u00dd\u03f2\u0001"+ - "\u0000\u0000\u0000\u00df\u03fa\u0001\u0000\u0000\u0000\u00e1\u040f\u0001"+ - "\u0000\u0000\u0000\u00e3\u0413\u0001\u0000\u0000\u0000\u00e5\u0417\u0001"+ - "\u0000\u0000\u0000\u00e7\u041b\u0001\u0000\u0000\u0000\u00e9\u041f\u0001"+ - "\u0000\u0000\u0000\u00eb\u0423\u0001\u0000\u0000\u0000\u00ed\u0428\u0001"+ - "\u0000\u0000\u0000\u00ef\u042c\u0001\u0000\u0000\u0000\u00f1\u0430\u0001"+ - "\u0000\u0000\u0000\u00f3\u0434\u0001\u0000\u0000\u0000\u00f5\u0437\u0001"+ - "\u0000\u0000\u0000\u00f7\u043b\u0001\u0000\u0000\u0000\u00f9\u043f\u0001"+ - "\u0000\u0000\u0000\u00fb\u0443\u0001\u0000\u0000\u0000\u00fd\u0447\u0001"+ - "\u0000\u0000\u0000\u00ff\u044c\u0001\u0000\u0000\u0000\u0101\u0451\u0001"+ - "\u0000\u0000\u0000\u0103\u0456\u0001\u0000\u0000\u0000\u0105\u045d\u0001"+ - "\u0000\u0000\u0000\u0107\u0466\u0001\u0000\u0000\u0000\u0109\u046d\u0001"+ - "\u0000\u0000\u0000\u010b\u0471\u0001\u0000\u0000\u0000\u010d\u0475\u0001"+ - "\u0000\u0000\u0000\u010f\u0479\u0001\u0000\u0000\u0000\u0111\u047d\u0001"+ - "\u0000\u0000\u0000\u0113\u0483\u0001\u0000\u0000\u0000\u0115\u0487\u0001"+ - "\u0000\u0000\u0000\u0117\u048b\u0001\u0000\u0000\u0000\u0119\u048f\u0001"+ - "\u0000\u0000\u0000\u011b\u0493\u0001\u0000\u0000\u0000\u011d\u0497\u0001"+ - "\u0000\u0000\u0000\u011f\u049b\u0001\u0000\u0000\u0000\u0121\u049f\u0001"+ - "\u0000\u0000\u0000\u0123\u04a3\u0001\u0000\u0000\u0000\u0125\u04a7\u0001"+ - "\u0000\u0000\u0000\u0127\u04ac\u0001\u0000\u0000\u0000\u0129\u04b0\u0001"+ - "\u0000\u0000\u0000\u012b\u04b4\u0001\u0000\u0000\u0000\u012d\u04b8\u0001"+ - "\u0000\u0000\u0000\u012f\u04bc\u0001\u0000\u0000\u0000\u0131\u04c0\u0001"+ - "\u0000\u0000\u0000\u0133\u04c4\u0001\u0000\u0000\u0000\u0135\u04c9\u0001"+ - "\u0000\u0000\u0000\u0137\u04ce\u0001\u0000\u0000\u0000\u0139\u04d2\u0001"+ - "\u0000\u0000\u0000\u013b\u04d6\u0001\u0000\u0000\u0000\u013d\u04da\u0001"+ - "\u0000\u0000\u0000\u013f\u04df\u0001\u0000\u0000\u0000\u0141\u04e6\u0001"+ - "\u0000\u0000\u0000\u0143\u04ea\u0001\u0000\u0000\u0000\u0145\u04ee\u0001"+ - "\u0000\u0000\u0000\u0147\u04f2\u0001\u0000\u0000\u0000\u0149\u04f6\u0001"+ - "\u0000\u0000\u0000\u014b\u04fb\u0001\u0000\u0000\u0000\u014d\u04ff\u0001"+ - "\u0000\u0000\u0000\u014f\u0503\u0001\u0000\u0000\u0000\u0151\u0507\u0001"+ - "\u0000\u0000\u0000\u0153\u050c\u0001\u0000\u0000\u0000\u0155\u0510\u0001"+ - "\u0000\u0000\u0000\u0157\u0514\u0001\u0000\u0000\u0000\u0159\u0518\u0001"+ - "\u0000\u0000\u0000\u015b\u051c\u0001\u0000\u0000\u0000\u015d\u0520\u0001"+ - "\u0000\u0000\u0000\u015f\u0526\u0001\u0000\u0000\u0000\u0161\u052a\u0001"+ - "\u0000\u0000\u0000\u0163\u052e\u0001\u0000\u0000\u0000\u0165\u0532\u0001"+ - "\u0000\u0000\u0000\u0167\u0536\u0001\u0000\u0000\u0000\u0169\u053a\u0001"+ - "\u0000\u0000\u0000\u016b\u053e\u0001\u0000\u0000\u0000\u016d\u0543\u0001"+ - "\u0000\u0000\u0000\u016f\u0549\u0001\u0000\u0000\u0000\u0171\u054f\u0001"+ - "\u0000\u0000\u0000\u0173\u0553\u0001\u0000\u0000\u0000\u0175\u0557\u0001"+ - "\u0000\u0000\u0000\u0177\u055b\u0001\u0000\u0000\u0000\u0179\u0561\u0001"+ - "\u0000\u0000\u0000\u017b\u0567\u0001\u0000\u0000\u0000\u017d\u056b\u0001"+ - "\u0000\u0000\u0000\u017f\u056f\u0001\u0000\u0000\u0000\u0181\u0573\u0001"+ - "\u0000\u0000\u0000\u0183\u0579\u0001\u0000\u0000\u0000\u0185\u057f\u0001"+ - "\u0000\u0000\u0000\u0187\u0585\u0001\u0000\u0000\u0000\u0189\u018a\u0007"+ - "\u0000\u0000\u0000\u018a\u018b\u0007\u0001\u0000\u0000\u018b\u018c\u0007"+ - "\u0002\u0000\u0000\u018c\u018d\u0007\u0002\u0000\u0000\u018d\u018e\u0007"+ - "\u0003\u0000\u0000\u018e\u018f\u0007\u0004\u0000\u0000\u018f\u0190\u0007"+ - "\u0005\u0000\u0000\u0190\u0191\u0001\u0000\u0000\u0000\u0191\u0192\u0006"+ - "\u0000\u0000\u0000\u0192\u0010\u0001\u0000\u0000\u0000\u0193\u0194\u0007"+ - "\u0000\u0000\u0000\u0194\u0195\u0007\u0006\u0000\u0000\u0195\u0196\u0007"+ - "\u0007\u0000\u0000\u0196\u0197\u0007\b\u0000\u0000\u0197\u0198\u0001\u0000"+ - "\u0000\u0000\u0198\u0199\u0006\u0001\u0001\u0000\u0199\u0012\u0001\u0000"+ - "\u0000\u0000\u019a\u019b\u0007\u0003\u0000\u0000\u019b\u019c\u0007\t\u0000"+ - "\u0000\u019c\u019d\u0007\u0006\u0000\u0000\u019d\u019e\u0007\u0001\u0000"+ - "\u0000\u019e\u019f\u0007\u0004\u0000\u0000\u019f\u01a0\u0007\n\u0000\u0000"+ - "\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a2\u0006\u0002\u0002\u0000"+ - "\u01a2\u0014\u0001\u0000\u0000\u0000\u01a3\u01a4\u0007\u0003\u0000\u0000"+ - "\u01a4\u01a5\u0007\u000b\u0000\u0000\u01a5\u01a6\u0007\f\u0000\u0000\u01a6"+ - "\u01a7\u0007\r\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000\u01a8\u01a9"+ - "\u0006\u0003\u0000\u0000\u01a9\u0016\u0001\u0000\u0000\u0000\u01aa\u01ab"+ - "\u0007\u0003\u0000\u0000\u01ab\u01ac\u0007\u000e\u0000\u0000\u01ac\u01ad"+ - "\u0007\b\u0000\u0000\u01ad\u01ae\u0007\r\u0000\u0000\u01ae\u01af\u0007"+ - "\f\u0000\u0000\u01af\u01b0\u0007\u0001\u0000\u0000\u01b0\u01b1\u0007\t"+ - "\u0000\u0000\u01b1\u01b2\u0001\u0000\u0000\u0000\u01b2\u01b3\u0006\u0004"+ - "\u0003\u0000\u01b3\u0018\u0001\u0000\u0000\u0000\u01b4\u01b5\u0007\u000f"+ - "\u0000\u0000\u01b5\u01b6\u0007\u0006\u0000\u0000\u01b6\u01b7\u0007\u0007"+ - "\u0000\u0000\u01b7\u01b8\u0007\u0010\u0000\u0000\u01b8\u01b9\u0001\u0000"+ - "\u0000\u0000\u01b9\u01ba\u0006\u0005\u0004\u0000\u01ba\u001a\u0001\u0000"+ - "\u0000\u0000\u01bb\u01bc\u0007\u0011\u0000\u0000\u01bc\u01bd\u0007\u0006"+ - "\u0000\u0000\u01bd\u01be\u0007\u0007\u0000\u0000\u01be\u01bf\u0007\u0012"+ - "\u0000\u0000\u01bf\u01c0\u0001\u0000\u0000\u0000\u01c0\u01c1\u0006\u0006"+ - "\u0000\u0000\u01c1\u001c\u0001\u0000\u0000\u0000\u01c2\u01c3\u0007\u0012"+ - "\u0000\u0000\u01c3\u01c4\u0007\u0003\u0000\u0000\u01c4\u01c5\u0007\u0003"+ - "\u0000\u0000\u01c5\u01c6\u0007\b\u0000\u0000\u01c6\u01c7\u0001\u0000\u0000"+ - "\u0000\u01c7\u01c8\u0006\u0007\u0001\u0000\u01c8\u001e\u0001\u0000\u0000"+ - "\u0000\u01c9\u01ca\u0007\r\u0000\u0000\u01ca\u01cb\u0007\u0001\u0000\u0000"+ - "\u01cb\u01cc\u0007\u0010\u0000\u0000\u01cc\u01cd\u0007\u0001\u0000\u0000"+ - "\u01cd\u01ce\u0007\u0005\u0000\u0000\u01ce\u01cf\u0001\u0000\u0000\u0000"+ - "\u01cf\u01d0\u0006\b\u0000\u0000\u01d0 \u0001\u0000\u0000\u0000\u01d1"+ - "\u01d2\u0007\u0010\u0000\u0000\u01d2\u01d3\u0007\u000b\u0000\u0000\u01d3"+ - "\u01d4\u0005_\u0000\u0000\u01d4\u01d5\u0007\u0003\u0000\u0000\u01d5\u01d6"+ - "\u0007\u000e\u0000\u0000\u01d6\u01d7\u0007\b\u0000\u0000\u01d7\u01d8\u0007"+ - "\f\u0000\u0000\u01d8\u01d9\u0007\t\u0000\u0000\u01d9\u01da\u0007\u0000"+ - "\u0000\u0000\u01da\u01db\u0001\u0000\u0000\u0000\u01db\u01dc\u0006\t\u0005"+ - "\u0000\u01dc\"\u0001\u0000\u0000\u0000\u01dd\u01de\u0007\u0006\u0000\u0000"+ - "\u01de\u01df\u0007\u0003\u0000\u0000\u01df\u01e0\u0007\t\u0000\u0000\u01e0"+ - "\u01e1\u0007\f\u0000\u0000\u01e1\u01e2\u0007\u0010\u0000\u0000\u01e2\u01e3"+ - "\u0007\u0003\u0000\u0000\u01e3\u01e4\u0001\u0000\u0000\u0000\u01e4\u01e5"+ - "\u0006\n\u0006\u0000\u01e5$\u0001\u0000\u0000\u0000\u01e6\u01e7\u0007"+ - "\u0006\u0000\u0000\u01e7\u01e8\u0007\u0007\u0000\u0000\u01e8\u01e9\u0007"+ - "\u0013\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01ea\u01eb\u0006"+ - "\u000b\u0000\u0000\u01eb&\u0001\u0000\u0000\u0000\u01ec\u01ed\u0007\u0002"+ - "\u0000\u0000\u01ed\u01ee\u0007\n\u0000\u0000\u01ee\u01ef\u0007\u0007\u0000"+ - "\u0000\u01ef\u01f0\u0007\u0013\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000"+ - "\u0000\u01f1\u01f2\u0006\f\u0007\u0000\u01f2(\u0001\u0000\u0000\u0000"+ - "\u01f3\u01f4\u0007\u0002\u0000\u0000\u01f4\u01f5\u0007\u0007\u0000\u0000"+ - "\u01f5\u01f6\u0007\u0006\u0000\u0000\u01f6\u01f7\u0007\u0005\u0000\u0000"+ - "\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8\u01f9\u0006\r\u0000\u0000\u01f9"+ - "*\u0001\u0000\u0000\u0000\u01fa\u01fb\u0007\u0002\u0000\u0000\u01fb\u01fc"+ - "\u0007\u0005\u0000\u0000\u01fc\u01fd\u0007\f\u0000\u0000\u01fd\u01fe\u0007"+ - "\u0005\u0000\u0000\u01fe\u01ff\u0007\u0002\u0000\u0000\u01ff\u0200\u0001"+ - "\u0000\u0000\u0000\u0200\u0201\u0006\u000e\u0000\u0000\u0201,\u0001\u0000"+ - "\u0000\u0000\u0202\u0203\u0007\u0013\u0000\u0000\u0203\u0204\u0007\n\u0000"+ - "\u0000\u0204\u0205\u0007\u0003\u0000\u0000\u0205\u0206\u0007\u0006\u0000"+ - "\u0000\u0206\u0207\u0007\u0003\u0000\u0000\u0207\u0208\u0001\u0000\u0000"+ - "\u0000\u0208\u0209\u0006\u000f\u0000\u0000\u0209.\u0001\u0000\u0000\u0000"+ - "\u020a\u020b\u0004\u0010\u0000\u0000\u020b\u020c\u0007\u0001\u0000\u0000"+ - "\u020c\u020d\u0007\t\u0000\u0000\u020d\u020e\u0007\r\u0000\u0000\u020e"+ - "\u020f\u0007\u0001\u0000\u0000\u020f\u0210\u0007\t\u0000\u0000\u0210\u0211"+ - "\u0007\u0003\u0000\u0000\u0211\u0212\u0007\u0002\u0000\u0000\u0212\u0213"+ - "\u0007\u0005\u0000\u0000\u0213\u0214\u0007\f\u0000\u0000\u0214\u0215\u0007"+ - "\u0005\u0000\u0000\u0215\u0216\u0007\u0002\u0000\u0000\u0216\u0217\u0001"+ - "\u0000\u0000\u0000\u0217\u0218\u0006\u0010\u0000\u0000\u02180\u0001\u0000"+ - "\u0000\u0000\u0219\u021a\u0004\u0011\u0001\u0000\u021a\u021b\u0007\r\u0000"+ - "\u0000\u021b\u021c\u0007\u0007\u0000\u0000\u021c\u021d\u0007\u0007\u0000"+ - "\u0000\u021d\u021e\u0007\u0012\u0000\u0000\u021e\u021f\u0007\u0014\u0000"+ - "\u0000\u021f\u0220\u0007\b\u0000\u0000\u0220\u0221\u0001\u0000\u0000\u0000"+ - "\u0221\u0222\u0006\u0011\b\u0000\u02222\u0001\u0000\u0000\u0000\u0223"+ - "\u0224\u0004\u0012\u0002\u0000\u0224\u0225\u0007\u0010\u0000\u0000\u0225"+ - "\u0226\u0007\u0003\u0000\u0000\u0226\u0227\u0007\u0005\u0000\u0000\u0227"+ - "\u0228\u0007\u0006\u0000\u0000\u0228\u0229\u0007\u0001\u0000\u0000\u0229"+ - "\u022a\u0007\u0004\u0000\u0000\u022a\u022b\u0007\u0002\u0000\u0000\u022b"+ - "\u022c\u0001\u0000\u0000\u0000\u022c\u022d\u0006\u0012\t\u0000\u022d4"+ - "\u0001\u0000\u0000\u0000\u022e\u0230\b\u0015\u0000\u0000\u022f\u022e\u0001"+ - "\u0000\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231\u022f\u0001"+ - "\u0000\u0000\u0000\u0231\u0232\u0001\u0000\u0000\u0000\u0232\u0233\u0001"+ - "\u0000\u0000\u0000\u0233\u0234\u0006\u0013\u0000\u0000\u02346\u0001\u0000"+ - "\u0000\u0000\u0235\u0236\u0005/\u0000\u0000\u0236\u0237\u0005/\u0000\u0000"+ - "\u0237\u023b\u0001\u0000\u0000\u0000\u0238\u023a\b\u0016\u0000\u0000\u0239"+ - "\u0238\u0001\u0000\u0000\u0000\u023a\u023d\u0001\u0000\u0000\u0000\u023b"+ - "\u0239\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000\u0000\u023c"+ - "\u023f\u0001\u0000\u0000\u0000\u023d\u023b\u0001\u0000\u0000\u0000\u023e"+ - "\u0240\u0005\r\u0000\u0000\u023f\u023e\u0001\u0000\u0000\u0000\u023f\u0240"+ - "\u0001\u0000\u0000\u0000\u0240\u0242\u0001\u0000\u0000\u0000\u0241\u0243"+ - "\u0005\n\u0000\u0000\u0242\u0241\u0001\u0000\u0000\u0000\u0242\u0243\u0001"+ - "\u0000\u0000\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0245\u0006"+ - "\u0014\n\u0000\u02458\u0001\u0000\u0000\u0000\u0246\u0247\u0005/\u0000"+ - "\u0000\u0247\u0248\u0005*\u0000\u0000\u0248\u024d\u0001\u0000\u0000\u0000"+ - "\u0249\u024c\u00039\u0015\u0000\u024a\u024c\t\u0000\u0000\u0000\u024b"+ - "\u0249\u0001\u0000\u0000\u0000\u024b\u024a\u0001\u0000\u0000\u0000\u024c"+ - "\u024f\u0001\u0000\u0000\u0000\u024d\u024e\u0001\u0000\u0000\u0000\u024d"+ - "\u024b\u0001\u0000\u0000\u0000\u024e\u0250\u0001\u0000\u0000\u0000\u024f"+ - "\u024d\u0001\u0000\u0000\u0000\u0250\u0251\u0005*\u0000\u0000\u0251\u0252"+ - "\u0005/\u0000\u0000\u0252\u0253\u0001\u0000\u0000\u0000\u0253\u0254\u0006"+ - "\u0015\n\u0000\u0254:\u0001\u0000\u0000\u0000\u0255\u0257\u0007\u0017"+ - "\u0000\u0000\u0256\u0255\u0001\u0000\u0000\u0000\u0257\u0258\u0001\u0000"+ - "\u0000\u0000\u0258\u0256\u0001\u0000\u0000\u0000\u0258\u0259\u0001\u0000"+ - "\u0000\u0000\u0259\u025a\u0001\u0000\u0000\u0000\u025a\u025b\u0006\u0016"+ - "\n\u0000\u025b<\u0001\u0000\u0000\u0000\u025c\u025d\u0005|\u0000\u0000"+ - "\u025d\u025e\u0001\u0000\u0000\u0000\u025e\u025f\u0006\u0017\u000b\u0000"+ - "\u025f>\u0001\u0000\u0000\u0000\u0260\u0261\u0007\u0018\u0000\u0000\u0261"+ - "@\u0001\u0000\u0000\u0000\u0262\u0263\u0007\u0019\u0000\u0000\u0263B\u0001"+ - "\u0000\u0000\u0000\u0264\u0265\u0005\\\u0000\u0000\u0265\u0266\u0007\u001a"+ - "\u0000\u0000\u0266D\u0001\u0000\u0000\u0000\u0267\u0268\b\u001b\u0000"+ - "\u0000\u0268F\u0001\u0000\u0000\u0000\u0269\u026b\u0007\u0003\u0000\u0000"+ - "\u026a\u026c\u0007\u001c\u0000\u0000\u026b\u026a\u0001\u0000\u0000\u0000"+ - "\u026b\u026c\u0001\u0000\u0000\u0000\u026c\u026e\u0001\u0000\u0000\u0000"+ - "\u026d\u026f\u0003?\u0018\u0000\u026e\u026d\u0001\u0000\u0000\u0000\u026f"+ - "\u0270\u0001\u0000\u0000\u0000\u0270\u026e\u0001\u0000\u0000\u0000\u0270"+ - "\u0271\u0001\u0000\u0000\u0000\u0271H\u0001\u0000\u0000\u0000\u0272\u0273"+ - "\u0005@\u0000\u0000\u0273J\u0001\u0000\u0000\u0000\u0274\u0275\u0005`"+ - "\u0000\u0000\u0275L\u0001\u0000\u0000\u0000\u0276\u027a\b\u001d\u0000"+ - "\u0000\u0277\u0278\u0005`\u0000\u0000\u0278\u027a\u0005`\u0000\u0000\u0279"+ - "\u0276\u0001\u0000\u0000\u0000\u0279\u0277\u0001\u0000\u0000\u0000\u027a"+ - "N\u0001\u0000\u0000\u0000\u027b\u027c\u0005_\u0000\u0000\u027cP\u0001"+ - "\u0000\u0000\u0000\u027d\u0281\u0003A\u0019\u0000\u027e\u0281\u0003?\u0018"+ - "\u0000\u027f\u0281\u0003O \u0000\u0280\u027d\u0001\u0000\u0000\u0000\u0280"+ - "\u027e\u0001\u0000\u0000\u0000\u0280\u027f\u0001\u0000\u0000\u0000\u0281"+ - "R\u0001\u0000\u0000\u0000\u0282\u0287\u0005\"\u0000\u0000\u0283\u0286"+ - "\u0003C\u001a\u0000\u0284\u0286\u0003E\u001b\u0000\u0285\u0283\u0001\u0000"+ - "\u0000\u0000\u0285\u0284\u0001\u0000\u0000\u0000\u0286\u0289\u0001\u0000"+ - "\u0000\u0000\u0287\u0285\u0001\u0000\u0000\u0000\u0287\u0288\u0001\u0000"+ - "\u0000\u0000\u0288\u028a\u0001\u0000\u0000\u0000\u0289\u0287\u0001\u0000"+ - "\u0000\u0000\u028a\u02a0\u0005\"\u0000\u0000\u028b\u028c\u0005\"\u0000"+ - "\u0000\u028c\u028d\u0005\"\u0000\u0000\u028d\u028e\u0005\"\u0000\u0000"+ - "\u028e\u0292\u0001\u0000\u0000\u0000\u028f\u0291\b\u0016\u0000\u0000\u0290"+ - "\u028f\u0001\u0000\u0000\u0000\u0291\u0294\u0001\u0000\u0000\u0000\u0292"+ - "\u0293\u0001\u0000\u0000\u0000\u0292\u0290\u0001\u0000\u0000\u0000\u0293"+ - "\u0295\u0001\u0000\u0000\u0000\u0294\u0292\u0001\u0000\u0000\u0000\u0295"+ - "\u0296\u0005\"\u0000\u0000\u0296\u0297\u0005\"\u0000\u0000\u0297\u0298"+ - "\u0005\"\u0000\u0000\u0298\u029a\u0001\u0000\u0000\u0000\u0299\u029b\u0005"+ - "\"\u0000\u0000\u029a\u0299\u0001\u0000\u0000\u0000\u029a\u029b\u0001\u0000"+ - "\u0000\u0000\u029b\u029d\u0001\u0000\u0000\u0000\u029c\u029e\u0005\"\u0000"+ - "\u0000\u029d\u029c\u0001\u0000\u0000\u0000\u029d\u029e\u0001\u0000\u0000"+ - "\u0000\u029e\u02a0\u0001\u0000\u0000\u0000\u029f\u0282\u0001\u0000\u0000"+ - "\u0000\u029f\u028b\u0001\u0000\u0000\u0000\u02a0T\u0001\u0000\u0000\u0000"+ - "\u02a1\u02a3\u0003?\u0018\u0000\u02a2\u02a1\u0001\u0000\u0000\u0000\u02a3"+ - "\u02a4\u0001\u0000\u0000\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a4"+ - "\u02a5\u0001\u0000\u0000\u0000\u02a5V\u0001\u0000\u0000\u0000\u02a6\u02a8"+ - "\u0003?\u0018\u0000\u02a7\u02a6\u0001\u0000\u0000\u0000\u02a8\u02a9\u0001"+ - "\u0000\u0000\u0000\u02a9\u02a7\u0001\u0000\u0000\u0000\u02a9\u02aa\u0001"+ - "\u0000\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02af\u0003"+ - "g,\u0000\u02ac\u02ae\u0003?\u0018\u0000\u02ad\u02ac\u0001\u0000\u0000"+ - "\u0000\u02ae\u02b1\u0001\u0000\u0000\u0000\u02af\u02ad\u0001\u0000\u0000"+ - "\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02d1\u0001\u0000\u0000"+ - "\u0000\u02b1\u02af\u0001\u0000\u0000\u0000\u02b2\u02b4\u0003g,\u0000\u02b3"+ - "\u02b5\u0003?\u0018\u0000\u02b4\u02b3\u0001\u0000\u0000\u0000\u02b5\u02b6"+ - "\u0001\u0000\u0000\u0000\u02b6\u02b4\u0001\u0000\u0000\u0000\u02b6\u02b7"+ - "\u0001\u0000\u0000\u0000\u02b7\u02d1\u0001\u0000\u0000\u0000\u02b8\u02ba"+ - "\u0003?\u0018\u0000\u02b9\u02b8\u0001\u0000\u0000\u0000\u02ba\u02bb\u0001"+ - "\u0000\u0000\u0000\u02bb\u02b9\u0001\u0000\u0000\u0000\u02bb\u02bc\u0001"+ - "\u0000\u0000\u0000\u02bc\u02c4\u0001\u0000\u0000\u0000\u02bd\u02c1\u0003"+ - "g,\u0000\u02be\u02c0\u0003?\u0018\u0000\u02bf\u02be\u0001\u0000\u0000"+ - "\u0000\u02c0\u02c3\u0001\u0000\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000"+ - "\u0000\u02c1\u02c2\u0001\u0000\u0000\u0000\u02c2\u02c5\u0001\u0000\u0000"+ - "\u0000\u02c3\u02c1\u0001\u0000\u0000\u0000\u02c4\u02bd\u0001\u0000\u0000"+ - "\u0000\u02c4\u02c5\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000"+ - "\u0000\u02c6\u02c7\u0003G\u001c\u0000\u02c7\u02d1\u0001\u0000\u0000\u0000"+ - "\u02c8\u02ca\u0003g,\u0000\u02c9\u02cb\u0003?\u0018\u0000\u02ca\u02c9"+ - "\u0001\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u02ca"+ - "\u0001\u0000\u0000\u0000\u02cc\u02cd\u0001\u0000\u0000\u0000\u02cd\u02ce"+ - "\u0001\u0000\u0000\u0000\u02ce\u02cf\u0003G\u001c\u0000\u02cf\u02d1\u0001"+ - "\u0000\u0000\u0000\u02d0\u02a7\u0001\u0000\u0000\u0000\u02d0\u02b2\u0001"+ - "\u0000\u0000\u0000\u02d0\u02b9\u0001\u0000\u0000\u0000\u02d0\u02c8\u0001"+ - "\u0000\u0000\u0000\u02d1X\u0001\u0000\u0000\u0000\u02d2\u02d3\u0007\u001e"+ - "\u0000\u0000\u02d3\u02d4\u0007\u001f\u0000\u0000\u02d4Z\u0001\u0000\u0000"+ - "\u0000\u02d5\u02d6\u0007\f\u0000\u0000\u02d6\u02d7\u0007\t\u0000\u0000"+ - "\u02d7\u02d8\u0007\u0000\u0000\u0000\u02d8\\\u0001\u0000\u0000\u0000\u02d9"+ - "\u02da\u0007\f\u0000\u0000\u02da\u02db\u0007\u0002\u0000\u0000\u02db\u02dc"+ - "\u0007\u0004\u0000\u0000\u02dc^\u0001\u0000\u0000\u0000\u02dd\u02de\u0005"+ - "=\u0000\u0000\u02de`\u0001\u0000\u0000\u0000\u02df\u02e0\u0005:\u0000"+ - "\u0000\u02e0\u02e1\u0005:\u0000\u0000\u02e1b\u0001\u0000\u0000\u0000\u02e2"+ - "\u02e3\u0005,\u0000\u0000\u02e3d\u0001\u0000\u0000\u0000\u02e4\u02e5\u0007"+ - "\u0000\u0000\u0000\u02e5\u02e6\u0007\u0003\u0000\u0000\u02e6\u02e7\u0007"+ - "\u0002\u0000\u0000\u02e7\u02e8\u0007\u0004\u0000\u0000\u02e8f\u0001\u0000"+ - "\u0000\u0000\u02e9\u02ea\u0005.\u0000\u0000\u02eah\u0001\u0000\u0000\u0000"+ - "\u02eb\u02ec\u0007\u000f\u0000\u0000\u02ec\u02ed\u0007\f\u0000\u0000\u02ed"+ - "\u02ee\u0007\r\u0000\u0000\u02ee\u02ef\u0007\u0002\u0000\u0000\u02ef\u02f0"+ - "\u0007\u0003\u0000\u0000\u02f0j\u0001\u0000\u0000\u0000\u02f1\u02f2\u0007"+ - "\u000f\u0000\u0000\u02f2\u02f3\u0007\u0001\u0000\u0000\u02f3\u02f4\u0007"+ - "\u0006\u0000\u0000\u02f4\u02f5\u0007\u0002\u0000\u0000\u02f5\u02f6\u0007"+ - "\u0005\u0000\u0000\u02f6l\u0001\u0000\u0000\u0000\u02f7\u02f8\u0007\u0001"+ - "\u0000\u0000\u02f8\u02f9\u0007\t\u0000\u0000\u02f9n\u0001\u0000\u0000"+ - "\u0000\u02fa\u02fb\u0007\u0001\u0000\u0000\u02fb\u02fc\u0007\u0002\u0000"+ - "\u0000\u02fcp\u0001\u0000\u0000\u0000\u02fd\u02fe\u0007\r\u0000\u0000"+ - "\u02fe\u02ff\u0007\f\u0000\u0000\u02ff\u0300\u0007\u0002\u0000\u0000\u0300"+ - "\u0301\u0007\u0005\u0000\u0000\u0301r\u0001\u0000\u0000\u0000\u0302\u0303"+ - "\u0007\r\u0000\u0000\u0303\u0304\u0007\u0001\u0000\u0000\u0304\u0305\u0007"+ - "\u0012\u0000\u0000\u0305\u0306\u0007\u0003\u0000\u0000\u0306t\u0001\u0000"+ - "\u0000\u0000\u0307\u0308\u0005(\u0000\u0000\u0308v\u0001\u0000\u0000\u0000"+ - "\u0309\u030a\u0007\t\u0000\u0000\u030a\u030b\u0007\u0007\u0000\u0000\u030b"+ - "\u030c\u0007\u0005\u0000\u0000\u030cx\u0001\u0000\u0000\u0000\u030d\u030e"+ - "\u0007\t\u0000\u0000\u030e\u030f\u0007\u0014\u0000\u0000\u030f\u0310\u0007"+ - "\r\u0000\u0000\u0310\u0311\u0007\r\u0000\u0000\u0311z\u0001\u0000\u0000"+ - "\u0000\u0312\u0313\u0007\t\u0000\u0000\u0313\u0314\u0007\u0014\u0000\u0000"+ - "\u0314\u0315\u0007\r\u0000\u0000\u0315\u0316\u0007\r\u0000\u0000\u0316"+ - "\u0317\u0007\u0002\u0000\u0000\u0317|\u0001\u0000\u0000\u0000\u0318\u0319"+ - "\u0007\u0007\u0000\u0000\u0319\u031a\u0007\u0006\u0000\u0000\u031a~\u0001"+ - "\u0000\u0000\u0000\u031b\u031c\u0005?\u0000\u0000\u031c\u0080\u0001\u0000"+ - "\u0000\u0000\u031d\u031e\u0007\u0006\u0000\u0000\u031e\u031f\u0007\r\u0000"+ - "\u0000\u031f\u0320\u0007\u0001\u0000\u0000\u0320\u0321\u0007\u0012\u0000"+ - "\u0000\u0321\u0322\u0007\u0003\u0000\u0000\u0322\u0082\u0001\u0000\u0000"+ - "\u0000\u0323\u0324\u0005)\u0000\u0000\u0324\u0084\u0001\u0000\u0000\u0000"+ - "\u0325\u0326\u0007\u0005\u0000\u0000\u0326\u0327\u0007\u0006\u0000\u0000"+ - "\u0327\u0328\u0007\u0014\u0000\u0000\u0328\u0329\u0007\u0003\u0000\u0000"+ - "\u0329\u0086\u0001\u0000\u0000\u0000\u032a\u032b\u0005=\u0000\u0000\u032b"+ - "\u032c\u0005=\u0000\u0000\u032c\u0088\u0001\u0000\u0000\u0000\u032d\u032e"+ - "\u0005=\u0000\u0000\u032e\u032f\u0005~\u0000\u0000\u032f\u008a\u0001\u0000"+ - "\u0000\u0000\u0330\u0331\u0005!\u0000\u0000\u0331\u0332\u0005=\u0000\u0000"+ - "\u0332\u008c\u0001\u0000\u0000\u0000\u0333\u0334\u0005<\u0000\u0000\u0334"+ - "\u008e\u0001\u0000\u0000\u0000\u0335\u0336\u0005<\u0000\u0000\u0336\u0337"+ - "\u0005=\u0000\u0000\u0337\u0090\u0001\u0000\u0000\u0000\u0338\u0339\u0005"+ - ">\u0000\u0000\u0339\u0092\u0001\u0000\u0000\u0000\u033a\u033b\u0005>\u0000"+ - "\u0000\u033b\u033c\u0005=\u0000\u0000\u033c\u0094\u0001\u0000\u0000\u0000"+ - "\u033d\u033e\u0005+\u0000\u0000\u033e\u0096\u0001\u0000\u0000\u0000\u033f"+ - "\u0340\u0005-\u0000\u0000\u0340\u0098\u0001\u0000\u0000\u0000\u0341\u0342"+ - "\u0005*\u0000\u0000\u0342\u009a\u0001\u0000\u0000\u0000\u0343\u0344\u0005"+ - "/\u0000\u0000\u0344\u009c\u0001\u0000\u0000\u0000\u0345\u0346\u0005%\u0000"+ - "\u0000\u0346\u009e\u0001\u0000\u0000\u0000\u0347\u0348\u0004H\u0003\u0000"+ - "\u0348\u0349\u0007\u0010\u0000\u0000\u0349\u034a\u0007\f\u0000\u0000\u034a"+ - "\u034b\u0007\u0005\u0000\u0000\u034b\u034c\u0007\u0004\u0000\u0000\u034c"+ - "\u034d\u0007\n\u0000\u0000\u034d\u00a0\u0001\u0000\u0000\u0000\u034e\u0351"+ - "\u0003\u007f8\u0000\u034f\u0352\u0003A\u0019\u0000\u0350\u0352\u0003O"+ - " \u0000\u0351\u034f\u0001\u0000\u0000\u0000\u0351\u0350\u0001\u0000\u0000"+ - "\u0000\u0352\u0356\u0001\u0000\u0000\u0000\u0353\u0355\u0003Q!\u0000\u0354"+ - "\u0353\u0001\u0000\u0000\u0000\u0355\u0358\u0001\u0000\u0000\u0000\u0356"+ - "\u0354\u0001\u0000\u0000\u0000\u0356\u0357\u0001\u0000\u0000\u0000\u0357"+ - "\u0360\u0001\u0000\u0000\u0000\u0358\u0356\u0001\u0000\u0000\u0000\u0359"+ - "\u035b\u0003\u007f8\u0000\u035a\u035c\u0003?\u0018\u0000\u035b\u035a\u0001"+ - "\u0000\u0000\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u035b\u0001"+ - "\u0000\u0000\u0000\u035d\u035e\u0001\u0000\u0000\u0000\u035e\u0360\u0001"+ - "\u0000\u0000\u0000\u035f\u034e\u0001\u0000\u0000\u0000\u035f\u0359\u0001"+ - "\u0000\u0000\u0000\u0360\u00a2\u0001\u0000\u0000\u0000\u0361\u0362\u0005"+ - "[\u0000\u0000\u0362\u0363\u0001\u0000\u0000\u0000\u0363\u0364\u0006J\u0000"+ - "\u0000\u0364\u0365\u0006J\u0000\u0000\u0365\u00a4\u0001\u0000\u0000\u0000"+ - "\u0366\u0367\u0005]\u0000\u0000\u0367\u0368\u0001\u0000\u0000\u0000\u0368"+ - "\u0369\u0006K\u000b\u0000\u0369\u036a\u0006K\u000b\u0000\u036a\u00a6\u0001"+ - "\u0000\u0000\u0000\u036b\u036f\u0003A\u0019\u0000\u036c\u036e\u0003Q!"+ - "\u0000\u036d\u036c\u0001\u0000\u0000\u0000\u036e\u0371\u0001\u0000\u0000"+ - "\u0000\u036f\u036d\u0001\u0000\u0000\u0000\u036f\u0370\u0001\u0000\u0000"+ - "\u0000\u0370\u037c\u0001\u0000\u0000\u0000\u0371\u036f\u0001\u0000\u0000"+ - "\u0000\u0372\u0375\u0003O \u0000\u0373\u0375\u0003I\u001d\u0000\u0374"+ - "\u0372\u0001\u0000\u0000\u0000\u0374\u0373\u0001\u0000\u0000\u0000\u0375"+ - "\u0377\u0001\u0000\u0000\u0000\u0376\u0378\u0003Q!\u0000\u0377\u0376\u0001"+ - "\u0000\u0000\u0000\u0378\u0379\u0001\u0000\u0000\u0000\u0379\u0377\u0001"+ - "\u0000\u0000\u0000\u0379\u037a\u0001\u0000\u0000\u0000\u037a\u037c\u0001"+ - "\u0000\u0000\u0000\u037b\u036b\u0001\u0000\u0000\u0000\u037b\u0374\u0001"+ - "\u0000\u0000\u0000\u037c\u00a8\u0001\u0000\u0000\u0000\u037d\u037f\u0003"+ - "K\u001e\u0000\u037e\u0380\u0003M\u001f\u0000\u037f\u037e\u0001\u0000\u0000"+ - "\u0000\u0380\u0381\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000"+ - "\u0000\u0381\u0382\u0001\u0000\u0000\u0000\u0382\u0383\u0001\u0000\u0000"+ - "\u0000\u0383\u0384\u0003K\u001e\u0000\u0384\u00aa\u0001\u0000\u0000\u0000"+ - "\u0385\u0386\u0003\u00a9M\u0000\u0386\u00ac\u0001\u0000\u0000\u0000\u0387"+ - "\u0388\u00037\u0014\u0000\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u038a"+ - "\u0006O\n\u0000\u038a\u00ae\u0001\u0000\u0000\u0000\u038b\u038c\u0003"+ - "9\u0015\u0000\u038c\u038d\u0001\u0000\u0000\u0000\u038d\u038e\u0006P\n"+ - "\u0000\u038e\u00b0\u0001\u0000\u0000\u0000\u038f\u0390\u0003;\u0016\u0000"+ - "\u0390\u0391\u0001\u0000\u0000\u0000\u0391\u0392\u0006Q\n\u0000\u0392"+ - "\u00b2\u0001\u0000\u0000\u0000\u0393\u0394\u0003\u00a3J\u0000\u0394\u0395"+ - "\u0001\u0000\u0000\u0000\u0395\u0396\u0006R\f\u0000\u0396\u0397\u0006"+ - "R\r\u0000\u0397\u00b4\u0001\u0000\u0000\u0000\u0398\u0399\u0003=\u0017"+ - "\u0000\u0399\u039a\u0001\u0000\u0000\u0000\u039a\u039b\u0006S\u000e\u0000"+ - "\u039b\u039c\u0006S\u000b\u0000\u039c\u00b6\u0001\u0000\u0000\u0000\u039d"+ - "\u039e\u0003;\u0016\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u03a0"+ - "\u0006T\n\u0000\u03a0\u00b8\u0001\u0000\u0000\u0000\u03a1\u03a2\u0003"+ - "7\u0014\u0000\u03a2\u03a3\u0001\u0000\u0000\u0000\u03a3\u03a4\u0006U\n"+ - "\u0000\u03a4\u00ba\u0001\u0000\u0000\u0000\u03a5\u03a6\u00039\u0015\u0000"+ - "\u03a6\u03a7\u0001\u0000\u0000\u0000\u03a7\u03a8\u0006V\n\u0000\u03a8"+ - "\u00bc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0003=\u0017\u0000\u03aa\u03ab"+ - "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0006W\u000e\u0000\u03ac\u03ad\u0006"+ - "W\u000b\u0000\u03ad\u00be\u0001\u0000\u0000\u0000\u03ae\u03af\u0003\u00a3"+ - "J\u0000\u03af\u03b0\u0001\u0000\u0000\u0000\u03b0\u03b1\u0006X\f\u0000"+ - "\u03b1\u00c0\u0001\u0000\u0000\u0000\u03b2\u03b3\u0003\u00a5K\u0000\u03b3"+ - "\u03b4\u0001\u0000\u0000\u0000\u03b4\u03b5\u0006Y\u000f\u0000\u03b5\u00c2"+ - "\u0001\u0000\u0000\u0000\u03b6\u03b7\u0003\u013f\u0098\u0000\u03b7\u03b8"+ - "\u0001\u0000\u0000\u0000\u03b8\u03b9\u0006Z\u0010\u0000\u03b9\u00c4\u0001"+ - "\u0000\u0000\u0000\u03ba\u03bb\u0003c*\u0000\u03bb\u03bc\u0001\u0000\u0000"+ - "\u0000\u03bc\u03bd\u0006[\u0011\u0000\u03bd\u00c6\u0001\u0000\u0000\u0000"+ - "\u03be\u03bf\u0003_(\u0000\u03bf\u03c0\u0001\u0000\u0000\u0000\u03c0\u03c1"+ - "\u0006\\\u0012\u0000\u03c1\u00c8\u0001\u0000\u0000\u0000\u03c2\u03c3\u0007"+ - "\u0010\u0000\u0000\u03c3\u03c4\u0007\u0003\u0000\u0000\u03c4\u03c5\u0007"+ - "\u0005\u0000\u0000\u03c5\u03c6\u0007\f\u0000\u0000\u03c6\u03c7\u0007\u0000"+ - "\u0000\u0000\u03c7\u03c8\u0007\f\u0000\u0000\u03c8\u03c9\u0007\u0005\u0000"+ - "\u0000\u03c9\u03ca\u0007\f\u0000\u0000\u03ca\u00ca\u0001\u0000\u0000\u0000"+ - "\u03cb\u03cf\b \u0000\u0000\u03cc\u03cd\u0005/\u0000\u0000\u03cd\u03cf"+ - "\b!\u0000\u0000\u03ce\u03cb\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001"+ - "\u0000\u0000\u0000\u03cf\u00cc\u0001\u0000\u0000\u0000\u03d0\u03d2\u0003"+ - "\u00cb^\u0000\u03d1\u03d0\u0001\u0000\u0000\u0000\u03d2\u03d3\u0001\u0000"+ - "\u0000\u0000\u03d3\u03d1\u0001\u0000\u0000\u0000\u03d3\u03d4\u0001\u0000"+ - "\u0000\u0000\u03d4\u00ce\u0001\u0000\u0000\u0000\u03d5\u03d6\u0003\u00cd"+ - "_\u0000\u03d6\u03d7\u0001\u0000\u0000\u0000\u03d7\u03d8\u0006`\u0013\u0000"+ - "\u03d8\u00d0\u0001\u0000\u0000\u0000\u03d9\u03da\u0003S\"\u0000\u03da"+ - "\u03db\u0001\u0000\u0000\u0000\u03db\u03dc\u0006a\u0014\u0000\u03dc\u00d2"+ - "\u0001\u0000\u0000\u0000\u03dd\u03de\u00037\u0014\u0000\u03de\u03df\u0001"+ - "\u0000\u0000\u0000\u03df\u03e0\u0006b\n\u0000\u03e0\u00d4\u0001\u0000"+ - "\u0000\u0000\u03e1\u03e2\u00039\u0015\u0000\u03e2\u03e3\u0001\u0000\u0000"+ - "\u0000\u03e3\u03e4\u0006c\n\u0000\u03e4\u00d6\u0001\u0000\u0000\u0000"+ - "\u03e5\u03e6\u0003;\u0016\u0000\u03e6\u03e7\u0001\u0000\u0000\u0000\u03e7"+ - "\u03e8\u0006d\n\u0000\u03e8\u00d8\u0001\u0000\u0000\u0000\u03e9\u03ea"+ - "\u0003=\u0017\u0000\u03ea\u03eb\u0001\u0000\u0000\u0000\u03eb\u03ec\u0006"+ - "e\u000e\u0000\u03ec\u03ed\u0006e\u000b\u0000\u03ed\u00da\u0001\u0000\u0000"+ - "\u0000\u03ee\u03ef\u0003g,\u0000\u03ef\u03f0\u0001\u0000\u0000\u0000\u03f0"+ - "\u03f1\u0006f\u0015\u0000\u03f1\u00dc\u0001\u0000\u0000\u0000\u03f2\u03f3"+ - "\u0003c*\u0000\u03f3\u03f4\u0001\u0000\u0000\u0000\u03f4\u03f5\u0006g"+ - "\u0011\u0000\u03f5\u00de\u0001\u0000\u0000\u0000\u03f6\u03fb\u0003A\u0019"+ - "\u0000\u03f7\u03fb\u0003?\u0018\u0000\u03f8\u03fb\u0003O \u0000\u03f9"+ - "\u03fb\u0003\u0099E\u0000\u03fa\u03f6\u0001\u0000\u0000\u0000\u03fa\u03f7"+ - "\u0001\u0000\u0000\u0000\u03fa\u03f8\u0001\u0000\u0000\u0000\u03fa\u03f9"+ - "\u0001\u0000\u0000\u0000\u03fb\u00e0\u0001\u0000\u0000\u0000\u03fc\u03ff"+ - "\u0003A\u0019\u0000\u03fd\u03ff\u0003\u0099E\u0000\u03fe\u03fc\u0001\u0000"+ - "\u0000\u0000\u03fe\u03fd\u0001\u0000\u0000\u0000\u03ff\u0403\u0001\u0000"+ - "\u0000\u0000\u0400\u0402\u0003\u00dfh\u0000\u0401\u0400\u0001\u0000\u0000"+ - "\u0000\u0402\u0405\u0001\u0000\u0000\u0000\u0403\u0401\u0001\u0000\u0000"+ - "\u0000\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0410\u0001\u0000\u0000"+ - "\u0000\u0405\u0403\u0001\u0000\u0000\u0000\u0406\u0409\u0003O \u0000\u0407"+ - "\u0409\u0003I\u001d\u0000\u0408\u0406\u0001\u0000\u0000\u0000\u0408\u0407"+ - "\u0001\u0000\u0000\u0000\u0409\u040b\u0001\u0000\u0000\u0000\u040a\u040c"+ - "\u0003\u00dfh\u0000\u040b\u040a\u0001\u0000\u0000\u0000\u040c\u040d\u0001"+ - "\u0000\u0000\u0000\u040d\u040b\u0001\u0000\u0000\u0000\u040d\u040e\u0001"+ - "\u0000\u0000\u0000\u040e\u0410\u0001\u0000\u0000\u0000\u040f\u03fe\u0001"+ - "\u0000\u0000\u0000\u040f\u0408\u0001\u0000\u0000\u0000\u0410\u00e2\u0001"+ - "\u0000\u0000\u0000\u0411\u0414\u0003\u00e1i\u0000\u0412\u0414\u0003\u00a9"+ - "M\u0000\u0413\u0411\u0001\u0000\u0000\u0000\u0413\u0412\u0001\u0000\u0000"+ - "\u0000\u0414\u0415\u0001\u0000\u0000\u0000\u0415\u0413\u0001\u0000\u0000"+ - "\u0000\u0415\u0416\u0001\u0000\u0000\u0000\u0416\u00e4\u0001\u0000\u0000"+ - "\u0000\u0417\u0418\u00037\u0014\u0000\u0418\u0419\u0001\u0000\u0000\u0000"+ - "\u0419\u041a\u0006k\n\u0000\u041a\u00e6\u0001\u0000\u0000\u0000\u041b"+ - "\u041c\u00039\u0015\u0000\u041c\u041d\u0001\u0000\u0000\u0000\u041d\u041e"+ - "\u0006l\n\u0000\u041e\u00e8\u0001\u0000\u0000\u0000\u041f\u0420\u0003"+ - ";\u0016\u0000\u0420\u0421\u0001\u0000\u0000\u0000\u0421\u0422\u0006m\n"+ - "\u0000\u0422\u00ea\u0001\u0000\u0000\u0000\u0423\u0424\u0003=\u0017\u0000"+ - "\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0426\u0006n\u000e\u0000\u0426"+ - "\u0427\u0006n\u000b\u0000\u0427\u00ec\u0001\u0000\u0000\u0000\u0428\u0429"+ - "\u0003_(\u0000\u0429\u042a\u0001\u0000\u0000\u0000\u042a\u042b\u0006o"+ - "\u0012\u0000\u042b\u00ee\u0001\u0000\u0000\u0000\u042c\u042d\u0003c*\u0000"+ - "\u042d\u042e\u0001\u0000\u0000\u0000\u042e\u042f\u0006p\u0011\u0000\u042f"+ - "\u00f0\u0001\u0000\u0000\u0000\u0430\u0431\u0003g,\u0000\u0431\u0432\u0001"+ - "\u0000\u0000\u0000\u0432\u0433\u0006q\u0015\u0000\u0433\u00f2\u0001\u0000"+ - "\u0000\u0000\u0434\u0435\u0007\f\u0000\u0000\u0435\u0436\u0007\u0002\u0000"+ - "\u0000\u0436\u00f4\u0001\u0000\u0000\u0000\u0437\u0438\u0003\u00e3j\u0000"+ - "\u0438\u0439\u0001\u0000\u0000\u0000\u0439\u043a\u0006s\u0016\u0000\u043a"+ - "\u00f6\u0001\u0000\u0000\u0000\u043b\u043c\u00037\u0014\u0000\u043c\u043d"+ - "\u0001\u0000\u0000\u0000\u043d\u043e\u0006t\n\u0000\u043e\u00f8\u0001"+ - "\u0000\u0000\u0000\u043f\u0440\u00039\u0015\u0000\u0440\u0441\u0001\u0000"+ - "\u0000\u0000\u0441\u0442\u0006u\n\u0000\u0442\u00fa\u0001\u0000\u0000"+ - "\u0000\u0443\u0444\u0003;\u0016\u0000\u0444\u0445\u0001\u0000\u0000\u0000"+ - "\u0445\u0446\u0006v\n\u0000\u0446\u00fc\u0001\u0000\u0000\u0000\u0447"+ - "\u0448\u0003=\u0017\u0000\u0448\u0449\u0001\u0000\u0000\u0000\u0449\u044a"+ - "\u0006w\u000e\u0000\u044a\u044b\u0006w\u000b\u0000\u044b\u00fe\u0001\u0000"+ - "\u0000\u0000\u044c\u044d\u0003\u00a3J\u0000\u044d\u044e\u0001\u0000\u0000"+ - "\u0000\u044e\u044f\u0006x\f\u0000\u044f\u0450\u0006x\u0017\u0000\u0450"+ - "\u0100\u0001\u0000\u0000\u0000\u0451\u0452\u0007\u0007\u0000\u0000\u0452"+ - "\u0453\u0007\t\u0000\u0000\u0453\u0454\u0001\u0000\u0000\u0000\u0454\u0455"+ - "\u0006y\u0018\u0000\u0455\u0102\u0001\u0000\u0000\u0000\u0456\u0457\u0007"+ - "\u0013\u0000\u0000\u0457\u0458\u0007\u0001\u0000\u0000\u0458\u0459\u0007"+ - "\u0005\u0000\u0000\u0459\u045a\u0007\n\u0000\u0000\u045a\u045b\u0001\u0000"+ - "\u0000\u0000\u045b\u045c\u0006z\u0018\u0000\u045c\u0104\u0001\u0000\u0000"+ - "\u0000\u045d\u045e\b\"\u0000\u0000\u045e\u0106\u0001\u0000\u0000\u0000"+ - "\u045f\u0461\u0003\u0105{\u0000\u0460\u045f\u0001\u0000\u0000\u0000\u0461"+ - "\u0462\u0001\u0000\u0000\u0000\u0462\u0460\u0001\u0000\u0000\u0000\u0462"+ - "\u0463\u0001\u0000\u0000\u0000\u0463\u0464\u0001\u0000\u0000\u0000\u0464"+ - "\u0465\u0003\u013f\u0098\u0000\u0465\u0467\u0001\u0000\u0000\u0000\u0466"+ - "\u0460\u0001\u0000\u0000\u0000\u0466\u0467\u0001\u0000\u0000\u0000\u0467"+ - "\u0469\u0001\u0000\u0000\u0000\u0468\u046a\u0003\u0105{\u0000\u0469\u0468"+ - "\u0001\u0000\u0000\u0000\u046a\u046b\u0001\u0000\u0000\u0000\u046b\u0469"+ - "\u0001\u0000\u0000\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u0108"+ - "\u0001\u0000\u0000\u0000\u046d\u046e\u0003\u0107|\u0000\u046e\u046f\u0001"+ - "\u0000\u0000\u0000\u046f\u0470\u0006}\u0019\u0000\u0470\u010a\u0001\u0000"+ - "\u0000\u0000\u0471\u0472\u00037\u0014\u0000\u0472\u0473\u0001\u0000\u0000"+ - "\u0000\u0473\u0474\u0006~\n\u0000\u0474\u010c\u0001\u0000\u0000\u0000"+ - "\u0475\u0476\u00039\u0015\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477"+ - "\u0478\u0006\u007f\n\u0000\u0478\u010e\u0001\u0000\u0000\u0000\u0479\u047a"+ - "\u0003;\u0016\u0000\u047a\u047b\u0001\u0000\u0000\u0000\u047b\u047c\u0006"+ - "\u0080\n\u0000\u047c\u0110\u0001\u0000\u0000\u0000\u047d\u047e\u0003="+ - "\u0017\u0000\u047e\u047f\u0001\u0000\u0000\u0000\u047f\u0480\u0006\u0081"+ - "\u000e\u0000\u0480\u0481\u0006\u0081\u000b\u0000\u0481\u0482\u0006\u0081"+ - "\u000b\u0000\u0482\u0112\u0001\u0000\u0000\u0000\u0483\u0484\u0003_(\u0000"+ - "\u0484\u0485\u0001\u0000\u0000\u0000\u0485\u0486\u0006\u0082\u0012\u0000"+ - "\u0486\u0114\u0001\u0000\u0000\u0000\u0487\u0488\u0003c*\u0000\u0488\u0489"+ - "\u0001\u0000\u0000\u0000\u0489\u048a\u0006\u0083\u0011\u0000\u048a\u0116"+ - "\u0001\u0000\u0000\u0000\u048b\u048c\u0003g,\u0000\u048c\u048d\u0001\u0000"+ - "\u0000\u0000\u048d\u048e\u0006\u0084\u0015\u0000\u048e\u0118\u0001\u0000"+ - "\u0000\u0000\u048f\u0490\u0003\u0103z\u0000\u0490\u0491\u0001\u0000\u0000"+ - "\u0000\u0491\u0492\u0006\u0085\u001a\u0000\u0492\u011a\u0001\u0000\u0000"+ - "\u0000\u0493\u0494\u0003\u00e3j\u0000\u0494\u0495\u0001\u0000\u0000\u0000"+ - "\u0495\u0496\u0006\u0086\u0016\u0000\u0496\u011c\u0001\u0000\u0000\u0000"+ - "\u0497\u0498\u0003\u00abN\u0000\u0498\u0499\u0001\u0000\u0000\u0000\u0499"+ - "\u049a\u0006\u0087\u001b\u0000\u049a\u011e\u0001\u0000\u0000\u0000\u049b"+ - "\u049c\u00037\u0014\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049e"+ - "\u0006\u0088\n\u0000\u049e\u0120\u0001\u0000\u0000\u0000\u049f\u04a0\u0003"+ - "9\u0015\u0000\u04a0\u04a1\u0001\u0000\u0000\u0000\u04a1\u04a2\u0006\u0089"+ - "\n\u0000\u04a2\u0122\u0001\u0000\u0000\u0000\u04a3\u04a4\u0003;\u0016"+ - "\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5\u04a6\u0006\u008a\n\u0000"+ - "\u04a6\u0124\u0001\u0000\u0000\u0000\u04a7\u04a8\u0003=\u0017\u0000\u04a8"+ - "\u04a9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0006\u008b\u000e\u0000\u04aa"+ - "\u04ab\u0006\u008b\u000b\u0000\u04ab\u0126\u0001\u0000\u0000\u0000\u04ac"+ - "\u04ad\u0003g,\u0000\u04ad\u04ae\u0001\u0000\u0000\u0000\u04ae\u04af\u0006"+ - "\u008c\u0015\u0000\u04af\u0128\u0001\u0000\u0000\u0000\u04b0\u04b1\u0003"+ - "\u00abN\u0000\u04b1\u04b2\u0001\u0000\u0000\u0000\u04b2\u04b3\u0006\u008d"+ - "\u001b\u0000\u04b3\u012a\u0001\u0000\u0000\u0000\u04b4\u04b5\u0003\u00a7"+ - "L\u0000\u04b5\u04b6\u0001\u0000\u0000\u0000\u04b6\u04b7\u0006\u008e\u001c"+ - "\u0000\u04b7\u012c\u0001\u0000\u0000\u0000\u04b8\u04b9\u00037\u0014\u0000"+ - "\u04b9\u04ba\u0001\u0000\u0000\u0000\u04ba\u04bb\u0006\u008f\n\u0000\u04bb"+ - "\u012e\u0001\u0000\u0000\u0000\u04bc\u04bd\u00039\u0015\u0000\u04bd\u04be"+ - "\u0001\u0000\u0000\u0000\u04be\u04bf\u0006\u0090\n\u0000\u04bf\u0130\u0001"+ - "\u0000\u0000\u0000\u04c0\u04c1\u0003;\u0016\u0000\u04c1\u04c2\u0001\u0000"+ - "\u0000\u0000\u04c2\u04c3\u0006\u0091\n\u0000\u04c3\u0132\u0001\u0000\u0000"+ - "\u0000\u04c4\u04c5\u0003=\u0017\u0000\u04c5\u04c6\u0001\u0000\u0000\u0000"+ - "\u04c6\u04c7\u0006\u0092\u000e\u0000\u04c7\u04c8\u0006\u0092\u000b\u0000"+ - "\u04c8\u0134\u0001\u0000\u0000\u0000\u04c9\u04ca\u0007\u0001\u0000\u0000"+ - "\u04ca\u04cb\u0007\t\u0000\u0000\u04cb\u04cc\u0007\u000f\u0000\u0000\u04cc"+ - "\u04cd\u0007\u0007\u0000\u0000\u04cd\u0136\u0001\u0000\u0000\u0000\u04ce"+ - "\u04cf\u00037\u0014\u0000\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d1"+ - "\u0006\u0094\n\u0000\u04d1\u0138\u0001\u0000\u0000\u0000\u04d2\u04d3\u0003"+ - "9\u0015\u0000\u04d3\u04d4\u0001\u0000\u0000\u0000\u04d4\u04d5\u0006\u0095"+ - "\n\u0000\u04d5\u013a\u0001\u0000\u0000\u0000\u04d6\u04d7\u0003;\u0016"+ - "\u0000\u04d7\u04d8\u0001\u0000\u0000\u0000\u04d8\u04d9\u0006\u0096\n\u0000"+ - "\u04d9\u013c\u0001\u0000\u0000\u0000\u04da\u04db\u0003\u00a5K\u0000\u04db"+ - "\u04dc\u0001\u0000\u0000\u0000\u04dc\u04dd\u0006\u0097\u000f\u0000\u04dd"+ - "\u04de\u0006\u0097\u000b\u0000\u04de\u013e\u0001\u0000\u0000\u0000\u04df"+ - "\u04e0\u0005:\u0000\u0000\u04e0\u0140\u0001\u0000\u0000\u0000\u04e1\u04e7"+ - "\u0003I\u001d\u0000\u04e2\u04e7\u0003?\u0018\u0000\u04e3\u04e7\u0003g"+ - ",\u0000\u04e4\u04e7\u0003A\u0019\u0000\u04e5\u04e7\u0003O \u0000\u04e6"+ - "\u04e1\u0001\u0000\u0000\u0000\u04e6\u04e2\u0001\u0000\u0000\u0000\u04e6"+ - "\u04e3\u0001\u0000\u0000\u0000\u04e6\u04e4\u0001\u0000\u0000\u0000\u04e6"+ - "\u04e5\u0001\u0000\u0000\u0000\u04e7\u04e8\u0001\u0000\u0000\u0000\u04e8"+ - "\u04e6\u0001\u0000\u0000\u0000\u04e8\u04e9\u0001\u0000\u0000\u0000\u04e9"+ - "\u0142\u0001\u0000\u0000\u0000\u04ea\u04eb\u00037\u0014\u0000\u04eb\u04ec"+ - "\u0001\u0000\u0000\u0000\u04ec\u04ed\u0006\u009a\n\u0000\u04ed\u0144\u0001"+ - "\u0000\u0000\u0000\u04ee\u04ef\u00039\u0015\u0000\u04ef\u04f0\u0001\u0000"+ - "\u0000\u0000\u04f0\u04f1\u0006\u009b\n\u0000\u04f1\u0146\u0001\u0000\u0000"+ - "\u0000\u04f2\u04f3\u0003;\u0016\u0000\u04f3\u04f4\u0001\u0000\u0000\u0000"+ - "\u04f4\u04f5\u0006\u009c\n\u0000\u04f5\u0148\u0001\u0000\u0000\u0000\u04f6"+ - "\u04f7\u0003=\u0017\u0000\u04f7\u04f8\u0001\u0000\u0000\u0000\u04f8\u04f9"+ - "\u0006\u009d\u000e\u0000\u04f9\u04fa\u0006\u009d\u000b\u0000\u04fa\u014a"+ - "\u0001\u0000\u0000\u0000\u04fb\u04fc\u0003\u013f\u0098\u0000\u04fc\u04fd"+ - "\u0001\u0000\u0000\u0000\u04fd\u04fe\u0006\u009e\u0010\u0000\u04fe\u014c"+ - "\u0001\u0000\u0000\u0000\u04ff\u0500\u0003c*\u0000\u0500\u0501\u0001\u0000"+ - "\u0000\u0000\u0501\u0502\u0006\u009f\u0011\u0000\u0502\u014e\u0001\u0000"+ - "\u0000\u0000\u0503\u0504\u0003g,\u0000\u0504\u0505\u0001\u0000\u0000\u0000"+ - "\u0505\u0506\u0006\u00a0\u0015\u0000\u0506\u0150\u0001\u0000\u0000\u0000"+ - "\u0507\u0508\u0003\u0101y\u0000\u0508\u0509\u0001\u0000\u0000\u0000\u0509"+ - "\u050a\u0006\u00a1\u001d\u0000\u050a\u050b\u0006\u00a1\u001e\u0000\u050b"+ - "\u0152\u0001\u0000\u0000\u0000\u050c\u050d\u0003\u00cd_\u0000\u050d\u050e"+ - "\u0001\u0000\u0000\u0000\u050e\u050f\u0006\u00a2\u0013\u0000\u050f\u0154"+ - "\u0001\u0000\u0000\u0000\u0510\u0511\u0003S\"\u0000\u0511\u0512\u0001"+ - "\u0000\u0000\u0000\u0512\u0513\u0006\u00a3\u0014\u0000\u0513\u0156\u0001"+ - "\u0000\u0000\u0000\u0514\u0515\u00037\u0014\u0000\u0515\u0516\u0001\u0000"+ - "\u0000\u0000\u0516\u0517\u0006\u00a4\n\u0000\u0517\u0158\u0001\u0000\u0000"+ - "\u0000\u0518\u0519\u00039\u0015\u0000\u0519\u051a\u0001\u0000\u0000\u0000"+ - "\u051a\u051b\u0006\u00a5\n\u0000\u051b\u015a\u0001\u0000\u0000\u0000\u051c"+ - "\u051d\u0003;\u0016\u0000\u051d\u051e\u0001\u0000\u0000\u0000\u051e\u051f"+ - "\u0006\u00a6\n\u0000\u051f\u015c\u0001\u0000\u0000\u0000\u0520\u0521\u0003"+ - "=\u0017\u0000\u0521\u0522\u0001\u0000\u0000\u0000\u0522\u0523\u0006\u00a7"+ - "\u000e\u0000\u0523\u0524\u0006\u00a7\u000b\u0000\u0524\u0525\u0006\u00a7"+ - "\u000b\u0000\u0525\u015e\u0001\u0000\u0000\u0000\u0526\u0527\u0003c*\u0000"+ - "\u0527\u0528\u0001\u0000\u0000\u0000\u0528\u0529\u0006\u00a8\u0011\u0000"+ - "\u0529\u0160\u0001\u0000\u0000\u0000\u052a\u052b\u0003g,\u0000\u052b\u052c"+ - "\u0001\u0000\u0000\u0000\u052c\u052d\u0006\u00a9\u0015\u0000\u052d\u0162"+ - "\u0001\u0000\u0000\u0000\u052e\u052f\u0003\u00e3j\u0000\u052f\u0530\u0001"+ - "\u0000\u0000\u0000\u0530\u0531\u0006\u00aa\u0016\u0000\u0531\u0164\u0001"+ - "\u0000\u0000\u0000\u0532\u0533\u00037\u0014\u0000\u0533\u0534\u0001\u0000"+ - "\u0000\u0000\u0534\u0535\u0006\u00ab\n\u0000\u0535\u0166\u0001\u0000\u0000"+ - "\u0000\u0536\u0537\u00039\u0015\u0000\u0537\u0538\u0001\u0000\u0000\u0000"+ - "\u0538\u0539\u0006\u00ac\n\u0000\u0539\u0168\u0001\u0000\u0000\u0000\u053a"+ - "\u053b\u0003;\u0016\u0000\u053b\u053c\u0001\u0000\u0000\u0000\u053c\u053d"+ - "\u0006\u00ad\n\u0000\u053d\u016a\u0001\u0000\u0000\u0000\u053e\u053f\u0003"+ - "=\u0017\u0000\u053f\u0540\u0001\u0000\u0000\u0000\u0540\u0541\u0006\u00ae"+ - "\u000e\u0000\u0541\u0542\u0006\u00ae\u000b\u0000\u0542\u016c\u0001\u0000"+ - "\u0000\u0000\u0543\u0544\u0003\u00cd_\u0000\u0544\u0545\u0001\u0000\u0000"+ - "\u0000\u0545\u0546\u0006\u00af\u0013\u0000\u0546\u0547\u0006\u00af\u000b"+ - "\u0000\u0547\u0548\u0006\u00af\u001f\u0000\u0548\u016e\u0001\u0000\u0000"+ - "\u0000\u0549\u054a\u0003S\"\u0000\u054a\u054b\u0001\u0000\u0000\u0000"+ - "\u054b\u054c\u0006\u00b0\u0014\u0000\u054c\u054d\u0006\u00b0\u000b\u0000"+ - "\u054d\u054e\u0006\u00b0\u001f\u0000\u054e\u0170\u0001\u0000\u0000\u0000"+ - "\u054f\u0550\u00037\u0014\u0000\u0550\u0551\u0001\u0000\u0000\u0000\u0551"+ - "\u0552\u0006\u00b1\n\u0000\u0552\u0172\u0001\u0000\u0000\u0000\u0553\u0554"+ - "\u00039\u0015\u0000\u0554\u0555\u0001\u0000\u0000\u0000\u0555\u0556\u0006"+ - "\u00b2\n\u0000\u0556\u0174\u0001\u0000\u0000\u0000\u0557\u0558\u0003;"+ - "\u0016\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055a\u0006\u00b3"+ - "\n\u0000\u055a\u0176\u0001\u0000\u0000\u0000\u055b\u055c\u0003\u013f\u0098"+ - "\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055e\u0006\u00b4\u0010"+ - "\u0000\u055e\u055f\u0006\u00b4\u000b\u0000\u055f\u0560\u0006\u00b4\t\u0000"+ - "\u0560\u0178\u0001\u0000\u0000\u0000\u0561\u0562\u0003c*\u0000\u0562\u0563"+ - "\u0001\u0000\u0000\u0000\u0563\u0564\u0006\u00b5\u0011\u0000\u0564\u0565"+ - "\u0006\u00b5\u000b\u0000\u0565\u0566\u0006\u00b5\t\u0000\u0566\u017a\u0001"+ - "\u0000\u0000\u0000\u0567\u0568\u00037\u0014\u0000\u0568\u0569\u0001\u0000"+ - "\u0000\u0000\u0569\u056a\u0006\u00b6\n\u0000\u056a\u017c\u0001\u0000\u0000"+ - "\u0000\u056b\u056c\u00039\u0015\u0000\u056c\u056d\u0001\u0000\u0000\u0000"+ - "\u056d\u056e\u0006\u00b7\n\u0000\u056e\u017e\u0001\u0000\u0000\u0000\u056f"+ - "\u0570\u0003;\u0016\u0000\u0570\u0571\u0001\u0000\u0000\u0000\u0571\u0572"+ - "\u0006\u00b8\n\u0000\u0572\u0180\u0001\u0000\u0000\u0000\u0573\u0574\u0003"+ - "\u00abN\u0000\u0574\u0575\u0001\u0000\u0000\u0000\u0575\u0576\u0006\u00b9"+ - "\u000b\u0000\u0576\u0577\u0006\u00b9\u0000\u0000\u0577\u0578\u0006\u00b9"+ - "\u001b\u0000\u0578\u0182\u0001\u0000\u0000\u0000\u0579\u057a\u0003\u00a7"+ - "L\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u057c\u0006\u00ba\u000b"+ - "\u0000\u057c\u057d\u0006\u00ba\u0000\u0000\u057d\u057e\u0006\u00ba\u001c"+ - "\u0000\u057e\u0184\u0001\u0000\u0000\u0000\u057f\u0580\u0003Y%\u0000\u0580"+ - "\u0581\u0001\u0000\u0000\u0000\u0581\u0582\u0006\u00bb\u000b\u0000\u0582"+ - "\u0583\u0006\u00bb\u0000\u0000\u0583\u0584\u0006\u00bb \u0000\u0584\u0186"+ - "\u0001\u0000\u0000\u0000\u0585\u0586\u0003=\u0017\u0000\u0586\u0587\u0001"+ - "\u0000\u0000\u0000\u0587\u0588\u0006\u00bc\u000e\u0000\u0588\u0589\u0006"+ - "\u00bc\u000b\u0000\u0589\u0188\u0001\u0000\u0000\u0000A\u0000\u0001\u0002"+ - "\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u0231\u023b\u023f"+ - "\u0242\u024b\u024d\u0258\u026b\u0270\u0279\u0280\u0285\u0287\u0292\u029a"+ - "\u029d\u029f\u02a4\u02a9\u02af\u02b6\u02bb\u02c1\u02c4\u02cc\u02d0\u0351"+ - "\u0356\u035d\u035f\u036f\u0374\u0379\u037b\u0381\u03ce\u03d3\u03fa\u03fe"+ - "\u0403\u0408\u040d\u040f\u0413\u0415\u0462\u0466\u046b\u04e6\u04e8!\u0005"+ - "\u0001\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0005"+ - "\u0003\u0000\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005\u000b"+ - "\u0000\u0005\r\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0007A\u0000"+ - "\u0005\u0000\u0000\u0007\u0018\u0000\u0007B\u0000\u0007h\u0000\u0007!"+ - "\u0000\u0007\u001f\u0000\u0007L\u0000\u0007\u0019\u0000\u0007#\u0000\u0007"+ - "P\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007Z\u0000\u0007Y\u0000\u0007"+ - "D\u0000\u0007C\u0000\u0007X\u0000\u0005\f\u0000\u0005\u000e\u0000\u0007"+ - "\u001c\u0000"; + "\u0121\u0001\u0000\u0000\u0000\u0007\u0123\u0001\u0000\u0000\u0000\u0007"+ + "\u0125\u0001\u0000\u0000\u0000\u0007\u0127\u0001\u0000\u0000\u0000\u0007"+ + "\u0129\u0001\u0000\u0000\u0000\u0007\u012b\u0001\u0000\u0000\u0000\u0007"+ + "\u012d\u0001\u0000\u0000\u0000\u0007\u012f\u0001\u0000\u0000\u0000\b\u0131"+ + "\u0001\u0000\u0000\u0000\b\u0133\u0001\u0000\u0000\u0000\b\u0135\u0001"+ + "\u0000\u0000\u0000\b\u0137\u0001\u0000\u0000\u0000\b\u0139\u0001\u0000"+ + "\u0000\u0000\b\u013b\u0001\u0000\u0000\u0000\b\u013d\u0001\u0000\u0000"+ + "\u0000\b\u013f\u0001\u0000\u0000\u0000\b\u0141\u0001\u0000\u0000\u0000"+ + "\t\u0143\u0001\u0000\u0000\u0000\t\u0145\u0001\u0000\u0000\u0000\t\u0147"+ + "\u0001\u0000\u0000\u0000\t\u0149\u0001\u0000\u0000\u0000\t\u014b\u0001"+ + "\u0000\u0000\u0000\n\u014d\u0001\u0000\u0000\u0000\n\u014f\u0001\u0000"+ + "\u0000\u0000\n\u0151\u0001\u0000\u0000\u0000\n\u0153\u0001\u0000\u0000"+ + "\u0000\n\u0155\u0001\u0000\u0000\u0000\n\u0157\u0001\u0000\u0000\u0000"+ + "\u000b\u0159\u0001\u0000\u0000\u0000\u000b\u015b\u0001\u0000\u0000\u0000"+ + "\u000b\u015d\u0001\u0000\u0000\u0000\u000b\u015f\u0001\u0000\u0000\u0000"+ + "\u000b\u0161\u0001\u0000\u0000\u0000\u000b\u0163\u0001\u0000\u0000\u0000"+ + "\u000b\u0165\u0001\u0000\u0000\u0000\u000b\u0167\u0001\u0000\u0000\u0000"+ + "\u000b\u0169\u0001\u0000\u0000\u0000\u000b\u016b\u0001\u0000\u0000\u0000"+ + "\f\u016d\u0001\u0000\u0000\u0000\f\u016f\u0001\u0000\u0000\u0000\f\u0171"+ + "\u0001\u0000\u0000\u0000\f\u0173\u0001\u0000\u0000\u0000\f\u0175\u0001"+ + "\u0000\u0000\u0000\f\u0177\u0001\u0000\u0000\u0000\f\u0179\u0001\u0000"+ + "\u0000\u0000\r\u017b\u0001\u0000\u0000\u0000\r\u017d\u0001\u0000\u0000"+ + "\u0000\r\u017f\u0001\u0000\u0000\u0000\r\u0181\u0001\u0000\u0000\u0000"+ + "\r\u0183\u0001\u0000\u0000\u0000\r\u0185\u0001\u0000\u0000\u0000\u000e"+ + "\u0187\u0001\u0000\u0000\u0000\u000e\u0189\u0001\u0000\u0000\u0000\u000e"+ + "\u018b\u0001\u0000\u0000\u0000\u000e\u018d\u0001\u0000\u0000\u0000\u000e"+ + "\u018f\u0001\u0000\u0000\u0000\u000e\u0191\u0001\u0000\u0000\u0000\u000e"+ + "\u0193\u0001\u0000\u0000\u0000\u000e\u0195\u0001\u0000\u0000\u0000\u000e"+ + "\u0197\u0001\u0000\u0000\u0000\u000f\u0199\u0001\u0000\u0000\u0000\u0011"+ + "\u01a3\u0001\u0000\u0000\u0000\u0013\u01aa\u0001\u0000\u0000\u0000\u0015"+ + "\u01b3\u0001\u0000\u0000\u0000\u0017\u01ba\u0001\u0000\u0000\u0000\u0019"+ + "\u01c4\u0001\u0000\u0000\u0000\u001b\u01cb\u0001\u0000\u0000\u0000\u001d"+ + "\u01d2\u0001\u0000\u0000\u0000\u001f\u01d9\u0001\u0000\u0000\u0000!\u01e1"+ + "\u0001\u0000\u0000\u0000#\u01ed\u0001\u0000\u0000\u0000%\u01f6\u0001\u0000"+ + "\u0000\u0000\'\u01fc\u0001\u0000\u0000\u0000)\u0203\u0001\u0000\u0000"+ + "\u0000+\u020a\u0001\u0000\u0000\u0000-\u0212\u0001\u0000\u0000\u0000/"+ + "\u021a\u0001\u0000\u0000\u00001\u0229\u0001\u0000\u0000\u00003\u0233\u0001"+ + "\u0000\u0000\u00005\u023f\u0001\u0000\u0000\u00007\u0245\u0001\u0000\u0000"+ + "\u00009\u0256\u0001\u0000\u0000\u0000;\u0266\u0001\u0000\u0000\u0000="+ + "\u026c\u0001\u0000\u0000\u0000?\u0270\u0001\u0000\u0000\u0000A\u0272\u0001"+ + "\u0000\u0000\u0000C\u0274\u0001\u0000\u0000\u0000E\u0277\u0001\u0000\u0000"+ + "\u0000G\u0279\u0001\u0000\u0000\u0000I\u0282\u0001\u0000\u0000\u0000K"+ + "\u0284\u0001\u0000\u0000\u0000M\u0289\u0001\u0000\u0000\u0000O\u028b\u0001"+ + "\u0000\u0000\u0000Q\u0290\u0001\u0000\u0000\u0000S\u02af\u0001\u0000\u0000"+ + "\u0000U\u02b2\u0001\u0000\u0000\u0000W\u02e0\u0001\u0000\u0000\u0000Y"+ + "\u02e2\u0001\u0000\u0000\u0000[\u02e5\u0001\u0000\u0000\u0000]\u02e9\u0001"+ + "\u0000\u0000\u0000_\u02ed\u0001\u0000\u0000\u0000a\u02ef\u0001\u0000\u0000"+ + "\u0000c\u02f2\u0001\u0000\u0000\u0000e\u02f4\u0001\u0000\u0000\u0000g"+ + "\u02f9\u0001\u0000\u0000\u0000i\u02fb\u0001\u0000\u0000\u0000k\u0301\u0001"+ + "\u0000\u0000\u0000m\u0307\u0001\u0000\u0000\u0000o\u030a\u0001\u0000\u0000"+ + "\u0000q\u030d\u0001\u0000\u0000\u0000s\u0312\u0001\u0000\u0000\u0000u"+ + "\u0317\u0001\u0000\u0000\u0000w\u0319\u0001\u0000\u0000\u0000y\u031d\u0001"+ + "\u0000\u0000\u0000{\u0322\u0001\u0000\u0000\u0000}\u0328\u0001\u0000\u0000"+ + "\u0000\u007f\u032b\u0001\u0000\u0000\u0000\u0081\u032d\u0001\u0000\u0000"+ + "\u0000\u0083\u0333\u0001\u0000\u0000\u0000\u0085\u0335\u0001\u0000\u0000"+ + "\u0000\u0087\u033a\u0001\u0000\u0000\u0000\u0089\u033d\u0001\u0000\u0000"+ + "\u0000\u008b\u0340\u0001\u0000\u0000\u0000\u008d\u0343\u0001\u0000\u0000"+ + "\u0000\u008f\u0345\u0001\u0000\u0000\u0000\u0091\u0348\u0001\u0000\u0000"+ + "\u0000\u0093\u034a\u0001\u0000\u0000\u0000\u0095\u034d\u0001\u0000\u0000"+ + "\u0000\u0097\u034f\u0001\u0000\u0000\u0000\u0099\u0351\u0001\u0000\u0000"+ + "\u0000\u009b\u0353\u0001\u0000\u0000\u0000\u009d\u0355\u0001\u0000\u0000"+ + "\u0000\u009f\u0357\u0001\u0000\u0000\u0000\u00a1\u036f\u0001\u0000\u0000"+ + "\u0000\u00a3\u0371\u0001\u0000\u0000\u0000\u00a5\u0376\u0001\u0000\u0000"+ + "\u0000\u00a7\u038b\u0001\u0000\u0000\u0000\u00a9\u038d\u0001\u0000\u0000"+ + "\u0000\u00ab\u0395\u0001\u0000\u0000\u0000\u00ad\u0397\u0001\u0000\u0000"+ + "\u0000\u00af\u039b\u0001\u0000\u0000\u0000\u00b1\u039f\u0001\u0000\u0000"+ + "\u0000\u00b3\u03a3\u0001\u0000\u0000\u0000\u00b5\u03a8\u0001\u0000\u0000"+ + "\u0000\u00b7\u03ad\u0001\u0000\u0000\u0000\u00b9\u03b1\u0001\u0000\u0000"+ + "\u0000\u00bb\u03b5\u0001\u0000\u0000\u0000\u00bd\u03b9\u0001\u0000\u0000"+ + "\u0000\u00bf\u03be\u0001\u0000\u0000\u0000\u00c1\u03c2\u0001\u0000\u0000"+ + "\u0000\u00c3\u03c6\u0001\u0000\u0000\u0000\u00c5\u03ca\u0001\u0000\u0000"+ + "\u0000\u00c7\u03ce\u0001\u0000\u0000\u0000\u00c9\u03d2\u0001\u0000\u0000"+ + "\u0000\u00cb\u03de\u0001\u0000\u0000\u0000\u00cd\u03e1\u0001\u0000\u0000"+ + "\u0000\u00cf\u03e5\u0001\u0000\u0000\u0000\u00d1\u03e9\u0001\u0000\u0000"+ + "\u0000\u00d3\u03ed\u0001\u0000\u0000\u0000\u00d5\u03f1\u0001\u0000\u0000"+ + "\u0000\u00d7\u03f5\u0001\u0000\u0000\u0000\u00d9\u03f9\u0001\u0000\u0000"+ + "\u0000\u00db\u03fe\u0001\u0000\u0000\u0000\u00dd\u0402\u0001\u0000\u0000"+ + "\u0000\u00df\u0406\u0001\u0000\u0000\u0000\u00e1\u040a\u0001\u0000\u0000"+ + "\u0000\u00e3\u0412\u0001\u0000\u0000\u0000\u00e5\u0427\u0001\u0000\u0000"+ + "\u0000\u00e7\u042b\u0001\u0000\u0000\u0000\u00e9\u042f\u0001\u0000\u0000"+ + "\u0000\u00eb\u0433\u0001\u0000\u0000\u0000\u00ed\u0437\u0001\u0000\u0000"+ + "\u0000\u00ef\u043b\u0001\u0000\u0000\u0000\u00f1\u0440\u0001\u0000\u0000"+ + "\u0000\u00f3\u0444\u0001\u0000\u0000\u0000\u00f5\u0448\u0001\u0000\u0000"+ + "\u0000\u00f7\u044c\u0001\u0000\u0000\u0000\u00f9\u0450\u0001\u0000\u0000"+ + "\u0000\u00fb\u0454\u0001\u0000\u0000\u0000\u00fd\u0457\u0001\u0000\u0000"+ + "\u0000\u00ff\u045b\u0001\u0000\u0000\u0000\u0101\u045f\u0001\u0000\u0000"+ + "\u0000\u0103\u0463\u0001\u0000\u0000\u0000\u0105\u0467\u0001\u0000\u0000"+ + "\u0000\u0107\u046c\u0001\u0000\u0000\u0000\u0109\u0471\u0001\u0000\u0000"+ + "\u0000\u010b\u0476\u0001\u0000\u0000\u0000\u010d\u047d\u0001\u0000\u0000"+ + "\u0000\u010f\u0486\u0001\u0000\u0000\u0000\u0111\u048d\u0001\u0000\u0000"+ + "\u0000\u0113\u0491\u0001\u0000\u0000\u0000\u0115\u0495\u0001\u0000\u0000"+ + "\u0000\u0117\u0499\u0001\u0000\u0000\u0000\u0119\u049d\u0001\u0000\u0000"+ + "\u0000\u011b\u04a3\u0001\u0000\u0000\u0000\u011d\u04a7\u0001\u0000\u0000"+ + "\u0000\u011f\u04ab\u0001\u0000\u0000\u0000\u0121\u04af\u0001\u0000\u0000"+ + "\u0000\u0123\u04b3\u0001\u0000\u0000\u0000\u0125\u04b7\u0001\u0000\u0000"+ + "\u0000\u0127\u04bb\u0001\u0000\u0000\u0000\u0129\u04bf\u0001\u0000\u0000"+ + "\u0000\u012b\u04c3\u0001\u0000\u0000\u0000\u012d\u04c7\u0001\u0000\u0000"+ + "\u0000\u012f\u04cb\u0001\u0000\u0000\u0000\u0131\u04cf\u0001\u0000\u0000"+ + "\u0000\u0133\u04d4\u0001\u0000\u0000\u0000\u0135\u04d8\u0001\u0000\u0000"+ + "\u0000\u0137\u04dc\u0001\u0000\u0000\u0000\u0139\u04e0\u0001\u0000\u0000"+ + "\u0000\u013b\u04e4\u0001\u0000\u0000\u0000\u013d\u04e8\u0001\u0000\u0000"+ + "\u0000\u013f\u04ec\u0001\u0000\u0000\u0000\u0141\u04f0\u0001\u0000\u0000"+ + "\u0000\u0143\u04f4\u0001\u0000\u0000\u0000\u0145\u04f9\u0001\u0000\u0000"+ + "\u0000\u0147\u04fe\u0001\u0000\u0000\u0000\u0149\u0502\u0001\u0000\u0000"+ + "\u0000\u014b\u0506\u0001\u0000\u0000\u0000\u014d\u050a\u0001\u0000\u0000"+ + "\u0000\u014f\u050f\u0001\u0000\u0000\u0000\u0151\u0516\u0001\u0000\u0000"+ + "\u0000\u0153\u051a\u0001\u0000\u0000\u0000\u0155\u051e\u0001\u0000\u0000"+ + "\u0000\u0157\u0522\u0001\u0000\u0000\u0000\u0159\u0526\u0001\u0000\u0000"+ + "\u0000\u015b\u052b\u0001\u0000\u0000\u0000\u015d\u052f\u0001\u0000\u0000"+ + "\u0000\u015f\u0533\u0001\u0000\u0000\u0000\u0161\u0537\u0001\u0000\u0000"+ + "\u0000\u0163\u053c\u0001\u0000\u0000\u0000\u0165\u0540\u0001\u0000\u0000"+ + "\u0000\u0167\u0544\u0001\u0000\u0000\u0000\u0169\u0548\u0001\u0000\u0000"+ + "\u0000\u016b\u054c\u0001\u0000\u0000\u0000\u016d\u0550\u0001\u0000\u0000"+ + "\u0000\u016f\u0556\u0001\u0000\u0000\u0000\u0171\u055a\u0001\u0000\u0000"+ + "\u0000\u0173\u055e\u0001\u0000\u0000\u0000\u0175\u0562\u0001\u0000\u0000"+ + "\u0000\u0177\u0566\u0001\u0000\u0000\u0000\u0179\u056a\u0001\u0000\u0000"+ + "\u0000\u017b\u056e\u0001\u0000\u0000\u0000\u017d\u0573\u0001\u0000\u0000"+ + "\u0000\u017f\u0579\u0001\u0000\u0000\u0000\u0181\u057f\u0001\u0000\u0000"+ + "\u0000\u0183\u0583\u0001\u0000\u0000\u0000\u0185\u0587\u0001\u0000\u0000"+ + "\u0000\u0187\u058b\u0001\u0000\u0000\u0000\u0189\u0591\u0001\u0000\u0000"+ + "\u0000\u018b\u0597\u0001\u0000\u0000\u0000\u018d\u059b\u0001\u0000\u0000"+ + "\u0000\u018f\u059f\u0001\u0000\u0000\u0000\u0191\u05a3\u0001\u0000\u0000"+ + "\u0000\u0193\u05a9\u0001\u0000\u0000\u0000\u0195\u05af\u0001\u0000\u0000"+ + "\u0000\u0197\u05b5\u0001\u0000\u0000\u0000\u0199\u019a\u0007\u0000\u0000"+ + "\u0000\u019a\u019b\u0007\u0001\u0000\u0000\u019b\u019c\u0007\u0002\u0000"+ + "\u0000\u019c\u019d\u0007\u0002\u0000\u0000\u019d\u019e\u0007\u0003\u0000"+ + "\u0000\u019e\u019f\u0007\u0004\u0000\u0000\u019f\u01a0\u0007\u0005\u0000"+ + "\u0000\u01a0\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a2\u0006\u0000\u0000"+ + "\u0000\u01a2\u0010\u0001\u0000\u0000\u0000\u01a3\u01a4\u0007\u0000\u0000"+ + "\u0000\u01a4\u01a5\u0007\u0006\u0000\u0000\u01a5\u01a6\u0007\u0007\u0000"+ + "\u0000\u01a6\u01a7\u0007\b\u0000\u0000\u01a7\u01a8\u0001\u0000\u0000\u0000"+ + "\u01a8\u01a9\u0006\u0001\u0001\u0000\u01a9\u0012\u0001\u0000\u0000\u0000"+ + "\u01aa\u01ab\u0007\u0003\u0000\u0000\u01ab\u01ac\u0007\t\u0000\u0000\u01ac"+ + "\u01ad\u0007\u0006\u0000\u0000\u01ad\u01ae\u0007\u0001\u0000\u0000\u01ae"+ + "\u01af\u0007\u0004\u0000\u0000\u01af\u01b0\u0007\n\u0000\u0000\u01b0\u01b1"+ + "\u0001\u0000\u0000\u0000\u01b1\u01b2\u0006\u0002\u0002\u0000\u01b2\u0014"+ + "\u0001\u0000\u0000\u0000\u01b3\u01b4\u0007\u0003\u0000\u0000\u01b4\u01b5"+ + "\u0007\u000b\u0000\u0000\u01b5\u01b6\u0007\f\u0000\u0000\u01b6\u01b7\u0007"+ + "\r\u0000\u0000\u01b7\u01b8\u0001\u0000\u0000\u0000\u01b8\u01b9\u0006\u0003"+ + "\u0000\u0000\u01b9\u0016\u0001\u0000\u0000\u0000\u01ba\u01bb\u0007\u0003"+ + "\u0000\u0000\u01bb\u01bc\u0007\u000e\u0000\u0000\u01bc\u01bd\u0007\b\u0000"+ + "\u0000\u01bd\u01be\u0007\r\u0000\u0000\u01be\u01bf\u0007\f\u0000\u0000"+ + "\u01bf\u01c0\u0007\u0001\u0000\u0000\u01c0\u01c1\u0007\t\u0000\u0000\u01c1"+ + "\u01c2\u0001\u0000\u0000\u0000\u01c2\u01c3\u0006\u0004\u0003\u0000\u01c3"+ + "\u0018\u0001\u0000\u0000\u0000\u01c4\u01c5\u0007\u000f\u0000\u0000\u01c5"+ + "\u01c6\u0007\u0006\u0000\u0000\u01c6\u01c7\u0007\u0007\u0000\u0000\u01c7"+ + "\u01c8\u0007\u0010\u0000\u0000\u01c8\u01c9\u0001\u0000\u0000\u0000\u01c9"+ + "\u01ca\u0006\u0005\u0004\u0000\u01ca\u001a\u0001\u0000\u0000\u0000\u01cb"+ + "\u01cc\u0007\u0011\u0000\u0000\u01cc\u01cd\u0007\u0006\u0000\u0000\u01cd"+ + "\u01ce\u0007\u0007\u0000\u0000\u01ce\u01cf\u0007\u0012\u0000\u0000\u01cf"+ + "\u01d0\u0001\u0000\u0000\u0000\u01d0\u01d1\u0006\u0006\u0000\u0000\u01d1"+ + "\u001c\u0001\u0000\u0000\u0000\u01d2\u01d3\u0007\u0012\u0000\u0000\u01d3"+ + "\u01d4\u0007\u0003\u0000\u0000\u01d4\u01d5\u0007\u0003\u0000\u0000\u01d5"+ + "\u01d6\u0007\b\u0000\u0000\u01d6\u01d7\u0001\u0000\u0000\u0000\u01d7\u01d8"+ + "\u0006\u0007\u0001\u0000\u01d8\u001e\u0001\u0000\u0000\u0000\u01d9\u01da"+ + "\u0007\r\u0000\u0000\u01da\u01db\u0007\u0001\u0000\u0000\u01db\u01dc\u0007"+ + "\u0010\u0000\u0000\u01dc\u01dd\u0007\u0001\u0000\u0000\u01dd\u01de\u0007"+ + "\u0005\u0000\u0000\u01de\u01df\u0001\u0000\u0000\u0000\u01df\u01e0\u0006"+ + "\b\u0000\u0000\u01e0 \u0001\u0000\u0000\u0000\u01e1\u01e2\u0007\u0010"+ + "\u0000\u0000\u01e2\u01e3\u0007\u000b\u0000\u0000\u01e3\u01e4\u0005_\u0000"+ + "\u0000\u01e4\u01e5\u0007\u0003\u0000\u0000\u01e5\u01e6\u0007\u000e\u0000"+ + "\u0000\u01e6\u01e7\u0007\b\u0000\u0000\u01e7\u01e8\u0007\f\u0000\u0000"+ + "\u01e8\u01e9\u0007\t\u0000\u0000\u01e9\u01ea\u0007\u0000\u0000\u0000\u01ea"+ + "\u01eb\u0001\u0000\u0000\u0000\u01eb\u01ec\u0006\t\u0005\u0000\u01ec\""+ + "\u0001\u0000\u0000\u0000\u01ed\u01ee\u0007\u0006\u0000\u0000\u01ee\u01ef"+ + "\u0007\u0003\u0000\u0000\u01ef\u01f0\u0007\t\u0000\u0000\u01f0\u01f1\u0007"+ + "\f\u0000\u0000\u01f1\u01f2\u0007\u0010\u0000\u0000\u01f2\u01f3\u0007\u0003"+ + "\u0000\u0000\u01f3\u01f4\u0001\u0000\u0000\u0000\u01f4\u01f5\u0006\n\u0006"+ + "\u0000\u01f5$\u0001\u0000\u0000\u0000\u01f6\u01f7\u0007\u0006\u0000\u0000"+ + "\u01f7\u01f8\u0007\u0007\u0000\u0000\u01f8\u01f9\u0007\u0013\u0000\u0000"+ + "\u01f9\u01fa\u0001\u0000\u0000\u0000\u01fa\u01fb\u0006\u000b\u0000\u0000"+ + "\u01fb&\u0001\u0000\u0000\u0000\u01fc\u01fd\u0007\u0002\u0000\u0000\u01fd"+ + "\u01fe\u0007\n\u0000\u0000\u01fe\u01ff\u0007\u0007\u0000\u0000\u01ff\u0200"+ + "\u0007\u0013\u0000\u0000\u0200\u0201\u0001\u0000\u0000\u0000\u0201\u0202"+ + "\u0006\f\u0007\u0000\u0202(\u0001\u0000\u0000\u0000\u0203\u0204\u0007"+ + "\u0002\u0000\u0000\u0204\u0205\u0007\u0007\u0000\u0000\u0205\u0206\u0007"+ + "\u0006\u0000\u0000\u0206\u0207\u0007\u0005\u0000\u0000\u0207\u0208\u0001"+ + "\u0000\u0000\u0000\u0208\u0209\u0006\r\u0000\u0000\u0209*\u0001\u0000"+ + "\u0000\u0000\u020a\u020b\u0007\u0002\u0000\u0000\u020b\u020c\u0007\u0005"+ + "\u0000\u0000\u020c\u020d\u0007\f\u0000\u0000\u020d\u020e\u0007\u0005\u0000"+ + "\u0000\u020e\u020f\u0007\u0002\u0000\u0000\u020f\u0210\u0001\u0000\u0000"+ + "\u0000\u0210\u0211\u0006\u000e\u0000\u0000\u0211,\u0001\u0000\u0000\u0000"+ + "\u0212\u0213\u0007\u0013\u0000\u0000\u0213\u0214\u0007\n\u0000\u0000\u0214"+ + "\u0215\u0007\u0003\u0000\u0000\u0215\u0216\u0007\u0006\u0000\u0000\u0216"+ + "\u0217\u0007\u0003\u0000\u0000\u0217\u0218\u0001\u0000\u0000\u0000\u0218"+ + "\u0219\u0006\u000f\u0000\u0000\u0219.\u0001\u0000\u0000\u0000\u021a\u021b"+ + "\u0004\u0010\u0000\u0000\u021b\u021c\u0007\u0001\u0000\u0000\u021c\u021d"+ + "\u0007\t\u0000\u0000\u021d\u021e\u0007\r\u0000\u0000\u021e\u021f\u0007"+ + "\u0001\u0000\u0000\u021f\u0220\u0007\t\u0000\u0000\u0220\u0221\u0007\u0003"+ + "\u0000\u0000\u0221\u0222\u0007\u0002\u0000\u0000\u0222\u0223\u0007\u0005"+ + "\u0000\u0000\u0223\u0224\u0007\f\u0000\u0000\u0224\u0225\u0007\u0005\u0000"+ + "\u0000\u0225\u0226\u0007\u0002\u0000\u0000\u0226\u0227\u0001\u0000\u0000"+ + "\u0000\u0227\u0228\u0006\u0010\u0000\u0000\u02280\u0001\u0000\u0000\u0000"+ + "\u0229\u022a\u0004\u0011\u0001\u0000\u022a\u022b\u0007\r\u0000\u0000\u022b"+ + "\u022c\u0007\u0007\u0000\u0000\u022c\u022d\u0007\u0007\u0000\u0000\u022d"+ + "\u022e\u0007\u0012\u0000\u0000\u022e\u022f\u0007\u0014\u0000\u0000\u022f"+ + "\u0230\u0007\b\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000\u0231\u0232"+ + "\u0006\u0011\b\u0000\u02322\u0001\u0000\u0000\u0000\u0233\u0234\u0004"+ + "\u0012\u0002\u0000\u0234\u0235\u0007\u0010\u0000\u0000\u0235\u0236\u0007"+ + "\u0003\u0000\u0000\u0236\u0237\u0007\u0005\u0000\u0000\u0237\u0238\u0007"+ + "\u0006\u0000\u0000\u0238\u0239\u0007\u0001\u0000\u0000\u0239\u023a\u0007"+ + "\u0004\u0000\u0000\u023a\u023b\u0007\u0002\u0000\u0000\u023b\u023c\u0001"+ + "\u0000\u0000\u0000\u023c\u023d\u0006\u0012\t\u0000\u023d4\u0001\u0000"+ + "\u0000\u0000\u023e\u0240\b\u0015\u0000\u0000\u023f\u023e\u0001\u0000\u0000"+ + "\u0000\u0240\u0241\u0001\u0000\u0000\u0000\u0241\u023f\u0001\u0000\u0000"+ + "\u0000\u0241\u0242\u0001\u0000\u0000\u0000\u0242\u0243\u0001\u0000\u0000"+ + "\u0000\u0243\u0244\u0006\u0013\u0000\u0000\u02446\u0001\u0000\u0000\u0000"+ + "\u0245\u0246\u0005/\u0000\u0000\u0246\u0247\u0005/\u0000\u0000\u0247\u024b"+ + "\u0001\u0000\u0000\u0000\u0248\u024a\b\u0016\u0000\u0000\u0249\u0248\u0001"+ + "\u0000\u0000\u0000\u024a\u024d\u0001\u0000\u0000\u0000\u024b\u0249\u0001"+ + "\u0000\u0000\u0000\u024b\u024c\u0001\u0000\u0000\u0000\u024c\u024f\u0001"+ + "\u0000\u0000\u0000\u024d\u024b\u0001\u0000\u0000\u0000\u024e\u0250\u0005"+ + "\r\u0000\u0000\u024f\u024e\u0001\u0000\u0000\u0000\u024f\u0250\u0001\u0000"+ + "\u0000\u0000\u0250\u0252\u0001\u0000\u0000\u0000\u0251\u0253\u0005\n\u0000"+ + "\u0000\u0252\u0251\u0001\u0000\u0000\u0000\u0252\u0253\u0001\u0000\u0000"+ + "\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0255\u0006\u0014\n\u0000"+ + "\u02558\u0001\u0000\u0000\u0000\u0256\u0257\u0005/\u0000\u0000\u0257\u0258"+ + "\u0005*\u0000\u0000\u0258\u025d\u0001\u0000\u0000\u0000\u0259\u025c\u0003"+ + "9\u0015\u0000\u025a\u025c\t\u0000\u0000\u0000\u025b\u0259\u0001\u0000"+ + "\u0000\u0000\u025b\u025a\u0001\u0000\u0000\u0000\u025c\u025f\u0001\u0000"+ + "\u0000\u0000\u025d\u025e\u0001\u0000\u0000\u0000\u025d\u025b\u0001\u0000"+ + "\u0000\u0000\u025e\u0260\u0001\u0000\u0000\u0000\u025f\u025d\u0001\u0000"+ + "\u0000\u0000\u0260\u0261\u0005*\u0000\u0000\u0261\u0262\u0005/\u0000\u0000"+ + "\u0262\u0263\u0001\u0000\u0000\u0000\u0263\u0264\u0006\u0015\n\u0000\u0264"+ + ":\u0001\u0000\u0000\u0000\u0265\u0267\u0007\u0017\u0000\u0000\u0266\u0265"+ + "\u0001\u0000\u0000\u0000\u0267\u0268\u0001\u0000\u0000\u0000\u0268\u0266"+ + "\u0001\u0000\u0000\u0000\u0268\u0269\u0001\u0000\u0000\u0000\u0269\u026a"+ + "\u0001\u0000\u0000\u0000\u026a\u026b\u0006\u0016\n\u0000\u026b<\u0001"+ + "\u0000\u0000\u0000\u026c\u026d\u0005|\u0000\u0000\u026d\u026e\u0001\u0000"+ + "\u0000\u0000\u026e\u026f\u0006\u0017\u000b\u0000\u026f>\u0001\u0000\u0000"+ + "\u0000\u0270\u0271\u0007\u0018\u0000\u0000\u0271@\u0001\u0000\u0000\u0000"+ + "\u0272\u0273\u0007\u0019\u0000\u0000\u0273B\u0001\u0000\u0000\u0000\u0274"+ + "\u0275\u0005\\\u0000\u0000\u0275\u0276\u0007\u001a\u0000\u0000\u0276D"+ + "\u0001\u0000\u0000\u0000\u0277\u0278\b\u001b\u0000\u0000\u0278F\u0001"+ + "\u0000\u0000\u0000\u0279\u027b\u0007\u0003\u0000\u0000\u027a\u027c\u0007"+ + "\u001c\u0000\u0000\u027b\u027a\u0001\u0000\u0000\u0000\u027b\u027c\u0001"+ + "\u0000\u0000\u0000\u027c\u027e\u0001\u0000\u0000\u0000\u027d\u027f\u0003"+ + "?\u0018\u0000\u027e\u027d\u0001\u0000\u0000\u0000\u027f\u0280\u0001\u0000"+ + "\u0000\u0000\u0280\u027e\u0001\u0000\u0000\u0000\u0280\u0281\u0001\u0000"+ + "\u0000\u0000\u0281H\u0001\u0000\u0000\u0000\u0282\u0283\u0005@\u0000\u0000"+ + "\u0283J\u0001\u0000\u0000\u0000\u0284\u0285\u0005`\u0000\u0000\u0285L"+ + "\u0001\u0000\u0000\u0000\u0286\u028a\b\u001d\u0000\u0000\u0287\u0288\u0005"+ + "`\u0000\u0000\u0288\u028a\u0005`\u0000\u0000\u0289\u0286\u0001\u0000\u0000"+ + "\u0000\u0289\u0287\u0001\u0000\u0000\u0000\u028aN\u0001\u0000\u0000\u0000"+ + "\u028b\u028c\u0005_\u0000\u0000\u028cP\u0001\u0000\u0000\u0000\u028d\u0291"+ + "\u0003A\u0019\u0000\u028e\u0291\u0003?\u0018\u0000\u028f\u0291\u0003O"+ + " \u0000\u0290\u028d\u0001\u0000\u0000\u0000\u0290\u028e\u0001\u0000\u0000"+ + "\u0000\u0290\u028f\u0001\u0000\u0000\u0000\u0291R\u0001\u0000\u0000\u0000"+ + "\u0292\u0297\u0005\"\u0000\u0000\u0293\u0296\u0003C\u001a\u0000\u0294"+ + "\u0296\u0003E\u001b\u0000\u0295\u0293\u0001\u0000\u0000\u0000\u0295\u0294"+ + "\u0001\u0000\u0000\u0000\u0296\u0299\u0001\u0000\u0000\u0000\u0297\u0295"+ + "\u0001\u0000\u0000\u0000\u0297\u0298\u0001\u0000\u0000\u0000\u0298\u029a"+ + "\u0001\u0000\u0000\u0000\u0299\u0297\u0001\u0000\u0000\u0000\u029a\u02b0"+ + "\u0005\"\u0000\u0000\u029b\u029c\u0005\"\u0000\u0000\u029c\u029d\u0005"+ + "\"\u0000\u0000\u029d\u029e\u0005\"\u0000\u0000\u029e\u02a2\u0001\u0000"+ + "\u0000\u0000\u029f\u02a1\b\u0016\u0000\u0000\u02a0\u029f\u0001\u0000\u0000"+ + "\u0000\u02a1\u02a4\u0001\u0000\u0000\u0000\u02a2\u02a3\u0001\u0000\u0000"+ + "\u0000\u02a2\u02a0\u0001\u0000\u0000\u0000\u02a3\u02a5\u0001\u0000\u0000"+ + "\u0000\u02a4\u02a2\u0001\u0000\u0000\u0000\u02a5\u02a6\u0005\"\u0000\u0000"+ + "\u02a6\u02a7\u0005\"\u0000\u0000\u02a7\u02a8\u0005\"\u0000\u0000\u02a8"+ + "\u02aa\u0001\u0000\u0000\u0000\u02a9\u02ab\u0005\"\u0000\u0000\u02aa\u02a9"+ + "\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02ab\u02ad"+ + "\u0001\u0000\u0000\u0000\u02ac\u02ae\u0005\"\u0000\u0000\u02ad\u02ac\u0001"+ + "\u0000\u0000\u0000\u02ad\u02ae\u0001\u0000\u0000\u0000\u02ae\u02b0\u0001"+ + "\u0000\u0000\u0000\u02af\u0292\u0001\u0000\u0000\u0000\u02af\u029b\u0001"+ + "\u0000\u0000\u0000\u02b0T\u0001\u0000\u0000\u0000\u02b1\u02b3\u0003?\u0018"+ + "\u0000\u02b2\u02b1\u0001\u0000\u0000\u0000\u02b3\u02b4\u0001\u0000\u0000"+ + "\u0000\u02b4\u02b2\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001\u0000\u0000"+ + "\u0000\u02b5V\u0001\u0000\u0000\u0000\u02b6\u02b8\u0003?\u0018\u0000\u02b7"+ + "\u02b6\u0001\u0000\u0000\u0000\u02b8\u02b9\u0001\u0000\u0000\u0000\u02b9"+ + "\u02b7\u0001\u0000\u0000\u0000\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba"+ + "\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bf\u0003g,\u0000\u02bc\u02be\u0003"+ + "?\u0018\u0000\u02bd\u02bc\u0001\u0000\u0000\u0000\u02be\u02c1\u0001\u0000"+ + "\u0000\u0000\u02bf\u02bd\u0001\u0000\u0000\u0000\u02bf\u02c0\u0001\u0000"+ + "\u0000\u0000\u02c0\u02e1\u0001\u0000\u0000\u0000\u02c1\u02bf\u0001\u0000"+ + "\u0000\u0000\u02c2\u02c4\u0003g,\u0000\u02c3\u02c5\u0003?\u0018\u0000"+ + "\u02c4\u02c3\u0001\u0000\u0000\u0000\u02c5\u02c6\u0001\u0000\u0000\u0000"+ + "\u02c6\u02c4\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000"+ + "\u02c7\u02e1\u0001\u0000\u0000\u0000\u02c8\u02ca\u0003?\u0018\u0000\u02c9"+ + "\u02c8\u0001\u0000\u0000\u0000\u02ca\u02cb\u0001\u0000\u0000\u0000\u02cb"+ + "\u02c9\u0001\u0000\u0000\u0000\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc"+ + "\u02d4\u0001\u0000\u0000\u0000\u02cd\u02d1\u0003g,\u0000\u02ce\u02d0\u0003"+ + "?\u0018\u0000\u02cf\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d3\u0001\u0000"+ + "\u0000\u0000\u02d1\u02cf\u0001\u0000\u0000\u0000\u02d1\u02d2\u0001\u0000"+ + "\u0000\u0000\u02d2\u02d5\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000"+ + "\u0000\u0000\u02d4\u02cd\u0001\u0000\u0000\u0000\u02d4\u02d5\u0001\u0000"+ + "\u0000\u0000\u02d5\u02d6\u0001\u0000\u0000\u0000\u02d6\u02d7\u0003G\u001c"+ + "\u0000\u02d7\u02e1\u0001\u0000\u0000\u0000\u02d8\u02da\u0003g,\u0000\u02d9"+ + "\u02db\u0003?\u0018\u0000\u02da\u02d9\u0001\u0000\u0000\u0000\u02db\u02dc"+ + "\u0001\u0000\u0000\u0000\u02dc\u02da\u0001\u0000\u0000\u0000\u02dc\u02dd"+ + "\u0001\u0000\u0000\u0000\u02dd\u02de\u0001\u0000\u0000\u0000\u02de\u02df"+ + "\u0003G\u001c\u0000\u02df\u02e1\u0001\u0000\u0000\u0000\u02e0\u02b7\u0001"+ + "\u0000\u0000\u0000\u02e0\u02c2\u0001\u0000\u0000\u0000\u02e0\u02c9\u0001"+ + "\u0000\u0000\u0000\u02e0\u02d8\u0001\u0000\u0000\u0000\u02e1X\u0001\u0000"+ + "\u0000\u0000\u02e2\u02e3\u0007\u001e\u0000\u0000\u02e3\u02e4\u0007\u001f"+ + "\u0000\u0000\u02e4Z\u0001\u0000\u0000\u0000\u02e5\u02e6\u0007\f\u0000"+ + "\u0000\u02e6\u02e7\u0007\t\u0000\u0000\u02e7\u02e8\u0007\u0000\u0000\u0000"+ + "\u02e8\\\u0001\u0000\u0000\u0000\u02e9\u02ea\u0007\f\u0000\u0000\u02ea"+ + "\u02eb\u0007\u0002\u0000\u0000\u02eb\u02ec\u0007\u0004\u0000\u0000\u02ec"+ + "^\u0001\u0000\u0000\u0000\u02ed\u02ee\u0005=\u0000\u0000\u02ee`\u0001"+ + "\u0000\u0000\u0000\u02ef\u02f0\u0005:\u0000\u0000\u02f0\u02f1\u0005:\u0000"+ + "\u0000\u02f1b\u0001\u0000\u0000\u0000\u02f2\u02f3\u0005,\u0000\u0000\u02f3"+ + "d\u0001\u0000\u0000\u0000\u02f4\u02f5\u0007\u0000\u0000\u0000\u02f5\u02f6"+ + "\u0007\u0003\u0000\u0000\u02f6\u02f7\u0007\u0002\u0000\u0000\u02f7\u02f8"+ + "\u0007\u0004\u0000\u0000\u02f8f\u0001\u0000\u0000\u0000\u02f9\u02fa\u0005"+ + ".\u0000\u0000\u02fah\u0001\u0000\u0000\u0000\u02fb\u02fc\u0007\u000f\u0000"+ + "\u0000\u02fc\u02fd\u0007\f\u0000\u0000\u02fd\u02fe\u0007\r\u0000\u0000"+ + "\u02fe\u02ff\u0007\u0002\u0000\u0000\u02ff\u0300\u0007\u0003\u0000\u0000"+ + "\u0300j\u0001\u0000\u0000\u0000\u0301\u0302\u0007\u000f\u0000\u0000\u0302"+ + "\u0303\u0007\u0001\u0000\u0000\u0303\u0304\u0007\u0006\u0000\u0000\u0304"+ + "\u0305\u0007\u0002\u0000\u0000\u0305\u0306\u0007\u0005\u0000\u0000\u0306"+ + "l\u0001\u0000\u0000\u0000\u0307\u0308\u0007\u0001\u0000\u0000\u0308\u0309"+ + "\u0007\t\u0000\u0000\u0309n\u0001\u0000\u0000\u0000\u030a\u030b\u0007"+ + "\u0001\u0000\u0000\u030b\u030c\u0007\u0002\u0000\u0000\u030cp\u0001\u0000"+ + "\u0000\u0000\u030d\u030e\u0007\r\u0000\u0000\u030e\u030f\u0007\f\u0000"+ + "\u0000\u030f\u0310\u0007\u0002\u0000\u0000\u0310\u0311\u0007\u0005\u0000"+ + "\u0000\u0311r\u0001\u0000\u0000\u0000\u0312\u0313\u0007\r\u0000\u0000"+ + "\u0313\u0314\u0007\u0001\u0000\u0000\u0314\u0315\u0007\u0012\u0000\u0000"+ + "\u0315\u0316\u0007\u0003\u0000\u0000\u0316t\u0001\u0000\u0000\u0000\u0317"+ + "\u0318\u0005(\u0000\u0000\u0318v\u0001\u0000\u0000\u0000\u0319\u031a\u0007"+ + "\t\u0000\u0000\u031a\u031b\u0007\u0007\u0000\u0000\u031b\u031c\u0007\u0005"+ + "\u0000\u0000\u031cx\u0001\u0000\u0000\u0000\u031d\u031e\u0007\t\u0000"+ + "\u0000\u031e\u031f\u0007\u0014\u0000\u0000\u031f\u0320\u0007\r\u0000\u0000"+ + "\u0320\u0321\u0007\r\u0000\u0000\u0321z\u0001\u0000\u0000\u0000\u0322"+ + "\u0323\u0007\t\u0000\u0000\u0323\u0324\u0007\u0014\u0000\u0000\u0324\u0325"+ + "\u0007\r\u0000\u0000\u0325\u0326\u0007\r\u0000\u0000\u0326\u0327\u0007"+ + "\u0002\u0000\u0000\u0327|\u0001\u0000\u0000\u0000\u0328\u0329\u0007\u0007"+ + "\u0000\u0000\u0329\u032a\u0007\u0006\u0000\u0000\u032a~\u0001\u0000\u0000"+ + "\u0000\u032b\u032c\u0005?\u0000\u0000\u032c\u0080\u0001\u0000\u0000\u0000"+ + "\u032d\u032e\u0007\u0006\u0000\u0000\u032e\u032f\u0007\r\u0000\u0000\u032f"+ + "\u0330\u0007\u0001\u0000\u0000\u0330\u0331\u0007\u0012\u0000\u0000\u0331"+ + "\u0332\u0007\u0003\u0000\u0000\u0332\u0082\u0001\u0000\u0000\u0000\u0333"+ + "\u0334\u0005)\u0000\u0000\u0334\u0084\u0001\u0000\u0000\u0000\u0335\u0336"+ + "\u0007\u0005\u0000\u0000\u0336\u0337\u0007\u0006\u0000\u0000\u0337\u0338"+ + "\u0007\u0014\u0000\u0000\u0338\u0339\u0007\u0003\u0000\u0000\u0339\u0086"+ + "\u0001\u0000\u0000\u0000\u033a\u033b\u0005=\u0000\u0000\u033b\u033c\u0005"+ + "=\u0000\u0000\u033c\u0088\u0001\u0000\u0000\u0000\u033d\u033e\u0005=\u0000"+ + "\u0000\u033e\u033f\u0005~\u0000\u0000\u033f\u008a\u0001\u0000\u0000\u0000"+ + "\u0340\u0341\u0005!\u0000\u0000\u0341\u0342\u0005=\u0000\u0000\u0342\u008c"+ + "\u0001\u0000\u0000\u0000\u0343\u0344\u0005<\u0000\u0000\u0344\u008e\u0001"+ + "\u0000\u0000\u0000\u0345\u0346\u0005<\u0000\u0000\u0346\u0347\u0005=\u0000"+ + "\u0000\u0347\u0090\u0001\u0000\u0000\u0000\u0348\u0349\u0005>\u0000\u0000"+ + "\u0349\u0092\u0001\u0000\u0000\u0000\u034a\u034b\u0005>\u0000\u0000\u034b"+ + "\u034c\u0005=\u0000\u0000\u034c\u0094\u0001\u0000\u0000\u0000\u034d\u034e"+ + "\u0005+\u0000\u0000\u034e\u0096\u0001\u0000\u0000\u0000\u034f\u0350\u0005"+ + "-\u0000\u0000\u0350\u0098\u0001\u0000\u0000\u0000\u0351\u0352\u0005*\u0000"+ + "\u0000\u0352\u009a\u0001\u0000\u0000\u0000\u0353\u0354\u0005/\u0000\u0000"+ + "\u0354\u009c\u0001\u0000\u0000\u0000\u0355\u0356\u0005%\u0000\u0000\u0356"+ + "\u009e\u0001\u0000\u0000\u0000\u0357\u0358\u0004H\u0003\u0000\u0358\u0359"+ + "\u0007\u0010\u0000\u0000\u0359\u035a\u0007\f\u0000\u0000\u035a\u035b\u0007"+ + "\u0005\u0000\u0000\u035b\u035c\u0007\u0004\u0000\u0000\u035c\u035d\u0007"+ + "\n\u0000\u0000\u035d\u00a0\u0001\u0000\u0000\u0000\u035e\u0361\u0003\u007f"+ + "8\u0000\u035f\u0362\u0003A\u0019\u0000\u0360\u0362\u0003O \u0000\u0361"+ + "\u035f\u0001\u0000\u0000\u0000\u0361\u0360\u0001\u0000\u0000\u0000\u0362"+ + "\u0366\u0001\u0000\u0000\u0000\u0363\u0365\u0003Q!\u0000\u0364\u0363\u0001"+ + "\u0000\u0000\u0000\u0365\u0368\u0001\u0000\u0000\u0000\u0366\u0364\u0001"+ + "\u0000\u0000\u0000\u0366\u0367\u0001\u0000\u0000\u0000\u0367\u0370\u0001"+ + "\u0000\u0000\u0000\u0368\u0366\u0001\u0000\u0000\u0000\u0369\u036b\u0003"+ + "\u007f8\u0000\u036a\u036c\u0003?\u0018\u0000\u036b\u036a\u0001\u0000\u0000"+ + "\u0000\u036c\u036d\u0001\u0000\u0000\u0000\u036d\u036b\u0001\u0000\u0000"+ + "\u0000\u036d\u036e\u0001\u0000\u0000\u0000\u036e\u0370\u0001\u0000\u0000"+ + "\u0000\u036f\u035e\u0001\u0000\u0000\u0000\u036f\u0369\u0001\u0000\u0000"+ + "\u0000\u0370\u00a2\u0001\u0000\u0000\u0000\u0371\u0372\u0005[\u0000\u0000"+ + "\u0372\u0373\u0001\u0000\u0000\u0000\u0373\u0374\u0006J\u0000\u0000\u0374"+ + "\u0375\u0006J\u0000\u0000\u0375\u00a4\u0001\u0000\u0000\u0000\u0376\u0377"+ + "\u0005]\u0000\u0000\u0377\u0378\u0001\u0000\u0000\u0000\u0378\u0379\u0006"+ + "K\u000b\u0000\u0379\u037a\u0006K\u000b\u0000\u037a\u00a6\u0001\u0000\u0000"+ + "\u0000\u037b\u037f\u0003A\u0019\u0000\u037c\u037e\u0003Q!\u0000\u037d"+ + "\u037c\u0001\u0000\u0000\u0000\u037e\u0381\u0001\u0000\u0000\u0000\u037f"+ + "\u037d\u0001\u0000\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380"+ + "\u038c\u0001\u0000\u0000\u0000\u0381\u037f\u0001\u0000\u0000\u0000\u0382"+ + "\u0385\u0003O \u0000\u0383\u0385\u0003I\u001d\u0000\u0384\u0382\u0001"+ + "\u0000\u0000\u0000\u0384\u0383\u0001\u0000\u0000\u0000\u0385\u0387\u0001"+ + "\u0000\u0000\u0000\u0386\u0388\u0003Q!\u0000\u0387\u0386\u0001\u0000\u0000"+ + "\u0000\u0388\u0389\u0001\u0000\u0000\u0000\u0389\u0387\u0001\u0000\u0000"+ + "\u0000\u0389\u038a\u0001\u0000\u0000\u0000\u038a\u038c\u0001\u0000\u0000"+ + "\u0000\u038b\u037b\u0001\u0000\u0000\u0000\u038b\u0384\u0001\u0000\u0000"+ + "\u0000\u038c\u00a8\u0001\u0000\u0000\u0000\u038d\u038f\u0003K\u001e\u0000"+ + "\u038e\u0390\u0003M\u001f\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390"+ + "\u0391\u0001\u0000\u0000\u0000\u0391\u038f\u0001\u0000\u0000\u0000\u0391"+ + "\u0392\u0001\u0000\u0000\u0000\u0392\u0393\u0001\u0000\u0000\u0000\u0393"+ + "\u0394\u0003K\u001e\u0000\u0394\u00aa\u0001\u0000\u0000\u0000\u0395\u0396"+ + "\u0003\u00a9M\u0000\u0396\u00ac\u0001\u0000\u0000\u0000\u0397\u0398\u0003"+ + "7\u0014\u0000\u0398\u0399\u0001\u0000\u0000\u0000\u0399\u039a\u0006O\n"+ + "\u0000\u039a\u00ae\u0001\u0000\u0000\u0000\u039b\u039c\u00039\u0015\u0000"+ + "\u039c\u039d\u0001\u0000\u0000\u0000\u039d\u039e\u0006P\n\u0000\u039e"+ + "\u00b0\u0001\u0000\u0000\u0000\u039f\u03a0\u0003;\u0016\u0000\u03a0\u03a1"+ + "\u0001\u0000\u0000\u0000\u03a1\u03a2\u0006Q\n\u0000\u03a2\u00b2\u0001"+ + "\u0000\u0000\u0000\u03a3\u03a4\u0003\u00a3J\u0000\u03a4\u03a5\u0001\u0000"+ + "\u0000\u0000\u03a5\u03a6\u0006R\f\u0000\u03a6\u03a7\u0006R\r\u0000\u03a7"+ + "\u00b4\u0001\u0000\u0000\u0000\u03a8\u03a9\u0003=\u0017\u0000\u03a9\u03aa"+ + "\u0001\u0000\u0000\u0000\u03aa\u03ab\u0006S\u000e\u0000\u03ab\u03ac\u0006"+ + "S\u000b\u0000\u03ac\u00b6\u0001\u0000\u0000\u0000\u03ad\u03ae\u0003;\u0016"+ + "\u0000\u03ae\u03af\u0001\u0000\u0000\u0000\u03af\u03b0\u0006T\n\u0000"+ + "\u03b0\u00b8\u0001\u0000\u0000\u0000\u03b1\u03b2\u00037\u0014\u0000\u03b2"+ + "\u03b3\u0001\u0000\u0000\u0000\u03b3\u03b4\u0006U\n\u0000\u03b4\u00ba"+ + "\u0001\u0000\u0000\u0000\u03b5\u03b6\u00039\u0015\u0000\u03b6\u03b7\u0001"+ + "\u0000\u0000\u0000\u03b7\u03b8\u0006V\n\u0000\u03b8\u00bc\u0001\u0000"+ + "\u0000\u0000\u03b9\u03ba\u0003=\u0017\u0000\u03ba\u03bb\u0001\u0000\u0000"+ + "\u0000\u03bb\u03bc\u0006W\u000e\u0000\u03bc\u03bd\u0006W\u000b\u0000\u03bd"+ + "\u00be\u0001\u0000\u0000\u0000\u03be\u03bf\u0003\u00a3J\u0000\u03bf\u03c0"+ + "\u0001\u0000\u0000\u0000\u03c0\u03c1\u0006X\f\u0000\u03c1\u00c0\u0001"+ + "\u0000\u0000\u0000\u03c2\u03c3\u0003\u00a5K\u0000\u03c3\u03c4\u0001\u0000"+ + "\u0000\u0000\u03c4\u03c5\u0006Y\u000f\u0000\u03c5\u00c2\u0001\u0000\u0000"+ + "\u0000\u03c6\u03c7\u0003\u014f\u00a0\u0000\u03c7\u03c8\u0001\u0000\u0000"+ + "\u0000\u03c8\u03c9\u0006Z\u0010\u0000\u03c9\u00c4\u0001\u0000\u0000\u0000"+ + "\u03ca\u03cb\u0003c*\u0000\u03cb\u03cc\u0001\u0000\u0000\u0000\u03cc\u03cd"+ + "\u0006[\u0011\u0000\u03cd\u00c6\u0001\u0000\u0000\u0000\u03ce\u03cf\u0003"+ + "_(\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000\u03d0\u03d1\u0006\\\u0012"+ + "\u0000\u03d1\u00c8\u0001\u0000\u0000\u0000\u03d2\u03d3\u0007\u0010\u0000"+ + "\u0000\u03d3\u03d4\u0007\u0003\u0000\u0000\u03d4\u03d5\u0007\u0005\u0000"+ + "\u0000\u03d5\u03d6\u0007\f\u0000\u0000\u03d6\u03d7\u0007\u0000\u0000\u0000"+ + "\u03d7\u03d8\u0007\f\u0000\u0000\u03d8\u03d9\u0007\u0005\u0000\u0000\u03d9"+ + "\u03da\u0007\f\u0000\u0000\u03da\u00ca\u0001\u0000\u0000\u0000\u03db\u03df"+ + "\b \u0000\u0000\u03dc\u03dd\u0005/\u0000\u0000\u03dd\u03df\b!\u0000\u0000"+ + "\u03de\u03db\u0001\u0000\u0000\u0000\u03de\u03dc\u0001\u0000\u0000\u0000"+ + "\u03df\u00cc\u0001\u0000\u0000\u0000\u03e0\u03e2\u0003\u00cb^\u0000\u03e1"+ + "\u03e0\u0001\u0000\u0000\u0000\u03e2\u03e3\u0001\u0000\u0000\u0000\u03e3"+ + "\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4\u0001\u0000\u0000\u0000\u03e4"+ + "\u00ce\u0001\u0000\u0000\u0000\u03e5\u03e6\u0003\u00cd_\u0000\u03e6\u03e7"+ + "\u0001\u0000\u0000\u0000\u03e7\u03e8\u0006`\u0013\u0000\u03e8\u00d0\u0001"+ + "\u0000\u0000\u0000\u03e9\u03ea\u0003S\"\u0000\u03ea\u03eb\u0001\u0000"+ + "\u0000\u0000\u03eb\u03ec\u0006a\u0014\u0000\u03ec\u00d2\u0001\u0000\u0000"+ + "\u0000\u03ed\u03ee\u00037\u0014\u0000\u03ee\u03ef\u0001\u0000\u0000\u0000"+ + "\u03ef\u03f0\u0006b\n\u0000\u03f0\u00d4\u0001\u0000\u0000\u0000\u03f1"+ + "\u03f2\u00039\u0015\u0000\u03f2\u03f3\u0001\u0000\u0000\u0000\u03f3\u03f4"+ + "\u0006c\n\u0000\u03f4\u00d6\u0001\u0000\u0000\u0000\u03f5\u03f6\u0003"+ + ";\u0016\u0000\u03f6\u03f7\u0001\u0000\u0000\u0000\u03f7\u03f8\u0006d\n"+ + "\u0000\u03f8\u00d8\u0001\u0000\u0000\u0000\u03f9\u03fa\u0003=\u0017\u0000"+ + "\u03fa\u03fb\u0001\u0000\u0000\u0000\u03fb\u03fc\u0006e\u000e\u0000\u03fc"+ + "\u03fd\u0006e\u000b\u0000\u03fd\u00da\u0001\u0000\u0000\u0000\u03fe\u03ff"+ + "\u0003g,\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u0401\u0006f"+ + "\u0015\u0000\u0401\u00dc\u0001\u0000\u0000\u0000\u0402\u0403\u0003c*\u0000"+ + "\u0403\u0404\u0001\u0000\u0000\u0000\u0404\u0405\u0006g\u0011\u0000\u0405"+ + "\u00de\u0001\u0000\u0000\u0000\u0406\u0407\u0003\u007f8\u0000\u0407\u0408"+ + "\u0001\u0000\u0000\u0000\u0408\u0409\u0006h\u0016\u0000\u0409\u00e0\u0001"+ + "\u0000\u0000\u0000\u040a\u040b\u0003\u00a1I\u0000\u040b\u040c\u0001\u0000"+ + "\u0000\u0000\u040c\u040d\u0006i\u0017\u0000\u040d\u00e2\u0001\u0000\u0000"+ + "\u0000\u040e\u0413\u0003A\u0019\u0000\u040f\u0413\u0003?\u0018\u0000\u0410"+ + "\u0413\u0003O \u0000\u0411\u0413\u0003\u0099E\u0000\u0412\u040e\u0001"+ + "\u0000\u0000\u0000\u0412\u040f\u0001\u0000\u0000\u0000\u0412\u0410\u0001"+ + "\u0000\u0000\u0000\u0412\u0411\u0001\u0000\u0000\u0000\u0413\u00e4\u0001"+ + "\u0000\u0000\u0000\u0414\u0417\u0003A\u0019\u0000\u0415\u0417\u0003\u0099"+ + "E\u0000\u0416\u0414\u0001\u0000\u0000\u0000\u0416\u0415\u0001\u0000\u0000"+ + "\u0000\u0417\u041b\u0001\u0000\u0000\u0000\u0418\u041a\u0003\u00e3j\u0000"+ + "\u0419\u0418\u0001\u0000\u0000\u0000\u041a\u041d\u0001\u0000\u0000\u0000"+ + "\u041b\u0419\u0001\u0000\u0000\u0000\u041b\u041c\u0001\u0000\u0000\u0000"+ + "\u041c\u0428\u0001\u0000\u0000\u0000\u041d\u041b\u0001\u0000\u0000\u0000"+ + "\u041e\u0421\u0003O \u0000\u041f\u0421\u0003I\u001d\u0000\u0420\u041e"+ + "\u0001\u0000\u0000\u0000\u0420\u041f\u0001\u0000\u0000\u0000\u0421\u0423"+ + "\u0001\u0000\u0000\u0000\u0422\u0424\u0003\u00e3j\u0000\u0423\u0422\u0001"+ + "\u0000\u0000\u0000\u0424\u0425\u0001\u0000\u0000\u0000\u0425\u0423\u0001"+ + "\u0000\u0000\u0000\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0428\u0001"+ + "\u0000\u0000\u0000\u0427\u0416\u0001\u0000\u0000\u0000\u0427\u0420\u0001"+ + "\u0000\u0000\u0000\u0428\u00e6\u0001\u0000\u0000\u0000\u0429\u042c\u0003"+ + "\u00e5k\u0000\u042a\u042c\u0003\u00a9M\u0000\u042b\u0429\u0001\u0000\u0000"+ + "\u0000\u042b\u042a\u0001\u0000\u0000\u0000\u042c\u042d\u0001\u0000\u0000"+ + "\u0000\u042d\u042b\u0001\u0000\u0000\u0000\u042d\u042e\u0001\u0000\u0000"+ + "\u0000\u042e\u00e8\u0001\u0000\u0000\u0000\u042f\u0430\u00037\u0014\u0000"+ + "\u0430\u0431\u0001\u0000\u0000\u0000\u0431\u0432\u0006m\n\u0000\u0432"+ + "\u00ea\u0001\u0000\u0000\u0000\u0433\u0434\u00039\u0015\u0000\u0434\u0435"+ + "\u0001\u0000\u0000\u0000\u0435\u0436\u0006n\n\u0000\u0436\u00ec\u0001"+ + "\u0000\u0000\u0000\u0437\u0438\u0003;\u0016\u0000\u0438\u0439\u0001\u0000"+ + "\u0000\u0000\u0439\u043a\u0006o\n\u0000\u043a\u00ee\u0001\u0000\u0000"+ + "\u0000\u043b\u043c\u0003=\u0017\u0000\u043c\u043d\u0001\u0000\u0000\u0000"+ + "\u043d\u043e\u0006p\u000e\u0000\u043e\u043f\u0006p\u000b\u0000\u043f\u00f0"+ + "\u0001\u0000\u0000\u0000\u0440\u0441\u0003_(\u0000\u0441\u0442\u0001\u0000"+ + "\u0000\u0000\u0442\u0443\u0006q\u0012\u0000\u0443\u00f2\u0001\u0000\u0000"+ + "\u0000\u0444\u0445\u0003c*\u0000\u0445\u0446\u0001\u0000\u0000\u0000\u0446"+ + "\u0447\u0006r\u0011\u0000\u0447\u00f4\u0001\u0000\u0000\u0000\u0448\u0449"+ + "\u0003g,\u0000\u0449\u044a\u0001\u0000\u0000\u0000\u044a\u044b\u0006s"+ + "\u0015\u0000\u044b\u00f6\u0001\u0000\u0000\u0000\u044c\u044d\u0003\u007f"+ + "8\u0000\u044d\u044e\u0001\u0000\u0000\u0000\u044e\u044f\u0006t\u0016\u0000"+ + "\u044f\u00f8\u0001\u0000\u0000\u0000\u0450\u0451\u0003\u00a1I\u0000\u0451"+ + "\u0452\u0001\u0000\u0000\u0000\u0452\u0453\u0006u\u0017\u0000\u0453\u00fa"+ + "\u0001\u0000\u0000\u0000\u0454\u0455\u0007\f\u0000\u0000\u0455\u0456\u0007"+ + "\u0002\u0000\u0000\u0456\u00fc\u0001\u0000\u0000\u0000\u0457\u0458\u0003"+ + "\u00e7l\u0000\u0458\u0459\u0001\u0000\u0000\u0000\u0459\u045a\u0006w\u0018"+ + "\u0000\u045a\u00fe\u0001\u0000\u0000\u0000\u045b\u045c\u00037\u0014\u0000"+ + "\u045c\u045d\u0001\u0000\u0000\u0000\u045d\u045e\u0006x\n\u0000\u045e"+ + "\u0100\u0001\u0000\u0000\u0000\u045f\u0460\u00039\u0015\u0000\u0460\u0461"+ + "\u0001\u0000\u0000\u0000\u0461\u0462\u0006y\n\u0000\u0462\u0102\u0001"+ + "\u0000\u0000\u0000\u0463\u0464\u0003;\u0016\u0000\u0464\u0465\u0001\u0000"+ + "\u0000\u0000\u0465\u0466\u0006z\n\u0000\u0466\u0104\u0001\u0000\u0000"+ + "\u0000\u0467\u0468\u0003=\u0017\u0000\u0468\u0469\u0001\u0000\u0000\u0000"+ + "\u0469\u046a\u0006{\u000e\u0000\u046a\u046b\u0006{\u000b\u0000\u046b\u0106"+ + "\u0001\u0000\u0000\u0000\u046c\u046d\u0003\u00a3J\u0000\u046d\u046e\u0001"+ + "\u0000\u0000\u0000\u046e\u046f\u0006|\f\u0000\u046f\u0470\u0006|\u0019"+ + "\u0000\u0470\u0108\u0001\u0000\u0000\u0000\u0471\u0472\u0007\u0007\u0000"+ + "\u0000\u0472\u0473\u0007\t\u0000\u0000\u0473\u0474\u0001\u0000\u0000\u0000"+ + "\u0474\u0475\u0006}\u001a\u0000\u0475\u010a\u0001\u0000\u0000\u0000\u0476"+ + "\u0477\u0007\u0013\u0000\u0000\u0477\u0478\u0007\u0001\u0000\u0000\u0478"+ + "\u0479\u0007\u0005\u0000\u0000\u0479\u047a\u0007\n\u0000\u0000\u047a\u047b"+ + "\u0001\u0000\u0000\u0000\u047b\u047c\u0006~\u001a\u0000\u047c\u010c\u0001"+ + "\u0000\u0000\u0000\u047d\u047e\b\"\u0000\u0000\u047e\u010e\u0001\u0000"+ + "\u0000\u0000\u047f\u0481\u0003\u010d\u007f\u0000\u0480\u047f\u0001\u0000"+ + "\u0000\u0000\u0481\u0482\u0001\u0000\u0000\u0000\u0482\u0480\u0001\u0000"+ + "\u0000\u0000\u0482\u0483\u0001\u0000\u0000\u0000\u0483\u0484\u0001\u0000"+ + "\u0000\u0000\u0484\u0485\u0003\u014f\u00a0\u0000\u0485\u0487\u0001\u0000"+ + "\u0000\u0000\u0486\u0480\u0001\u0000\u0000\u0000\u0486\u0487\u0001\u0000"+ + "\u0000\u0000\u0487\u0489\u0001\u0000\u0000\u0000\u0488\u048a\u0003\u010d"+ + "\u007f\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u048a\u048b\u0001\u0000"+ + "\u0000\u0000\u048b\u0489\u0001\u0000\u0000\u0000\u048b\u048c\u0001\u0000"+ + "\u0000\u0000\u048c\u0110\u0001\u0000\u0000\u0000\u048d\u048e\u0003\u010f"+ + "\u0080\u0000\u048e\u048f\u0001\u0000\u0000\u0000\u048f\u0490\u0006\u0081"+ + "\u001b\u0000\u0490\u0112\u0001\u0000\u0000\u0000\u0491\u0492\u00037\u0014"+ + "\u0000\u0492\u0493\u0001\u0000\u0000\u0000\u0493\u0494\u0006\u0082\n\u0000"+ + "\u0494\u0114\u0001\u0000\u0000\u0000\u0495\u0496\u00039\u0015\u0000\u0496"+ + "\u0497\u0001\u0000\u0000\u0000\u0497\u0498\u0006\u0083\n\u0000\u0498\u0116"+ + "\u0001\u0000\u0000\u0000\u0499\u049a\u0003;\u0016\u0000\u049a\u049b\u0001"+ + "\u0000\u0000\u0000\u049b\u049c\u0006\u0084\n\u0000\u049c\u0118\u0001\u0000"+ + "\u0000\u0000\u049d\u049e\u0003=\u0017\u0000\u049e\u049f\u0001\u0000\u0000"+ + "\u0000\u049f\u04a0\u0006\u0085\u000e\u0000\u04a0\u04a1\u0006\u0085\u000b"+ + "\u0000\u04a1\u04a2\u0006\u0085\u000b\u0000\u04a2\u011a\u0001\u0000\u0000"+ + "\u0000\u04a3\u04a4\u0003_(\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5"+ + "\u04a6\u0006\u0086\u0012\u0000\u04a6\u011c\u0001\u0000\u0000\u0000\u04a7"+ + "\u04a8\u0003c*\u0000\u04a8\u04a9\u0001\u0000\u0000\u0000\u04a9\u04aa\u0006"+ + "\u0087\u0011\u0000\u04aa\u011e\u0001\u0000\u0000\u0000\u04ab\u04ac\u0003"+ + "g,\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000\u04ad\u04ae\u0006\u0088\u0015"+ + "\u0000\u04ae\u0120\u0001\u0000\u0000\u0000\u04af\u04b0\u0003\u010b~\u0000"+ + "\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2\u0006\u0089\u001c\u0000"+ + "\u04b2\u0122\u0001\u0000\u0000\u0000\u04b3\u04b4\u0003\u00e7l\u0000\u04b4"+ + "\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u0006\u008a\u0018\u0000\u04b6"+ + "\u0124\u0001\u0000\u0000\u0000\u04b7\u04b8\u0003\u00abN\u0000\u04b8\u04b9"+ + "\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006\u008b\u001d\u0000\u04ba\u0126"+ + "\u0001\u0000\u0000\u0000\u04bb\u04bc\u0003\u007f8\u0000\u04bc\u04bd\u0001"+ + "\u0000\u0000\u0000\u04bd\u04be\u0006\u008c\u0016\u0000\u04be\u0128\u0001"+ + "\u0000\u0000\u0000\u04bf\u04c0\u0003\u00a1I\u0000\u04c0\u04c1\u0001\u0000"+ + "\u0000\u0000\u04c1\u04c2\u0006\u008d\u0017\u0000\u04c2\u012a\u0001\u0000"+ + "\u0000\u0000\u04c3\u04c4\u00037\u0014\u0000\u04c4\u04c5\u0001\u0000\u0000"+ + "\u0000\u04c5\u04c6\u0006\u008e\n\u0000\u04c6\u012c\u0001\u0000\u0000\u0000"+ + "\u04c7\u04c8\u00039\u0015\u0000\u04c8\u04c9\u0001\u0000\u0000\u0000\u04c9"+ + "\u04ca\u0006\u008f\n\u0000\u04ca\u012e\u0001\u0000\u0000\u0000\u04cb\u04cc"+ + "\u0003;\u0016\u0000\u04cc\u04cd\u0001\u0000\u0000\u0000\u04cd\u04ce\u0006"+ + "\u0090\n\u0000\u04ce\u0130\u0001\u0000\u0000\u0000\u04cf\u04d0\u0003="+ + "\u0017\u0000\u04d0\u04d1\u0001\u0000\u0000\u0000\u04d1\u04d2\u0006\u0091"+ + "\u000e\u0000\u04d2\u04d3\u0006\u0091\u000b\u0000\u04d3\u0132\u0001\u0000"+ + "\u0000\u0000\u04d4\u04d5\u0003g,\u0000\u04d5\u04d6\u0001\u0000\u0000\u0000"+ + "\u04d6\u04d7\u0006\u0092\u0015\u0000\u04d7\u0134\u0001\u0000\u0000\u0000"+ + "\u04d8\u04d9\u0003\u007f8\u0000\u04d9\u04da\u0001\u0000\u0000\u0000\u04da"+ + "\u04db\u0006\u0093\u0016\u0000\u04db\u0136\u0001\u0000\u0000\u0000\u04dc"+ + "\u04dd\u0003\u00a1I\u0000\u04dd\u04de\u0001\u0000\u0000\u0000\u04de\u04df"+ + "\u0006\u0094\u0017\u0000\u04df\u0138\u0001\u0000\u0000\u0000\u04e0\u04e1"+ + "\u0003\u00abN\u0000\u04e1\u04e2\u0001\u0000\u0000\u0000\u04e2\u04e3\u0006"+ + "\u0095\u001d\u0000\u04e3\u013a\u0001\u0000\u0000\u0000\u04e4\u04e5\u0003"+ + "\u00a7L\u0000\u04e5\u04e6\u0001\u0000\u0000\u0000\u04e6\u04e7\u0006\u0096"+ + "\u001e\u0000\u04e7\u013c\u0001\u0000\u0000\u0000\u04e8\u04e9\u00037\u0014"+ + "\u0000\u04e9\u04ea\u0001\u0000\u0000\u0000\u04ea\u04eb\u0006\u0097\n\u0000"+ + "\u04eb\u013e\u0001\u0000\u0000\u0000\u04ec\u04ed\u00039\u0015\u0000\u04ed"+ + "\u04ee\u0001\u0000\u0000\u0000\u04ee\u04ef\u0006\u0098\n\u0000\u04ef\u0140"+ + "\u0001\u0000\u0000\u0000\u04f0\u04f1\u0003;\u0016\u0000\u04f1\u04f2\u0001"+ + "\u0000\u0000\u0000\u04f2\u04f3\u0006\u0099\n\u0000\u04f3\u0142\u0001\u0000"+ + "\u0000\u0000\u04f4\u04f5\u0003=\u0017\u0000\u04f5\u04f6\u0001\u0000\u0000"+ + "\u0000\u04f6\u04f7\u0006\u009a\u000e\u0000\u04f7\u04f8\u0006\u009a\u000b"+ + "\u0000\u04f8\u0144\u0001\u0000\u0000\u0000\u04f9\u04fa\u0007\u0001\u0000"+ + "\u0000\u04fa\u04fb\u0007\t\u0000\u0000\u04fb\u04fc\u0007\u000f\u0000\u0000"+ + "\u04fc\u04fd\u0007\u0007\u0000\u0000\u04fd\u0146\u0001\u0000\u0000\u0000"+ + "\u04fe\u04ff\u00037\u0014\u0000\u04ff\u0500\u0001\u0000\u0000\u0000\u0500"+ + "\u0501\u0006\u009c\n\u0000\u0501\u0148\u0001\u0000\u0000\u0000\u0502\u0503"+ + "\u00039\u0015\u0000\u0503\u0504\u0001\u0000\u0000\u0000\u0504\u0505\u0006"+ + "\u009d\n\u0000\u0505\u014a\u0001\u0000\u0000\u0000\u0506\u0507\u0003;"+ + "\u0016\u0000\u0507\u0508\u0001\u0000\u0000\u0000\u0508\u0509\u0006\u009e"+ + "\n\u0000\u0509\u014c\u0001\u0000\u0000\u0000\u050a\u050b\u0003\u00a5K"+ + "\u0000\u050b\u050c\u0001\u0000\u0000\u0000\u050c\u050d\u0006\u009f\u000f"+ + "\u0000\u050d\u050e\u0006\u009f\u000b\u0000\u050e\u014e\u0001\u0000\u0000"+ + "\u0000\u050f\u0510\u0005:\u0000\u0000\u0510\u0150\u0001\u0000\u0000\u0000"+ + "\u0511\u0517\u0003I\u001d\u0000\u0512\u0517\u0003?\u0018\u0000\u0513\u0517"+ + "\u0003g,\u0000\u0514\u0517\u0003A\u0019\u0000\u0515\u0517\u0003O \u0000"+ + "\u0516\u0511\u0001\u0000\u0000\u0000\u0516\u0512\u0001\u0000\u0000\u0000"+ + "\u0516\u0513\u0001\u0000\u0000\u0000\u0516\u0514\u0001\u0000\u0000\u0000"+ + "\u0516\u0515\u0001\u0000\u0000\u0000\u0517\u0518\u0001\u0000\u0000\u0000"+ + "\u0518\u0516\u0001\u0000\u0000\u0000\u0518\u0519\u0001\u0000\u0000\u0000"+ + "\u0519\u0152\u0001\u0000\u0000\u0000\u051a\u051b\u00037\u0014\u0000\u051b"+ + "\u051c\u0001\u0000\u0000\u0000\u051c\u051d\u0006\u00a2\n\u0000\u051d\u0154"+ + "\u0001\u0000\u0000\u0000\u051e\u051f\u00039\u0015\u0000\u051f\u0520\u0001"+ + "\u0000\u0000\u0000\u0520\u0521\u0006\u00a3\n\u0000\u0521\u0156\u0001\u0000"+ + "\u0000\u0000\u0522\u0523\u0003;\u0016\u0000\u0523\u0524\u0001\u0000\u0000"+ + "\u0000\u0524\u0525\u0006\u00a4\n\u0000\u0525\u0158\u0001\u0000\u0000\u0000"+ + "\u0526\u0527\u0003=\u0017\u0000\u0527\u0528\u0001\u0000\u0000\u0000\u0528"+ + "\u0529\u0006\u00a5\u000e\u0000\u0529\u052a\u0006\u00a5\u000b\u0000\u052a"+ + "\u015a\u0001\u0000\u0000\u0000\u052b\u052c\u0003\u014f\u00a0\u0000\u052c"+ + "\u052d\u0001\u0000\u0000\u0000\u052d\u052e\u0006\u00a6\u0010\u0000\u052e"+ + "\u015c\u0001\u0000\u0000\u0000\u052f\u0530\u0003c*\u0000\u0530\u0531\u0001"+ + "\u0000\u0000\u0000\u0531\u0532\u0006\u00a7\u0011\u0000\u0532\u015e\u0001"+ + "\u0000\u0000\u0000\u0533\u0534\u0003g,\u0000\u0534\u0535\u0001\u0000\u0000"+ + "\u0000\u0535\u0536\u0006\u00a8\u0015\u0000\u0536\u0160\u0001\u0000\u0000"+ + "\u0000\u0537\u0538\u0003\u0109}\u0000\u0538\u0539\u0001\u0000\u0000\u0000"+ + "\u0539\u053a\u0006\u00a9\u001f\u0000\u053a\u053b\u0006\u00a9 \u0000\u053b"+ + "\u0162\u0001\u0000\u0000\u0000\u053c\u053d\u0003\u00cd_\u0000\u053d\u053e"+ + "\u0001\u0000\u0000\u0000\u053e\u053f\u0006\u00aa\u0013\u0000\u053f\u0164"+ + "\u0001\u0000\u0000\u0000\u0540\u0541\u0003S\"\u0000\u0541\u0542\u0001"+ + "\u0000\u0000\u0000\u0542\u0543\u0006\u00ab\u0014\u0000\u0543\u0166\u0001"+ + "\u0000\u0000\u0000\u0544\u0545\u00037\u0014\u0000\u0545\u0546\u0001\u0000"+ + "\u0000\u0000\u0546\u0547\u0006\u00ac\n\u0000\u0547\u0168\u0001\u0000\u0000"+ + "\u0000\u0548\u0549\u00039\u0015\u0000\u0549\u054a\u0001\u0000\u0000\u0000"+ + "\u054a\u054b\u0006\u00ad\n\u0000\u054b\u016a\u0001\u0000\u0000\u0000\u054c"+ + "\u054d\u0003;\u0016\u0000\u054d\u054e\u0001\u0000\u0000\u0000\u054e\u054f"+ + "\u0006\u00ae\n\u0000\u054f\u016c\u0001\u0000\u0000\u0000\u0550\u0551\u0003"+ + "=\u0017\u0000\u0551\u0552\u0001\u0000\u0000\u0000\u0552\u0553\u0006\u00af"+ + "\u000e\u0000\u0553\u0554\u0006\u00af\u000b\u0000\u0554\u0555\u0006\u00af"+ + "\u000b\u0000\u0555\u016e\u0001\u0000\u0000\u0000\u0556\u0557\u0003c*\u0000"+ + "\u0557\u0558\u0001\u0000\u0000\u0000\u0558\u0559\u0006\u00b0\u0011\u0000"+ + "\u0559\u0170\u0001\u0000\u0000\u0000\u055a\u055b\u0003g,\u0000\u055b\u055c"+ + "\u0001\u0000\u0000\u0000\u055c\u055d\u0006\u00b1\u0015\u0000\u055d\u0172"+ + "\u0001\u0000\u0000\u0000\u055e\u055f\u0003\u00e7l\u0000\u055f\u0560\u0001"+ + "\u0000\u0000\u0000\u0560\u0561\u0006\u00b2\u0018\u0000\u0561\u0174\u0001"+ + "\u0000\u0000\u0000\u0562\u0563\u00037\u0014\u0000\u0563\u0564\u0001\u0000"+ + "\u0000\u0000\u0564\u0565\u0006\u00b3\n\u0000\u0565\u0176\u0001\u0000\u0000"+ + "\u0000\u0566\u0567\u00039\u0015\u0000\u0567\u0568\u0001\u0000\u0000\u0000"+ + "\u0568\u0569\u0006\u00b4\n\u0000\u0569\u0178\u0001\u0000\u0000\u0000\u056a"+ + "\u056b\u0003;\u0016\u0000\u056b\u056c\u0001\u0000\u0000\u0000\u056c\u056d"+ + "\u0006\u00b5\n\u0000\u056d\u017a\u0001\u0000\u0000\u0000\u056e\u056f\u0003"+ + "=\u0017\u0000\u056f\u0570\u0001\u0000\u0000\u0000\u0570\u0571\u0006\u00b6"+ + "\u000e\u0000\u0571\u0572\u0006\u00b6\u000b\u0000\u0572\u017c\u0001\u0000"+ + "\u0000\u0000\u0573\u0574\u0003\u00cd_\u0000\u0574\u0575\u0001\u0000\u0000"+ + "\u0000\u0575\u0576\u0006\u00b7\u0013\u0000\u0576\u0577\u0006\u00b7\u000b"+ + "\u0000\u0577\u0578\u0006\u00b7!\u0000\u0578\u017e\u0001\u0000\u0000\u0000"+ + "\u0579\u057a\u0003S\"\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b"+ + "\u057c\u0006\u00b8\u0014\u0000\u057c\u057d\u0006\u00b8\u000b\u0000\u057d"+ + "\u057e\u0006\u00b8!\u0000\u057e\u0180\u0001\u0000\u0000\u0000\u057f\u0580"+ + "\u00037\u0014\u0000\u0580\u0581\u0001\u0000\u0000\u0000\u0581\u0582\u0006"+ + "\u00b9\n\u0000\u0582\u0182\u0001\u0000\u0000\u0000\u0583\u0584\u00039"+ + "\u0015\u0000\u0584\u0585\u0001\u0000\u0000\u0000\u0585\u0586\u0006\u00ba"+ + "\n\u0000\u0586\u0184\u0001\u0000\u0000\u0000\u0587\u0588\u0003;\u0016"+ + "\u0000\u0588\u0589\u0001\u0000\u0000\u0000\u0589\u058a\u0006\u00bb\n\u0000"+ + "\u058a\u0186\u0001\u0000\u0000\u0000\u058b\u058c\u0003\u014f\u00a0\u0000"+ + "\u058c\u058d\u0001\u0000\u0000\u0000\u058d\u058e\u0006\u00bc\u0010\u0000"+ + "\u058e\u058f\u0006\u00bc\u000b\u0000\u058f\u0590\u0006\u00bc\t\u0000\u0590"+ + "\u0188\u0001\u0000\u0000\u0000\u0591\u0592\u0003c*\u0000\u0592\u0593\u0001"+ + "\u0000\u0000\u0000\u0593\u0594\u0006\u00bd\u0011\u0000\u0594\u0595\u0006"+ + "\u00bd\u000b\u0000\u0595\u0596\u0006\u00bd\t\u0000\u0596\u018a\u0001\u0000"+ + "\u0000\u0000\u0597\u0598\u00037\u0014\u0000\u0598\u0599\u0001\u0000\u0000"+ + "\u0000\u0599\u059a\u0006\u00be\n\u0000\u059a\u018c\u0001\u0000\u0000\u0000"+ + "\u059b\u059c\u00039\u0015\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d"+ + "\u059e\u0006\u00bf\n\u0000\u059e\u018e\u0001\u0000\u0000\u0000\u059f\u05a0"+ + "\u0003;\u0016\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2\u0006"+ + "\u00c0\n\u0000\u05a2\u0190\u0001\u0000\u0000\u0000\u05a3\u05a4\u0003\u00ab"+ + "N\u0000\u05a4\u05a5\u0001\u0000\u0000\u0000\u05a5\u05a6\u0006\u00c1\u000b"+ + "\u0000\u05a6\u05a7\u0006\u00c1\u0000\u0000\u05a7\u05a8\u0006\u00c1\u001d"+ + "\u0000\u05a8\u0192\u0001\u0000\u0000\u0000\u05a9\u05aa\u0003\u00a7L\u0000"+ + "\u05aa\u05ab\u0001\u0000\u0000\u0000\u05ab\u05ac\u0006\u00c2\u000b\u0000"+ + "\u05ac\u05ad\u0006\u00c2\u0000\u0000\u05ad\u05ae\u0006\u00c2\u001e\u0000"+ + "\u05ae\u0194\u0001\u0000\u0000\u0000\u05af\u05b0\u0003Y%\u0000\u05b0\u05b1"+ + "\u0001\u0000\u0000\u0000\u05b1\u05b2\u0006\u00c3\u000b\u0000\u05b2\u05b3"+ + "\u0006\u00c3\u0000\u0000\u05b3\u05b4\u0006\u00c3\"\u0000\u05b4\u0196\u0001"+ + "\u0000\u0000\u0000\u05b5\u05b6\u0003=\u0017\u0000\u05b6\u05b7\u0001\u0000"+ + "\u0000\u0000\u05b7\u05b8\u0006\u00c4\u000e\u0000\u05b8\u05b9\u0006\u00c4"+ + "\u000b\u0000\u05b9\u0198\u0001\u0000\u0000\u0000A\u0000\u0001\u0002\u0003"+ + "\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u0241\u024b\u024f\u0252"+ + "\u025b\u025d\u0268\u027b\u0280\u0289\u0290\u0295\u0297\u02a2\u02aa\u02ad"+ + "\u02af\u02b4\u02b9\u02bf\u02c6\u02cb\u02d1\u02d4\u02dc\u02e0\u0361\u0366"+ + "\u036d\u036f\u037f\u0384\u0389\u038b\u0391\u03de\u03e3\u0412\u0416\u041b"+ + "\u0420\u0425\u0427\u042b\u042d\u0482\u0486\u048b\u0516\u0518#\u0005\u0001"+ + "\u0000\u0005\u0004\u0000\u0005\u0006\u0000\u0005\u0002\u0000\u0005\u0003"+ + "\u0000\u0005\b\u0000\u0005\u0005\u0000\u0005\t\u0000\u0005\u000b\u0000"+ + "\u0005\r\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0007A\u0000\u0005"+ + "\u0000\u0000\u0007\u0018\u0000\u0007B\u0000\u0007h\u0000\u0007!\u0000"+ + "\u0007\u001f\u0000\u0007L\u0000\u0007\u0019\u0000\u0007#\u0000\u0007/"+ + "\u0000\u0007@\u0000\u0007P\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007"+ + "Z\u0000\u0007Y\u0000\u0007D\u0000\u0007C\u0000\u0007X\u0000\u0005\f\u0000"+ + "\u0005\u000e\u0000\u0007\u001c\u0000"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp index b8a3b966fc45b..5fdf80f24d9b0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp @@ -278,7 +278,8 @@ qualifiedNamePatterns identifier identifierPattern constant -params +parameter +identifierOrParameter limitCommand sortCommand orderExpression @@ -307,4 +308,4 @@ inlinestatsCommand atn: -[4, 1, 120, 579, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 128, 8, 1, 10, 1, 12, 1, 131, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 139, 8, 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, 3, 3, 157, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 169, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 176, 8, 5, 10, 5, 12, 5, 179, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 186, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 192, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 200, 8, 5, 10, 5, 12, 5, 203, 9, 5, 1, 6, 1, 6, 3, 6, 207, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 214, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 219, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 230, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 236, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 244, 8, 9, 10, 9, 12, 9, 247, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 257, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 262, 8, 10, 10, 10, 12, 10, 265, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 273, 8, 11, 10, 11, 12, 11, 276, 9, 11, 3, 11, 278, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 285, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 295, 8, 15, 10, 15, 12, 15, 298, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 305, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 311, 8, 17, 10, 17, 12, 17, 314, 9, 17, 1, 17, 3, 17, 317, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 324, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 332, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 338, 8, 22, 10, 22, 12, 22, 341, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 351, 8, 24, 10, 24, 12, 24, 354, 9, 24, 1, 24, 3, 24, 357, 8, 24, 1, 24, 1, 24, 3, 24, 361, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 368, 8, 26, 1, 26, 1, 26, 3, 26, 372, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 377, 8, 27, 10, 27, 12, 27, 380, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 385, 8, 28, 10, 28, 12, 28, 388, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 393, 8, 29, 10, 29, 12, 29, 396, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 415, 8, 32, 10, 32, 12, 32, 418, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 426, 8, 32, 10, 32, 12, 32, 429, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 437, 8, 32, 10, 32, 12, 32, 440, 9, 32, 1, 32, 1, 32, 3, 32, 444, 8, 32, 1, 33, 1, 33, 3, 33, 448, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 457, 8, 35, 10, 35, 12, 35, 460, 9, 35, 1, 36, 1, 36, 3, 36, 464, 8, 36, 1, 36, 1, 36, 3, 36, 468, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 480, 8, 39, 10, 39, 12, 39, 483, 9, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 493, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 505, 8, 44, 10, 44, 12, 44, 508, 9, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 518, 8, 47, 1, 48, 3, 48, 521, 8, 48, 1, 48, 1, 48, 1, 49, 3, 49, 526, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 548, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 554, 8, 55, 10, 55, 12, 55, 557, 9, 55, 3, 55, 559, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 564, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 577, 8, 58, 1, 58, 0, 4, 2, 10, 18, 20, 59, 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, 0, 8, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 25, 25, 76, 76, 1, 0, 67, 68, 2, 0, 30, 30, 34, 34, 2, 0, 37, 37, 40, 40, 2, 0, 36, 36, 50, 50, 2, 0, 51, 51, 53, 57, 604, 0, 118, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 4, 138, 1, 0, 0, 0, 6, 156, 1, 0, 0, 0, 8, 158, 1, 0, 0, 0, 10, 191, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 220, 1, 0, 0, 0, 16, 229, 1, 0, 0, 0, 18, 235, 1, 0, 0, 0, 20, 256, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 284, 1, 0, 0, 0, 26, 286, 1, 0, 0, 0, 28, 288, 1, 0, 0, 0, 30, 291, 1, 0, 0, 0, 32, 304, 1, 0, 0, 0, 34, 306, 1, 0, 0, 0, 36, 323, 1, 0, 0, 0, 38, 325, 1, 0, 0, 0, 40, 327, 1, 0, 0, 0, 42, 331, 1, 0, 0, 0, 44, 333, 1, 0, 0, 0, 46, 342, 1, 0, 0, 0, 48, 346, 1, 0, 0, 0, 50, 362, 1, 0, 0, 0, 52, 365, 1, 0, 0, 0, 54, 373, 1, 0, 0, 0, 56, 381, 1, 0, 0, 0, 58, 389, 1, 0, 0, 0, 60, 397, 1, 0, 0, 0, 62, 399, 1, 0, 0, 0, 64, 443, 1, 0, 0, 0, 66, 447, 1, 0, 0, 0, 68, 449, 1, 0, 0, 0, 70, 452, 1, 0, 0, 0, 72, 461, 1, 0, 0, 0, 74, 469, 1, 0, 0, 0, 76, 472, 1, 0, 0, 0, 78, 475, 1, 0, 0, 0, 80, 484, 1, 0, 0, 0, 82, 488, 1, 0, 0, 0, 84, 494, 1, 0, 0, 0, 86, 498, 1, 0, 0, 0, 88, 501, 1, 0, 0, 0, 90, 509, 1, 0, 0, 0, 92, 513, 1, 0, 0, 0, 94, 517, 1, 0, 0, 0, 96, 520, 1, 0, 0, 0, 98, 525, 1, 0, 0, 0, 100, 529, 1, 0, 0, 0, 102, 531, 1, 0, 0, 0, 104, 533, 1, 0, 0, 0, 106, 536, 1, 0, 0, 0, 108, 540, 1, 0, 0, 0, 110, 543, 1, 0, 0, 0, 112, 563, 1, 0, 0, 0, 114, 567, 1, 0, 0, 0, 116, 572, 1, 0, 0, 0, 118, 119, 3, 2, 1, 0, 119, 120, 5, 0, 0, 1, 120, 1, 1, 0, 0, 0, 121, 122, 6, 1, -1, 0, 122, 123, 3, 4, 2, 0, 123, 129, 1, 0, 0, 0, 124, 125, 10, 1, 0, 0, 125, 126, 5, 24, 0, 0, 126, 128, 3, 6, 3, 0, 127, 124, 1, 0, 0, 0, 128, 131, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 129, 130, 1, 0, 0, 0, 130, 3, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 132, 139, 3, 104, 52, 0, 133, 139, 3, 34, 17, 0, 134, 139, 3, 28, 14, 0, 135, 139, 3, 108, 54, 0, 136, 137, 4, 2, 1, 0, 137, 139, 3, 48, 24, 0, 138, 132, 1, 0, 0, 0, 138, 133, 1, 0, 0, 0, 138, 134, 1, 0, 0, 0, 138, 135, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 139, 5, 1, 0, 0, 0, 140, 157, 3, 50, 25, 0, 141, 157, 3, 8, 4, 0, 142, 157, 3, 74, 37, 0, 143, 157, 3, 68, 34, 0, 144, 157, 3, 52, 26, 0, 145, 157, 3, 70, 35, 0, 146, 157, 3, 76, 38, 0, 147, 157, 3, 78, 39, 0, 148, 157, 3, 82, 41, 0, 149, 157, 3, 84, 42, 0, 150, 157, 3, 110, 55, 0, 151, 157, 3, 86, 43, 0, 152, 153, 4, 3, 2, 0, 153, 157, 3, 116, 58, 0, 154, 155, 4, 3, 3, 0, 155, 157, 3, 114, 57, 0, 156, 140, 1, 0, 0, 0, 156, 141, 1, 0, 0, 0, 156, 142, 1, 0, 0, 0, 156, 143, 1, 0, 0, 0, 156, 144, 1, 0, 0, 0, 156, 145, 1, 0, 0, 0, 156, 146, 1, 0, 0, 0, 156, 147, 1, 0, 0, 0, 156, 148, 1, 0, 0, 0, 156, 149, 1, 0, 0, 0, 156, 150, 1, 0, 0, 0, 156, 151, 1, 0, 0, 0, 156, 152, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 157, 7, 1, 0, 0, 0, 158, 159, 5, 16, 0, 0, 159, 160, 3, 10, 5, 0, 160, 9, 1, 0, 0, 0, 161, 162, 6, 5, -1, 0, 162, 163, 5, 43, 0, 0, 163, 192, 3, 10, 5, 8, 164, 192, 3, 16, 8, 0, 165, 192, 3, 12, 6, 0, 166, 168, 3, 16, 8, 0, 167, 169, 5, 43, 0, 0, 168, 167, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 171, 5, 38, 0, 0, 171, 172, 5, 42, 0, 0, 172, 177, 3, 16, 8, 0, 173, 174, 5, 33, 0, 0, 174, 176, 3, 16, 8, 0, 175, 173, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 49, 0, 0, 181, 192, 1, 0, 0, 0, 182, 183, 3, 16, 8, 0, 183, 185, 5, 39, 0, 0, 184, 186, 5, 43, 0, 0, 185, 184, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 188, 5, 44, 0, 0, 188, 192, 1, 0, 0, 0, 189, 190, 4, 5, 4, 0, 190, 192, 3, 14, 7, 0, 191, 161, 1, 0, 0, 0, 191, 164, 1, 0, 0, 0, 191, 165, 1, 0, 0, 0, 191, 166, 1, 0, 0, 0, 191, 182, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 201, 1, 0, 0, 0, 193, 194, 10, 5, 0, 0, 194, 195, 5, 29, 0, 0, 195, 200, 3, 10, 5, 6, 196, 197, 10, 4, 0, 0, 197, 198, 5, 46, 0, 0, 198, 200, 3, 10, 5, 5, 199, 193, 1, 0, 0, 0, 199, 196, 1, 0, 0, 0, 200, 203, 1, 0, 0, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 11, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 204, 206, 3, 16, 8, 0, 205, 207, 5, 43, 0, 0, 206, 205, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 41, 0, 0, 209, 210, 3, 100, 50, 0, 210, 219, 1, 0, 0, 0, 211, 213, 3, 16, 8, 0, 212, 214, 5, 43, 0, 0, 213, 212, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 216, 5, 48, 0, 0, 216, 217, 3, 100, 50, 0, 217, 219, 1, 0, 0, 0, 218, 204, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 219, 13, 1, 0, 0, 0, 220, 221, 3, 16, 8, 0, 221, 222, 5, 63, 0, 0, 222, 223, 3, 100, 50, 0, 223, 15, 1, 0, 0, 0, 224, 230, 3, 18, 9, 0, 225, 226, 3, 18, 9, 0, 226, 227, 3, 102, 51, 0, 227, 228, 3, 18, 9, 0, 228, 230, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 229, 225, 1, 0, 0, 0, 230, 17, 1, 0, 0, 0, 231, 232, 6, 9, -1, 0, 232, 236, 3, 20, 10, 0, 233, 234, 7, 0, 0, 0, 234, 236, 3, 18, 9, 3, 235, 231, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 236, 245, 1, 0, 0, 0, 237, 238, 10, 2, 0, 0, 238, 239, 7, 1, 0, 0, 239, 244, 3, 18, 9, 3, 240, 241, 10, 1, 0, 0, 241, 242, 7, 0, 0, 0, 242, 244, 3, 18, 9, 2, 243, 237, 1, 0, 0, 0, 243, 240, 1, 0, 0, 0, 244, 247, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 19, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 248, 249, 6, 10, -1, 0, 249, 257, 3, 64, 32, 0, 250, 257, 3, 54, 27, 0, 251, 257, 3, 22, 11, 0, 252, 253, 5, 42, 0, 0, 253, 254, 3, 10, 5, 0, 254, 255, 5, 49, 0, 0, 255, 257, 1, 0, 0, 0, 256, 248, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 252, 1, 0, 0, 0, 257, 263, 1, 0, 0, 0, 258, 259, 10, 1, 0, 0, 259, 260, 5, 32, 0, 0, 260, 262, 3, 26, 13, 0, 261, 258, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 21, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 266, 267, 3, 24, 12, 0, 267, 277, 5, 42, 0, 0, 268, 278, 5, 60, 0, 0, 269, 274, 3, 10, 5, 0, 270, 271, 5, 33, 0, 0, 271, 273, 3, 10, 5, 0, 272, 270, 1, 0, 0, 0, 273, 276, 1, 0, 0, 0, 274, 272, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 277, 268, 1, 0, 0, 0, 277, 269, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 280, 5, 49, 0, 0, 280, 23, 1, 0, 0, 0, 281, 282, 4, 12, 10, 0, 282, 285, 5, 63, 0, 0, 283, 285, 3, 60, 30, 0, 284, 281, 1, 0, 0, 0, 284, 283, 1, 0, 0, 0, 285, 25, 1, 0, 0, 0, 286, 287, 3, 60, 30, 0, 287, 27, 1, 0, 0, 0, 288, 289, 5, 12, 0, 0, 289, 290, 3, 30, 15, 0, 290, 29, 1, 0, 0, 0, 291, 296, 3, 32, 16, 0, 292, 293, 5, 33, 0, 0, 293, 295, 3, 32, 16, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 31, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 305, 3, 10, 5, 0, 300, 301, 3, 54, 27, 0, 301, 302, 5, 31, 0, 0, 302, 303, 3, 10, 5, 0, 303, 305, 1, 0, 0, 0, 304, 299, 1, 0, 0, 0, 304, 300, 1, 0, 0, 0, 305, 33, 1, 0, 0, 0, 306, 307, 5, 6, 0, 0, 307, 312, 3, 36, 18, 0, 308, 309, 5, 33, 0, 0, 309, 311, 3, 36, 18, 0, 310, 308, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 315, 317, 3, 42, 21, 0, 316, 315, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 35, 1, 0, 0, 0, 318, 319, 3, 38, 19, 0, 319, 320, 5, 104, 0, 0, 320, 321, 3, 40, 20, 0, 321, 324, 1, 0, 0, 0, 322, 324, 3, 40, 20, 0, 323, 318, 1, 0, 0, 0, 323, 322, 1, 0, 0, 0, 324, 37, 1, 0, 0, 0, 325, 326, 5, 76, 0, 0, 326, 39, 1, 0, 0, 0, 327, 328, 7, 2, 0, 0, 328, 41, 1, 0, 0, 0, 329, 332, 3, 44, 22, 0, 330, 332, 3, 46, 23, 0, 331, 329, 1, 0, 0, 0, 331, 330, 1, 0, 0, 0, 332, 43, 1, 0, 0, 0, 333, 334, 5, 75, 0, 0, 334, 339, 5, 76, 0, 0, 335, 336, 5, 33, 0, 0, 336, 338, 5, 76, 0, 0, 337, 335, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 45, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 342, 343, 5, 65, 0, 0, 343, 344, 3, 44, 22, 0, 344, 345, 5, 66, 0, 0, 345, 47, 1, 0, 0, 0, 346, 347, 5, 19, 0, 0, 347, 352, 3, 36, 18, 0, 348, 349, 5, 33, 0, 0, 349, 351, 3, 36, 18, 0, 350, 348, 1, 0, 0, 0, 351, 354, 1, 0, 0, 0, 352, 350, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 355, 357, 3, 30, 15, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 360, 1, 0, 0, 0, 358, 359, 5, 28, 0, 0, 359, 361, 3, 30, 15, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 49, 1, 0, 0, 0, 362, 363, 5, 4, 0, 0, 363, 364, 3, 30, 15, 0, 364, 51, 1, 0, 0, 0, 365, 367, 5, 15, 0, 0, 366, 368, 3, 30, 15, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 371, 1, 0, 0, 0, 369, 370, 5, 28, 0, 0, 370, 372, 3, 30, 15, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 53, 1, 0, 0, 0, 373, 378, 3, 60, 30, 0, 374, 375, 5, 35, 0, 0, 375, 377, 3, 60, 30, 0, 376, 374, 1, 0, 0, 0, 377, 380, 1, 0, 0, 0, 378, 376, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 55, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 381, 386, 3, 62, 31, 0, 382, 383, 5, 35, 0, 0, 383, 385, 3, 62, 31, 0, 384, 382, 1, 0, 0, 0, 385, 388, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 57, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 394, 3, 56, 28, 0, 390, 391, 5, 33, 0, 0, 391, 393, 3, 56, 28, 0, 392, 390, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 59, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 7, 3, 0, 0, 398, 61, 1, 0, 0, 0, 399, 400, 5, 80, 0, 0, 400, 63, 1, 0, 0, 0, 401, 444, 5, 44, 0, 0, 402, 403, 3, 98, 49, 0, 403, 404, 5, 67, 0, 0, 404, 444, 1, 0, 0, 0, 405, 444, 3, 96, 48, 0, 406, 444, 3, 98, 49, 0, 407, 444, 3, 92, 46, 0, 408, 444, 3, 66, 33, 0, 409, 444, 3, 100, 50, 0, 410, 411, 5, 65, 0, 0, 411, 416, 3, 94, 47, 0, 412, 413, 5, 33, 0, 0, 413, 415, 3, 94, 47, 0, 414, 412, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 66, 0, 0, 420, 444, 1, 0, 0, 0, 421, 422, 5, 65, 0, 0, 422, 427, 3, 92, 46, 0, 423, 424, 5, 33, 0, 0, 424, 426, 3, 92, 46, 0, 425, 423, 1, 0, 0, 0, 426, 429, 1, 0, 0, 0, 427, 425, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 430, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 430, 431, 5, 66, 0, 0, 431, 444, 1, 0, 0, 0, 432, 433, 5, 65, 0, 0, 433, 438, 3, 100, 50, 0, 434, 435, 5, 33, 0, 0, 435, 437, 3, 100, 50, 0, 436, 434, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 66, 0, 0, 442, 444, 1, 0, 0, 0, 443, 401, 1, 0, 0, 0, 443, 402, 1, 0, 0, 0, 443, 405, 1, 0, 0, 0, 443, 406, 1, 0, 0, 0, 443, 407, 1, 0, 0, 0, 443, 408, 1, 0, 0, 0, 443, 409, 1, 0, 0, 0, 443, 410, 1, 0, 0, 0, 443, 421, 1, 0, 0, 0, 443, 432, 1, 0, 0, 0, 444, 65, 1, 0, 0, 0, 445, 448, 5, 47, 0, 0, 446, 448, 5, 64, 0, 0, 447, 445, 1, 0, 0, 0, 447, 446, 1, 0, 0, 0, 448, 67, 1, 0, 0, 0, 449, 450, 5, 9, 0, 0, 450, 451, 5, 26, 0, 0, 451, 69, 1, 0, 0, 0, 452, 453, 5, 14, 0, 0, 453, 458, 3, 72, 36, 0, 454, 455, 5, 33, 0, 0, 455, 457, 3, 72, 36, 0, 456, 454, 1, 0, 0, 0, 457, 460, 1, 0, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 71, 1, 0, 0, 0, 460, 458, 1, 0, 0, 0, 461, 463, 3, 10, 5, 0, 462, 464, 7, 4, 0, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 466, 5, 45, 0, 0, 466, 468, 7, 5, 0, 0, 467, 465, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 73, 1, 0, 0, 0, 469, 470, 5, 8, 0, 0, 470, 471, 3, 58, 29, 0, 471, 75, 1, 0, 0, 0, 472, 473, 5, 2, 0, 0, 473, 474, 3, 58, 29, 0, 474, 77, 1, 0, 0, 0, 475, 476, 5, 11, 0, 0, 476, 481, 3, 80, 40, 0, 477, 478, 5, 33, 0, 0, 478, 480, 3, 80, 40, 0, 479, 477, 1, 0, 0, 0, 480, 483, 1, 0, 0, 0, 481, 479, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 79, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 484, 485, 3, 56, 28, 0, 485, 486, 5, 84, 0, 0, 486, 487, 3, 56, 28, 0, 487, 81, 1, 0, 0, 0, 488, 489, 5, 1, 0, 0, 489, 490, 3, 20, 10, 0, 490, 492, 3, 100, 50, 0, 491, 493, 3, 88, 44, 0, 492, 491, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 83, 1, 0, 0, 0, 494, 495, 5, 7, 0, 0, 495, 496, 3, 20, 10, 0, 496, 497, 3, 100, 50, 0, 497, 85, 1, 0, 0, 0, 498, 499, 5, 10, 0, 0, 499, 500, 3, 54, 27, 0, 500, 87, 1, 0, 0, 0, 501, 506, 3, 90, 45, 0, 502, 503, 5, 33, 0, 0, 503, 505, 3, 90, 45, 0, 504, 502, 1, 0, 0, 0, 505, 508, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 89, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 510, 3, 60, 30, 0, 510, 511, 5, 31, 0, 0, 511, 512, 3, 64, 32, 0, 512, 91, 1, 0, 0, 0, 513, 514, 7, 6, 0, 0, 514, 93, 1, 0, 0, 0, 515, 518, 3, 96, 48, 0, 516, 518, 3, 98, 49, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 95, 1, 0, 0, 0, 519, 521, 7, 0, 0, 0, 520, 519, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 5, 27, 0, 0, 523, 97, 1, 0, 0, 0, 524, 526, 7, 0, 0, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 5, 26, 0, 0, 528, 99, 1, 0, 0, 0, 529, 530, 5, 25, 0, 0, 530, 101, 1, 0, 0, 0, 531, 532, 7, 7, 0, 0, 532, 103, 1, 0, 0, 0, 533, 534, 5, 5, 0, 0, 534, 535, 3, 106, 53, 0, 535, 105, 1, 0, 0, 0, 536, 537, 5, 65, 0, 0, 537, 538, 3, 2, 1, 0, 538, 539, 5, 66, 0, 0, 539, 107, 1, 0, 0, 0, 540, 541, 5, 13, 0, 0, 541, 542, 5, 100, 0, 0, 542, 109, 1, 0, 0, 0, 543, 544, 5, 3, 0, 0, 544, 547, 5, 90, 0, 0, 545, 546, 5, 88, 0, 0, 546, 548, 3, 56, 28, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 558, 1, 0, 0, 0, 549, 550, 5, 89, 0, 0, 550, 555, 3, 112, 56, 0, 551, 552, 5, 33, 0, 0, 552, 554, 3, 112, 56, 0, 553, 551, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 549, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 111, 1, 0, 0, 0, 560, 561, 3, 56, 28, 0, 561, 562, 5, 31, 0, 0, 562, 564, 1, 0, 0, 0, 563, 560, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 3, 56, 28, 0, 566, 113, 1, 0, 0, 0, 567, 568, 5, 18, 0, 0, 568, 569, 3, 36, 18, 0, 569, 570, 5, 88, 0, 0, 570, 571, 3, 58, 29, 0, 571, 115, 1, 0, 0, 0, 572, 573, 5, 17, 0, 0, 573, 576, 3, 30, 15, 0, 574, 575, 5, 28, 0, 0, 575, 577, 3, 30, 15, 0, 576, 574, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 117, 1, 0, 0, 0, 55, 129, 138, 156, 168, 177, 185, 191, 199, 201, 206, 213, 218, 229, 235, 243, 245, 256, 263, 274, 277, 284, 296, 304, 312, 316, 323, 331, 339, 352, 356, 360, 367, 371, 378, 386, 394, 416, 427, 438, 443, 447, 458, 463, 467, 481, 492, 506, 517, 520, 525, 547, 555, 558, 563, 576] \ No newline at end of file +[4, 1, 120, 587, 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, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 130, 8, 1, 10, 1, 12, 1, 133, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 141, 8, 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, 3, 3, 159, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 171, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 178, 8, 5, 10, 5, 12, 5, 181, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 188, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 194, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 202, 8, 5, 10, 5, 12, 5, 205, 9, 5, 1, 6, 1, 6, 3, 6, 209, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 216, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 232, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 238, 8, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 246, 8, 9, 10, 9, 12, 9, 249, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 259, 8, 10, 1, 10, 1, 10, 1, 10, 5, 10, 264, 8, 10, 10, 10, 12, 10, 267, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 275, 8, 11, 10, 11, 12, 11, 278, 9, 11, 3, 11, 280, 8, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 5, 15, 297, 8, 15, 10, 15, 12, 15, 300, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 307, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 313, 8, 17, 10, 17, 12, 17, 316, 9, 17, 1, 17, 3, 17, 319, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 326, 8, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21, 3, 21, 334, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 340, 8, 22, 10, 22, 12, 22, 343, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 353, 8, 24, 10, 24, 12, 24, 356, 9, 24, 1, 24, 3, 24, 359, 8, 24, 1, 24, 1, 24, 3, 24, 363, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 3, 26, 370, 8, 26, 1, 26, 1, 26, 3, 26, 374, 8, 26, 1, 27, 1, 27, 1, 27, 5, 27, 379, 8, 27, 10, 27, 12, 27, 382, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 387, 8, 28, 10, 28, 12, 28, 390, 9, 28, 1, 29, 1, 29, 1, 29, 5, 29, 395, 8, 29, 10, 29, 12, 29, 398, 9, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 404, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 419, 8, 32, 10, 32, 12, 32, 422, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 430, 8, 32, 10, 32, 12, 32, 433, 9, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 441, 8, 32, 10, 32, 12, 32, 444, 9, 32, 1, 32, 1, 32, 3, 32, 448, 8, 32, 1, 33, 1, 33, 3, 33, 452, 8, 33, 1, 34, 1, 34, 3, 34, 456, 8, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 465, 8, 36, 10, 36, 12, 36, 468, 9, 36, 1, 37, 1, 37, 3, 37, 472, 8, 37, 1, 37, 1, 37, 3, 37, 476, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 488, 8, 40, 10, 40, 12, 40, 491, 9, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 501, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 5, 45, 513, 8, 45, 10, 45, 12, 45, 516, 9, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 526, 8, 48, 1, 49, 3, 49, 529, 8, 49, 1, 49, 1, 49, 1, 50, 3, 50, 534, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 556, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 562, 8, 56, 10, 56, 12, 56, 565, 9, 56, 3, 56, 567, 8, 56, 1, 57, 1, 57, 1, 57, 3, 57, 572, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 585, 8, 59, 1, 59, 0, 4, 2, 10, 18, 20, 60, 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, 0, 8, 1, 0, 58, 59, 1, 0, 60, 62, 2, 0, 25, 25, 76, 76, 1, 0, 67, 68, 2, 0, 30, 30, 34, 34, 2, 0, 37, 37, 40, 40, 2, 0, 36, 36, 50, 50, 2, 0, 51, 51, 53, 57, 613, 0, 120, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 140, 1, 0, 0, 0, 6, 158, 1, 0, 0, 0, 8, 160, 1, 0, 0, 0, 10, 193, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 222, 1, 0, 0, 0, 16, 231, 1, 0, 0, 0, 18, 237, 1, 0, 0, 0, 20, 258, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 286, 1, 0, 0, 0, 26, 288, 1, 0, 0, 0, 28, 290, 1, 0, 0, 0, 30, 293, 1, 0, 0, 0, 32, 306, 1, 0, 0, 0, 34, 308, 1, 0, 0, 0, 36, 325, 1, 0, 0, 0, 38, 327, 1, 0, 0, 0, 40, 329, 1, 0, 0, 0, 42, 333, 1, 0, 0, 0, 44, 335, 1, 0, 0, 0, 46, 344, 1, 0, 0, 0, 48, 348, 1, 0, 0, 0, 50, 364, 1, 0, 0, 0, 52, 367, 1, 0, 0, 0, 54, 375, 1, 0, 0, 0, 56, 383, 1, 0, 0, 0, 58, 391, 1, 0, 0, 0, 60, 399, 1, 0, 0, 0, 62, 403, 1, 0, 0, 0, 64, 447, 1, 0, 0, 0, 66, 451, 1, 0, 0, 0, 68, 455, 1, 0, 0, 0, 70, 457, 1, 0, 0, 0, 72, 460, 1, 0, 0, 0, 74, 469, 1, 0, 0, 0, 76, 477, 1, 0, 0, 0, 78, 480, 1, 0, 0, 0, 80, 483, 1, 0, 0, 0, 82, 492, 1, 0, 0, 0, 84, 496, 1, 0, 0, 0, 86, 502, 1, 0, 0, 0, 88, 506, 1, 0, 0, 0, 90, 509, 1, 0, 0, 0, 92, 517, 1, 0, 0, 0, 94, 521, 1, 0, 0, 0, 96, 525, 1, 0, 0, 0, 98, 528, 1, 0, 0, 0, 100, 533, 1, 0, 0, 0, 102, 537, 1, 0, 0, 0, 104, 539, 1, 0, 0, 0, 106, 541, 1, 0, 0, 0, 108, 544, 1, 0, 0, 0, 110, 548, 1, 0, 0, 0, 112, 551, 1, 0, 0, 0, 114, 571, 1, 0, 0, 0, 116, 575, 1, 0, 0, 0, 118, 580, 1, 0, 0, 0, 120, 121, 3, 2, 1, 0, 121, 122, 5, 0, 0, 1, 122, 1, 1, 0, 0, 0, 123, 124, 6, 1, -1, 0, 124, 125, 3, 4, 2, 0, 125, 131, 1, 0, 0, 0, 126, 127, 10, 1, 0, 0, 127, 128, 5, 24, 0, 0, 128, 130, 3, 6, 3, 0, 129, 126, 1, 0, 0, 0, 130, 133, 1, 0, 0, 0, 131, 129, 1, 0, 0, 0, 131, 132, 1, 0, 0, 0, 132, 3, 1, 0, 0, 0, 133, 131, 1, 0, 0, 0, 134, 141, 3, 106, 53, 0, 135, 141, 3, 34, 17, 0, 136, 141, 3, 28, 14, 0, 137, 141, 3, 110, 55, 0, 138, 139, 4, 2, 1, 0, 139, 141, 3, 48, 24, 0, 140, 134, 1, 0, 0, 0, 140, 135, 1, 0, 0, 0, 140, 136, 1, 0, 0, 0, 140, 137, 1, 0, 0, 0, 140, 138, 1, 0, 0, 0, 141, 5, 1, 0, 0, 0, 142, 159, 3, 50, 25, 0, 143, 159, 3, 8, 4, 0, 144, 159, 3, 76, 38, 0, 145, 159, 3, 70, 35, 0, 146, 159, 3, 52, 26, 0, 147, 159, 3, 72, 36, 0, 148, 159, 3, 78, 39, 0, 149, 159, 3, 80, 40, 0, 150, 159, 3, 84, 42, 0, 151, 159, 3, 86, 43, 0, 152, 159, 3, 112, 56, 0, 153, 159, 3, 88, 44, 0, 154, 155, 4, 3, 2, 0, 155, 159, 3, 118, 59, 0, 156, 157, 4, 3, 3, 0, 157, 159, 3, 116, 58, 0, 158, 142, 1, 0, 0, 0, 158, 143, 1, 0, 0, 0, 158, 144, 1, 0, 0, 0, 158, 145, 1, 0, 0, 0, 158, 146, 1, 0, 0, 0, 158, 147, 1, 0, 0, 0, 158, 148, 1, 0, 0, 0, 158, 149, 1, 0, 0, 0, 158, 150, 1, 0, 0, 0, 158, 151, 1, 0, 0, 0, 158, 152, 1, 0, 0, 0, 158, 153, 1, 0, 0, 0, 158, 154, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 159, 7, 1, 0, 0, 0, 160, 161, 5, 16, 0, 0, 161, 162, 3, 10, 5, 0, 162, 9, 1, 0, 0, 0, 163, 164, 6, 5, -1, 0, 164, 165, 5, 43, 0, 0, 165, 194, 3, 10, 5, 8, 166, 194, 3, 16, 8, 0, 167, 194, 3, 12, 6, 0, 168, 170, 3, 16, 8, 0, 169, 171, 5, 43, 0, 0, 170, 169, 1, 0, 0, 0, 170, 171, 1, 0, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 5, 38, 0, 0, 173, 174, 5, 42, 0, 0, 174, 179, 3, 16, 8, 0, 175, 176, 5, 33, 0, 0, 176, 178, 3, 16, 8, 0, 177, 175, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 182, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 5, 49, 0, 0, 183, 194, 1, 0, 0, 0, 184, 185, 3, 16, 8, 0, 185, 187, 5, 39, 0, 0, 186, 188, 5, 43, 0, 0, 187, 186, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 189, 1, 0, 0, 0, 189, 190, 5, 44, 0, 0, 190, 194, 1, 0, 0, 0, 191, 192, 4, 5, 4, 0, 192, 194, 3, 14, 7, 0, 193, 163, 1, 0, 0, 0, 193, 166, 1, 0, 0, 0, 193, 167, 1, 0, 0, 0, 193, 168, 1, 0, 0, 0, 193, 184, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 203, 1, 0, 0, 0, 195, 196, 10, 5, 0, 0, 196, 197, 5, 29, 0, 0, 197, 202, 3, 10, 5, 6, 198, 199, 10, 4, 0, 0, 199, 200, 5, 46, 0, 0, 200, 202, 3, 10, 5, 5, 201, 195, 1, 0, 0, 0, 201, 198, 1, 0, 0, 0, 202, 205, 1, 0, 0, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 11, 1, 0, 0, 0, 205, 203, 1, 0, 0, 0, 206, 208, 3, 16, 8, 0, 207, 209, 5, 43, 0, 0, 208, 207, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 211, 5, 41, 0, 0, 211, 212, 3, 102, 51, 0, 212, 221, 1, 0, 0, 0, 213, 215, 3, 16, 8, 0, 214, 216, 5, 43, 0, 0, 215, 214, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 217, 1, 0, 0, 0, 217, 218, 5, 48, 0, 0, 218, 219, 3, 102, 51, 0, 219, 221, 1, 0, 0, 0, 220, 206, 1, 0, 0, 0, 220, 213, 1, 0, 0, 0, 221, 13, 1, 0, 0, 0, 222, 223, 3, 16, 8, 0, 223, 224, 5, 63, 0, 0, 224, 225, 3, 102, 51, 0, 225, 15, 1, 0, 0, 0, 226, 232, 3, 18, 9, 0, 227, 228, 3, 18, 9, 0, 228, 229, 3, 104, 52, 0, 229, 230, 3, 18, 9, 0, 230, 232, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 231, 227, 1, 0, 0, 0, 232, 17, 1, 0, 0, 0, 233, 234, 6, 9, -1, 0, 234, 238, 3, 20, 10, 0, 235, 236, 7, 0, 0, 0, 236, 238, 3, 18, 9, 3, 237, 233, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 247, 1, 0, 0, 0, 239, 240, 10, 2, 0, 0, 240, 241, 7, 1, 0, 0, 241, 246, 3, 18, 9, 3, 242, 243, 10, 1, 0, 0, 243, 244, 7, 0, 0, 0, 244, 246, 3, 18, 9, 2, 245, 239, 1, 0, 0, 0, 245, 242, 1, 0, 0, 0, 246, 249, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 19, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 250, 251, 6, 10, -1, 0, 251, 259, 3, 64, 32, 0, 252, 259, 3, 54, 27, 0, 253, 259, 3, 22, 11, 0, 254, 255, 5, 42, 0, 0, 255, 256, 3, 10, 5, 0, 256, 257, 5, 49, 0, 0, 257, 259, 1, 0, 0, 0, 258, 250, 1, 0, 0, 0, 258, 252, 1, 0, 0, 0, 258, 253, 1, 0, 0, 0, 258, 254, 1, 0, 0, 0, 259, 265, 1, 0, 0, 0, 260, 261, 10, 1, 0, 0, 261, 262, 5, 32, 0, 0, 262, 264, 3, 26, 13, 0, 263, 260, 1, 0, 0, 0, 264, 267, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 21, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 268, 269, 3, 24, 12, 0, 269, 279, 5, 42, 0, 0, 270, 280, 5, 60, 0, 0, 271, 276, 3, 10, 5, 0, 272, 273, 5, 33, 0, 0, 273, 275, 3, 10, 5, 0, 274, 272, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 279, 271, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 282, 5, 49, 0, 0, 282, 23, 1, 0, 0, 0, 283, 284, 4, 12, 10, 0, 284, 287, 5, 63, 0, 0, 285, 287, 3, 68, 34, 0, 286, 283, 1, 0, 0, 0, 286, 285, 1, 0, 0, 0, 287, 25, 1, 0, 0, 0, 288, 289, 3, 60, 30, 0, 289, 27, 1, 0, 0, 0, 290, 291, 5, 12, 0, 0, 291, 292, 3, 30, 15, 0, 292, 29, 1, 0, 0, 0, 293, 298, 3, 32, 16, 0, 294, 295, 5, 33, 0, 0, 295, 297, 3, 32, 16, 0, 296, 294, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 31, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 307, 3, 10, 5, 0, 302, 303, 3, 54, 27, 0, 303, 304, 5, 31, 0, 0, 304, 305, 3, 10, 5, 0, 305, 307, 1, 0, 0, 0, 306, 301, 1, 0, 0, 0, 306, 302, 1, 0, 0, 0, 307, 33, 1, 0, 0, 0, 308, 309, 5, 6, 0, 0, 309, 314, 3, 36, 18, 0, 310, 311, 5, 33, 0, 0, 311, 313, 3, 36, 18, 0, 312, 310, 1, 0, 0, 0, 313, 316, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 318, 1, 0, 0, 0, 316, 314, 1, 0, 0, 0, 317, 319, 3, 42, 21, 0, 318, 317, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 35, 1, 0, 0, 0, 320, 321, 3, 38, 19, 0, 321, 322, 5, 104, 0, 0, 322, 323, 3, 40, 20, 0, 323, 326, 1, 0, 0, 0, 324, 326, 3, 40, 20, 0, 325, 320, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 37, 1, 0, 0, 0, 327, 328, 5, 76, 0, 0, 328, 39, 1, 0, 0, 0, 329, 330, 7, 2, 0, 0, 330, 41, 1, 0, 0, 0, 331, 334, 3, 44, 22, 0, 332, 334, 3, 46, 23, 0, 333, 331, 1, 0, 0, 0, 333, 332, 1, 0, 0, 0, 334, 43, 1, 0, 0, 0, 335, 336, 5, 75, 0, 0, 336, 341, 5, 76, 0, 0, 337, 338, 5, 33, 0, 0, 338, 340, 5, 76, 0, 0, 339, 337, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 45, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 65, 0, 0, 345, 346, 3, 44, 22, 0, 346, 347, 5, 66, 0, 0, 347, 47, 1, 0, 0, 0, 348, 349, 5, 19, 0, 0, 349, 354, 3, 36, 18, 0, 350, 351, 5, 33, 0, 0, 351, 353, 3, 36, 18, 0, 352, 350, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 359, 3, 30, 15, 0, 358, 357, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 361, 5, 28, 0, 0, 361, 363, 3, 30, 15, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 49, 1, 0, 0, 0, 364, 365, 5, 4, 0, 0, 365, 366, 3, 30, 15, 0, 366, 51, 1, 0, 0, 0, 367, 369, 5, 15, 0, 0, 368, 370, 3, 30, 15, 0, 369, 368, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 372, 5, 28, 0, 0, 372, 374, 3, 30, 15, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 53, 1, 0, 0, 0, 375, 380, 3, 68, 34, 0, 376, 377, 5, 35, 0, 0, 377, 379, 3, 68, 34, 0, 378, 376, 1, 0, 0, 0, 379, 382, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 55, 1, 0, 0, 0, 382, 380, 1, 0, 0, 0, 383, 388, 3, 62, 31, 0, 384, 385, 5, 35, 0, 0, 385, 387, 3, 62, 31, 0, 386, 384, 1, 0, 0, 0, 387, 390, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 57, 1, 0, 0, 0, 390, 388, 1, 0, 0, 0, 391, 396, 3, 56, 28, 0, 392, 393, 5, 33, 0, 0, 393, 395, 3, 56, 28, 0, 394, 392, 1, 0, 0, 0, 395, 398, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 59, 1, 0, 0, 0, 398, 396, 1, 0, 0, 0, 399, 400, 7, 3, 0, 0, 400, 61, 1, 0, 0, 0, 401, 404, 5, 80, 0, 0, 402, 404, 3, 66, 33, 0, 403, 401, 1, 0, 0, 0, 403, 402, 1, 0, 0, 0, 404, 63, 1, 0, 0, 0, 405, 448, 5, 44, 0, 0, 406, 407, 3, 100, 50, 0, 407, 408, 5, 67, 0, 0, 408, 448, 1, 0, 0, 0, 409, 448, 3, 98, 49, 0, 410, 448, 3, 100, 50, 0, 411, 448, 3, 94, 47, 0, 412, 448, 3, 66, 33, 0, 413, 448, 3, 102, 51, 0, 414, 415, 5, 65, 0, 0, 415, 420, 3, 96, 48, 0, 416, 417, 5, 33, 0, 0, 417, 419, 3, 96, 48, 0, 418, 416, 1, 0, 0, 0, 419, 422, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 423, 1, 0, 0, 0, 422, 420, 1, 0, 0, 0, 423, 424, 5, 66, 0, 0, 424, 448, 1, 0, 0, 0, 425, 426, 5, 65, 0, 0, 426, 431, 3, 94, 47, 0, 427, 428, 5, 33, 0, 0, 428, 430, 3, 94, 47, 0, 429, 427, 1, 0, 0, 0, 430, 433, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 434, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 434, 435, 5, 66, 0, 0, 435, 448, 1, 0, 0, 0, 436, 437, 5, 65, 0, 0, 437, 442, 3, 102, 51, 0, 438, 439, 5, 33, 0, 0, 439, 441, 3, 102, 51, 0, 440, 438, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 445, 1, 0, 0, 0, 444, 442, 1, 0, 0, 0, 445, 446, 5, 66, 0, 0, 446, 448, 1, 0, 0, 0, 447, 405, 1, 0, 0, 0, 447, 406, 1, 0, 0, 0, 447, 409, 1, 0, 0, 0, 447, 410, 1, 0, 0, 0, 447, 411, 1, 0, 0, 0, 447, 412, 1, 0, 0, 0, 447, 413, 1, 0, 0, 0, 447, 414, 1, 0, 0, 0, 447, 425, 1, 0, 0, 0, 447, 436, 1, 0, 0, 0, 448, 65, 1, 0, 0, 0, 449, 452, 5, 47, 0, 0, 450, 452, 5, 64, 0, 0, 451, 449, 1, 0, 0, 0, 451, 450, 1, 0, 0, 0, 452, 67, 1, 0, 0, 0, 453, 456, 3, 60, 30, 0, 454, 456, 3, 66, 33, 0, 455, 453, 1, 0, 0, 0, 455, 454, 1, 0, 0, 0, 456, 69, 1, 0, 0, 0, 457, 458, 5, 9, 0, 0, 458, 459, 5, 26, 0, 0, 459, 71, 1, 0, 0, 0, 460, 461, 5, 14, 0, 0, 461, 466, 3, 74, 37, 0, 462, 463, 5, 33, 0, 0, 463, 465, 3, 74, 37, 0, 464, 462, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 73, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 469, 471, 3, 10, 5, 0, 470, 472, 7, 4, 0, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 475, 1, 0, 0, 0, 473, 474, 5, 45, 0, 0, 474, 476, 7, 5, 0, 0, 475, 473, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 75, 1, 0, 0, 0, 477, 478, 5, 8, 0, 0, 478, 479, 3, 58, 29, 0, 479, 77, 1, 0, 0, 0, 480, 481, 5, 2, 0, 0, 481, 482, 3, 58, 29, 0, 482, 79, 1, 0, 0, 0, 483, 484, 5, 11, 0, 0, 484, 489, 3, 82, 41, 0, 485, 486, 5, 33, 0, 0, 486, 488, 3, 82, 41, 0, 487, 485, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 81, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 493, 3, 56, 28, 0, 493, 494, 5, 84, 0, 0, 494, 495, 3, 56, 28, 0, 495, 83, 1, 0, 0, 0, 496, 497, 5, 1, 0, 0, 497, 498, 3, 20, 10, 0, 498, 500, 3, 102, 51, 0, 499, 501, 3, 90, 45, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 85, 1, 0, 0, 0, 502, 503, 5, 7, 0, 0, 503, 504, 3, 20, 10, 0, 504, 505, 3, 102, 51, 0, 505, 87, 1, 0, 0, 0, 506, 507, 5, 10, 0, 0, 507, 508, 3, 54, 27, 0, 508, 89, 1, 0, 0, 0, 509, 514, 3, 92, 46, 0, 510, 511, 5, 33, 0, 0, 511, 513, 3, 92, 46, 0, 512, 510, 1, 0, 0, 0, 513, 516, 1, 0, 0, 0, 514, 512, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 91, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 517, 518, 3, 60, 30, 0, 518, 519, 5, 31, 0, 0, 519, 520, 3, 64, 32, 0, 520, 93, 1, 0, 0, 0, 521, 522, 7, 6, 0, 0, 522, 95, 1, 0, 0, 0, 523, 526, 3, 98, 49, 0, 524, 526, 3, 100, 50, 0, 525, 523, 1, 0, 0, 0, 525, 524, 1, 0, 0, 0, 526, 97, 1, 0, 0, 0, 527, 529, 7, 0, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 27, 0, 0, 531, 99, 1, 0, 0, 0, 532, 534, 7, 0, 0, 0, 533, 532, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 5, 26, 0, 0, 536, 101, 1, 0, 0, 0, 537, 538, 5, 25, 0, 0, 538, 103, 1, 0, 0, 0, 539, 540, 7, 7, 0, 0, 540, 105, 1, 0, 0, 0, 541, 542, 5, 5, 0, 0, 542, 543, 3, 108, 54, 0, 543, 107, 1, 0, 0, 0, 544, 545, 5, 65, 0, 0, 545, 546, 3, 2, 1, 0, 546, 547, 5, 66, 0, 0, 547, 109, 1, 0, 0, 0, 548, 549, 5, 13, 0, 0, 549, 550, 5, 100, 0, 0, 550, 111, 1, 0, 0, 0, 551, 552, 5, 3, 0, 0, 552, 555, 5, 90, 0, 0, 553, 554, 5, 88, 0, 0, 554, 556, 3, 56, 28, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 566, 1, 0, 0, 0, 557, 558, 5, 89, 0, 0, 558, 563, 3, 114, 57, 0, 559, 560, 5, 33, 0, 0, 560, 562, 3, 114, 57, 0, 561, 559, 1, 0, 0, 0, 562, 565, 1, 0, 0, 0, 563, 561, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 567, 1, 0, 0, 0, 565, 563, 1, 0, 0, 0, 566, 557, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 113, 1, 0, 0, 0, 568, 569, 3, 56, 28, 0, 569, 570, 5, 31, 0, 0, 570, 572, 1, 0, 0, 0, 571, 568, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 3, 56, 28, 0, 574, 115, 1, 0, 0, 0, 575, 576, 5, 18, 0, 0, 576, 577, 3, 36, 18, 0, 577, 578, 5, 88, 0, 0, 578, 579, 3, 58, 29, 0, 579, 117, 1, 0, 0, 0, 580, 581, 5, 17, 0, 0, 581, 584, 3, 30, 15, 0, 582, 583, 5, 28, 0, 0, 583, 585, 3, 30, 15, 0, 584, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 119, 1, 0, 0, 0, 57, 131, 140, 158, 170, 179, 187, 193, 201, 203, 208, 215, 220, 231, 237, 245, 247, 258, 265, 276, 279, 286, 298, 306, 314, 318, 325, 333, 341, 354, 358, 362, 369, 373, 380, 388, 396, 403, 420, 431, 442, 447, 451, 455, 466, 471, 475, 489, 500, 514, 525, 528, 533, 555, 563, 566, 571, 584] \ No newline at end of file diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java index 0afc77dc12f8b..522393fb42c4b 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java @@ -73,15 +73,15 @@ public class EsqlBaseParser extends ParserConfig { RULE_metricsCommand = 24, RULE_evalCommand = 25, RULE_statsCommand = 26, RULE_qualifiedName = 27, RULE_qualifiedNamePattern = 28, RULE_qualifiedNamePatterns = 29, RULE_identifier = 30, RULE_identifierPattern = 31, RULE_constant = 32, - RULE_params = 33, RULE_limitCommand = 34, RULE_sortCommand = 35, RULE_orderExpression = 36, - RULE_keepCommand = 37, RULE_dropCommand = 38, RULE_renameCommand = 39, - RULE_renameClause = 40, RULE_dissectCommand = 41, RULE_grokCommand = 42, - RULE_mvExpandCommand = 43, RULE_commandOptions = 44, RULE_commandOption = 45, - RULE_booleanValue = 46, RULE_numericValue = 47, RULE_decimalValue = 48, - RULE_integerValue = 49, RULE_string = 50, RULE_comparisonOperator = 51, - RULE_explainCommand = 52, RULE_subqueryExpression = 53, RULE_showCommand = 54, - RULE_enrichCommand = 55, RULE_enrichWithClause = 56, RULE_lookupCommand = 57, - RULE_inlinestatsCommand = 58; + RULE_parameter = 33, RULE_identifierOrParameter = 34, RULE_limitCommand = 35, + RULE_sortCommand = 36, RULE_orderExpression = 37, RULE_keepCommand = 38, + RULE_dropCommand = 39, RULE_renameCommand = 40, RULE_renameClause = 41, + RULE_dissectCommand = 42, RULE_grokCommand = 43, RULE_mvExpandCommand = 44, + RULE_commandOptions = 45, RULE_commandOption = 46, RULE_booleanValue = 47, + RULE_numericValue = 48, RULE_decimalValue = 49, RULE_integerValue = 50, + RULE_string = 51, RULE_comparisonOperator = 52, RULE_explainCommand = 53, + RULE_subqueryExpression = 54, RULE_showCommand = 55, RULE_enrichCommand = 56, + RULE_enrichWithClause = 57, RULE_lookupCommand = 58, RULE_inlinestatsCommand = 59; private static String[] makeRuleNames() { return new String[] { "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", @@ -91,11 +91,11 @@ private static String[] makeRuleNames() { "indexPattern", "clusterString", "indexString", "metadata", "metadataOption", "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", "identifier", - "identifierPattern", "constant", "params", "limitCommand", "sortCommand", - "orderExpression", "keepCommand", "dropCommand", "renameCommand", "renameClause", - "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", - "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", - "string", "comparisonOperator", "explainCommand", "subqueryExpression", + "identifierPattern", "constant", "parameter", "identifierOrParameter", + "limitCommand", "sortCommand", "orderExpression", "keepCommand", "dropCommand", + "renameCommand", "renameClause", "dissectCommand", "grokCommand", "mvExpandCommand", + "commandOptions", "commandOption", "booleanValue", "numericValue", "decimalValue", + "integerValue", "string", "comparisonOperator", "explainCommand", "subqueryExpression", "showCommand", "enrichCommand", "enrichWithClause", "lookupCommand", "inlinestatsCommand" }; @@ -231,9 +231,9 @@ public final SingleStatementContext singleStatement() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(118); + setState(120); query(0); - setState(119); + setState(121); match(EOF); } } @@ -329,11 +329,11 @@ private QueryContext query(int _p) throws RecognitionException { _ctx = _localctx; _prevctx = _localctx; - setState(122); + setState(124); sourceCommand(); } _ctx.stop = _input.LT(-1); - setState(129); + setState(131); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -344,16 +344,16 @@ private QueryContext query(int _p) throws RecognitionException { { _localctx = new CompositeQueryContext(new QueryContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_query); - setState(124); + setState(126); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(125); + setState(127); match(PIPE); - setState(126); + setState(128); processingCommand(); } } } - setState(131); + setState(133); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,0,_ctx); } @@ -411,43 +411,43 @@ public final SourceCommandContext sourceCommand() throws RecognitionException { SourceCommandContext _localctx = new SourceCommandContext(_ctx, getState()); enterRule(_localctx, 4, RULE_sourceCommand); try { - setState(138); + setState(140); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(132); + setState(134); explainCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(133); + setState(135); fromCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(134); + setState(136); rowCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(135); + setState(137); showCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(136); + setState(138); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(137); + setState(139); metricsCommand(); } break; @@ -532,108 +532,108 @@ public final ProcessingCommandContext processingCommand() throws RecognitionExce ProcessingCommandContext _localctx = new ProcessingCommandContext(_ctx, getState()); enterRule(_localctx, 6, RULE_processingCommand); try { - setState(156); + setState(158); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(140); + setState(142); evalCommand(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(141); + setState(143); whereCommand(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(142); + setState(144); keepCommand(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(143); + setState(145); limitCommand(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(144); + setState(146); statsCommand(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(145); + setState(147); sortCommand(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(146); + setState(148); dropCommand(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(147); + setState(149); renameCommand(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(148); + setState(150); dissectCommand(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(149); + setState(151); grokCommand(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(150); + setState(152); enrichCommand(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(151); + setState(153); mvExpandCommand(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(152); + setState(154); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(153); + setState(155); inlinestatsCommand(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(154); + setState(156); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(155); + setState(157); lookupCommand(); } break; @@ -682,9 +682,9 @@ public final WhereCommandContext whereCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(158); + setState(160); match(WHERE); - setState(159); + setState(161); booleanExpression(0); } } @@ -900,7 +900,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(191); + setState(193); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: @@ -909,9 +909,9 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(162); + setState(164); match(NOT); - setState(163); + setState(165); booleanExpression(8); } break; @@ -920,7 +920,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new BooleanDefaultContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(164); + setState(166); valueExpression(); } break; @@ -929,7 +929,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new RegexExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(165); + setState(167); regexBooleanExpression(); } break; @@ -938,41 +938,41 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalInContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(166); - valueExpression(); setState(168); + valueExpression(); + setState(170); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(167); + setState(169); match(NOT); } } - setState(170); + setState(172); match(IN); - setState(171); + setState(173); match(LP); - setState(172); + setState(174); valueExpression(); - setState(177); + setState(179); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(173); + setState(175); match(COMMA); - setState(174); + setState(176); valueExpression(); } } - setState(179); + setState(181); _errHandler.sync(this); _la = _input.LA(1); } - setState(180); + setState(182); match(RP); } break; @@ -981,21 +981,21 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new IsNullContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(182); + setState(184); valueExpression(); - setState(183); - match(IS); setState(185); + match(IS); + setState(187); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(184); + setState(186); match(NOT); } } - setState(187); + setState(189); match(NULL); } break; @@ -1004,15 +1004,15 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new MatchExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(189); + setState(191); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(190); + setState(192); matchBooleanExpression(); } break; } _ctx.stop = _input.LT(-1); - setState(201); + setState(203); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1020,7 +1020,7 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(199); + setState(201); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { case 1: @@ -1028,11 +1028,11 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(193); + setState(195); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(194); + setState(196); ((LogicalBinaryContext)_localctx).operator = match(AND); - setState(195); + setState(197); ((LogicalBinaryContext)_localctx).right = booleanExpression(6); } break; @@ -1041,18 +1041,18 @@ private BooleanExpressionContext booleanExpression(int _p) throws RecognitionExc _localctx = new LogicalBinaryContext(new BooleanExpressionContext(_parentctx, _parentState)); ((LogicalBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_booleanExpression); - setState(196); + setState(198); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(197); + setState(199); ((LogicalBinaryContext)_localctx).operator = match(OR); - setState(198); + setState(200); ((LogicalBinaryContext)_localctx).right = booleanExpression(5); } break; } } } - setState(203); + setState(205); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,8,_ctx); } @@ -1107,48 +1107,48 @@ public final RegexBooleanExpressionContext regexBooleanExpression() throws Recog enterRule(_localctx, 12, RULE_regexBooleanExpression); int _la; try { - setState(218); + setState(220); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(204); - valueExpression(); setState(206); + valueExpression(); + setState(208); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(205); + setState(207); match(NOT); } } - setState(208); + setState(210); ((RegexBooleanExpressionContext)_localctx).kind = match(LIKE); - setState(209); + setState(211); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(211); - valueExpression(); setState(213); + valueExpression(); + setState(215); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(212); + setState(214); match(NOT); } } - setState(215); + setState(217); ((RegexBooleanExpressionContext)_localctx).kind = match(RLIKE); - setState(216); + setState(218); ((RegexBooleanExpressionContext)_localctx).pattern = string(); } break; @@ -1201,11 +1201,11 @@ public final MatchBooleanExpressionContext matchBooleanExpression() throws Recog try { enterOuterAlt(_localctx, 1); { - setState(220); + setState(222); valueExpression(); - setState(221); + setState(223); match(DEV_MATCH); - setState(222); + setState(224); ((MatchBooleanExpressionContext)_localctx).queryString = string(); } } @@ -1289,14 +1289,14 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio ValueExpressionContext _localctx = new ValueExpressionContext(_ctx, getState()); enterRule(_localctx, 16, RULE_valueExpression); try { - setState(229); + setState(231); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: _localctx = new ValueExpressionDefaultContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(224); + setState(226); operatorExpression(0); } break; @@ -1304,11 +1304,11 @@ public final ValueExpressionContext valueExpression() throws RecognitionExceptio _localctx = new ComparisonContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(225); + setState(227); ((ComparisonContext)_localctx).left = operatorExpression(0); - setState(226); + setState(228); comparisonOperator(); - setState(227); + setState(229); ((ComparisonContext)_localctx).right = operatorExpression(0); } break; @@ -1433,7 +1433,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE int _alt; enterOuterAlt(_localctx, 1); { - setState(235); + setState(237); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: @@ -1442,7 +1442,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _ctx = _localctx; _prevctx = _localctx; - setState(232); + setState(234); primaryExpression(0); } break; @@ -1451,7 +1451,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(233); + setState(235); ((ArithmeticUnaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1462,13 +1462,13 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(234); + setState(236); operatorExpression(3); } break; } _ctx.stop = _input.LT(-1); - setState(245); + setState(247); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1476,7 +1476,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(243); + setState(245); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: @@ -1484,9 +1484,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(237); + setState(239); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(238); + setState(240); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8070450532247928832L) != 0)) ) { @@ -1497,7 +1497,7 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(239); + setState(241); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(3); } break; @@ -1506,9 +1506,9 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _localctx = new ArithmeticBinaryContext(new OperatorExpressionContext(_parentctx, _parentState)); ((ArithmeticBinaryContext)_localctx).left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_operatorExpression); - setState(240); + setState(242); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(241); + setState(243); ((ArithmeticBinaryContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { @@ -1519,14 +1519,14 @@ private OperatorExpressionContext operatorExpression(int _p) throws RecognitionE _errHandler.reportMatch(this); consume(); } - setState(242); + setState(244); ((ArithmeticBinaryContext)_localctx).right = operatorExpression(2); } break; } } } - setState(247); + setState(249); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,15,_ctx); } @@ -1684,7 +1684,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc int _alt; enterOuterAlt(_localctx, 1); { - setState(256); + setState(258); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1693,7 +1693,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _ctx = _localctx; _prevctx = _localctx; - setState(249); + setState(251); constant(); } break; @@ -1702,7 +1702,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new DereferenceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(250); + setState(252); qualifiedName(); } break; @@ -1711,7 +1711,7 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new FunctionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(251); + setState(253); functionExpression(); } break; @@ -1720,17 +1720,17 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc _localctx = new ParenthesizedExpressionContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(252); + setState(254); match(LP); - setState(253); + setState(255); booleanExpression(0); - setState(254); + setState(256); match(RP); } break; } _ctx.stop = _input.LT(-1); - setState(263); + setState(265); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1741,16 +1741,16 @@ private PrimaryExpressionContext primaryExpression(int _p) throws RecognitionExc { _localctx = new InlineCastContext(new PrimaryExpressionContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_primaryExpression); - setState(258); + setState(260); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(259); + setState(261); match(CAST_OP); - setState(260); + setState(262); dataType(); } } } - setState(265); + setState(267); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1812,37 +1812,37 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(266); + setState(268); functionName(); - setState(267); + setState(269); match(LP); - setState(277); + setState(279); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { case 1: { - setState(268); + setState(270); match(ASTERISK); } break; case 2: { { - setState(269); + setState(271); booleanExpression(0); - setState(274); + setState(276); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(270); + setState(272); match(COMMA); - setState(271); + setState(273); booleanExpression(0); } } - setState(276); + setState(278); _errHandler.sync(this); _la = _input.LA(1); } @@ -1850,7 +1850,7 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx } break; } - setState(279); + setState(281); match(RP); } } @@ -1868,8 +1868,8 @@ public final FunctionExpressionContext functionExpression() throws RecognitionEx @SuppressWarnings("CheckReturnValue") public static class FunctionNameContext extends ParserRuleContext { public TerminalNode DEV_MATCH() { return getToken(EsqlBaseParser.DEV_MATCH, 0); } - public IdentifierContext identifier() { - return getRuleContext(IdentifierContext.class,0); + public IdentifierOrParameterContext identifierOrParameter() { + return getRuleContext(IdentifierOrParameterContext.class,0); } @SuppressWarnings("this-escape") public FunctionNameContext(ParserRuleContext parent, int invokingState) { @@ -1895,23 +1895,23 @@ public final FunctionNameContext functionName() throws RecognitionException { FunctionNameContext _localctx = new FunctionNameContext(_ctx, getState()); enterRule(_localctx, 24, RULE_functionName); try { - setState(284); + setState(286); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(281); + setState(283); if (!(this.isDevVersion())) throw new FailedPredicateException(this, "this.isDevVersion()"); - setState(282); + setState(284); match(DEV_MATCH); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(283); - identifier(); + setState(285); + identifierOrParameter(); } break; } @@ -1970,7 +1970,7 @@ public final DataTypeContext dataType() throws RecognitionException { _localctx = new ToDataTypeContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(286); + setState(288); identifier(); } } @@ -2017,9 +2017,9 @@ public final RowCommandContext rowCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(288); + setState(290); match(ROW); - setState(289); + setState(291); fields(); } } @@ -2073,23 +2073,23 @@ public final FieldsContext fields() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(291); + setState(293); field(); - setState(296); + setState(298); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,21,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(292); + setState(294); match(COMMA); - setState(293); + setState(295); field(); } } } - setState(298); + setState(300); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,21,_ctx); } @@ -2139,24 +2139,24 @@ public final FieldContext field() throws RecognitionException { FieldContext _localctx = new FieldContext(_ctx, getState()); enterRule(_localctx, 32, RULE_field); try { - setState(304); + setState(306); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(299); + setState(301); booleanExpression(0); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(300); + setState(302); qualifiedName(); - setState(301); + setState(303); match(ASSIGN); - setState(302); + setState(304); booleanExpression(0); } break; @@ -2216,34 +2216,34 @@ public final FromCommandContext fromCommand() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(306); + setState(308); match(FROM); - setState(307); + setState(309); indexPattern(); - setState(312); + setState(314); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(308); + setState(310); match(COMMA); - setState(309); + setState(311); indexPattern(); } } } - setState(314); + setState(316); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } - setState(316); + setState(318); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: { - setState(315); + setState(317); metadata(); } break; @@ -2294,24 +2294,24 @@ public final IndexPatternContext indexPattern() throws RecognitionException { IndexPatternContext _localctx = new IndexPatternContext(_ctx, getState()); enterRule(_localctx, 36, RULE_indexPattern); try { - setState(323); + setState(325); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(318); + setState(320); clusterString(); - setState(319); + setState(321); match(COLON); - setState(320); + setState(322); indexString(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(322); + setState(324); indexString(); } break; @@ -2357,7 +2357,7 @@ public final ClusterStringContext clusterString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(325); + setState(327); match(UNQUOTED_SOURCE); } } @@ -2403,7 +2403,7 @@ public final IndexStringContext indexString() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(327); + setState(329); _la = _input.LA(1); if ( !(_la==QUOTED_STRING || _la==UNQUOTED_SOURCE) ) { _errHandler.recoverInline(this); @@ -2458,20 +2458,20 @@ public final MetadataContext metadata() throws RecognitionException { MetadataContext _localctx = new MetadataContext(_ctx, getState()); enterRule(_localctx, 42, RULE_metadata); try { - setState(331); + setState(333); _errHandler.sync(this); switch (_input.LA(1)) { case METADATA: enterOuterAlt(_localctx, 1); { - setState(329); + setState(331); metadataOption(); } break; case OPENING_BRACKET: enterOuterAlt(_localctx, 2); { - setState(330); + setState(332); deprecated_metadata(); } break; @@ -2528,25 +2528,25 @@ public final MetadataOptionContext metadataOption() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(333); + setState(335); match(METADATA); - setState(334); + setState(336); match(UNQUOTED_SOURCE); - setState(339); + setState(341); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,27,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(335); + setState(337); match(COMMA); - setState(336); + setState(338); match(UNQUOTED_SOURCE); } } } - setState(341); + setState(343); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,27,_ctx); } @@ -2595,11 +2595,11 @@ public final Deprecated_metadataContext deprecated_metadata() throws Recognition try { enterOuterAlt(_localctx, 1); { - setState(342); + setState(344); match(OPENING_BRACKET); - setState(343); + setState(345); metadataOption(); - setState(344); + setState(346); match(CLOSING_BRACKET); } } @@ -2663,46 +2663,46 @@ public final MetricsCommandContext metricsCommand() throws RecognitionException int _alt; enterOuterAlt(_localctx, 1); { - setState(346); + setState(348); match(DEV_METRICS); - setState(347); + setState(349); indexPattern(); - setState(352); + setState(354); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(348); + setState(350); match(COMMA); - setState(349); + setState(351); indexPattern(); } } } - setState(354); + setState(356); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } - setState(356); + setState(358); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: { - setState(355); + setState(357); ((MetricsCommandContext)_localctx).aggregates = fields(); } break; } - setState(360); + setState(362); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { - setState(358); + setState(360); match(BY); - setState(359); + setState(361); ((MetricsCommandContext)_localctx).grouping = fields(); } break; @@ -2752,9 +2752,9 @@ public final EvalCommandContext evalCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(362); + setState(364); match(EVAL); - setState(363); + setState(365); fields(); } } @@ -2807,26 +2807,26 @@ public final StatsCommandContext statsCommand() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(365); - match(STATS); setState(367); + match(STATS); + setState(369); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(366); + setState(368); ((StatsCommandContext)_localctx).stats = fields(); } break; } - setState(371); + setState(373); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(369); + setState(371); match(BY); - setState(370); + setState(372); ((StatsCommandContext)_localctx).grouping = fields(); } break; @@ -2846,11 +2846,11 @@ public final StatsCommandContext statsCommand() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class QualifiedNameContext extends ParserRuleContext { - public List identifier() { - return getRuleContexts(IdentifierContext.class); + public List identifierOrParameter() { + return getRuleContexts(IdentifierOrParameterContext.class); } - public IdentifierContext identifier(int i) { - return getRuleContext(IdentifierContext.class,i); + public IdentifierOrParameterContext identifierOrParameter(int i) { + return getRuleContext(IdentifierOrParameterContext.class,i); } public List DOT() { return getTokens(EsqlBaseParser.DOT); } public TerminalNode DOT(int i) { @@ -2883,23 +2883,23 @@ public final QualifiedNameContext qualifiedName() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(373); - identifier(); - setState(378); + setState(375); + identifierOrParameter(); + setState(380); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(374); + setState(376); match(DOT); - setState(375); - identifier(); + setState(377); + identifierOrParameter(); } } } - setState(380); + setState(382); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } @@ -2955,23 +2955,23 @@ public final QualifiedNamePatternContext qualifiedNamePattern() throws Recogniti int _alt; enterOuterAlt(_localctx, 1); { - setState(381); + setState(383); identifierPattern(); - setState(386); + setState(388); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(382); + setState(384); match(DOT); - setState(383); + setState(385); identifierPattern(); } } } - setState(388); + setState(390); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } @@ -3027,23 +3027,23 @@ public final QualifiedNamePatternsContext qualifiedNamePatterns() throws Recogni int _alt; enterOuterAlt(_localctx, 1); { - setState(389); + setState(391); qualifiedNamePattern(); - setState(394); + setState(396); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(390); + setState(392); match(COMMA); - setState(391); + setState(393); qualifiedNamePattern(); } } } - setState(396); + setState(398); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } @@ -3091,7 +3091,7 @@ public final IdentifierContext identifier() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(397); + setState(399); _la = _input.LA(1); if ( !(_la==UNQUOTED_IDENTIFIER || _la==QUOTED_IDENTIFIER) ) { _errHandler.recoverInline(this); @@ -3117,6 +3117,9 @@ public final IdentifierContext identifier() throws RecognitionException { @SuppressWarnings("CheckReturnValue") public static class IdentifierPatternContext extends ParserRuleContext { public TerminalNode ID_PATTERN() { return getToken(EsqlBaseParser.ID_PATTERN, 0); } + public ParameterContext parameter() { + return getRuleContext(ParameterContext.class,0); + } @SuppressWarnings("this-escape") public IdentifierPatternContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); @@ -3141,10 +3144,26 @@ public final IdentifierPatternContext identifierPattern() throws RecognitionExce IdentifierPatternContext _localctx = new IdentifierPatternContext(_ctx, getState()); enterRule(_localctx, 62, RULE_identifierPattern); try { - enterOuterAlt(_localctx, 1); - { - setState(399); - match(ID_PATTERN); + setState(403); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ID_PATTERN: + enterOuterAlt(_localctx, 1); + { + setState(401); + match(ID_PATTERN); + } + break; + case PARAM: + case NAMED_OR_POSITIONAL_PARAM: + enterOuterAlt(_localctx, 2); + { + setState(402); + parameter(); + } + break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -3295,6 +3314,27 @@ public T accept(ParseTreeVisitor visitor) { } } @SuppressWarnings("CheckReturnValue") + public static class InputParameterContext extends ConstantContext { + public ParameterContext parameter() { + return getRuleContext(ParameterContext.class,0); + } + @SuppressWarnings("this-escape") + public InputParameterContext(ConstantContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInputParameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitInputParameter(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitInputParameter(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") public static class StringLiteralContext extends ConstantContext { public StringContext string() { return getRuleContext(StringContext.class,0); @@ -3346,27 +3386,6 @@ public T accept(ParseTreeVisitor visitor) { } } @SuppressWarnings("CheckReturnValue") - public static class InputParamsContext extends ConstantContext { - public ParamsContext params() { - return getRuleContext(ParamsContext.class,0); - } - @SuppressWarnings("this-escape") - public InputParamsContext(ConstantContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInputParams(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitInputParams(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitInputParams(this); - else return visitor.visitChildren(this); - } - } - @SuppressWarnings("CheckReturnValue") public static class IntegerLiteralContext extends ConstantContext { public IntegerValueContext integerValue() { return getRuleContext(IntegerValueContext.class,0); @@ -3414,14 +3433,14 @@ public final ConstantContext constant() throws RecognitionException { enterRule(_localctx, 64, RULE_constant); int _la; try { - setState(443); + setState(447); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { case 1: _localctx = new NullLiteralContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(401); + setState(405); match(NULL); } break; @@ -3429,9 +3448,9 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new QualifiedIntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(402); + setState(406); integerValue(); - setState(403); + setState(407); match(UNQUOTED_IDENTIFIER); } break; @@ -3439,7 +3458,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new DecimalLiteralContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(405); + setState(409); decimalValue(); } break; @@ -3447,7 +3466,7 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new IntegerLiteralContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(406); + setState(410); integerValue(); } break; @@ -3455,23 +3474,23 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanLiteralContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(407); + setState(411); booleanValue(); } break; case 6: - _localctx = new InputParamsContext(_localctx); + _localctx = new InputParameterContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(408); - params(); + setState(412); + parameter(); } break; case 7: _localctx = new StringLiteralContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(409); + setState(413); string(); } break; @@ -3479,27 +3498,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new NumericArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(410); + setState(414); match(OPENING_BRACKET); - setState(411); + setState(415); numericValue(); - setState(416); + setState(420); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(412); + setState(416); match(COMMA); - setState(413); + setState(417); numericValue(); } } - setState(418); + setState(422); _errHandler.sync(this); _la = _input.LA(1); } - setState(419); + setState(423); match(CLOSING_BRACKET); } break; @@ -3507,27 +3526,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new BooleanArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(421); + setState(425); match(OPENING_BRACKET); - setState(422); + setState(426); booleanValue(); - setState(427); + setState(431); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(423); + setState(427); match(COMMA); - setState(424); + setState(428); booleanValue(); } } - setState(429); + setState(433); _errHandler.sync(this); _la = _input.LA(1); } - setState(430); + setState(434); match(CLOSING_BRACKET); } break; @@ -3535,27 +3554,27 @@ public final ConstantContext constant() throws RecognitionException { _localctx = new StringArrayLiteralContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(432); + setState(436); match(OPENING_BRACKET); - setState(433); + setState(437); string(); - setState(438); + setState(442); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(434); + setState(438); match(COMMA); - setState(435); + setState(439); string(); } } - setState(440); + setState(444); _errHandler.sync(this); _la = _input.LA(1); } - setState(441); + setState(445); match(CLOSING_BRACKET); } break; @@ -3573,24 +3592,24 @@ public final ConstantContext constant() throws RecognitionException { } @SuppressWarnings("CheckReturnValue") - public static class ParamsContext extends ParserRuleContext { + public static class ParameterContext extends ParserRuleContext { @SuppressWarnings("this-escape") - public ParamsContext(ParserRuleContext parent, int invokingState) { + public ParameterContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } - @Override public int getRuleIndex() { return RULE_params; } + @Override public int getRuleIndex() { return RULE_parameter; } @SuppressWarnings("this-escape") - public ParamsContext() { } - public void copyFrom(ParamsContext ctx) { + public ParameterContext() { } + public void copyFrom(ParameterContext ctx) { super.copyFrom(ctx); } } @SuppressWarnings("CheckReturnValue") - public static class InputNamedOrPositionalParamContext extends ParamsContext { + public static class InputNamedOrPositionalParamContext extends ParameterContext { public TerminalNode NAMED_OR_POSITIONAL_PARAM() { return getToken(EsqlBaseParser.NAMED_OR_POSITIONAL_PARAM, 0); } @SuppressWarnings("this-escape") - public InputNamedOrPositionalParamContext(ParamsContext ctx) { copyFrom(ctx); } + public InputNamedOrPositionalParamContext(ParameterContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInputNamedOrPositionalParam(this); @@ -3606,10 +3625,10 @@ public T accept(ParseTreeVisitor visitor) { } } @SuppressWarnings("CheckReturnValue") - public static class InputParamContext extends ParamsContext { + public static class InputParamContext extends ParameterContext { public TerminalNode PARAM() { return getToken(EsqlBaseParser.PARAM, 0); } @SuppressWarnings("this-escape") - public InputParamContext(ParamsContext ctx) { copyFrom(ctx); } + public InputParamContext(ParameterContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterInputParam(this); @@ -3625,18 +3644,18 @@ public T accept(ParseTreeVisitor visitor) { } } - public final ParamsContext params() throws RecognitionException { - ParamsContext _localctx = new ParamsContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_params); + public final ParameterContext parameter() throws RecognitionException { + ParameterContext _localctx = new ParameterContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_parameter); try { - setState(447); + setState(451); _errHandler.sync(this); switch (_input.LA(1)) { case PARAM: _localctx = new InputParamContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(445); + setState(449); match(PARAM); } break; @@ -3644,7 +3663,7 @@ public final ParamsContext params() throws RecognitionException { _localctx = new InputNamedOrPositionalParamContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(446); + setState(450); match(NAMED_OR_POSITIONAL_PARAM); } break; @@ -3663,6 +3682,72 @@ public final ParamsContext params() throws RecognitionException { return _localctx; } + @SuppressWarnings("CheckReturnValue") + public static class IdentifierOrParameterContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public ParameterContext parameter() { + return getRuleContext(ParameterContext.class,0); + } + @SuppressWarnings("this-escape") + public IdentifierOrParameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifierOrParameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).enterIdentifierOrParameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof EsqlBaseParserListener ) ((EsqlBaseParserListener)listener).exitIdentifierOrParameter(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof EsqlBaseParserVisitor ) return ((EsqlBaseParserVisitor)visitor).visitIdentifierOrParameter(this); + else return visitor.visitChildren(this); + } + } + + public final IdentifierOrParameterContext identifierOrParameter() throws RecognitionException { + IdentifierOrParameterContext _localctx = new IdentifierOrParameterContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_identifierOrParameter); + try { + setState(455); + _errHandler.sync(this); + switch (_input.LA(1)) { + case UNQUOTED_IDENTIFIER: + case QUOTED_IDENTIFIER: + enterOuterAlt(_localctx, 1); + { + setState(453); + identifier(); + } + break; + case PARAM: + case NAMED_OR_POSITIONAL_PARAM: + enterOuterAlt(_localctx, 2); + { + setState(454); + parameter(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") public static class LimitCommandContext extends ParserRuleContext { public TerminalNode LIMIT() { return getToken(EsqlBaseParser.LIMIT, 0); } @@ -3689,13 +3774,13 @@ public T accept(ParseTreeVisitor visitor) { public final LimitCommandContext limitCommand() throws RecognitionException { LimitCommandContext _localctx = new LimitCommandContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_limitCommand); + enterRule(_localctx, 70, RULE_limitCommand); try { enterOuterAlt(_localctx, 1); { - setState(449); + setState(457); match(LIMIT); - setState(450); + setState(458); match(INTEGER_LITERAL); } } @@ -3745,32 +3830,32 @@ public T accept(ParseTreeVisitor visitor) { public final SortCommandContext sortCommand() throws RecognitionException { SortCommandContext _localctx = new SortCommandContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_sortCommand); + enterRule(_localctx, 72, RULE_sortCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(452); + setState(460); match(SORT); - setState(453); + setState(461); orderExpression(); - setState(458); + setState(466); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(454); + setState(462); match(COMMA); - setState(455); + setState(463); orderExpression(); } } } - setState(460); + setState(468); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,41,_ctx); + _alt = getInterpreter().adaptivePredict(_input,43,_ctx); } } } @@ -3819,19 +3904,19 @@ public T accept(ParseTreeVisitor visitor) { public final OrderExpressionContext orderExpression() throws RecognitionException { OrderExpressionContext _localctx = new OrderExpressionContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_orderExpression); + enterRule(_localctx, 74, RULE_orderExpression); int _la; try { enterOuterAlt(_localctx, 1); { - setState(461); + setState(469); booleanExpression(0); - setState(463); + setState(471); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,44,_ctx) ) { case 1: { - setState(462); + setState(470); ((OrderExpressionContext)_localctx).ordering = _input.LT(1); _la = _input.LA(1); if ( !(_la==ASC || _la==DESC) ) { @@ -3845,14 +3930,14 @@ public final OrderExpressionContext orderExpression() throws RecognitionExceptio } break; } - setState(467); + setState(475); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(465); + setState(473); match(NULLS); - setState(466); + setState(474); ((OrderExpressionContext)_localctx).nullOrdering = _input.LT(1); _la = _input.LA(1); if ( !(_la==FIRST || _la==LAST) ) { @@ -3907,13 +3992,13 @@ public T accept(ParseTreeVisitor visitor) { public final KeepCommandContext keepCommand() throws RecognitionException { KeepCommandContext _localctx = new KeepCommandContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_keepCommand); + enterRule(_localctx, 76, RULE_keepCommand); try { enterOuterAlt(_localctx, 1); { - setState(469); + setState(477); match(KEEP); - setState(470); + setState(478); qualifiedNamePatterns(); } } @@ -3956,13 +4041,13 @@ public T accept(ParseTreeVisitor visitor) { public final DropCommandContext dropCommand() throws RecognitionException { DropCommandContext _localctx = new DropCommandContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_dropCommand); + enterRule(_localctx, 78, RULE_dropCommand); try { enterOuterAlt(_localctx, 1); { - setState(472); + setState(480); match(DROP); - setState(473); + setState(481); qualifiedNamePatterns(); } } @@ -4012,32 +4097,32 @@ public T accept(ParseTreeVisitor visitor) { public final RenameCommandContext renameCommand() throws RecognitionException { RenameCommandContext _localctx = new RenameCommandContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_renameCommand); + enterRule(_localctx, 80, RULE_renameCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(475); + setState(483); match(RENAME); - setState(476); + setState(484); renameClause(); - setState(481); + setState(489); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(477); + setState(485); match(COMMA); - setState(478); + setState(486); renameClause(); } } } - setState(483); + setState(491); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } } } @@ -4085,15 +4170,15 @@ public T accept(ParseTreeVisitor visitor) { public final RenameClauseContext renameClause() throws RecognitionException { RenameClauseContext _localctx = new RenameClauseContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_renameClause); + enterRule(_localctx, 82, RULE_renameClause); try { enterOuterAlt(_localctx, 1); { - setState(484); + setState(492); ((RenameClauseContext)_localctx).oldName = qualifiedNamePattern(); - setState(485); + setState(493); match(AS); - setState(486); + setState(494); ((RenameClauseContext)_localctx).newName = qualifiedNamePattern(); } } @@ -4142,22 +4227,22 @@ public T accept(ParseTreeVisitor visitor) { public final DissectCommandContext dissectCommand() throws RecognitionException { DissectCommandContext _localctx = new DissectCommandContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_dissectCommand); + enterRule(_localctx, 84, RULE_dissectCommand); try { enterOuterAlt(_localctx, 1); { - setState(488); + setState(496); match(DISSECT); - setState(489); + setState(497); primaryExpression(0); - setState(490); + setState(498); string(); - setState(492); + setState(500); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(491); + setState(499); commandOptions(); } break; @@ -4206,15 +4291,15 @@ public T accept(ParseTreeVisitor visitor) { public final GrokCommandContext grokCommand() throws RecognitionException { GrokCommandContext _localctx = new GrokCommandContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_grokCommand); + enterRule(_localctx, 86, RULE_grokCommand); try { enterOuterAlt(_localctx, 1); { - setState(494); + setState(502); match(GROK); - setState(495); + setState(503); primaryExpression(0); - setState(496); + setState(504); string(); } } @@ -4257,13 +4342,13 @@ public T accept(ParseTreeVisitor visitor) { public final MvExpandCommandContext mvExpandCommand() throws RecognitionException { MvExpandCommandContext _localctx = new MvExpandCommandContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_mvExpandCommand); + enterRule(_localctx, 88, RULE_mvExpandCommand); try { enterOuterAlt(_localctx, 1); { - setState(498); + setState(506); match(MV_EXPAND); - setState(499); + setState(507); qualifiedName(); } } @@ -4312,30 +4397,30 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionsContext commandOptions() throws RecognitionException { CommandOptionsContext _localctx = new CommandOptionsContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_commandOptions); + enterRule(_localctx, 90, RULE_commandOptions); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(501); + setState(509); commandOption(); - setState(506); + setState(514); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(502); + setState(510); match(COMMA); - setState(503); + setState(511); commandOption(); } } } - setState(508); + setState(516); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,46,_ctx); + _alt = getInterpreter().adaptivePredict(_input,48,_ctx); } } } @@ -4381,15 +4466,15 @@ public T accept(ParseTreeVisitor visitor) { public final CommandOptionContext commandOption() throws RecognitionException { CommandOptionContext _localctx = new CommandOptionContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_commandOption); + enterRule(_localctx, 92, RULE_commandOption); try { enterOuterAlt(_localctx, 1); { - setState(509); + setState(517); identifier(); - setState(510); + setState(518); match(ASSIGN); - setState(511); + setState(519); constant(); } } @@ -4430,12 +4515,12 @@ public T accept(ParseTreeVisitor visitor) { public final BooleanValueContext booleanValue() throws RecognitionException { BooleanValueContext _localctx = new BooleanValueContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_booleanValue); + enterRule(_localctx, 94, RULE_booleanValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(513); + setState(521); _la = _input.LA(1); if ( !(_la==FALSE || _la==TRUE) ) { _errHandler.recoverInline(this); @@ -4488,22 +4573,22 @@ public T accept(ParseTreeVisitor visitor) { public final NumericValueContext numericValue() throws RecognitionException { NumericValueContext _localctx = new NumericValueContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_numericValue); + enterRule(_localctx, 96, RULE_numericValue); try { - setState(517); + setState(525); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(515); + setState(523); decimalValue(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(516); + setState(524); integerValue(); } break; @@ -4547,17 +4632,17 @@ public T accept(ParseTreeVisitor visitor) { public final DecimalValueContext decimalValue() throws RecognitionException { DecimalValueContext _localctx = new DecimalValueContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_decimalValue); + enterRule(_localctx, 98, RULE_decimalValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(520); + setState(528); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(519); + setState(527); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4570,7 +4655,7 @@ public final DecimalValueContext decimalValue() throws RecognitionException { } } - setState(522); + setState(530); match(DECIMAL_LITERAL); } } @@ -4612,17 +4697,17 @@ public T accept(ParseTreeVisitor visitor) { public final IntegerValueContext integerValue() throws RecognitionException { IntegerValueContext _localctx = new IntegerValueContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_integerValue); + enterRule(_localctx, 100, RULE_integerValue); int _la; try { enterOuterAlt(_localctx, 1); { - setState(525); + setState(533); _errHandler.sync(this); _la = _input.LA(1); if (_la==PLUS || _la==MINUS) { { - setState(524); + setState(532); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4635,7 +4720,7 @@ public final IntegerValueContext integerValue() throws RecognitionException { } } - setState(527); + setState(535); match(INTEGER_LITERAL); } } @@ -4675,11 +4760,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringContext string() throws RecognitionException { StringContext _localctx = new StringContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_string); + enterRule(_localctx, 102, RULE_string); try { enterOuterAlt(_localctx, 1); { - setState(529); + setState(537); match(QUOTED_STRING); } } @@ -4724,12 +4809,12 @@ public T accept(ParseTreeVisitor visitor) { public final ComparisonOperatorContext comparisonOperator() throws RecognitionException { ComparisonOperatorContext _localctx = new ComparisonOperatorContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_comparisonOperator); + enterRule(_localctx, 104, RULE_comparisonOperator); int _la; try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(539); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 281474976710656000L) != 0)) ) { _errHandler.recoverInline(this); @@ -4780,13 +4865,13 @@ public T accept(ParseTreeVisitor visitor) { public final ExplainCommandContext explainCommand() throws RecognitionException { ExplainCommandContext _localctx = new ExplainCommandContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_explainCommand); + enterRule(_localctx, 106, RULE_explainCommand); try { enterOuterAlt(_localctx, 1); { - setState(533); + setState(541); match(EXPLAIN); - setState(534); + setState(542); subqueryExpression(); } } @@ -4830,15 +4915,15 @@ public T accept(ParseTreeVisitor visitor) { public final SubqueryExpressionContext subqueryExpression() throws RecognitionException { SubqueryExpressionContext _localctx = new SubqueryExpressionContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_subqueryExpression); + enterRule(_localctx, 108, RULE_subqueryExpression); try { enterOuterAlt(_localctx, 1); { - setState(536); + setState(544); match(OPENING_BRACKET); - setState(537); + setState(545); query(0); - setState(538); + setState(546); match(CLOSING_BRACKET); } } @@ -4890,14 +4975,14 @@ public T accept(ParseTreeVisitor visitor) { public final ShowCommandContext showCommand() throws RecognitionException { ShowCommandContext _localctx = new ShowCommandContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_showCommand); + enterRule(_localctx, 110, RULE_showCommand); try { _localctx = new ShowInfoContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(540); + setState(548); match(SHOW); - setState(541); + setState(549); match(INFO); } } @@ -4955,53 +5040,53 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichCommandContext enrichCommand() throws RecognitionException { EnrichCommandContext _localctx = new EnrichCommandContext(_ctx, getState()); - enterRule(_localctx, 110, RULE_enrichCommand); + enterRule(_localctx, 112, RULE_enrichCommand); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(543); + setState(551); match(ENRICH); - setState(544); + setState(552); ((EnrichCommandContext)_localctx).policyName = match(ENRICH_POLICY_NAME); - setState(547); + setState(555); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { case 1: { - setState(545); + setState(553); match(ON); - setState(546); + setState(554); ((EnrichCommandContext)_localctx).matchField = qualifiedNamePattern(); } break; } - setState(558); + setState(566); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(549); + setState(557); match(WITH); - setState(550); + setState(558); enrichWithClause(); - setState(555); + setState(563); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(551); + setState(559); match(COMMA); - setState(552); + setState(560); enrichWithClause(); } } } - setState(557); + setState(565); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + _alt = getInterpreter().adaptivePredict(_input,53,_ctx); } } break; @@ -5052,23 +5137,23 @@ public T accept(ParseTreeVisitor visitor) { public final EnrichWithClauseContext enrichWithClause() throws RecognitionException { EnrichWithClauseContext _localctx = new EnrichWithClauseContext(_ctx, getState()); - enterRule(_localctx, 112, RULE_enrichWithClause); + enterRule(_localctx, 114, RULE_enrichWithClause); try { enterOuterAlt(_localctx, 1); { - setState(563); + setState(571); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { case 1: { - setState(560); + setState(568); ((EnrichWithClauseContext)_localctx).newName = qualifiedNamePattern(); - setState(561); + setState(569); match(ASSIGN); } break; } - setState(565); + setState(573); ((EnrichWithClauseContext)_localctx).enrichField = qualifiedNamePattern(); } } @@ -5117,17 +5202,17 @@ public T accept(ParseTreeVisitor visitor) { public final LookupCommandContext lookupCommand() throws RecognitionException { LookupCommandContext _localctx = new LookupCommandContext(_ctx, getState()); - enterRule(_localctx, 114, RULE_lookupCommand); + enterRule(_localctx, 116, RULE_lookupCommand); try { enterOuterAlt(_localctx, 1); { - setState(567); + setState(575); match(DEV_LOOKUP); - setState(568); + setState(576); ((LookupCommandContext)_localctx).tableName = indexPattern(); - setState(569); + setState(577); match(ON); - setState(570); + setState(578); ((LookupCommandContext)_localctx).matchFields = qualifiedNamePatterns(); } } @@ -5176,22 +5261,22 @@ public T accept(ParseTreeVisitor visitor) { public final InlinestatsCommandContext inlinestatsCommand() throws RecognitionException { InlinestatsCommandContext _localctx = new InlinestatsCommandContext(_ctx, getState()); - enterRule(_localctx, 116, RULE_inlinestatsCommand); + enterRule(_localctx, 118, RULE_inlinestatsCommand); try { enterOuterAlt(_localctx, 1); { - setState(572); + setState(580); match(DEV_INLINESTATS); - setState(573); + setState(581); ((InlinestatsCommandContext)_localctx).stats = fields(); - setState(576); + setState(584); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: { - setState(574); + setState(582); match(BY); - setState(575); + setState(583); ((InlinestatsCommandContext)_localctx).grouping = fields(); } break; @@ -5287,7 +5372,7 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde } public static final String _serializedATN = - "\u0004\u0001x\u0243\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001x\u024b\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -5302,357 +5387,361 @@ private boolean functionName_sempred(FunctionNameContext _localctx, int predInde "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ - "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0001\u0000\u0001\u0000"+ - "\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ - "\u0001\u0001\u0005\u0001\u0080\b\u0001\n\u0001\f\u0001\u0083\t\u0001\u0001"+ - "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003"+ - "\u0002\u008b\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ - "\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003"+ - "\u0003\u009d\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ - "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ - "\u0005\u00a9\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ - "\u0005\u0005\u0005\u00b0\b\u0005\n\u0005\f\u0005\u00b3\t\u0005\u0001\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00ba\b\u0005"+ - "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u00c0\b\u0005"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0005\u0001\u0082\b\u0001\n\u0001\f\u0001"+ + "\u0085\t\u0001\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0001\u0002\u0003\u0002\u008d\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0003\u0003\u009f\b\u0003\u0001\u0004\u0001\u0004\u0001\u0004"+ "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ - "\u0005\u0005\u00c8\b\u0005\n\u0005\f\u0005\u00cb\t\u0005\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u00cf\b\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0001\u0006\u0003\u0006\u00d6\b\u0006\u0001\u0006\u0001\u0006\u0001"+ - "\u0006\u0003\u0006\u00db\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ - "\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003\b\u00e6\b\b\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0003\t\u00ec\b\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\t\u0001\t\u0001\t\u0005\t\u00f4\b\t\n\t\f\t\u00f7\t\t\u0001\n\u0001\n"+ - "\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003\n\u0101\b\n\u0001"+ - "\n\u0001\n\u0001\n\u0005\n\u0106\b\n\n\n\f\n\u0109\t\n\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u0111"+ - "\b\u000b\n\u000b\f\u000b\u0114\t\u000b\u0003\u000b\u0116\b\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0003\f\u011d\b\f\u0001\r\u0001"+ - "\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0005\u000f\u0127\b\u000f\n\u000f\f\u000f\u012a\t\u000f\u0001\u0010\u0001"+ - "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0131\b\u0010\u0001"+ - "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011\u0137\b\u0011\n"+ - "\u0011\f\u0011\u013a\t\u0011\u0001\u0011\u0003\u0011\u013d\b\u0011\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003\u0012\u0144"+ - "\b\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0015\u0001"+ - "\u0015\u0003\u0015\u014c\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ - "\u0016\u0005\u0016\u0152\b\u0016\n\u0016\f\u0016\u0155\t\u0016\u0001\u0017"+ - "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0005\u0018\u015f\b\u0018\n\u0018\f\u0018\u0162\t\u0018\u0001"+ - "\u0018\u0003\u0018\u0165\b\u0018\u0001\u0018\u0001\u0018\u0003\u0018\u0169"+ - "\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0003"+ - "\u001a\u0170\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u0174\b\u001a"+ - "\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u0179\b\u001b\n\u001b"+ - "\f\u001b\u017c\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c"+ - "\u0181\b\u001c\n\u001c\f\u001c\u0184\t\u001c\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0005\u001d\u0189\b\u001d\n\u001d\f\u001d\u018c\t\u001d\u0001\u001e"+ - "\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 \u0001 \u0001"+ - " \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u019f"+ - "\b \n \f \u01a2\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01aa"+ - "\b \n \f \u01ad\t \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0005 \u01b5"+ - "\b \n \f \u01b8\t \u0001 \u0001 \u0003 \u01bc\b \u0001!\u0001!\u0003!"+ - "\u01c0\b!\u0001\"\u0001\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0005#\u01c9"+ - "\b#\n#\f#\u01cc\t#\u0001$\u0001$\u0003$\u01d0\b$\u0001$\u0001$\u0003$"+ - "\u01d4\b$\u0001%\u0001%\u0001%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001"+ - "\'\u0001\'\u0005\'\u01e0\b\'\n\'\f\'\u01e3\t\'\u0001(\u0001(\u0001(\u0001"+ - "(\u0001)\u0001)\u0001)\u0001)\u0003)\u01ed\b)\u0001*\u0001*\u0001*\u0001"+ - "*\u0001+\u0001+\u0001+\u0001,\u0001,\u0001,\u0005,\u01f9\b,\n,\f,\u01fc"+ - "\t,\u0001-\u0001-\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u0003/\u0206"+ - "\b/\u00010\u00030\u0209\b0\u00010\u00010\u00011\u00031\u020e\b1\u0001"+ - "1\u00011\u00012\u00012\u00013\u00013\u00014\u00014\u00014\u00015\u0001"+ - "5\u00015\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0003"+ - "7\u0224\b7\u00017\u00017\u00017\u00017\u00057\u022a\b7\n7\f7\u022d\t7"+ - "\u00037\u022f\b7\u00018\u00018\u00018\u00038\u0234\b8\u00018\u00018\u0001"+ - "9\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0003:\u0241"+ - "\b:\u0001:\u0000\u0004\u0002\n\u0012\u0014;\u0000\u0002\u0004\u0006\b"+ - "\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02"+ - "468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprt\u0000\b\u0001\u0000:;\u0001\u0000<"+ - ">\u0002\u0000\u0019\u0019LL\u0001\u0000CD\u0002\u0000\u001e\u001e\"\""+ - "\u0002\u0000%%((\u0002\u0000$$22\u0002\u00003359\u025c\u0000v\u0001\u0000"+ - "\u0000\u0000\u0002y\u0001\u0000\u0000\u0000\u0004\u008a\u0001\u0000\u0000"+ - "\u0000\u0006\u009c\u0001\u0000\u0000\u0000\b\u009e\u0001\u0000\u0000\u0000"+ - "\n\u00bf\u0001\u0000\u0000\u0000\f\u00da\u0001\u0000\u0000\u0000\u000e"+ - "\u00dc\u0001\u0000\u0000\u0000\u0010\u00e5\u0001\u0000\u0000\u0000\u0012"+ - "\u00eb\u0001\u0000\u0000\u0000\u0014\u0100\u0001\u0000\u0000\u0000\u0016"+ - "\u010a\u0001\u0000\u0000\u0000\u0018\u011c\u0001\u0000\u0000\u0000\u001a"+ - "\u011e\u0001\u0000\u0000\u0000\u001c\u0120\u0001\u0000\u0000\u0000\u001e"+ - "\u0123\u0001\u0000\u0000\u0000 \u0130\u0001\u0000\u0000\u0000\"\u0132"+ - "\u0001\u0000\u0000\u0000$\u0143\u0001\u0000\u0000\u0000&\u0145\u0001\u0000"+ - "\u0000\u0000(\u0147\u0001\u0000\u0000\u0000*\u014b\u0001\u0000\u0000\u0000"+ - ",\u014d\u0001\u0000\u0000\u0000.\u0156\u0001\u0000\u0000\u00000\u015a"+ - "\u0001\u0000\u0000\u00002\u016a\u0001\u0000\u0000\u00004\u016d\u0001\u0000"+ - "\u0000\u00006\u0175\u0001\u0000\u0000\u00008\u017d\u0001\u0000\u0000\u0000"+ - ":\u0185\u0001\u0000\u0000\u0000<\u018d\u0001\u0000\u0000\u0000>\u018f"+ - "\u0001\u0000\u0000\u0000@\u01bb\u0001\u0000\u0000\u0000B\u01bf\u0001\u0000"+ - "\u0000\u0000D\u01c1\u0001\u0000\u0000\u0000F\u01c4\u0001\u0000\u0000\u0000"+ - "H\u01cd\u0001\u0000\u0000\u0000J\u01d5\u0001\u0000\u0000\u0000L\u01d8"+ - "\u0001\u0000\u0000\u0000N\u01db\u0001\u0000\u0000\u0000P\u01e4\u0001\u0000"+ - "\u0000\u0000R\u01e8\u0001\u0000\u0000\u0000T\u01ee\u0001\u0000\u0000\u0000"+ - "V\u01f2\u0001\u0000\u0000\u0000X\u01f5\u0001\u0000\u0000\u0000Z\u01fd"+ - "\u0001\u0000\u0000\u0000\\\u0201\u0001\u0000\u0000\u0000^\u0205\u0001"+ - "\u0000\u0000\u0000`\u0208\u0001\u0000\u0000\u0000b\u020d\u0001\u0000\u0000"+ - "\u0000d\u0211\u0001\u0000\u0000\u0000f\u0213\u0001\u0000\u0000\u0000h"+ - "\u0215\u0001\u0000\u0000\u0000j\u0218\u0001\u0000\u0000\u0000l\u021c\u0001"+ - "\u0000\u0000\u0000n\u021f\u0001\u0000\u0000\u0000p\u0233\u0001\u0000\u0000"+ - "\u0000r\u0237\u0001\u0000\u0000\u0000t\u023c\u0001\u0000\u0000\u0000v"+ - "w\u0003\u0002\u0001\u0000wx\u0005\u0000\u0000\u0001x\u0001\u0001\u0000"+ - "\u0000\u0000yz\u0006\u0001\uffff\uffff\u0000z{\u0003\u0004\u0002\u0000"+ - "{\u0081\u0001\u0000\u0000\u0000|}\n\u0001\u0000\u0000}~\u0005\u0018\u0000"+ - "\u0000~\u0080\u0003\u0006\u0003\u0000\u007f|\u0001\u0000\u0000\u0000\u0080"+ - "\u0083\u0001\u0000\u0000\u0000\u0081\u007f\u0001\u0000\u0000\u0000\u0081"+ - "\u0082\u0001\u0000\u0000\u0000\u0082\u0003\u0001\u0000\u0000\u0000\u0083"+ - "\u0081\u0001\u0000\u0000\u0000\u0084\u008b\u0003h4\u0000\u0085\u008b\u0003"+ - "\"\u0011\u0000\u0086\u008b\u0003\u001c\u000e\u0000\u0087\u008b\u0003l"+ - "6\u0000\u0088\u0089\u0004\u0002\u0001\u0000\u0089\u008b\u00030\u0018\u0000"+ - "\u008a\u0084\u0001\u0000\u0000\u0000\u008a\u0085\u0001\u0000\u0000\u0000"+ - "\u008a\u0086\u0001\u0000\u0000\u0000\u008a\u0087\u0001\u0000\u0000\u0000"+ - "\u008a\u0088\u0001\u0000\u0000\u0000\u008b\u0005\u0001\u0000\u0000\u0000"+ - "\u008c\u009d\u00032\u0019\u0000\u008d\u009d\u0003\b\u0004\u0000\u008e"+ - "\u009d\u0003J%\u0000\u008f\u009d\u0003D\"\u0000\u0090\u009d\u00034\u001a"+ - "\u0000\u0091\u009d\u0003F#\u0000\u0092\u009d\u0003L&\u0000\u0093\u009d"+ - "\u0003N\'\u0000\u0094\u009d\u0003R)\u0000\u0095\u009d\u0003T*\u0000\u0096"+ - "\u009d\u0003n7\u0000\u0097\u009d\u0003V+\u0000\u0098\u0099\u0004\u0003"+ - "\u0002\u0000\u0099\u009d\u0003t:\u0000\u009a\u009b\u0004\u0003\u0003\u0000"+ - "\u009b\u009d\u0003r9\u0000\u009c\u008c\u0001\u0000\u0000\u0000\u009c\u008d"+ - "\u0001\u0000\u0000\u0000\u009c\u008e\u0001\u0000\u0000\u0000\u009c\u008f"+ - "\u0001\u0000\u0000\u0000\u009c\u0090\u0001\u0000\u0000\u0000\u009c\u0091"+ - "\u0001\u0000\u0000\u0000\u009c\u0092\u0001\u0000\u0000\u0000\u009c\u0093"+ - "\u0001\u0000\u0000\u0000\u009c\u0094\u0001\u0000\u0000\u0000\u009c\u0095"+ - "\u0001\u0000\u0000\u0000\u009c\u0096\u0001\u0000\u0000\u0000\u009c\u0097"+ - "\u0001\u0000\u0000\u0000\u009c\u0098\u0001\u0000\u0000\u0000\u009c\u009a"+ - "\u0001\u0000\u0000\u0000\u009d\u0007\u0001\u0000\u0000\u0000\u009e\u009f"+ - "\u0005\u0010\u0000\u0000\u009f\u00a0\u0003\n\u0005\u0000\u00a0\t\u0001"+ - "\u0000\u0000\u0000\u00a1\u00a2\u0006\u0005\uffff\uffff\u0000\u00a2\u00a3"+ - "\u0005+\u0000\u0000\u00a3\u00c0\u0003\n\u0005\b\u00a4\u00c0\u0003\u0010"+ - "\b\u0000\u00a5\u00c0\u0003\f\u0006\u0000\u00a6\u00a8\u0003\u0010\b\u0000"+ - "\u00a7\u00a9\u0005+\u0000\u0000\u00a8\u00a7\u0001\u0000\u0000\u0000\u00a8"+ - "\u00a9\u0001\u0000\u0000\u0000\u00a9\u00aa\u0001\u0000\u0000\u0000\u00aa"+ - "\u00ab\u0005&\u0000\u0000\u00ab\u00ac\u0005*\u0000\u0000\u00ac\u00b1\u0003"+ - "\u0010\b\u0000\u00ad\u00ae\u0005!\u0000\u0000\u00ae\u00b0\u0003\u0010"+ - "\b\u0000\u00af\u00ad\u0001\u0000\u0000\u0000\u00b0\u00b3\u0001\u0000\u0000"+ - "\u0000\u00b1\u00af\u0001\u0000\u0000\u0000\u00b1\u00b2\u0001\u0000\u0000"+ - "\u0000\u00b2\u00b4\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000"+ - "\u0000\u00b4\u00b5\u00051\u0000\u0000\u00b5\u00c0\u0001\u0000\u0000\u0000"+ - "\u00b6\u00b7\u0003\u0010\b\u0000\u00b7\u00b9\u0005\'\u0000\u0000\u00b8"+ - "\u00ba\u0005+\u0000\u0000\u00b9\u00b8\u0001\u0000\u0000\u0000\u00b9\u00ba"+ - "\u0001\u0000\u0000\u0000\u00ba\u00bb\u0001\u0000\u0000\u0000\u00bb\u00bc"+ - "\u0005,\u0000\u0000\u00bc\u00c0\u0001\u0000\u0000\u0000\u00bd\u00be\u0004"+ - "\u0005\u0004\u0000\u00be\u00c0\u0003\u000e\u0007\u0000\u00bf\u00a1\u0001"+ - "\u0000\u0000\u0000\u00bf\u00a4\u0001\u0000\u0000\u0000\u00bf\u00a5\u0001"+ - "\u0000\u0000\u0000\u00bf\u00a6\u0001\u0000\u0000\u0000\u00bf\u00b6\u0001"+ - "\u0000\u0000\u0000\u00bf\u00bd\u0001\u0000\u0000\u0000\u00c0\u00c9\u0001"+ - "\u0000\u0000\u0000\u00c1\u00c2\n\u0005\u0000\u0000\u00c2\u00c3\u0005\u001d"+ - "\u0000\u0000\u00c3\u00c8\u0003\n\u0005\u0006\u00c4\u00c5\n\u0004\u0000"+ - "\u0000\u00c5\u00c6\u0005.\u0000\u0000\u00c6\u00c8\u0003\n\u0005\u0005"+ - "\u00c7\u00c1\u0001\u0000\u0000\u0000\u00c7\u00c4\u0001\u0000\u0000\u0000"+ - "\u00c8\u00cb\u0001\u0000\u0000\u0000\u00c9\u00c7\u0001\u0000\u0000\u0000"+ - "\u00c9\u00ca\u0001\u0000\u0000\u0000\u00ca\u000b\u0001\u0000\u0000\u0000"+ - "\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cc\u00ce\u0003\u0010\b\u0000\u00cd"+ - "\u00cf\u0005+\u0000\u0000\u00ce\u00cd\u0001\u0000\u0000\u0000\u00ce\u00cf"+ - "\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001\u0000\u0000\u0000\u00d0\u00d1"+ - "\u0005)\u0000\u0000\u00d1\u00d2\u0003d2\u0000\u00d2\u00db\u0001\u0000"+ - "\u0000\u0000\u00d3\u00d5\u0003\u0010\b\u0000\u00d4\u00d6\u0005+\u0000"+ - "\u0000\u00d5\u00d4\u0001\u0000\u0000\u0000\u00d5\u00d6\u0001\u0000\u0000"+ - "\u0000\u00d6\u00d7\u0001\u0000\u0000\u0000\u00d7\u00d8\u00050\u0000\u0000"+ - "\u00d8\u00d9\u0003d2\u0000\u00d9\u00db\u0001\u0000\u0000\u0000\u00da\u00cc"+ - "\u0001\u0000\u0000\u0000\u00da\u00d3\u0001\u0000\u0000\u0000\u00db\r\u0001"+ - "\u0000\u0000\u0000\u00dc\u00dd\u0003\u0010\b\u0000\u00dd\u00de\u0005?"+ - "\u0000\u0000\u00de\u00df\u0003d2\u0000\u00df\u000f\u0001\u0000\u0000\u0000"+ - "\u00e0\u00e6\u0003\u0012\t\u0000\u00e1\u00e2\u0003\u0012\t\u0000\u00e2"+ - "\u00e3\u0003f3\u0000\u00e3\u00e4\u0003\u0012\t\u0000\u00e4\u00e6\u0001"+ - "\u0000\u0000\u0000\u00e5\u00e0\u0001\u0000\u0000\u0000\u00e5\u00e1\u0001"+ - "\u0000\u0000\u0000\u00e6\u0011\u0001\u0000\u0000\u0000\u00e7\u00e8\u0006"+ - "\t\uffff\uffff\u0000\u00e8\u00ec\u0003\u0014\n\u0000\u00e9\u00ea\u0007"+ - "\u0000\u0000\u0000\u00ea\u00ec\u0003\u0012\t\u0003\u00eb\u00e7\u0001\u0000"+ - "\u0000\u0000\u00eb\u00e9\u0001\u0000\u0000\u0000\u00ec\u00f5\u0001\u0000"+ - "\u0000\u0000\u00ed\u00ee\n\u0002\u0000\u0000\u00ee\u00ef\u0007\u0001\u0000"+ - "\u0000\u00ef\u00f4\u0003\u0012\t\u0003\u00f0\u00f1\n\u0001\u0000\u0000"+ - "\u00f1\u00f2\u0007\u0000\u0000\u0000\u00f2\u00f4\u0003\u0012\t\u0002\u00f3"+ - "\u00ed\u0001\u0000\u0000\u0000\u00f3\u00f0\u0001\u0000\u0000\u0000\u00f4"+ - "\u00f7\u0001\u0000\u0000\u0000\u00f5\u00f3\u0001\u0000\u0000\u0000\u00f5"+ - "\u00f6\u0001\u0000\u0000\u0000\u00f6\u0013\u0001\u0000\u0000\u0000\u00f7"+ - "\u00f5\u0001\u0000\u0000\u0000\u00f8\u00f9\u0006\n\uffff\uffff\u0000\u00f9"+ - "\u0101\u0003@ \u0000\u00fa\u0101\u00036\u001b\u0000\u00fb\u0101\u0003"+ - "\u0016\u000b\u0000\u00fc\u00fd\u0005*\u0000\u0000\u00fd\u00fe\u0003\n"+ - "\u0005\u0000\u00fe\u00ff\u00051\u0000\u0000\u00ff\u0101\u0001\u0000\u0000"+ - "\u0000\u0100\u00f8\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000"+ - "\u0000\u0100\u00fb\u0001\u0000\u0000\u0000\u0100\u00fc\u0001\u0000\u0000"+ - "\u0000\u0101\u0107\u0001\u0000\u0000\u0000\u0102\u0103\n\u0001\u0000\u0000"+ - "\u0103\u0104\u0005 \u0000\u0000\u0104\u0106\u0003\u001a\r\u0000\u0105"+ - "\u0102\u0001\u0000\u0000\u0000\u0106\u0109\u0001\u0000\u0000\u0000\u0107"+ - "\u0105\u0001\u0000\u0000\u0000\u0107\u0108\u0001\u0000\u0000\u0000\u0108"+ - "\u0015\u0001\u0000\u0000\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u010a"+ - "\u010b\u0003\u0018\f\u0000\u010b\u0115\u0005*\u0000\u0000\u010c\u0116"+ - "\u0005<\u0000\u0000\u010d\u0112\u0003\n\u0005\u0000\u010e\u010f\u0005"+ - "!\u0000\u0000\u010f\u0111\u0003\n\u0005\u0000\u0110\u010e\u0001\u0000"+ - "\u0000\u0000\u0111\u0114\u0001\u0000\u0000\u0000\u0112\u0110\u0001\u0000"+ - "\u0000\u0000\u0112\u0113\u0001\u0000\u0000\u0000\u0113\u0116\u0001\u0000"+ - "\u0000\u0000\u0114\u0112\u0001\u0000\u0000\u0000\u0115\u010c\u0001\u0000"+ - "\u0000\u0000\u0115\u010d\u0001\u0000\u0000\u0000\u0115\u0116\u0001\u0000"+ - "\u0000\u0000\u0116\u0117\u0001\u0000\u0000\u0000\u0117\u0118\u00051\u0000"+ - "\u0000\u0118\u0017\u0001\u0000\u0000\u0000\u0119\u011a\u0004\f\n\u0000"+ - "\u011a\u011d\u0005?\u0000\u0000\u011b\u011d\u0003<\u001e\u0000\u011c\u0119"+ - "\u0001\u0000\u0000\u0000\u011c\u011b\u0001\u0000\u0000\u0000\u011d\u0019"+ - "\u0001\u0000\u0000\u0000\u011e\u011f\u0003<\u001e\u0000\u011f\u001b\u0001"+ - "\u0000\u0000\u0000\u0120\u0121\u0005\f\u0000\u0000\u0121\u0122\u0003\u001e"+ - "\u000f\u0000\u0122\u001d\u0001\u0000\u0000\u0000\u0123\u0128\u0003 \u0010"+ - "\u0000\u0124\u0125\u0005!\u0000\u0000\u0125\u0127\u0003 \u0010\u0000\u0126"+ - "\u0124\u0001\u0000\u0000\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128"+ - "\u0126\u0001\u0000\u0000\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u0129"+ - "\u001f\u0001\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012b"+ - "\u0131\u0003\n\u0005\u0000\u012c\u012d\u00036\u001b\u0000\u012d\u012e"+ - "\u0005\u001f\u0000\u0000\u012e\u012f\u0003\n\u0005\u0000\u012f\u0131\u0001"+ - "\u0000\u0000\u0000\u0130\u012b\u0001\u0000\u0000\u0000\u0130\u012c\u0001"+ - "\u0000\u0000\u0000\u0131!\u0001\u0000\u0000\u0000\u0132\u0133\u0005\u0006"+ - "\u0000\u0000\u0133\u0138\u0003$\u0012\u0000\u0134\u0135\u0005!\u0000\u0000"+ - "\u0135\u0137\u0003$\u0012\u0000\u0136\u0134\u0001\u0000\u0000\u0000\u0137"+ - "\u013a\u0001\u0000\u0000\u0000\u0138\u0136\u0001\u0000\u0000\u0000\u0138"+ - "\u0139\u0001\u0000\u0000\u0000\u0139\u013c\u0001\u0000\u0000\u0000\u013a"+ - "\u0138\u0001\u0000\u0000\u0000\u013b\u013d\u0003*\u0015\u0000\u013c\u013b"+ - "\u0001\u0000\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d#\u0001"+ - "\u0000\u0000\u0000\u013e\u013f\u0003&\u0013\u0000\u013f\u0140\u0005h\u0000"+ - "\u0000\u0140\u0141\u0003(\u0014\u0000\u0141\u0144\u0001\u0000\u0000\u0000"+ - "\u0142\u0144\u0003(\u0014\u0000\u0143\u013e\u0001\u0000\u0000\u0000\u0143"+ - "\u0142\u0001\u0000\u0000\u0000\u0144%\u0001\u0000\u0000\u0000\u0145\u0146"+ - "\u0005L\u0000\u0000\u0146\'\u0001\u0000\u0000\u0000\u0147\u0148\u0007"+ - "\u0002\u0000\u0000\u0148)\u0001\u0000\u0000\u0000\u0149\u014c\u0003,\u0016"+ - "\u0000\u014a\u014c\u0003.\u0017\u0000\u014b\u0149\u0001\u0000\u0000\u0000"+ - "\u014b\u014a\u0001\u0000\u0000\u0000\u014c+\u0001\u0000\u0000\u0000\u014d"+ - "\u014e\u0005K\u0000\u0000\u014e\u0153\u0005L\u0000\u0000\u014f\u0150\u0005"+ - "!\u0000\u0000\u0150\u0152\u0005L\u0000\u0000\u0151\u014f\u0001\u0000\u0000"+ - "\u0000\u0152\u0155\u0001\u0000\u0000\u0000\u0153\u0151\u0001\u0000\u0000"+ - "\u0000\u0153\u0154\u0001\u0000\u0000\u0000\u0154-\u0001\u0000\u0000\u0000"+ - "\u0155\u0153\u0001\u0000\u0000\u0000\u0156\u0157\u0005A\u0000\u0000\u0157"+ - "\u0158\u0003,\u0016\u0000\u0158\u0159\u0005B\u0000\u0000\u0159/\u0001"+ - "\u0000\u0000\u0000\u015a\u015b\u0005\u0013\u0000\u0000\u015b\u0160\u0003"+ - "$\u0012\u0000\u015c\u015d\u0005!\u0000\u0000\u015d\u015f\u0003$\u0012"+ - "\u0000\u015e\u015c\u0001\u0000\u0000\u0000\u015f\u0162\u0001\u0000\u0000"+ - "\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0160\u0161\u0001\u0000\u0000"+ - "\u0000\u0161\u0164\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000"+ - "\u0000\u0163\u0165\u0003\u001e\u000f\u0000\u0164\u0163\u0001\u0000\u0000"+ - "\u0000\u0164\u0165\u0001\u0000\u0000\u0000\u0165\u0168\u0001\u0000\u0000"+ - "\u0000\u0166\u0167\u0005\u001c\u0000\u0000\u0167\u0169\u0003\u001e\u000f"+ - "\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168\u0169\u0001\u0000\u0000"+ - "\u0000\u01691\u0001\u0000\u0000\u0000\u016a\u016b\u0005\u0004\u0000\u0000"+ - "\u016b\u016c\u0003\u001e\u000f\u0000\u016c3\u0001\u0000\u0000\u0000\u016d"+ - "\u016f\u0005\u000f\u0000\u0000\u016e\u0170\u0003\u001e\u000f\u0000\u016f"+ - "\u016e\u0001\u0000\u0000\u0000\u016f\u0170\u0001\u0000\u0000\u0000\u0170"+ - "\u0173\u0001\u0000\u0000\u0000\u0171\u0172\u0005\u001c\u0000\u0000\u0172"+ - "\u0174\u0003\u001e\u000f\u0000\u0173\u0171\u0001\u0000\u0000\u0000\u0173"+ - "\u0174\u0001\u0000\u0000\u0000\u01745\u0001\u0000\u0000\u0000\u0175\u017a"+ - "\u0003<\u001e\u0000\u0176\u0177\u0005#\u0000\u0000\u0177\u0179\u0003<"+ - "\u001e\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179\u017c\u0001\u0000"+ - "\u0000\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017a\u017b\u0001\u0000"+ - "\u0000\u0000\u017b7\u0001\u0000\u0000\u0000\u017c\u017a\u0001\u0000\u0000"+ - "\u0000\u017d\u0182\u0003>\u001f\u0000\u017e\u017f\u0005#\u0000\u0000\u017f"+ - "\u0181\u0003>\u001f\u0000\u0180\u017e\u0001\u0000\u0000\u0000\u0181\u0184"+ - "\u0001\u0000\u0000\u0000\u0182\u0180\u0001\u0000\u0000\u0000\u0182\u0183"+ - "\u0001\u0000\u0000\u0000\u01839\u0001\u0000\u0000\u0000\u0184\u0182\u0001"+ - "\u0000\u0000\u0000\u0185\u018a\u00038\u001c\u0000\u0186\u0187\u0005!\u0000"+ - "\u0000\u0187\u0189\u00038\u001c\u0000\u0188\u0186\u0001\u0000\u0000\u0000"+ - "\u0189\u018c\u0001\u0000\u0000\u0000\u018a\u0188\u0001\u0000\u0000\u0000"+ - "\u018a\u018b\u0001\u0000\u0000\u0000\u018b;\u0001\u0000\u0000\u0000\u018c"+ - "\u018a\u0001\u0000\u0000\u0000\u018d\u018e\u0007\u0003\u0000\u0000\u018e"+ - "=\u0001\u0000\u0000\u0000\u018f\u0190\u0005P\u0000\u0000\u0190?\u0001"+ - "\u0000\u0000\u0000\u0191\u01bc\u0005,\u0000\u0000\u0192\u0193\u0003b1"+ - "\u0000\u0193\u0194\u0005C\u0000\u0000\u0194\u01bc\u0001\u0000\u0000\u0000"+ - "\u0195\u01bc\u0003`0\u0000\u0196\u01bc\u0003b1\u0000\u0197\u01bc\u0003"+ - "\\.\u0000\u0198\u01bc\u0003B!\u0000\u0199\u01bc\u0003d2\u0000\u019a\u019b"+ - "\u0005A\u0000\u0000\u019b\u01a0\u0003^/\u0000\u019c\u019d\u0005!\u0000"+ - "\u0000\u019d\u019f\u0003^/\u0000\u019e\u019c\u0001\u0000\u0000\u0000\u019f"+ - "\u01a2\u0001\u0000\u0000\u0000\u01a0\u019e\u0001\u0000\u0000\u0000\u01a0"+ - "\u01a1\u0001\u0000\u0000\u0000\u01a1\u01a3\u0001\u0000\u0000\u0000\u01a2"+ - "\u01a0\u0001\u0000\u0000\u0000\u01a3\u01a4\u0005B\u0000\u0000\u01a4\u01bc"+ - "\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005A\u0000\u0000\u01a6\u01ab\u0003"+ - "\\.\u0000\u01a7\u01a8\u0005!\u0000\u0000\u01a8\u01aa\u0003\\.\u0000\u01a9"+ - "\u01a7\u0001\u0000\u0000\u0000\u01aa\u01ad\u0001\u0000\u0000\u0000\u01ab"+ - "\u01a9\u0001\u0000\u0000\u0000\u01ab\u01ac\u0001\u0000\u0000\u0000\u01ac"+ - "\u01ae\u0001\u0000\u0000\u0000\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ae"+ - "\u01af\u0005B\u0000\u0000\u01af\u01bc\u0001\u0000\u0000\u0000\u01b0\u01b1"+ - "\u0005A\u0000\u0000\u01b1\u01b6\u0003d2\u0000\u01b2\u01b3\u0005!\u0000"+ - "\u0000\u01b3\u01b5\u0003d2\u0000\u01b4\u01b2\u0001\u0000\u0000\u0000\u01b5"+ - "\u01b8\u0001\u0000\u0000\u0000\u01b6\u01b4\u0001\u0000\u0000\u0000\u01b6"+ - "\u01b7\u0001\u0000\u0000\u0000\u01b7\u01b9\u0001\u0000\u0000\u0000\u01b8"+ - "\u01b6\u0001\u0000\u0000\u0000\u01b9\u01ba\u0005B\u0000\u0000\u01ba\u01bc"+ - "\u0001\u0000\u0000\u0000\u01bb\u0191\u0001\u0000\u0000\u0000\u01bb\u0192"+ - "\u0001\u0000\u0000\u0000\u01bb\u0195\u0001\u0000\u0000\u0000\u01bb\u0196"+ - "\u0001\u0000\u0000\u0000\u01bb\u0197\u0001\u0000\u0000\u0000\u01bb\u0198"+ - "\u0001\u0000\u0000\u0000\u01bb\u0199\u0001\u0000\u0000\u0000\u01bb\u019a"+ - "\u0001\u0000\u0000\u0000\u01bb\u01a5\u0001\u0000\u0000\u0000\u01bb\u01b0"+ - "\u0001\u0000\u0000\u0000\u01bcA\u0001\u0000\u0000\u0000\u01bd\u01c0\u0005"+ - "/\u0000\u0000\u01be\u01c0\u0005@\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000"+ - "\u0000\u01bf\u01be\u0001\u0000\u0000\u0000\u01c0C\u0001\u0000\u0000\u0000"+ - "\u01c1\u01c2\u0005\t\u0000\u0000\u01c2\u01c3\u0005\u001a\u0000\u0000\u01c3"+ - "E\u0001\u0000\u0000\u0000\u01c4\u01c5\u0005\u000e\u0000\u0000\u01c5\u01ca"+ - "\u0003H$\u0000\u01c6\u01c7\u0005!\u0000\u0000\u01c7\u01c9\u0003H$\u0000"+ - "\u01c8\u01c6\u0001\u0000\u0000\u0000\u01c9\u01cc\u0001\u0000\u0000\u0000"+ - "\u01ca\u01c8\u0001\u0000\u0000\u0000\u01ca\u01cb\u0001\u0000\u0000\u0000"+ - "\u01cbG\u0001\u0000\u0000\u0000\u01cc\u01ca\u0001\u0000\u0000\u0000\u01cd"+ - "\u01cf\u0003\n\u0005\u0000\u01ce\u01d0\u0007\u0004\u0000\u0000\u01cf\u01ce"+ - "\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000\u0000\u0000\u01d0\u01d3"+ - "\u0001\u0000\u0000\u0000\u01d1\u01d2\u0005-\u0000\u0000\u01d2\u01d4\u0007"+ - "\u0005\u0000\u0000\u01d3\u01d1\u0001\u0000\u0000\u0000\u01d3\u01d4\u0001"+ - "\u0000\u0000\u0000\u01d4I\u0001\u0000\u0000\u0000\u01d5\u01d6\u0005\b"+ - "\u0000\u0000\u01d6\u01d7\u0003:\u001d\u0000\u01d7K\u0001\u0000\u0000\u0000"+ - "\u01d8\u01d9\u0005\u0002\u0000\u0000\u01d9\u01da\u0003:\u001d\u0000\u01da"+ - "M\u0001\u0000\u0000\u0000\u01db\u01dc\u0005\u000b\u0000\u0000\u01dc\u01e1"+ - "\u0003P(\u0000\u01dd\u01de\u0005!\u0000\u0000\u01de\u01e0\u0003P(\u0000"+ - "\u01df\u01dd\u0001\u0000\u0000\u0000\u01e0\u01e3\u0001\u0000\u0000\u0000"+ - "\u01e1\u01df\u0001\u0000\u0000\u0000\u01e1\u01e2\u0001\u0000\u0000\u0000"+ - "\u01e2O\u0001\u0000\u0000\u0000\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e4"+ - "\u01e5\u00038\u001c\u0000\u01e5\u01e6\u0005T\u0000\u0000\u01e6\u01e7\u0003"+ - "8\u001c\u0000\u01e7Q\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005\u0001\u0000"+ - "\u0000\u01e9\u01ea\u0003\u0014\n\u0000\u01ea\u01ec\u0003d2\u0000\u01eb"+ - "\u01ed\u0003X,\u0000\u01ec\u01eb\u0001\u0000\u0000\u0000\u01ec\u01ed\u0001"+ - "\u0000\u0000\u0000\u01edS\u0001\u0000\u0000\u0000\u01ee\u01ef\u0005\u0007"+ - "\u0000\u0000\u01ef\u01f0\u0003\u0014\n\u0000\u01f0\u01f1\u0003d2\u0000"+ - "\u01f1U\u0001\u0000\u0000\u0000\u01f2\u01f3\u0005\n\u0000\u0000\u01f3"+ - "\u01f4\u00036\u001b\u0000\u01f4W\u0001\u0000\u0000\u0000\u01f5\u01fa\u0003"+ - "Z-\u0000\u01f6\u01f7\u0005!\u0000\u0000\u01f7\u01f9\u0003Z-\u0000\u01f8"+ - "\u01f6\u0001\u0000\u0000\u0000\u01f9\u01fc\u0001\u0000\u0000\u0000\u01fa"+ - "\u01f8\u0001\u0000\u0000\u0000\u01fa\u01fb\u0001\u0000\u0000\u0000\u01fb"+ - "Y\u0001\u0000\u0000\u0000\u01fc\u01fa\u0001\u0000\u0000\u0000\u01fd\u01fe"+ - "\u0003<\u001e\u0000\u01fe\u01ff\u0005\u001f\u0000\u0000\u01ff\u0200\u0003"+ - "@ \u0000\u0200[\u0001\u0000\u0000\u0000\u0201\u0202\u0007\u0006\u0000"+ - "\u0000\u0202]\u0001\u0000\u0000\u0000\u0203\u0206\u0003`0\u0000\u0204"+ - "\u0206\u0003b1\u0000\u0205\u0203\u0001\u0000\u0000\u0000\u0205\u0204\u0001"+ - "\u0000\u0000\u0000\u0206_\u0001\u0000\u0000\u0000\u0207\u0209\u0007\u0000"+ - "\u0000\u0000\u0208\u0207\u0001\u0000\u0000\u0000\u0208\u0209\u0001\u0000"+ - "\u0000\u0000\u0209\u020a\u0001\u0000\u0000\u0000\u020a\u020b\u0005\u001b"+ - "\u0000\u0000\u020ba\u0001\u0000\u0000\u0000\u020c\u020e\u0007\u0000\u0000"+ - "\u0000\u020d\u020c\u0001\u0000\u0000\u0000\u020d\u020e\u0001\u0000\u0000"+ - "\u0000\u020e\u020f\u0001\u0000\u0000\u0000\u020f\u0210\u0005\u001a\u0000"+ - "\u0000\u0210c\u0001\u0000\u0000\u0000\u0211\u0212\u0005\u0019\u0000\u0000"+ - "\u0212e\u0001\u0000\u0000\u0000\u0213\u0214\u0007\u0007\u0000\u0000\u0214"+ - "g\u0001\u0000\u0000\u0000\u0215\u0216\u0005\u0005\u0000\u0000\u0216\u0217"+ - "\u0003j5\u0000\u0217i\u0001\u0000\u0000\u0000\u0218\u0219\u0005A\u0000"+ - "\u0000\u0219\u021a\u0003\u0002\u0001\u0000\u021a\u021b\u0005B\u0000\u0000"+ - "\u021bk\u0001\u0000\u0000\u0000\u021c\u021d\u0005\r\u0000\u0000\u021d"+ - "\u021e\u0005d\u0000\u0000\u021em\u0001\u0000\u0000\u0000\u021f\u0220\u0005"+ - "\u0003\u0000\u0000\u0220\u0223\u0005Z\u0000\u0000\u0221\u0222\u0005X\u0000"+ - "\u0000\u0222\u0224\u00038\u001c\u0000\u0223\u0221\u0001\u0000\u0000\u0000"+ - "\u0223\u0224\u0001\u0000\u0000\u0000\u0224\u022e\u0001\u0000\u0000\u0000"+ - "\u0225\u0226\u0005Y\u0000\u0000\u0226\u022b\u0003p8\u0000\u0227\u0228"+ - "\u0005!\u0000\u0000\u0228\u022a\u0003p8\u0000\u0229\u0227\u0001\u0000"+ - "\u0000\u0000\u022a\u022d\u0001\u0000\u0000\u0000\u022b\u0229\u0001\u0000"+ - "\u0000\u0000\u022b\u022c\u0001\u0000\u0000\u0000\u022c\u022f\u0001\u0000"+ - "\u0000\u0000\u022d\u022b\u0001\u0000\u0000\u0000\u022e\u0225\u0001\u0000"+ - "\u0000\u0000\u022e\u022f\u0001\u0000\u0000\u0000\u022fo\u0001\u0000\u0000"+ - "\u0000\u0230\u0231\u00038\u001c\u0000\u0231\u0232\u0005\u001f\u0000\u0000"+ - "\u0232\u0234\u0001\u0000\u0000\u0000\u0233\u0230\u0001\u0000\u0000\u0000"+ - "\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0235\u0001\u0000\u0000\u0000"+ - "\u0235\u0236\u00038\u001c\u0000\u0236q\u0001\u0000\u0000\u0000\u0237\u0238"+ - "\u0005\u0012\u0000\u0000\u0238\u0239\u0003$\u0012\u0000\u0239\u023a\u0005"+ - "X\u0000\u0000\u023a\u023b\u0003:\u001d\u0000\u023bs\u0001\u0000\u0000"+ - "\u0000\u023c\u023d\u0005\u0011\u0000\u0000\u023d\u0240\u0003\u001e\u000f"+ - "\u0000\u023e\u023f\u0005\u001c\u0000\u0000\u023f\u0241\u0003\u001e\u000f"+ - "\u0000\u0240\u023e\u0001\u0000\u0000\u0000\u0240\u0241\u0001\u0000\u0000"+ - "\u0000\u0241u\u0001\u0000\u0000\u00007\u0081\u008a\u009c\u00a8\u00b1\u00b9"+ - "\u00bf\u00c7\u00c9\u00ce\u00d5\u00da\u00e5\u00eb\u00f3\u00f5\u0100\u0107"+ - "\u0112\u0115\u011c\u0128\u0130\u0138\u013c\u0143\u014b\u0153\u0160\u0164"+ - "\u0168\u016f\u0173\u017a\u0182\u018a\u01a0\u01ab\u01b6\u01bb\u01bf\u01ca"+ - "\u01cf\u01d3\u01e1\u01ec\u01fa\u0205\u0208\u020d\u0223\u022b\u022e\u0233"+ - "\u0240"; + "\u0001\u0005\u0003\u0005\u00ab\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0005\u0005\u00b2\b\u0005\n\u0005\f\u0005\u00b5"+ + "\t\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u00bc\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003"+ + "\u0005\u00c2\b\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0005\u0005\u00ca\b\u0005\n\u0005\f\u0005\u00cd\t\u0005"+ + "\u0001\u0006\u0001\u0006\u0003\u0006\u00d1\b\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0003\u0006\u00d8\b\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0003\u0006\u00dd\b\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0003"+ + "\b\u00e8\b\b\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u00ee\b\t\u0001\t"+ + "\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0005\t\u00f6\b\t\n\t\f\t\u00f9"+ + "\t\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0003"+ + "\n\u0103\b\n\u0001\n\u0001\n\u0001\n\u0005\n\u0108\b\n\n\n\f\n\u010b\t"+ + "\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0005\u000b\u0113\b\u000b\n\u000b\f\u000b\u0116\t\u000b\u0003\u000b\u0118"+ + "\b\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001\f\u0003\f\u011f"+ + "\b\f\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0005\u000f\u0129\b\u000f\n\u000f\f\u000f\u012c\t\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010"+ + "\u0133\b\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0005\u0011"+ + "\u0139\b\u0011\n\u0011\f\u0011\u013c\t\u0011\u0001\u0011\u0003\u0011\u013f"+ + "\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0003"+ + "\u0012\u0146\b\u0012\u0001\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001"+ + "\u0015\u0001\u0015\u0003\u0015\u014e\b\u0015\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0005\u0016\u0154\b\u0016\n\u0016\f\u0016\u0157\t\u0016"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0005\u0018\u0161\b\u0018\n\u0018\f\u0018\u0164"+ + "\t\u0018\u0001\u0018\u0003\u0018\u0167\b\u0018\u0001\u0018\u0001\u0018"+ + "\u0003\u0018\u016b\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u001a"+ + "\u0001\u001a\u0003\u001a\u0172\b\u001a\u0001\u001a\u0001\u001a\u0003\u001a"+ + "\u0176\b\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u017b\b"+ + "\u001b\n\u001b\f\u001b\u017e\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0005\u001c\u0183\b\u001c\n\u001c\f\u001c\u0186\t\u001c\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0005\u001d\u018b\b\u001d\n\u001d\f\u001d\u018e\t\u001d"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0003\u001f\u0194\b\u001f"+ + "\u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0005 \u01a3\b \n \f \u01a6\t \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0005 \u01ae\b \n \f \u01b1\t \u0001 \u0001 \u0001"+ + " \u0001 \u0001 \u0001 \u0005 \u01b9\b \n \f \u01bc\t \u0001 \u0001 \u0003"+ + " \u01c0\b \u0001!\u0001!\u0003!\u01c4\b!\u0001\"\u0001\"\u0003\"\u01c8"+ + "\b\"\u0001#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0005$\u01d1\b$"+ + "\n$\f$\u01d4\t$\u0001%\u0001%\u0003%\u01d8\b%\u0001%\u0001%\u0003%\u01dc"+ + "\b%\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0001("+ + "\u0001(\u0005(\u01e8\b(\n(\f(\u01eb\t(\u0001)\u0001)\u0001)\u0001)\u0001"+ + "*\u0001*\u0001*\u0001*\u0003*\u01f5\b*\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0005-\u0201\b-\n-\f-\u0204\t-\u0001"+ + ".\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00030\u020e\b0\u0001"+ + "1\u00031\u0211\b1\u00011\u00011\u00012\u00032\u0216\b2\u00012\u00012\u0001"+ + "3\u00013\u00014\u00014\u00015\u00015\u00015\u00016\u00016\u00016\u0001"+ + "6\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00038\u022c\b8\u0001"+ + "8\u00018\u00018\u00018\u00058\u0232\b8\n8\f8\u0235\t8\u00038\u0237\b8"+ + "\u00019\u00019\u00019\u00039\u023c\b9\u00019\u00019\u0001:\u0001:\u0001"+ + ":\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0003;\u0249\b;\u0001;\u0000"+ + "\u0004\u0002\n\u0012\u0014<\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.02468:<>@BDFHJLNPR"+ + "TVXZ\\^`bdfhjlnprtv\u0000\b\u0001\u0000:;\u0001\u0000<>\u0002\u0000\u0019"+ + "\u0019LL\u0001\u0000CD\u0002\u0000\u001e\u001e\"\"\u0002\u0000%%((\u0002"+ + "\u0000$$22\u0002\u00003359\u0265\u0000x\u0001\u0000\u0000\u0000\u0002"+ + "{\u0001\u0000\u0000\u0000\u0004\u008c\u0001\u0000\u0000\u0000\u0006\u009e"+ + "\u0001\u0000\u0000\u0000\b\u00a0\u0001\u0000\u0000\u0000\n\u00c1\u0001"+ + "\u0000\u0000\u0000\f\u00dc\u0001\u0000\u0000\u0000\u000e\u00de\u0001\u0000"+ + "\u0000\u0000\u0010\u00e7\u0001\u0000\u0000\u0000\u0012\u00ed\u0001\u0000"+ + "\u0000\u0000\u0014\u0102\u0001\u0000\u0000\u0000\u0016\u010c\u0001\u0000"+ + "\u0000\u0000\u0018\u011e\u0001\u0000\u0000\u0000\u001a\u0120\u0001\u0000"+ + "\u0000\u0000\u001c\u0122\u0001\u0000\u0000\u0000\u001e\u0125\u0001\u0000"+ + "\u0000\u0000 \u0132\u0001\u0000\u0000\u0000\"\u0134\u0001\u0000\u0000"+ + "\u0000$\u0145\u0001\u0000\u0000\u0000&\u0147\u0001\u0000\u0000\u0000("+ + "\u0149\u0001\u0000\u0000\u0000*\u014d\u0001\u0000\u0000\u0000,\u014f\u0001"+ + "\u0000\u0000\u0000.\u0158\u0001\u0000\u0000\u00000\u015c\u0001\u0000\u0000"+ + "\u00002\u016c\u0001\u0000\u0000\u00004\u016f\u0001\u0000\u0000\u00006"+ + "\u0177\u0001\u0000\u0000\u00008\u017f\u0001\u0000\u0000\u0000:\u0187\u0001"+ + "\u0000\u0000\u0000<\u018f\u0001\u0000\u0000\u0000>\u0193\u0001\u0000\u0000"+ + "\u0000@\u01bf\u0001\u0000\u0000\u0000B\u01c3\u0001\u0000\u0000\u0000D"+ + "\u01c7\u0001\u0000\u0000\u0000F\u01c9\u0001\u0000\u0000\u0000H\u01cc\u0001"+ + "\u0000\u0000\u0000J\u01d5\u0001\u0000\u0000\u0000L\u01dd\u0001\u0000\u0000"+ + "\u0000N\u01e0\u0001\u0000\u0000\u0000P\u01e3\u0001\u0000\u0000\u0000R"+ + "\u01ec\u0001\u0000\u0000\u0000T\u01f0\u0001\u0000\u0000\u0000V\u01f6\u0001"+ + "\u0000\u0000\u0000X\u01fa\u0001\u0000\u0000\u0000Z\u01fd\u0001\u0000\u0000"+ + "\u0000\\\u0205\u0001\u0000\u0000\u0000^\u0209\u0001\u0000\u0000\u0000"+ + "`\u020d\u0001\u0000\u0000\u0000b\u0210\u0001\u0000\u0000\u0000d\u0215"+ + "\u0001\u0000\u0000\u0000f\u0219\u0001\u0000\u0000\u0000h\u021b\u0001\u0000"+ + "\u0000\u0000j\u021d\u0001\u0000\u0000\u0000l\u0220\u0001\u0000\u0000\u0000"+ + "n\u0224\u0001\u0000\u0000\u0000p\u0227\u0001\u0000\u0000\u0000r\u023b"+ + "\u0001\u0000\u0000\u0000t\u023f\u0001\u0000\u0000\u0000v\u0244\u0001\u0000"+ + "\u0000\u0000xy\u0003\u0002\u0001\u0000yz\u0005\u0000\u0000\u0001z\u0001"+ + "\u0001\u0000\u0000\u0000{|\u0006\u0001\uffff\uffff\u0000|}\u0003\u0004"+ + "\u0002\u0000}\u0083\u0001\u0000\u0000\u0000~\u007f\n\u0001\u0000\u0000"+ + "\u007f\u0080\u0005\u0018\u0000\u0000\u0080\u0082\u0003\u0006\u0003\u0000"+ + "\u0081~\u0001\u0000\u0000\u0000\u0082\u0085\u0001\u0000\u0000\u0000\u0083"+ + "\u0081\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000\u0000\u0000\u0084"+ + "\u0003\u0001\u0000\u0000\u0000\u0085\u0083\u0001\u0000\u0000\u0000\u0086"+ + "\u008d\u0003j5\u0000\u0087\u008d\u0003\"\u0011\u0000\u0088\u008d\u0003"+ + "\u001c\u000e\u0000\u0089\u008d\u0003n7\u0000\u008a\u008b\u0004\u0002\u0001"+ + "\u0000\u008b\u008d\u00030\u0018\u0000\u008c\u0086\u0001\u0000\u0000\u0000"+ + "\u008c\u0087\u0001\u0000\u0000\u0000\u008c\u0088\u0001\u0000\u0000\u0000"+ + "\u008c\u0089\u0001\u0000\u0000\u0000\u008c\u008a\u0001\u0000\u0000\u0000"+ + "\u008d\u0005\u0001\u0000\u0000\u0000\u008e\u009f\u00032\u0019\u0000\u008f"+ + "\u009f\u0003\b\u0004\u0000\u0090\u009f\u0003L&\u0000\u0091\u009f\u0003"+ + "F#\u0000\u0092\u009f\u00034\u001a\u0000\u0093\u009f\u0003H$\u0000\u0094"+ + "\u009f\u0003N\'\u0000\u0095\u009f\u0003P(\u0000\u0096\u009f\u0003T*\u0000"+ + "\u0097\u009f\u0003V+\u0000\u0098\u009f\u0003p8\u0000\u0099\u009f\u0003"+ + "X,\u0000\u009a\u009b\u0004\u0003\u0002\u0000\u009b\u009f\u0003v;\u0000"+ + "\u009c\u009d\u0004\u0003\u0003\u0000\u009d\u009f\u0003t:\u0000\u009e\u008e"+ + "\u0001\u0000\u0000\u0000\u009e\u008f\u0001\u0000\u0000\u0000\u009e\u0090"+ + "\u0001\u0000\u0000\u0000\u009e\u0091\u0001\u0000\u0000\u0000\u009e\u0092"+ + "\u0001\u0000\u0000\u0000\u009e\u0093\u0001\u0000\u0000\u0000\u009e\u0094"+ + "\u0001\u0000\u0000\u0000\u009e\u0095\u0001\u0000\u0000\u0000\u009e\u0096"+ + "\u0001\u0000\u0000\u0000\u009e\u0097\u0001\u0000\u0000\u0000\u009e\u0098"+ + "\u0001\u0000\u0000\u0000\u009e\u0099\u0001\u0000\u0000\u0000\u009e\u009a"+ + "\u0001\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000\u009f\u0007"+ + "\u0001\u0000\u0000\u0000\u00a0\u00a1\u0005\u0010\u0000\u0000\u00a1\u00a2"+ + "\u0003\n\u0005\u0000\u00a2\t\u0001\u0000\u0000\u0000\u00a3\u00a4\u0006"+ + "\u0005\uffff\uffff\u0000\u00a4\u00a5\u0005+\u0000\u0000\u00a5\u00c2\u0003"+ + "\n\u0005\b\u00a6\u00c2\u0003\u0010\b\u0000\u00a7\u00c2\u0003\f\u0006\u0000"+ + "\u00a8\u00aa\u0003\u0010\b\u0000\u00a9\u00ab\u0005+\u0000\u0000\u00aa"+ + "\u00a9\u0001\u0000\u0000\u0000\u00aa\u00ab\u0001\u0000\u0000\u0000\u00ab"+ + "\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005&\u0000\u0000\u00ad\u00ae"+ + "\u0005*\u0000\u0000\u00ae\u00b3\u0003\u0010\b\u0000\u00af\u00b0\u0005"+ + "!\u0000\u0000\u00b0\u00b2\u0003\u0010\b\u0000\u00b1\u00af\u0001\u0000"+ + "\u0000\u0000\u00b2\u00b5\u0001\u0000\u0000\u0000\u00b3\u00b1\u0001\u0000"+ + "\u0000\u0000\u00b3\u00b4\u0001\u0000\u0000\u0000\u00b4\u00b6\u0001\u0000"+ + "\u0000\u0000\u00b5\u00b3\u0001\u0000\u0000\u0000\u00b6\u00b7\u00051\u0000"+ + "\u0000\u00b7\u00c2\u0001\u0000\u0000\u0000\u00b8\u00b9\u0003\u0010\b\u0000"+ + "\u00b9\u00bb\u0005\'\u0000\u0000\u00ba\u00bc\u0005+\u0000\u0000\u00bb"+ + "\u00ba\u0001\u0000\u0000\u0000\u00bb\u00bc\u0001\u0000\u0000\u0000\u00bc"+ + "\u00bd\u0001\u0000\u0000\u0000\u00bd\u00be\u0005,\u0000\u0000\u00be\u00c2"+ + "\u0001\u0000\u0000\u0000\u00bf\u00c0\u0004\u0005\u0004\u0000\u00c0\u00c2"+ + "\u0003\u000e\u0007\u0000\u00c1\u00a3\u0001\u0000\u0000\u0000\u00c1\u00a6"+ + "\u0001\u0000\u0000\u0000\u00c1\u00a7\u0001\u0000\u0000\u0000\u00c1\u00a8"+ + "\u0001\u0000\u0000\u0000\u00c1\u00b8\u0001\u0000\u0000\u0000\u00c1\u00bf"+ + "\u0001\u0000\u0000\u0000\u00c2\u00cb\u0001\u0000\u0000\u0000\u00c3\u00c4"+ + "\n\u0005\u0000\u0000\u00c4\u00c5\u0005\u001d\u0000\u0000\u00c5\u00ca\u0003"+ + "\n\u0005\u0006\u00c6\u00c7\n\u0004\u0000\u0000\u00c7\u00c8\u0005.\u0000"+ + "\u0000\u00c8\u00ca\u0003\n\u0005\u0005\u00c9\u00c3\u0001\u0000\u0000\u0000"+ + "\u00c9\u00c6\u0001\u0000\u0000\u0000\u00ca\u00cd\u0001\u0000\u0000\u0000"+ + "\u00cb\u00c9\u0001\u0000\u0000\u0000\u00cb\u00cc\u0001\u0000\u0000\u0000"+ + "\u00cc\u000b\u0001\u0000\u0000\u0000\u00cd\u00cb\u0001\u0000\u0000\u0000"+ + "\u00ce\u00d0\u0003\u0010\b\u0000\u00cf\u00d1\u0005+\u0000\u0000\u00d0"+ + "\u00cf\u0001\u0000\u0000\u0000\u00d0\u00d1\u0001\u0000\u0000\u0000\u00d1"+ + "\u00d2\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005)\u0000\u0000\u00d3\u00d4"+ + "\u0003f3\u0000\u00d4\u00dd\u0001\u0000\u0000\u0000\u00d5\u00d7\u0003\u0010"+ + "\b\u0000\u00d6\u00d8\u0005+\u0000\u0000\u00d7\u00d6\u0001\u0000\u0000"+ + "\u0000\u00d7\u00d8\u0001\u0000\u0000\u0000\u00d8\u00d9\u0001\u0000\u0000"+ + "\u0000\u00d9\u00da\u00050\u0000\u0000\u00da\u00db\u0003f3\u0000\u00db"+ + "\u00dd\u0001\u0000\u0000\u0000\u00dc\u00ce\u0001\u0000\u0000\u0000\u00dc"+ + "\u00d5\u0001\u0000\u0000\u0000\u00dd\r\u0001\u0000\u0000\u0000\u00de\u00df"+ + "\u0003\u0010\b\u0000\u00df\u00e0\u0005?\u0000\u0000\u00e0\u00e1\u0003"+ + "f3\u0000\u00e1\u000f\u0001\u0000\u0000\u0000\u00e2\u00e8\u0003\u0012\t"+ + "\u0000\u00e3\u00e4\u0003\u0012\t\u0000\u00e4\u00e5\u0003h4\u0000\u00e5"+ + "\u00e6\u0003\u0012\t\u0000\u00e6\u00e8\u0001\u0000\u0000\u0000\u00e7\u00e2"+ + "\u0001\u0000\u0000\u0000\u00e7\u00e3\u0001\u0000\u0000\u0000\u00e8\u0011"+ + "\u0001\u0000\u0000\u0000\u00e9\u00ea\u0006\t\uffff\uffff\u0000\u00ea\u00ee"+ + "\u0003\u0014\n\u0000\u00eb\u00ec\u0007\u0000\u0000\u0000\u00ec\u00ee\u0003"+ + "\u0012\t\u0003\u00ed\u00e9\u0001\u0000\u0000\u0000\u00ed\u00eb\u0001\u0000"+ + "\u0000\u0000\u00ee\u00f7\u0001\u0000\u0000\u0000\u00ef\u00f0\n\u0002\u0000"+ + "\u0000\u00f0\u00f1\u0007\u0001\u0000\u0000\u00f1\u00f6\u0003\u0012\t\u0003"+ + "\u00f2\u00f3\n\u0001\u0000\u0000\u00f3\u00f4\u0007\u0000\u0000\u0000\u00f4"+ + "\u00f6\u0003\u0012\t\u0002\u00f5\u00ef\u0001\u0000\u0000\u0000\u00f5\u00f2"+ + "\u0001\u0000\u0000\u0000\u00f6\u00f9\u0001\u0000\u0000\u0000\u00f7\u00f5"+ + "\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000\u0000\u0000\u00f8\u0013"+ + "\u0001\u0000\u0000\u0000\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fb"+ + "\u0006\n\uffff\uffff\u0000\u00fb\u0103\u0003@ \u0000\u00fc\u0103\u0003"+ + "6\u001b\u0000\u00fd\u0103\u0003\u0016\u000b\u0000\u00fe\u00ff\u0005*\u0000"+ + "\u0000\u00ff\u0100\u0003\n\u0005\u0000\u0100\u0101\u00051\u0000\u0000"+ + "\u0101\u0103\u0001\u0000\u0000\u0000\u0102\u00fa\u0001\u0000\u0000\u0000"+ + "\u0102\u00fc\u0001\u0000\u0000\u0000\u0102\u00fd\u0001\u0000\u0000\u0000"+ + "\u0102\u00fe\u0001\u0000\u0000\u0000\u0103\u0109\u0001\u0000\u0000\u0000"+ + "\u0104\u0105\n\u0001\u0000\u0000\u0105\u0106\u0005 \u0000\u0000\u0106"+ + "\u0108\u0003\u001a\r\u0000\u0107\u0104\u0001\u0000\u0000\u0000\u0108\u010b"+ + "\u0001\u0000\u0000\u0000\u0109\u0107\u0001\u0000\u0000\u0000\u0109\u010a"+ + "\u0001\u0000\u0000\u0000\u010a\u0015\u0001\u0000\u0000\u0000\u010b\u0109"+ + "\u0001\u0000\u0000\u0000\u010c\u010d\u0003\u0018\f\u0000\u010d\u0117\u0005"+ + "*\u0000\u0000\u010e\u0118\u0005<\u0000\u0000\u010f\u0114\u0003\n\u0005"+ + "\u0000\u0110\u0111\u0005!\u0000\u0000\u0111\u0113\u0003\n\u0005\u0000"+ + "\u0112\u0110\u0001\u0000\u0000\u0000\u0113\u0116\u0001\u0000\u0000\u0000"+ + "\u0114\u0112\u0001\u0000\u0000\u0000\u0114\u0115\u0001\u0000\u0000\u0000"+ + "\u0115\u0118\u0001\u0000\u0000\u0000\u0116\u0114\u0001\u0000\u0000\u0000"+ + "\u0117\u010e\u0001\u0000\u0000\u0000\u0117\u010f\u0001\u0000\u0000\u0000"+ + "\u0117\u0118\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000"+ + "\u0119\u011a\u00051\u0000\u0000\u011a\u0017\u0001\u0000\u0000\u0000\u011b"+ + "\u011c\u0004\f\n\u0000\u011c\u011f\u0005?\u0000\u0000\u011d\u011f\u0003"+ + "D\"\u0000\u011e\u011b\u0001\u0000\u0000\u0000\u011e\u011d\u0001\u0000"+ + "\u0000\u0000\u011f\u0019\u0001\u0000\u0000\u0000\u0120\u0121\u0003<\u001e"+ + "\u0000\u0121\u001b\u0001\u0000\u0000\u0000\u0122\u0123\u0005\f\u0000\u0000"+ + "\u0123\u0124\u0003\u001e\u000f\u0000\u0124\u001d\u0001\u0000\u0000\u0000"+ + "\u0125\u012a\u0003 \u0010\u0000\u0126\u0127\u0005!\u0000\u0000\u0127\u0129"+ + "\u0003 \u0010\u0000\u0128\u0126\u0001\u0000\u0000\u0000\u0129\u012c\u0001"+ + "\u0000\u0000\u0000\u012a\u0128\u0001\u0000\u0000\u0000\u012a\u012b\u0001"+ + "\u0000\u0000\u0000\u012b\u001f\u0001\u0000\u0000\u0000\u012c\u012a\u0001"+ + "\u0000\u0000\u0000\u012d\u0133\u0003\n\u0005\u0000\u012e\u012f\u00036"+ + "\u001b\u0000\u012f\u0130\u0005\u001f\u0000\u0000\u0130\u0131\u0003\n\u0005"+ + "\u0000\u0131\u0133\u0001\u0000\u0000\u0000\u0132\u012d\u0001\u0000\u0000"+ + "\u0000\u0132\u012e\u0001\u0000\u0000\u0000\u0133!\u0001\u0000\u0000\u0000"+ + "\u0134\u0135\u0005\u0006\u0000\u0000\u0135\u013a\u0003$\u0012\u0000\u0136"+ + "\u0137\u0005!\u0000\u0000\u0137\u0139\u0003$\u0012\u0000\u0138\u0136\u0001"+ + "\u0000\u0000\u0000\u0139\u013c\u0001\u0000\u0000\u0000\u013a\u0138\u0001"+ + "\u0000\u0000\u0000\u013a\u013b\u0001\u0000\u0000\u0000\u013b\u013e\u0001"+ + "\u0000\u0000\u0000\u013c\u013a\u0001\u0000\u0000\u0000\u013d\u013f\u0003"+ + "*\u0015\u0000\u013e\u013d\u0001\u0000\u0000\u0000\u013e\u013f\u0001\u0000"+ + "\u0000\u0000\u013f#\u0001\u0000\u0000\u0000\u0140\u0141\u0003&\u0013\u0000"+ + "\u0141\u0142\u0005h\u0000\u0000\u0142\u0143\u0003(\u0014\u0000\u0143\u0146"+ + "\u0001\u0000\u0000\u0000\u0144\u0146\u0003(\u0014\u0000\u0145\u0140\u0001"+ + "\u0000\u0000\u0000\u0145\u0144\u0001\u0000\u0000\u0000\u0146%\u0001\u0000"+ + "\u0000\u0000\u0147\u0148\u0005L\u0000\u0000\u0148\'\u0001\u0000\u0000"+ + "\u0000\u0149\u014a\u0007\u0002\u0000\u0000\u014a)\u0001\u0000\u0000\u0000"+ + "\u014b\u014e\u0003,\u0016\u0000\u014c\u014e\u0003.\u0017\u0000\u014d\u014b"+ + "\u0001\u0000\u0000\u0000\u014d\u014c\u0001\u0000\u0000\u0000\u014e+\u0001"+ + "\u0000\u0000\u0000\u014f\u0150\u0005K\u0000\u0000\u0150\u0155\u0005L\u0000"+ + "\u0000\u0151\u0152\u0005!\u0000\u0000\u0152\u0154\u0005L\u0000\u0000\u0153"+ + "\u0151\u0001\u0000\u0000\u0000\u0154\u0157\u0001\u0000\u0000\u0000\u0155"+ + "\u0153\u0001\u0000\u0000\u0000\u0155\u0156\u0001\u0000\u0000\u0000\u0156"+ + "-\u0001\u0000\u0000\u0000\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u0159"+ + "\u0005A\u0000\u0000\u0159\u015a\u0003,\u0016\u0000\u015a\u015b\u0005B"+ + "\u0000\u0000\u015b/\u0001\u0000\u0000\u0000\u015c\u015d\u0005\u0013\u0000"+ + "\u0000\u015d\u0162\u0003$\u0012\u0000\u015e\u015f\u0005!\u0000\u0000\u015f"+ + "\u0161\u0003$\u0012\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0161\u0164"+ + "\u0001\u0000\u0000\u0000\u0162\u0160\u0001\u0000\u0000\u0000\u0162\u0163"+ + "\u0001\u0000\u0000\u0000\u0163\u0166\u0001\u0000\u0000\u0000\u0164\u0162"+ + "\u0001\u0000\u0000\u0000\u0165\u0167\u0003\u001e\u000f\u0000\u0166\u0165"+ + "\u0001\u0000\u0000\u0000\u0166\u0167\u0001\u0000\u0000\u0000\u0167\u016a"+ + "\u0001\u0000\u0000\u0000\u0168\u0169\u0005\u001c\u0000\u0000\u0169\u016b"+ + "\u0003\u001e\u000f\u0000\u016a\u0168\u0001\u0000\u0000\u0000\u016a\u016b"+ + "\u0001\u0000\u0000\u0000\u016b1\u0001\u0000\u0000\u0000\u016c\u016d\u0005"+ + "\u0004\u0000\u0000\u016d\u016e\u0003\u001e\u000f\u0000\u016e3\u0001\u0000"+ + "\u0000\u0000\u016f\u0171\u0005\u000f\u0000\u0000\u0170\u0172\u0003\u001e"+ + "\u000f\u0000\u0171\u0170\u0001\u0000\u0000\u0000\u0171\u0172\u0001\u0000"+ + "\u0000\u0000\u0172\u0175\u0001\u0000\u0000\u0000\u0173\u0174\u0005\u001c"+ + "\u0000\u0000\u0174\u0176\u0003\u001e\u000f\u0000\u0175\u0173\u0001\u0000"+ + "\u0000\u0000\u0175\u0176\u0001\u0000\u0000\u0000\u01765\u0001\u0000\u0000"+ + "\u0000\u0177\u017c\u0003D\"\u0000\u0178\u0179\u0005#\u0000\u0000\u0179"+ + "\u017b\u0003D\"\u0000\u017a\u0178\u0001\u0000\u0000\u0000\u017b\u017e"+ + "\u0001\u0000\u0000\u0000\u017c\u017a\u0001\u0000\u0000\u0000\u017c\u017d"+ + "\u0001\u0000\u0000\u0000\u017d7\u0001\u0000\u0000\u0000\u017e\u017c\u0001"+ + "\u0000\u0000\u0000\u017f\u0184\u0003>\u001f\u0000\u0180\u0181\u0005#\u0000"+ + "\u0000\u0181\u0183\u0003>\u001f\u0000\u0182\u0180\u0001\u0000\u0000\u0000"+ + "\u0183\u0186\u0001\u0000\u0000\u0000\u0184\u0182\u0001\u0000\u0000\u0000"+ + "\u0184\u0185\u0001\u0000\u0000\u0000\u01859\u0001\u0000\u0000\u0000\u0186"+ + "\u0184\u0001\u0000\u0000\u0000\u0187\u018c\u00038\u001c\u0000\u0188\u0189"+ + "\u0005!\u0000\u0000\u0189\u018b\u00038\u001c\u0000\u018a\u0188\u0001\u0000"+ + "\u0000\u0000\u018b\u018e\u0001\u0000\u0000\u0000\u018c\u018a\u0001\u0000"+ + "\u0000\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d;\u0001\u0000\u0000"+ + "\u0000\u018e\u018c\u0001\u0000\u0000\u0000\u018f\u0190\u0007\u0003\u0000"+ + "\u0000\u0190=\u0001\u0000\u0000\u0000\u0191\u0194\u0005P\u0000\u0000\u0192"+ + "\u0194\u0003B!\u0000\u0193\u0191\u0001\u0000\u0000\u0000\u0193\u0192\u0001"+ + "\u0000\u0000\u0000\u0194?\u0001\u0000\u0000\u0000\u0195\u01c0\u0005,\u0000"+ + "\u0000\u0196\u0197\u0003d2\u0000\u0197\u0198\u0005C\u0000\u0000\u0198"+ + "\u01c0\u0001\u0000\u0000\u0000\u0199\u01c0\u0003b1\u0000\u019a\u01c0\u0003"+ + "d2\u0000\u019b\u01c0\u0003^/\u0000\u019c\u01c0\u0003B!\u0000\u019d\u01c0"+ + "\u0003f3\u0000\u019e\u019f\u0005A\u0000\u0000\u019f\u01a4\u0003`0\u0000"+ + "\u01a0\u01a1\u0005!\u0000\u0000\u01a1\u01a3\u0003`0\u0000\u01a2\u01a0"+ + "\u0001\u0000\u0000\u0000\u01a3\u01a6\u0001\u0000\u0000\u0000\u01a4\u01a2"+ + "\u0001\u0000\u0000\u0000\u01a4\u01a5\u0001\u0000\u0000\u0000\u01a5\u01a7"+ + "\u0001\u0000\u0000\u0000\u01a6\u01a4\u0001\u0000\u0000\u0000\u01a7\u01a8"+ + "\u0005B\u0000\u0000\u01a8\u01c0\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005"+ + "A\u0000\u0000\u01aa\u01af\u0003^/\u0000\u01ab\u01ac\u0005!\u0000\u0000"+ + "\u01ac\u01ae\u0003^/\u0000\u01ad\u01ab\u0001\u0000\u0000\u0000\u01ae\u01b1"+ + "\u0001\u0000\u0000\u0000\u01af\u01ad\u0001\u0000\u0000\u0000\u01af\u01b0"+ + "\u0001\u0000\u0000\u0000\u01b0\u01b2\u0001\u0000\u0000\u0000\u01b1\u01af"+ + "\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005B\u0000\u0000\u01b3\u01c0\u0001"+ + "\u0000\u0000\u0000\u01b4\u01b5\u0005A\u0000\u0000\u01b5\u01ba\u0003f3"+ + "\u0000\u01b6\u01b7\u0005!\u0000\u0000\u01b7\u01b9\u0003f3\u0000\u01b8"+ + "\u01b6\u0001\u0000\u0000\u0000\u01b9\u01bc\u0001\u0000\u0000\u0000\u01ba"+ + "\u01b8\u0001\u0000\u0000\u0000\u01ba\u01bb\u0001\u0000\u0000\u0000\u01bb"+ + "\u01bd\u0001\u0000\u0000\u0000\u01bc\u01ba\u0001\u0000\u0000\u0000\u01bd"+ + "\u01be\u0005B\u0000\u0000\u01be\u01c0\u0001\u0000\u0000\u0000\u01bf\u0195"+ + "\u0001\u0000\u0000\u0000\u01bf\u0196\u0001\u0000\u0000\u0000\u01bf\u0199"+ + "\u0001\u0000\u0000\u0000\u01bf\u019a\u0001\u0000\u0000\u0000\u01bf\u019b"+ + "\u0001\u0000\u0000\u0000\u01bf\u019c\u0001\u0000\u0000\u0000\u01bf\u019d"+ + "\u0001\u0000\u0000\u0000\u01bf\u019e\u0001\u0000\u0000\u0000\u01bf\u01a9"+ + "\u0001\u0000\u0000\u0000\u01bf\u01b4\u0001\u0000\u0000\u0000\u01c0A\u0001"+ + "\u0000\u0000\u0000\u01c1\u01c4\u0005/\u0000\u0000\u01c2\u01c4\u0005@\u0000"+ + "\u0000\u01c3\u01c1\u0001\u0000\u0000\u0000\u01c3\u01c2\u0001\u0000\u0000"+ + "\u0000\u01c4C\u0001\u0000\u0000\u0000\u01c5\u01c8\u0003<\u001e\u0000\u01c6"+ + "\u01c8\u0003B!\u0000\u01c7\u01c5\u0001\u0000\u0000\u0000\u01c7\u01c6\u0001"+ + "\u0000\u0000\u0000\u01c8E\u0001\u0000\u0000\u0000\u01c9\u01ca\u0005\t"+ + "\u0000\u0000\u01ca\u01cb\u0005\u001a\u0000\u0000\u01cbG\u0001\u0000\u0000"+ + "\u0000\u01cc\u01cd\u0005\u000e\u0000\u0000\u01cd\u01d2\u0003J%\u0000\u01ce"+ + "\u01cf\u0005!\u0000\u0000\u01cf\u01d1\u0003J%\u0000\u01d0\u01ce\u0001"+ + "\u0000\u0000\u0000\u01d1\u01d4\u0001\u0000\u0000\u0000\u01d2\u01d0\u0001"+ + "\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000\u0000\u0000\u01d3I\u0001\u0000"+ + "\u0000\u0000\u01d4\u01d2\u0001\u0000\u0000\u0000\u01d5\u01d7\u0003\n\u0005"+ + "\u0000\u01d6\u01d8\u0007\u0004\u0000\u0000\u01d7\u01d6\u0001\u0000\u0000"+ + "\u0000\u01d7\u01d8\u0001\u0000\u0000\u0000\u01d8\u01db\u0001\u0000\u0000"+ + "\u0000\u01d9\u01da\u0005-\u0000\u0000\u01da\u01dc\u0007\u0005\u0000\u0000"+ + "\u01db\u01d9\u0001\u0000\u0000\u0000\u01db\u01dc\u0001\u0000\u0000\u0000"+ + "\u01dcK\u0001\u0000\u0000\u0000\u01dd\u01de\u0005\b\u0000\u0000\u01de"+ + "\u01df\u0003:\u001d\u0000\u01dfM\u0001\u0000\u0000\u0000\u01e0\u01e1\u0005"+ + "\u0002\u0000\u0000\u01e1\u01e2\u0003:\u001d\u0000\u01e2O\u0001\u0000\u0000"+ + "\u0000\u01e3\u01e4\u0005\u000b\u0000\u0000\u01e4\u01e9\u0003R)\u0000\u01e5"+ + "\u01e6\u0005!\u0000\u0000\u01e6\u01e8\u0003R)\u0000\u01e7\u01e5\u0001"+ + "\u0000\u0000\u0000\u01e8\u01eb\u0001\u0000\u0000\u0000\u01e9\u01e7\u0001"+ + "\u0000\u0000\u0000\u01e9\u01ea\u0001\u0000\u0000\u0000\u01eaQ\u0001\u0000"+ + "\u0000\u0000\u01eb\u01e9\u0001\u0000\u0000\u0000\u01ec\u01ed\u00038\u001c"+ + "\u0000\u01ed\u01ee\u0005T\u0000\u0000\u01ee\u01ef\u00038\u001c\u0000\u01ef"+ + "S\u0001\u0000\u0000\u0000\u01f0\u01f1\u0005\u0001\u0000\u0000\u01f1\u01f2"+ + "\u0003\u0014\n\u0000\u01f2\u01f4\u0003f3\u0000\u01f3\u01f5\u0003Z-\u0000"+ + "\u01f4\u01f3\u0001\u0000\u0000\u0000\u01f4\u01f5\u0001\u0000\u0000\u0000"+ + "\u01f5U\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005\u0007\u0000\u0000\u01f7"+ + "\u01f8\u0003\u0014\n\u0000\u01f8\u01f9\u0003f3\u0000\u01f9W\u0001\u0000"+ + "\u0000\u0000\u01fa\u01fb\u0005\n\u0000\u0000\u01fb\u01fc\u00036\u001b"+ + "\u0000\u01fcY\u0001\u0000\u0000\u0000\u01fd\u0202\u0003\\.\u0000\u01fe"+ + "\u01ff\u0005!\u0000\u0000\u01ff\u0201\u0003\\.\u0000\u0200\u01fe\u0001"+ + "\u0000\u0000\u0000\u0201\u0204\u0001\u0000\u0000\u0000\u0202\u0200\u0001"+ + "\u0000\u0000\u0000\u0202\u0203\u0001\u0000\u0000\u0000\u0203[\u0001\u0000"+ + "\u0000\u0000\u0204\u0202\u0001\u0000\u0000\u0000\u0205\u0206\u0003<\u001e"+ + "\u0000\u0206\u0207\u0005\u001f\u0000\u0000\u0207\u0208\u0003@ \u0000\u0208"+ + "]\u0001\u0000\u0000\u0000\u0209\u020a\u0007\u0006\u0000\u0000\u020a_\u0001"+ + "\u0000\u0000\u0000\u020b\u020e\u0003b1\u0000\u020c\u020e\u0003d2\u0000"+ + "\u020d\u020b\u0001\u0000\u0000\u0000\u020d\u020c\u0001\u0000\u0000\u0000"+ + "\u020ea\u0001\u0000\u0000\u0000\u020f\u0211\u0007\u0000\u0000\u0000\u0210"+ + "\u020f\u0001\u0000\u0000\u0000\u0210\u0211\u0001\u0000\u0000\u0000\u0211"+ + "\u0212\u0001\u0000\u0000\u0000\u0212\u0213\u0005\u001b\u0000\u0000\u0213"+ + "c\u0001\u0000\u0000\u0000\u0214\u0216\u0007\u0000\u0000\u0000\u0215\u0214"+ + "\u0001\u0000\u0000\u0000\u0215\u0216\u0001\u0000\u0000\u0000\u0216\u0217"+ + "\u0001\u0000\u0000\u0000\u0217\u0218\u0005\u001a\u0000\u0000\u0218e\u0001"+ + "\u0000\u0000\u0000\u0219\u021a\u0005\u0019\u0000\u0000\u021ag\u0001\u0000"+ + "\u0000\u0000\u021b\u021c\u0007\u0007\u0000\u0000\u021ci\u0001\u0000\u0000"+ + "\u0000\u021d\u021e\u0005\u0005\u0000\u0000\u021e\u021f\u0003l6\u0000\u021f"+ + "k\u0001\u0000\u0000\u0000\u0220\u0221\u0005A\u0000\u0000\u0221\u0222\u0003"+ + "\u0002\u0001\u0000\u0222\u0223\u0005B\u0000\u0000\u0223m\u0001\u0000\u0000"+ + "\u0000\u0224\u0225\u0005\r\u0000\u0000\u0225\u0226\u0005d\u0000\u0000"+ + "\u0226o\u0001\u0000\u0000\u0000\u0227\u0228\u0005\u0003\u0000\u0000\u0228"+ + "\u022b\u0005Z\u0000\u0000\u0229\u022a\u0005X\u0000\u0000\u022a\u022c\u0003"+ + "8\u001c\u0000\u022b\u0229\u0001\u0000\u0000\u0000\u022b\u022c\u0001\u0000"+ + "\u0000\u0000\u022c\u0236\u0001\u0000\u0000\u0000\u022d\u022e\u0005Y\u0000"+ + "\u0000\u022e\u0233\u0003r9\u0000\u022f\u0230\u0005!\u0000\u0000\u0230"+ + "\u0232\u0003r9\u0000\u0231\u022f\u0001\u0000\u0000\u0000\u0232\u0235\u0001"+ + "\u0000\u0000\u0000\u0233\u0231\u0001\u0000\u0000\u0000\u0233\u0234\u0001"+ + "\u0000\u0000\u0000\u0234\u0237\u0001\u0000\u0000\u0000\u0235\u0233\u0001"+ + "\u0000\u0000\u0000\u0236\u022d\u0001\u0000\u0000\u0000\u0236\u0237\u0001"+ + "\u0000\u0000\u0000\u0237q\u0001\u0000\u0000\u0000\u0238\u0239\u00038\u001c"+ + "\u0000\u0239\u023a\u0005\u001f\u0000\u0000\u023a\u023c\u0001\u0000\u0000"+ + "\u0000\u023b\u0238\u0001\u0000\u0000\u0000\u023b\u023c\u0001\u0000\u0000"+ + "\u0000\u023c\u023d\u0001\u0000\u0000\u0000\u023d\u023e\u00038\u001c\u0000"+ + "\u023es\u0001\u0000\u0000\u0000\u023f\u0240\u0005\u0012\u0000\u0000\u0240"+ + "\u0241\u0003$\u0012\u0000\u0241\u0242\u0005X\u0000\u0000\u0242\u0243\u0003"+ + ":\u001d\u0000\u0243u\u0001\u0000\u0000\u0000\u0244\u0245\u0005\u0011\u0000"+ + "\u0000\u0245\u0248\u0003\u001e\u000f\u0000\u0246\u0247\u0005\u001c\u0000"+ + "\u0000\u0247\u0249\u0003\u001e\u000f\u0000\u0248\u0246\u0001\u0000\u0000"+ + "\u0000\u0248\u0249\u0001\u0000\u0000\u0000\u0249w\u0001\u0000\u0000\u0000"+ + "9\u0083\u008c\u009e\u00aa\u00b3\u00bb\u00c1\u00c9\u00cb\u00d0\u00d7\u00dc"+ + "\u00e7\u00ed\u00f5\u00f7\u0102\u0109\u0114\u0117\u011e\u012a\u0132\u013a"+ + "\u013e\u0145\u014d\u0155\u0162\u0166\u016a\u0171\u0175\u017c\u0184\u018c"+ + "\u0193\u01a4\u01af\u01ba\u01bf\u01c3\u01c7\u01d2\u01d7\u01db\u01e9\u01f4"+ + "\u0202\u020d\u0210\u0215\u022b\u0233\u0236\u023b\u0248"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java index 6a4e567a67565..39f1758b78733 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java @@ -79,6 +79,8 @@ import static org.elasticsearch.xpack.esql.core.util.NumericUtils.unsignedLongAsNumber; import static org.elasticsearch.xpack.esql.core.util.StringUtils.WILDCARD; import static org.elasticsearch.xpack.esql.core.util.StringUtils.isInteger; +import static org.elasticsearch.xpack.esql.parser.ParserUtils.ParamClassification.PATTERN; +import static org.elasticsearch.xpack.esql.parser.ParserUtils.ParamClassification.VALUE; import static org.elasticsearch.xpack.esql.parser.ParserUtils.source; import static org.elasticsearch.xpack.esql.parser.ParserUtils.typedParsing; import static org.elasticsearch.xpack.esql.parser.ParserUtils.visitList; @@ -249,8 +251,15 @@ public UnresolvedAttribute visitQualifiedName(EsqlBaseParser.QualifiedNameContex if (ctx == null) { return null; } - - List strings = visitList(this, ctx.identifier(), String.class); + List items = visitList(this, ctx.identifierOrParameter(), Object.class); + List strings = new ArrayList<>(items.size()); + for (Object item : items) { + if (item instanceof String s) { + strings.add(s); + } else if (item instanceof Expression e) { + strings.add(unresolvedAttributeNameInParam(ctx, e)); + } + } return new UnresolvedAttribute(source(ctx), Strings.collectionToDelimitedString(strings, ".")); } @@ -299,7 +308,28 @@ public NamedExpression visitQualifiedNamePattern(EsqlBaseParser.QualifiedNamePat // check special wildcard case if (patterns.size() == 1) { var idCtx = patterns.get(0); - if (idCtx.ID_PATTERN().getText().equals(WILDCARD)) { + boolean unresolvedStar = false; + if (idCtx.ID_PATTERN() != null && idCtx.ID_PATTERN().getText().equals(WILDCARD)) { + unresolvedStar = true; + } + if (idCtx.parameter() != null) { + Expression exp = expression(idCtx.parameter()); + if (exp instanceof Literal lit) { + if (lit.value() != null) { + throw new ParsingException( + src, + "Query parameter [{}] with value [{}] declared as a constant, cannot be used as an identifier or pattern", + ctx.getText(), + lit.value() + ); + } + } else if (exp instanceof UnresolvedNamePattern up) { + if (up.name() != null && up.name().equals(WILDCARD)) { + unresolvedStar = true; + } + } + } + if (unresolvedStar) { return new UnresolvedStar(src, null); } } @@ -314,7 +344,33 @@ public NamedExpression visitQualifiedNamePattern(EsqlBaseParser.QualifiedNamePat objects.add("."); } - String patternContext = patterns.get(i).ID_PATTERN().getText(); + String patternContext = ""; + EsqlBaseParser.IdentifierPatternContext pattern = patterns.get(i); + if (pattern.ID_PATTERN() != null) { + patternContext = pattern.ID_PATTERN().getText(); + } else if (pattern.parameter() != null) { + Expression exp = expression(pattern.parameter()); + if (exp instanceof Literal lit) { + // only Literal.NULL can happen with missing params, params for constants are not allowed + if (lit.value() != null) { + throw new ParsingException(src, "Constant [{}] is unsupported for [{}]", pattern, ctx.getText()); + } + } else if (exp instanceof UnresolvedAttribute ua) { // identifier provided in QueryParam is treated as unquoted string + String unquotedIdentifier = ua.name(); + String quotedIdentifier = quoteIdString(unquotedIdentifier); + patternString.append(quotedIdentifier); + objects.add(unquotedIdentifier); + nameString.append(unquotedIdentifier); + continue; + } else if (exp instanceof UnresolvedNamePattern up) { + patternContext = up.name(); + } + } else { + throw new ParsingException(src, "Unsupported field name pattern [{}]", pattern); + } + if (patternContext.isEmpty()) { // empty pattern can happen with missing params + continue; + } // as this is one big string of fragments mashed together, break it manually into quoted vs unquoted // for readability reasons, do a first pass to break the string into fragments and then process each of them // to avoid doing a string allocation @@ -539,6 +595,12 @@ public UnresolvedAttribute visitDereference(EsqlBaseParser.DereferenceContext ct public Expression visitFunctionExpression(EsqlBaseParser.FunctionExpressionContext ctx) { String name = visitFunctionName(ctx.functionName()); List args = expressions(ctx.booleanExpression()); + if ("is_null".equals(EsqlFunctionRegistry.normalizeName(name))) { + throw new ParsingException( + source(ctx), + "is_null function is not supported anymore, please use 'is null'/'is not null' predicates instead" + ); + } if ("count".equals(EsqlFunctionRegistry.normalizeName(name))) { // to simplify the registration, handle in the parser the special count cases if (args.isEmpty() || ctx.ASTERISK() != null) { @@ -548,6 +610,23 @@ public Expression visitFunctionExpression(EsqlBaseParser.FunctionExpressionConte return new UnresolvedFunction(source(ctx), name, FunctionResolutionStrategy.DEFAULT, args); } + @Override + public String visitFunctionName(EsqlBaseParser.FunctionNameContext ctx) { + if (ctx.DEV_MATCH() != null) { + return ctx.DEV_MATCH().getText(); + } + return visitIdentifierOrParameter(ctx.identifierOrParameter()); + } + + @Override + public String visitIdentifierOrParameter(EsqlBaseParser.IdentifierOrParameterContext ctx) { + if (ctx.identifier() != null) { + return visitIdentifier(ctx.identifier()); + } + + return unresolvedAttributeNameInParam(ctx.parameter(), expression(ctx.parameter())); + } + @Override public Expression visitInlineCast(EsqlBaseParser.InlineCastContext ctx) { Source source = source(ctx); @@ -634,7 +713,10 @@ public Alias visitRenameClause(EsqlBaseParser.RenameClauseContext ctx) { Source src = source(ctx); NamedExpression newName = visitQualifiedNamePattern(ctx.newName); NamedExpression oldName = visitQualifiedNamePattern(ctx.oldName); - if (newName instanceof UnresolvedNamePattern || oldName instanceof UnresolvedNamePattern) { + if (newName instanceof UnresolvedNamePattern + || oldName instanceof UnresolvedNamePattern + || newName instanceof UnresolvedStar + || oldName instanceof UnresolvedStar) { throw new ParsingException(src, "Using wildcards [*] in RENAME is not allowed [{}]", src.text()); } @@ -709,13 +791,13 @@ public List visitGrouping(EsqlBaseParser.FieldsContext ctx) { } @Override - public Object visitInputParam(EsqlBaseParser.InputParamContext ctx) { + public Expression visitInputParam(EsqlBaseParser.InputParamContext ctx) { QueryParam param = paramByToken(ctx.PARAM()); return visitParam(ctx, param); } @Override - public Object visitInputNamedOrPositionalParam(EsqlBaseParser.InputNamedOrPositionalParamContext ctx) { + public Expression visitInputNamedOrPositionalParam(EsqlBaseParser.InputNamedOrPositionalParamContext ctx) { QueryParam param = paramByNameOrPosition(ctx.NAMED_OR_POSITIONAL_PARAM()); if (param == null) { return Literal.NULL; @@ -723,10 +805,21 @@ public Object visitInputNamedOrPositionalParam(EsqlBaseParser.InputNamedOrPositi return visitParam(ctx, param); } - private Object visitParam(EsqlBaseParser.ParamsContext ctx, QueryParam param) { + private Expression visitParam(EsqlBaseParser.ParameterContext ctx, QueryParam param) { Source source = source(ctx); DataType type = param.type(); - return new Literal(source, param.value(), type); + var value = param.value(); + ParserUtils.ParamClassification classification = param.classification(); + // RequestXContent does not allow null value for identifier or pattern + if (value != null && classification != VALUE) { + if (classification == PATTERN) { + // let visitQualifiedNamePattern create a real UnresolvedNamePattern with Automaton + return new UnresolvedNamePattern(source, null, value.toString(), value.toString()); + } else { + return new UnresolvedAttribute(source, value.toString()); + } + } + return new Literal(source, value, type); } QueryParam paramByToken(TerminalNode node) { @@ -771,6 +864,32 @@ QueryParam paramByNameOrPosition(TerminalNode node) { } } + String unresolvedAttributeNameInParam(ParserRuleContext ctx, Expression param) { + String invalidParam = "Query parameter [{}]{}, cannot be used as an identifier"; + switch (param) { + case Literal lit -> throw new ParsingException( + source(ctx), + invalidParam, + ctx.getText(), + lit.value() != null ? " with value [" + lit.value() + "] declared as a constant" : " is null or undefined" + ); + case UnresolvedNamePattern up -> throw new ParsingException( + source(ctx), + invalidParam, + ctx.getText(), + "[" + up.name() + "] declared as a pattern" + ); + case UnresolvedAttribute ua -> { + if (ua.name() != null) { + return ua.name(); + } else { // this should not happen + throw new ParsingException(source(ctx), invalidParam, ctx.getText(), "[null]"); + } + } + default -> throw new ParsingException(source(ctx), invalidParam, ctx.getText(), "[null]"); + } + } + @Override public Expression visitMatchBooleanExpression(EsqlBaseParser.MatchBooleanExpressionContext ctx) { if (Build.current().isSnapshot() == false) { diff --git a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java index 043099b29d539..1872fa6e8f1f0 100644 --- a/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java +++ b/x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/IdentifierBuilder.java @@ -32,14 +32,6 @@ public String visitIdentifier(IdentifierContext ctx) { return ctx == null ? null : unquoteIdentifier(ctx.QUOTED_IDENTIFIER(), ctx.UNQUOTED_IDENTIFIER()); } - @Override - public String visitFunctionName(EsqlBaseParser.FunctionNameContext ctx) { - if (ctx.DEV_MATCH() != null) { - return ctx.DEV_MATCH().getText(); - } - return visitIdentifier(ctx.identifier()); - } - protected static String unquoteIdentifier(TerminalNode quotedNode, TerminalNode unquotedNode) { String result; if (quotedNode != null) {