Преглед на файлове

ES|QL change_point processing command (#120998)

* Grammar for ES|QL change point (with dummy impl)

* pipeline breaker

* ChangePointOperator

* Add sorting

* basic csv test

* conflict

* Update docs/changelog/120998.yaml

* [CI] Auto commit changes from spotless

* polish

* Non-long data type

* Move OrderBy/Limit to the logical plan

* fix mem.leak

* csv test for reusing column names

* Warning indeterminable

* capability

* handle null values

* too much data

* type text->keyword

* default timestamp and output columns

* spotless

* ChangePointOperatorTests + fix memory leaks

* [CI] Auto commit changes from spotless

* improve test

* add comments/todos

* handle multivalued columns

* don't register unserialiazable

* surrogate

* make "too much data" tests readable

* more tests

* Error handling

* fix multivalued test

* more name conflict tests

* [CI] Auto commit changes from spotless

* more tests

* improve code

* CSV test for various input key/value types

* one more csv test

* Check sortable/numeric for all types

* add null type to testChangePoint_valueNumeric

* more CSV tests

* skip nulls instead of zeroing them

* error on MV

* Test+todo for nicer error message

* better error msg

* Revert "better error msg"

This reverts commit 21ec77c8f34a875d41906ae8b8301ed66c009bc8.

* fix

* make csv test deterministic

* replace NamedExpression -> Attribute

* skip MVs + warning

---------

Co-authored-by: elasticsearchmachine <infra-root+elasticsearchmachine@elastic.co>
Jan Kuipers преди 8 месеца
родител
ревизия
aaa5ce85a9
променени са 29 файла, в които са добавени 3738 реда и са изтрити 1645 реда
  1. 5 0
      docs/changelog/120998.yaml
  2. 236 0
      x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ChangePointOperator.java
  3. 23 10
      x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/Warnings.java
  4. 86 0
      x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ChangePointOperatorTests.java
  5. 0 1
      x-pack/plugin/esql/compute/test/src/main/java/org/elasticsearch/compute/test/OperatorTestCase.java
  6. 1200 0
      x-pack/plugin/esql/qa/testFixtures/src/main/resources/change_point.csv-spec
  7. 23 6
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4
  8. 164 160
      x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens
  9. 5 0
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4
  10. 164 160
      x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens
  11. 6 1
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java
  12. 20 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp
  13. 1178 1113
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java
  14. 9 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp
  15. 194 179
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java
  16. 12 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java
  17. 7 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java
  18. 10 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java
  19. 6 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java
  20. 20 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java
  21. 2 2
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java
  22. 156 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/ChangePoint.java
  23. 107 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/ChangePointExec.java
  24. 20 2
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java
  25. 13 0
      x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java
  26. 2 4
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java
  27. 63 7
      x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/analysis/VerifierTests.java
  28. 3 0
      x-pack/plugin/ml/src/main/java/module-info.java
  29. 4 0
      x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/aggs/changepoint/ChangeType.java

+ 5 - 0
docs/changelog/120998.yaml

@@ -0,0 +1,5 @@
+pr: 120998
+summary: ES|QL `change_point` processing command
+area: Machine Learning
+type: feature
+issues: []

+ 236 - 0
x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/ChangePointOperator.java

@@ -0,0 +1,236 @@
+/*
+ * 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.compute.operator;
+
+import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.compute.data.Block;
+import org.elasticsearch.compute.data.BlockFactory;
+import org.elasticsearch.compute.data.BlockUtils;
+import org.elasticsearch.compute.data.BytesRefBlock;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.Page;
+import org.elasticsearch.core.Releasables;
+import org.elasticsearch.xpack.ml.aggs.MlAggsHelper;
+import org.elasticsearch.xpack.ml.aggs.changepoint.ChangePointDetector;
+import org.elasticsearch.xpack.ml.aggs.changepoint.ChangeType;
+
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Find spikes, dips and change point in a list of values.
+ * <p>
+ * Warning: this operator cannot handle large amounts of data! It buffers all
+ * data that is passed to it, runs the change point detector on the data (which
+ * is a compute-heavy process), and then outputs all data with the change points.
+ */
+public class ChangePointOperator implements Operator {
+
+    public static final int INPUT_VALUE_COUNT_LIMIT = 1000;
+
+    public record Factory(int channel, String sourceText, int sourceLine, int sourceColumn) implements OperatorFactory {
+        @Override
+        public Operator get(DriverContext driverContext) {
+            return new ChangePointOperator(driverContext, channel, sourceText, sourceLine, sourceColumn);
+        }
+
+        @Override
+        public String describe() {
+            return "ChangePointOperator[channel=" + channel + "]";
+        }
+    }
+
+    private final DriverContext driverContext;
+    private final int channel;
+    private final String sourceText;
+    private final int sourceLine;
+    private final int sourceColumn;
+
+    private final Deque<Page> inputPages;
+    private final Deque<Page> outputPages;
+    private boolean finished;
+    private Warnings warnings;
+
+    // TODO: make org.elasticsearch.xpack.esql.core.tree.Source available here
+    // (by modularizing esql-core) and use that instead of the individual fields.
+    public ChangePointOperator(DriverContext driverContext, int channel, String sourceText, int sourceLine, int sourceColumn) {
+        this.driverContext = driverContext;
+        this.channel = channel;
+        this.sourceText = sourceText;
+        this.sourceLine = sourceLine;
+        this.sourceColumn = sourceColumn;
+
+        finished = false;
+        inputPages = new LinkedList<>();
+        outputPages = new LinkedList<>();
+        warnings = null;
+    }
+
+    @Override
+    public boolean needsInput() {
+        return finished == false;
+    }
+
+    @Override
+    public void addInput(Page page) {
+        inputPages.add(page);
+    }
+
+    @Override
+    public void finish() {
+        if (finished == false) {
+            finished = true;
+            createOutputPages();
+        }
+    }
+
+    @Override
+    public boolean isFinished() {
+        return finished && outputPages.isEmpty();
+    }
+
+    @Override
+    public Page getOutput() {
+        if (finished == false || outputPages.isEmpty()) {
+            return null;
+        }
+        return outputPages.removeFirst();
+    }
+
+    private void createOutputPages() {
+        int valuesCount = 0;
+        for (Page page : inputPages) {
+            valuesCount += page.getPositionCount();
+        }
+        boolean tooManyValues = valuesCount > INPUT_VALUE_COUNT_LIMIT;
+        if (tooManyValues) {
+            valuesCount = INPUT_VALUE_COUNT_LIMIT;
+        }
+
+        List<Double> values = new ArrayList<>(valuesCount);
+        List<Integer> bucketIndexes = new ArrayList<>(valuesCount);
+        int valuesIndex = 0;
+        boolean hasNulls = false;
+        boolean hasMultivalued = false;
+        for (Page inputPage : inputPages) {
+            Block inputBlock = inputPage.getBlock(channel);
+            for (int i = 0; i < inputBlock.getPositionCount() && valuesIndex < valuesCount; i++) {
+                Object value = BlockUtils.toJavaObject(inputBlock, i);
+                if (value == null) {
+                    hasNulls = true;
+                    valuesIndex++;
+                } else if (value instanceof List<?>) {
+                    hasMultivalued = true;
+                    valuesIndex++;
+                } else {
+                    values.add(((Number) value).doubleValue());
+                    bucketIndexes.add(valuesIndex++);
+                }
+            }
+        }
+
+        MlAggsHelper.DoubleBucketValues bucketValues = new MlAggsHelper.DoubleBucketValues(
+            null,
+            values.stream().mapToDouble(Double::doubleValue).toArray(),
+            bucketIndexes.stream().mapToInt(Integer::intValue).toArray()
+        );
+        ChangeType changeType = ChangePointDetector.getChangeType(bucketValues);
+        int changePointIndex = changeType.changePoint();
+
+        BlockFactory blockFactory = driverContext.blockFactory();
+        int pageStartIndex = 0;
+        while (inputPages.isEmpty() == false) {
+            Page inputPage = inputPages.peek();
+            Page outputPage;
+            Block changeTypeBlock = null;
+            Block changePvalueBlock = null;
+            boolean success = false;
+            try {
+                if (pageStartIndex <= changePointIndex && changePointIndex < pageStartIndex + inputPage.getPositionCount()) {
+                    try (
+                        BytesRefBlock.Builder changeTypeBlockBuilder = blockFactory.newBytesRefBlockBuilder(inputPage.getPositionCount());
+                        DoubleBlock.Builder pvalueBlockBuilder = blockFactory.newDoubleBlockBuilder(inputPage.getPositionCount())
+                    ) {
+                        for (int i = 0; i < inputPage.getPositionCount(); i++) {
+                            if (pageStartIndex + i == changePointIndex) {
+                                changeTypeBlockBuilder.appendBytesRef(new BytesRef(changeType.getWriteableName()));
+                                pvalueBlockBuilder.appendDouble(changeType.pValue());
+                            } else {
+                                changeTypeBlockBuilder.appendNull();
+                                pvalueBlockBuilder.appendNull();
+                            }
+                        }
+                        changeTypeBlock = changeTypeBlockBuilder.build();
+                        changePvalueBlock = pvalueBlockBuilder.build();
+                    }
+                } else {
+                    changeTypeBlock = blockFactory.newConstantNullBlock(inputPage.getPositionCount());
+                    changePvalueBlock = blockFactory.newConstantNullBlock(inputPage.getPositionCount());
+                }
+
+                outputPage = inputPage.appendBlocks(new Block[] { changeTypeBlock, changePvalueBlock });
+                success = true;
+            } finally {
+                if (success == false) {
+                    Releasables.closeExpectNoException(changeTypeBlock, changePvalueBlock);
+                }
+            }
+
+            inputPages.removeFirst();
+            outputPages.add(outputPage);
+            pageStartIndex += inputPage.getPositionCount();
+        }
+
+        if (changeType instanceof ChangeType.Indeterminable indeterminable) {
+            warnings(false).registerException(new IllegalArgumentException(indeterminable.getReason()));
+        }
+        if (tooManyValues) {
+            warnings(true).registerException(
+                new IllegalArgumentException("too many values; keeping only first " + INPUT_VALUE_COUNT_LIMIT + " values")
+            );
+        }
+        if (hasNulls) {
+            warnings(true).registerException(new IllegalArgumentException("values contain nulls; skipping them"));
+        }
+        if (hasMultivalued) {
+            warnings(true).registerException(
+                new IllegalArgumentException(
+                    "values contains multivalued entries; skipping them (please consider reducing them with e.g. MV_AVG or MV_SUM)"
+                )
+            );
+        }
+    }
+
+    @Override
+    public void close() {
+        for (Page page : inputPages) {
+            page.releaseBlocks();
+        }
+        for (Page page : outputPages) {
+            page.releaseBlocks();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "ChangePointOperator[channel=" + channel + "]";
+    }
+
+    private Warnings warnings(boolean onlyWarnings) {
+        if (warnings == null) {
+            if (onlyWarnings) {
+                this.warnings = Warnings.createOnlyWarnings(driverContext.warningsMode(), sourceLine, sourceColumn, sourceText);
+            } else {
+                this.warnings = Warnings.createWarnings(driverContext.warningsMode(), sourceLine, sourceColumn, sourceText);
+            }
+        }
+        return warnings;
+    }
+}

+ 23 - 10
x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/operator/Warnings.java

@@ -31,8 +31,9 @@ public class Warnings {
      * @param sourceText The source text that caused the warning. Same as `source.text()`
      * @return A warnings collector object
      */
+    // TODO: rename to createWarningsTreatedAsNull
     public static Warnings createWarnings(DriverContext.WarningsMode warningsMode, int lineNumber, int columnNumber, String sourceText) {
-        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "treating result as null");
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "evaluation of [{}] failed, treating result as null");
     }
 
     /**
@@ -50,7 +51,26 @@ public class Warnings {
         int columnNumber,
         String sourceText
     ) {
-        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "treating result as false");
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "evaluation of [{}] failed, treating result as false");
+    }
+
+    /**
+     * Create a new warnings object based on the given mode which warns that
+     * evaluation resulted in warnings.
+     * @param warningsMode The warnings collection strategy to use
+     * @param lineNumber The line number of the source text. Same as `source.getLineNumber()`
+     * @param columnNumber The column number of the source text. Same as `source.getColumnNumber()`
+     * @param sourceText The source text that caused the warning. Same as `source.text()`
+     * @return A warnings collector object
+     */
+    // TODO: rename to createWarnings
+    public static Warnings createOnlyWarnings(
+        DriverContext.WarningsMode warningsMode,
+        int lineNumber,
+        int columnNumber,
+        String sourceText
+    ) {
+        return createWarnings(warningsMode, lineNumber, columnNumber, sourceText, "warnings during evaluation of [{}]");
     }
 
     private static Warnings createWarnings(
@@ -78,14 +98,7 @@ public class Warnings {
 
     private Warnings(int lineNumber, int columnNumber, String sourceText, String first) {
         this.location = format("Line {}:{}: ", lineNumber, columnNumber);
-        this.first = format(
-            null,
-            "{}evaluation of [{}] failed, {}. Only first {} failures recorded.",
-            location,
-            sourceText,
-            first,
-            MAX_ADDED_WARNINGS
-        );
+        this.first = format(null, "{}" + first + ". Only first {} failures recorded.", location, sourceText, MAX_ADDED_WARNINGS);
     }
 
     public void registerException(Exception exception) {

+ 86 - 0
x-pack/plugin/esql/compute/src/test/java/org/elasticsearch/compute/operator/ChangePointOperatorTests.java

@@ -0,0 +1,86 @@
+/*
+ * 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.compute.operator;
+
+import org.apache.lucene.util.BytesRef;
+import org.elasticsearch.compute.data.BlockFactory;
+import org.elasticsearch.compute.data.BytesRefBlock;
+import org.elasticsearch.compute.data.DoubleBlock;
+import org.elasticsearch.compute.data.LongBlock;
+import org.elasticsearch.compute.data.Page;
+import org.elasticsearch.compute.test.OperatorTestCase;
+import org.elasticsearch.compute.test.SequenceLongBlockSourceOperator;
+import org.hamcrest.Matcher;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.hasSize;
+
+public class ChangePointOperatorTests extends OperatorTestCase {
+
+    @Override
+    protected SourceOperator simpleInput(BlockFactory blockFactory, int size) {
+        // size must be in [25, 1000] for ChangePoint to function correctly
+        // and detect the step change.
+        size = Math.clamp(size, 25, 1000);
+        List<Long> data = new ArrayList<>(size);
+        for (int i = 0; i < size; i++) {
+            if (i <= size / 2) {
+                data.add(0L);
+            } else {
+                data.add(1L);
+            }
+        }
+        return new SequenceLongBlockSourceOperator(blockFactory, data);
+    }
+
+    @Override
+    protected void assertSimpleOutput(List<Page> input, List<Page> results) {
+        boolean seenOne = false;
+        assertThat(results, hasSize(input.size()));
+        for (int i = 0; i < results.size(); i++) {
+            Page inputPage = input.get(i);
+            Page resultPage = results.get(i);
+            assertThat(resultPage.getPositionCount(), equalTo(inputPage.getPositionCount()));
+            assertThat(resultPage.getBlockCount(), equalTo(3));
+            for (int j = 0; j < resultPage.getPositionCount(); j++) {
+                long inputValue = ((LongBlock) resultPage.getBlock(0)).getLong(j);
+                long resultValue = ((LongBlock) resultPage.getBlock(0)).getLong(j);
+                assertThat(resultValue, equalTo(inputValue));
+                if (seenOne == false && resultValue == 1L) {
+                    BytesRef type = ((BytesRefBlock) resultPage.getBlock(1)).getBytesRef(j, new BytesRef());
+                    double pvalue = ((DoubleBlock) resultPage.getBlock(2)).getDouble(j);
+                    assertThat(type.utf8ToString(), equalTo("step_change"));
+                    assertThat(pvalue, equalTo(0.0));
+                    seenOne = true;
+                } else {
+                    assertThat(resultPage.getBlock(1).isNull(j), equalTo(true));
+                    assertThat(resultPage.getBlock(2).isNull(j), equalTo(true));
+                }
+            }
+        }
+        assertThat(seenOne, equalTo(true));
+    }
+
+    @Override
+    protected Operator.OperatorFactory simple() {
+        return new ChangePointOperator.Factory(0, null, 0, 0);
+    }
+
+    @Override
+    protected Matcher<String> expectedDescriptionOfSimple() {
+        return equalTo("ChangePointOperator[channel=0]");
+    }
+
+    @Override
+    protected Matcher<String> expectedToStringOfSimple() {
+        return equalTo("ChangePointOperator[channel=0]");
+    }
+}

+ 0 - 1
x-pack/plugin/esql/compute/test/src/main/java/org/elasticsearch/compute/test/OperatorTestCase.java

@@ -46,7 +46,6 @@ import java.util.stream.LongStream;
 
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.in;
 
 /**
  * Base tests for {@link Operator}s that are not {@link SourceOperator} or {@link SinkOperator}.

+ 1200 - 0
x-pack/plugin/esql/qa/testFixtures/src/main/resources/change_point.csv-spec

@@ -0,0 +1,1200 @@
+detect nothing (long)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+;
+
+count:long | @timestamp:datetime      | type:keyword | pvalue:double
+4          | 2024-05-10T00:00:00.000Z | null         | null
+4          | 2024-05-10T00:01:00.000Z | null         | null
+8          | 2024-05-10T00:02:00.000Z | null         | null
+8          | 2024-05-10T00:03:00.000Z | null         | null
+5          | 2024-05-10T00:04:00.000Z | null         | null
+8          | 2024-05-10T00:05:00.000Z | null         | null
+10         | 2024-05-10T00:06:00.000Z | null         | null
+5          | 2024-05-10T00:07:00.000Z | null         | null
+12         | 2024-05-10T00:08:00.000Z | null         | null
+20         | 2024-05-10T00:09:00.000Z | null         | null
+5          | 2024-05-10T00:10:00.000Z | null         | null
+7          | 2024-05-10T00:11:00.000Z | null         | null
+8          | 2024-05-10T00:12:00.000Z | null         | null
+9          | 2024-05-10T00:13:00.000Z | null         | null
+9          | 2024-05-10T00:14:00.000Z | null         | null
+11         | 2024-05-10T00:15:00.000Z | null         | null
+7          | 2024-05-10T00:16:00.000Z | null         | null
+15         | 2024-05-10T00:17:00.000Z | null         | null
+17         | 2024-05-10T00:18:00.000Z | null         | null
+5          | 2024-05-10T00:19:00.000Z | null         | null
+10         | 2024-05-10T00:20:00.000Z | null         | null
+4          | 2024-05-10T00:21:00.000Z | null         | null
+9          | 2024-05-10T00:22:00.000Z | null         | null
+;
+
+
+detect spike (long; default output columns)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | 5          | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 112        | spike        | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 7          | null         | null
+2024-05-10T00:12:00.000Z | 8          | null         | null
+2024-05-10T00:13:00.000Z | 9          | null         | null
+2024-05-10T00:14:00.000Z | 9          | null         | null
+2024-05-10T00:15:00.000Z | 11         | null         | null
+2024-05-10T00:16:00.000Z | 7          | null         | null
+2024-05-10T00:17:00.000Z | 15         | null         | null
+2024-05-10T00:18:00.000Z | 17         | null         | null
+2024-05-10T00:19:00.000Z | 5          | null         | null
+2024-05-10T00:20:00.000Z | 10         | null         | null
+2024-05-10T00:21:00.000Z | 4          | null         | null
+2024-05-10T00:22:00.000Z | 9          | null         | null
+;
+
+
+detect step change (long; default timestamp)
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count AS type, pvalue
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | 5          | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 12         | null         | null
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.0924162021968114E-23
+2024-05-10T00:12:00.000Z | 108        | null         | null
+2024-05-10T00:13:00.000Z | 109        | null         | null
+2024-05-10T00:14:00.000Z | 109        | null         | null
+2024-05-10T00:15:00.000Z | 111        | null         | null
+2024-05-10T00:16:00.000Z | 107        | null         | null
+2024-05-10T00:17:00.000Z | 115        | null         | null
+2024-05-10T00:18:00.000Z | 117        | null         | null
+2024-05-10T00:19:00.000Z | 105        | null         | null
+2024-05-10T00:20:00.000Z | 110        | null         | null
+2024-05-10T00:21:00.000Z | 104        | null         | null
+2024-05-10T00:22:00.000Z | 109        | null         | null
+;
+
+
+detect dip (double)
+required_capability: change_point
+
+FROM employees
+  | STATS salary=AVG(salary) BY height
+  | EVAL salary=CASE(height==2.1, 0.0, salary)
+  | CHANGE_POINT salary ON height AS type, pvalue
+;
+
+height:double | salary:double      | type:keyword | pvalue:double       
+1.41          | 40031.0            | null         | null                
+1.42          | 34142.5            | null         | null                
+1.44          | 40266.0            | null         | null                
+1.45          | 49095.0            | null         | null                
+1.46          | 39878.0            | null         | null                
+1.47          | 60408.0            | null         | null                
+1.48          | 44307.0            | null         | null                
+1.5           | 31120.0            | null         | null                
+1.51          | 28035.0            | null         | null                
+1.52          | 41243.5            | null         | null                
+1.53          | 60079.333333333336 | null         | null                
+1.54          | 61358.0            | null         | null                
+1.55          | 36876.5            | null         | null                
+1.56          | 60335.0            | null         | null                
+1.57          | 38486.0            | null         | null                
+1.58          | 41701.5            | null         | null                
+1.59          | 36575.666666666664 | null         | null                
+1.61          | 55299.5            | null         | null                
+1.63          | 70011.0            | null         | null                
+1.64          | 38992.0            | null         | null                
+1.66          | 28946.0            | null         | null                
+1.68          | 42155.5            | null         | null                
+1.69          | 45656.0            | null         | null                
+1.7           | 65092.25           | null         | null                
+1.74          | 53178.0            | null         | null                
+1.75          | 43429.0            | null         | null                
+1.77          | 54184.25           | null         | null                
+1.78          | 44147.5            | null         | null                
+1.79          | 55360.0            | null         | null                
+1.8           | 52833.0            | null         | null                
+1.81          | 56475.666666666664 | null         | null                
+1.82          | 56039.333333333336 | null         | null                
+1.83          | 54195.333333333336 | null         | null                
+1.85          | 66174.0            | null         | null                
+1.87          | 47411.0            | null         | null                
+1.89          | 58121.0            | null         | null                
+1.9           | 37112.0            | null         | null                
+1.91          | 39638.0            | null         | null                
+1.92          | 67492.0            | null         | null                
+1.93          | 33956.0            | null         | null                
+1.94          | 48193.333333333336 | null         | null                
+1.96          | 43026.0            | null         | null                
+1.97          | 52851.0            | null         | null                
+1.99          | 56068.0            | null         | null                
+2.0           | 36314.666666666664 | null         | null                
+2.01          | 35742.0            | null         | null                
+2.03          | 51130.5            | null         | null                
+2.04          | 49281.0            | null         | null                
+2.05          | 63528.0            | null         | null                
+2.06          | 56722.5            | null         | null                
+2.07          | 39984.0            | null         | null                
+2.08          | 60523.0            | null         | null                
+2.09          | 38645.0            | null         | null                
+2.1           | 0.0                | dip          | 9.590143836835097E-6  
+;
+
+
+no stats command
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null         
+10002          | 56371          | null         | null         
+10003          | 61805          | null         | null         
+10004          | 36174          | null         | null         
+10005          | 63528          | null         | null         
+10006          | 60335          | null         | null         
+10007          | 74572          | null         | null         
+10008          | 43906          | null         | null         
+10009          | 66174          | null         | null         
+10010          | 45797          | null         | null         
+10011          | 31120          | null         | null         
+10012          | 48942          | null         | null         
+10013          | 48735          | null         | null         
+10014          | 37137          | null         | null         
+10015          | 25324          | null         | null         
+10016          | 61358          | null         | null         
+10017          | 58715          | null         | null         
+10018          | 56760          | null         | null         
+10019          | 73717          | null         | null         
+10020          | 40031          | null         | null         
+10021          | 60408          | null         | null         
+10022          | 48233          | null         | null         
+10023          | 47896          | null         | null         
+10024          | 64675          | null         | null         
+10025          | 47411          | null         | null         
+10026          | 28336          | null         | null         
+10027          | 73851          | null         | null         
+10028          | 39356          | null         | null         
+10029          | 74999          | null         | null         
+10030          | 67492          | null         | null         
+10031          | 37716          | null         | null         
+10032          | 62233          | null         | null         
+10033          | 70011          | null         | null         
+10034          | 39878          | null         | null         
+10035          | 25945          | null         | null         
+10036          | 60781          | null         | null         
+10037          | 37691          | null         | null         
+10038          | 35222          | null         | null         
+10039          | 36051          | null         | null         
+10040          | 37112          | null         | null         
+10041          | 56415          | null         | null         
+10042          | 30404          | null         | null         
+10043          | 34341          | null         | null         
+10044          | 39728          | null         | null         
+10045          | 74970          | null         | null         
+10046          | 50064          | null         | null         
+10047          | 42716          | null         | null         
+10048          | 26436          | null         | null         
+10049          | 37853          | null         | null         
+10050          | 43026          | null         | null         
+10051          | 58121          | null         | null         
+10052          | 55360          | null         | null         
+10053          | 54462          | null         | null         
+10054          | 65367          | null         | null         
+10055          | 49281          | null         | null         
+10056          | 33370          | null         | null         
+10057          | 27215          | null         | null         
+10058          | 38376          | null         | null         
+10059          | 44307          | null         | null         
+10060          | 29175          | null         | null         
+10061          | 49095          | null         | null         
+10062          | 65030          | null         | null         
+10063          | 52121          | null         | null         
+10064          | 33956          | null         | null         
+10065          | 50249          | null         | null         
+10066          | 31897          | null         | null         
+10067          | 52044          | null         | null         
+10068          | 28941          | null         | null         
+10069          | 41933          | null         | null         
+10070          | 54329          | null         | null         
+10071          | 40612          | null         | null         
+10072          | 54518          | null         | null         
+10073          | 32568          | null         | null         
+10074          | 38992          | null         | null         
+10075          | 51956          | null         | null         
+10076          | 62405          | null         | null         
+10077          | 46595          | null         | null         
+10078          | 69904          | null         | null         
+10079          | 32263          | null         | null         
+10080          | 52833          | null         | null         
+10081          | 50128          | null         | null         
+10082          | 49818          | null         | null         
+10083          | 39110          | null         | null         
+10084          | 28035          | null         | null         
+10085          | 35742          | null         | null         
+10086          | 68547          | null         | null         
+10087          | 32272          | null         | null         
+10088          | 39638          | null         | null         
+10089          | 43602          | null         | null         
+10090          | 44956          | null         | null         
+10091          | 38645          | null         | null         
+10092          | 25976          | null         | null         
+10093          | 45656          | null         | null         
+10094          | 66817          | null         | null         
+10095          | 37702          | null         | null         
+10096          | 43889          | null         | null         
+10097          | 71165          | null         | null         
+10098          | 44817          | null         | null         
+10099          | 73578          | null         | null         
+10100          | 68431          | null         | null
+;
+
+
+where before change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary = CASE(emp_no==10022, 100000, salary)
+  | EVAL salary = CASE(emp_no==10033, 1000000, salary)
+  | WHERE emp_no < 10025
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null                 
+10002          | 56371          | null         | null                 
+10003          | 61805          | null         | null                 
+10004          | 36174          | null         | null                 
+10005          | 63528          | null         | null                 
+10006          | 60335          | null         | null                 
+10007          | 74572          | null         | null                 
+10008          | 43906          | null         | null                 
+10009          | 66174          | null         | null                 
+10010          | 45797          | null         | null                 
+10011          | 31120          | null         | null                 
+10012          | 48942          | null         | null                 
+10013          | 48735          | null         | null                 
+10014          | 37137          | null         | null                 
+10015          | 25324          | null         | null                 
+10016          | 61358          | null         | null                 
+10017          | 58715          | null         | null                 
+10018          | 56760          | null         | null                 
+10019          | 73717          | null         | null                 
+10020          | 40031          | null         | null                 
+10021          | 60408          | null         | null                 
+10022          | 100000         | spike        | 0.0019710754505321004
+10023          | 47896          | null         | null                 
+10024          | 64675          | null         | null        
+;
+
+
+where after change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary = CASE(emp_no==10022, 100000, salary)
+  | EVAL salary = CASE(emp_no==10033, 1000000, salary)
+  | CHANGE_POINT salary ON emp_no AS type, pvalue
+  | WHERE emp_no < 10025
+;
+
+emp_no:integer | salary:integer | type:keyword | pvalue:double
+10001          | 57305          | null         | null                 
+10002          | 56371          | null         | null                 
+10003          | 61805          | null         | null                 
+10004          | 36174          | null         | null                 
+10005          | 63528          | null         | null                 
+10006          | 60335          | null         | null                 
+10007          | 74572          | null         | null                 
+10008          | 43906          | null         | null                 
+10009          | 66174          | null         | null                 
+10010          | 45797          | null         | null                 
+10011          | 31120          | null         | null                 
+10012          | 48942          | null         | null                 
+10013          | 48735          | null         | null                 
+10014          | 37137          | null         | null                 
+10015          | 25324          | null         | null                 
+10016          | 61358          | null         | null                 
+10017          | 58715          | null         | null                 
+10018          | 56760          | null         | null                 
+10019          | 73717          | null         | null                 
+10020          | 40031          | null         | null                 
+10021          | 60408          | null         | null                 
+10022          | 100000         | null         | null
+10023          | 47896          | null         | null                 
+10024          | 64675          | null         | null        
+;
+
+
+where with shadowing
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary=CASE(emp_no==10015, -1000000, salary)
+  | WHERE emp_no < 10025
+  | CHANGE_POINT salary ON emp_no AS type, emp_no
+  | WHERE emp_no IS NOT NULL
+  | RENAME emp_no AS pvalue
+;
+
+salary:integer | type:keyword | pvalue:double
+-1000000       | dip          | 0.0          
+;
+
+
+stats after change point
+required_capability: change_point
+
+FROM employees
+  | KEEP emp_no, salary
+  | EVAL salary=CASE(emp_no==10042, 1000000, salary)
+  | CHANGE_POINT salary ON emp_no
+  | STATS COUNT() by type
+  | SORT type
+;
+
+COUNT():long | type:keyword
+1            | spike
+99           | null
+;
+
+
+sort/limit before change point
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | SORT count, @timestamp
+  | LIMIT 22
+  | CHANGE_POINT count AS type, pvalue
+;
+
+count:long | @timestamp:datetime      | type:keyword | pvalue:double
+4          | 2024-05-10T00:00:00.000Z | null         | null         
+4          | 2024-05-10T00:01:00.000Z | null         | null         
+8          | 2024-05-10T00:02:00.000Z | null         | null         
+8          | 2024-05-10T00:03:00.000Z | null         | null         
+5          | 2024-05-10T00:04:00.000Z | null         | null         
+8          | 2024-05-10T00:05:00.000Z | null         | null         
+10         | 2024-05-10T00:06:00.000Z | null         | null         
+5          | 2024-05-10T00:07:00.000Z | null         | null         
+12         | 2024-05-10T00:08:00.000Z | null         | null         
+5          | 2024-05-10T00:10:00.000Z | null         | null         
+7          | 2024-05-10T00:11:00.000Z | null         | null         
+8          | 2024-05-10T00:12:00.000Z | null         | null         
+9          | 2024-05-10T00:13:00.000Z | null         | null         
+9          | 2024-05-10T00:14:00.000Z | null         | null         
+11         | 2024-05-10T00:15:00.000Z | null         | null         
+7          | 2024-05-10T00:16:00.000Z | null         | null         
+15         | 2024-05-10T00:17:00.000Z | null         | null         
+17         | 2024-05-10T00:18:00.000Z | null         | null         
+5          | 2024-05-10T00:19:00.000Z | null         | null         
+10         | 2024-05-10T00:20:00.000Z | null         | null         
+4          | 2024-05-10T00:21:00.000Z | null         | null         
+9          | 2024-05-10T00:22:00.000Z | null         | null   
+;
+
+
+sort after change point
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count AS type, pvalue
+  | SORT type, count, @timestamp
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.0924162021968114E-23
+2024-05-10T00:00:00.000Z | 4          | null         | null                  
+2024-05-10T00:01:00.000Z | 4          | null         | null                  
+2024-05-10T00:04:00.000Z | 5          | null         | null                  
+2024-05-10T00:07:00.000Z | 5          | null         | null                  
+2024-05-10T00:10:00.000Z | 5          | null         | null                  
+2024-05-10T00:02:00.000Z | 8          | null         | null                  
+2024-05-10T00:03:00.000Z | 8          | null         | null                  
+2024-05-10T00:05:00.000Z | 8          | null         | null                  
+2024-05-10T00:06:00.000Z | 10         | null         | null                  
+2024-05-10T00:08:00.000Z | 12         | null         | null                  
+2024-05-10T00:09:00.000Z | 20         | null         | null                  
+2024-05-10T00:21:00.000Z | 104        | null         | null                  
+2024-05-10T00:19:00.000Z | 105        | null         | null                  
+2024-05-10T00:16:00.000Z | 107        | null         | null                  
+2024-05-10T00:12:00.000Z | 108        | null         | null                  
+2024-05-10T00:13:00.000Z | 109        | null         | null                  
+2024-05-10T00:14:00.000Z | 109        | null         | null                  
+2024-05-10T00:22:00.000Z | 109        | null         | null                  
+2024-05-10T00:20:00.000Z | 110        | null         | null                  
+2024-05-10T00:15:00.000Z | 111        | null         | null                  
+2024-05-10T00:17:00.000Z | 115        | null         | null                  
+2024-05-10T00:18:00.000Z | 117        | null         | null                  
+;
+
+
+reuse input column names
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS @timestamp, count
+;
+
+@timestamp:keyword | count:double
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+spike              | 1.7502597878858522E-193
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+null               | null
+;
+
+
+reuse value column name twice
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS count, count
+;
+
+@timestamp:datetime      | count:double           
+2024-05-10T00:00:00.000Z | null                   
+2024-05-10T00:01:00.000Z | null                   
+2024-05-10T00:02:00.000Z | null                   
+2024-05-10T00:03:00.000Z | null                   
+2024-05-10T00:04:00.000Z | null                   
+2024-05-10T00:05:00.000Z | null                   
+2024-05-10T00:06:00.000Z | null                   
+2024-05-10T00:07:00.000Z | null                   
+2024-05-10T00:08:00.000Z | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | null                   
+2024-05-10T00:10:00.000Z | null                   
+2024-05-10T00:11:00.000Z | null                   
+2024-05-10T00:12:00.000Z | null                   
+2024-05-10T00:13:00.000Z | null                   
+2024-05-10T00:14:00.000Z | null                   
+2024-05-10T00:15:00.000Z | null                   
+2024-05-10T00:16:00.000Z | null                   
+2024-05-10T00:17:00.000Z | null                   
+2024-05-10T00:18:00.000Z | null                   
+2024-05-10T00:19:00.000Z | null                   
+2024-05-10T00:20:00.000Z | null                   
+2024-05-10T00:21:00.000Z | null                   
+2024-05-10T00:22:00.000Z | null                   
+;
+
+
+same key and value column
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY BUCKET(@timestamp, 1 MINUTE)
+  | KEEP count
+  | CHANGE_POINT count ON count AS type, pvalue
+;
+
+count:long | type:keyword | pvalue:double
+4          | null         | null                 
+4          | null         | null                 
+4          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+5          | null         | null                 
+7          | null         | null                 
+7          | null         | null                 
+8          | null         | null                 
+8          | null         | null                 
+8          | null         | null                 
+8          | trend_change | 3.793633808495355E-12
+9          | null         | null                 
+9          | null         | null                 
+9          | null         | null                 
+10         | null         | null                 
+10         | null         | null                 
+11         | null         | null                 
+12         | null         | null                 
+15         | null         | null                 
+17         | null         | null                 
+20         | null         | null 
+;
+
+
+all four columns the same
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY BUCKET(@timestamp, 1 MINUTE)
+  | KEEP count
+  | CHANGE_POINT count ON count AS count, count
+;
+
+count:double
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+3.793633808495355E-12
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null                 
+null 
+;
+
+
+rename columns
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp=="2024-05-10T00:08:00.000Z", 100, 0)
+  | RENAME count AS count2, @timestamp AS time2
+  | CHANGE_POINT count2 ON time2 AS type, pvalue
+  | RENAME time2 AS time, count2 AS cnt, type AS kind, pvalue AS significance
+;
+
+time:datetime            | cnt:long | kind:keyword | significance:double    
+2024-05-10T00:00:00.000Z | 4        | null         | null                   
+2024-05-10T00:01:00.000Z | 4        | null         | null                   
+2024-05-10T00:02:00.000Z | 8        | null         | null                   
+2024-05-10T00:03:00.000Z | 8        | null         | null                   
+2024-05-10T00:04:00.000Z | 5        | null         | null                   
+2024-05-10T00:05:00.000Z | 8        | null         | null                   
+2024-05-10T00:06:00.000Z | 10       | null         | null                   
+2024-05-10T00:07:00.000Z | 5        | null         | null                   
+2024-05-10T00:08:00.000Z | 112      | spike        | 1.7502597878858522E-193
+2024-05-10T00:09:00.000Z | 20       | null         | null                   
+2024-05-10T00:10:00.000Z | 5        | null         | null                   
+2024-05-10T00:11:00.000Z | 7        | null         | null                   
+2024-05-10T00:12:00.000Z | 8        | null         | null                   
+2024-05-10T00:13:00.000Z | 9        | null         | null                   
+2024-05-10T00:14:00.000Z | 9        | null         | null                   
+2024-05-10T00:15:00.000Z | 11       | null         | null                   
+2024-05-10T00:16:00.000Z | 7        | null         | null                   
+2024-05-10T00:17:00.000Z | 15       | null         | null                   
+2024-05-10T00:18:00.000Z | 17       | null         | null                   
+2024-05-10T00:19:00.000Z | 5        | null         | null                   
+2024-05-10T00:20:00.000Z | 10       | null         | null                   
+2024-05-10T00:21:00.000Z | 4        | null         | null                   
+2024-05-10T00:22:00.000Z | 9        | null         | null                   
+;
+
+
+null keys
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL @timestamp=CASE(@timestamp=="2024-05-10T00:04:00.000Z", NULL, @timestamp)
+  | EVAL @timestamp=CASE(@timestamp=="2024-05-10T00:08:00.000Z", NULL, @timestamp)
+  | EVAL count=count+CASE(@timestamp<="2024-05-10T00:11:00.000Z", 100, 0)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+  | SORT @timestamp, count
+;
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double        
+2024-05-10T00:00:00.000Z | 104        | null         | null                 
+2024-05-10T00:01:00.000Z | 104        | null         | null                 
+2024-05-10T00:02:00.000Z | 108        | null         | null                 
+2024-05-10T00:03:00.000Z | 108        | null         | null                 
+2024-05-10T00:05:00.000Z | 108        | null         | null                 
+2024-05-10T00:06:00.000Z | 110        | null         | null                 
+2024-05-10T00:07:00.000Z | 105        | null         | null                 
+2024-05-10T00:09:00.000Z | 120        | null         | null                 
+2024-05-10T00:10:00.000Z | 105        | null         | null                 
+2024-05-10T00:11:00.000Z | 107        | null         | null                 
+2024-05-10T00:12:00.000Z | 8          | step_change  | 9.678892139828202E-24
+2024-05-10T00:13:00.000Z | 9          | null         | null                 
+2024-05-10T00:14:00.000Z | 9          | null         | null                 
+2024-05-10T00:15:00.000Z | 11         | null         | null                 
+2024-05-10T00:16:00.000Z | 7          | null         | null                 
+2024-05-10T00:17:00.000Z | 15         | null         | null                 
+2024-05-10T00:18:00.000Z | 17         | null         | null                 
+2024-05-10T00:19:00.000Z | 5          | null         | null                 
+2024-05-10T00:20:00.000Z | 10         | null         | null                 
+2024-05-10T00:21:00.000Z | 4          | null         | null                 
+2024-05-10T00:22:00.000Z | 9          | null         | null                 
+null                     | 5          | null         | null  
+null                     | 12         | null         | null                 
+;
+
+null values
+required_capability: change_point
+
+FROM k8s
+  | STATS count=COUNT() BY @timestamp=BUCKET(@timestamp, 1 MINUTE)
+  | EVAL count=count+CASE(@timestamp>="2024-05-10T00:11:00.000Z", 100, 0)
+  | EVAL count=CASE(@timestamp=="2024-05-10T00:04:00.000Z", NULL, count)
+  | CHANGE_POINT count ON @timestamp AS type, pvalue
+;
+
+warning:Line 5:3: warnings during evaluation of [CHANGE_POINT count ON @timestamp AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 5:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
+
+@timestamp:datetime      | count:long | type:keyword | pvalue:double
+2024-05-10T00:00:00.000Z | 4          | null         | null
+2024-05-10T00:01:00.000Z | 4          | null         | null
+2024-05-10T00:02:00.000Z | 8          | null         | null
+2024-05-10T00:03:00.000Z | 8          | null         | null
+2024-05-10T00:04:00.000Z | null       | null         | null
+2024-05-10T00:05:00.000Z | 8          | null         | null
+2024-05-10T00:06:00.000Z | 10         | null         | null
+2024-05-10T00:07:00.000Z | 5          | null         | null
+2024-05-10T00:08:00.000Z | 12         | null         | null
+2024-05-10T00:09:00.000Z | 20         | null         | null
+2024-05-10T00:10:00.000Z | 5          | null         | null
+2024-05-10T00:11:00.000Z | 107        | step_change  | 3.438939970021414E-22
+2024-05-10T00:12:00.000Z | 108        | null         | null
+2024-05-10T00:13:00.000Z | 109        | null         | null
+2024-05-10T00:14:00.000Z | 109        | null         | null
+2024-05-10T00:15:00.000Z | 111        | null         | null
+2024-05-10T00:16:00.000Z | 107        | null         | null
+2024-05-10T00:17:00.000Z | 115        | null         | null
+2024-05-10T00:18:00.000Z | 117        | null         | null
+2024-05-10T00:19:00.000Z | 105        | null         | null
+2024-05-10T00:20:00.000Z | 110        | null         | null
+2024-05-10T00:21:00.000Z | 104        | null         | null
+2024-05-10T00:22:00.000Z | 109        | null         | null
+;
+
+
+multivalued
+required_capability: change_point
+
+FROM employees
+  | STATS salary=MV_SORT(VALUES(salary)) BY height
+  | EVAL salary = CASE(height == 1.5, [1, 22222, 33333], salary)
+  | EVAL salary = CASE(height == 1.63, [43210, -10000, 999999999], salary)
+  | EVAL salary = CASE(height == 1.8, 999999999, salary)
+  | CHANGE_POINT salary ON height
+;
+
+warning:Line 6:3: warnings during evaluation of [CHANGE_POINT salary ON height]. Only first 20 failures recorded.
+warning:Line 6:3: java.lang.IllegalArgumentException: values contains multivalued entries; skipping them (please consider reducing them with e.g. MV_AVG or MV_SUM)
+
+height:double | salary:integer                      | type:keyword | pvalue:double       
+1.41          | 40031                               | null         | null                
+1.42          | [29175, 39110]                      | null         | null                
+1.44          | [30404, 50128]                      | null         | null                
+1.45          | 49095                               | null         | null                
+1.46          | 39878                               | null         | null                
+1.47          | 60408                               | null         | null                
+1.48          | 44307                               | null         | null                
+1.5           | [1, 22222, 33333]                   | null         | null
+1.51          | 28035                               | null         | null                
+1.52          | [34341, 37853, 42716, 50064]        | null         | null                
+1.53          | [35222, 71165, 73851]               | null         | null                
+1.54          | 61358                               | null         | null                
+1.55          | [36051, 37702]                      | null         | null                
+1.56          | 60335                               | null         | null                
+1.57          | [33370, 43602]                      | null         | null                
+1.58          | [28941, 54462]                      | null         | null                
+1.59          | [27215, 32263, 50249]               | null         | null                
+1.61          | [49818, 60781]                      | null         | null                
+1.63          | [43210, -10000, 999999999]          | null         | null                
+1.64          | 38992                               | null         | null                
+1.66          | [25324, 32568]                      | null         | null                
+1.68          | [37716, 46595]                      | null         | null                
+1.69          | 45656                               | null         | null                
+1.7           | [45797, 65030, 74572, 74970]        | null         | null                
+1.74          | [32272, 58715, 68547]               | null         | null                
+1.75          | [25976, 47896, 56415]               | null         | null                
+1.77          | [41933, 52044, 54329, 68431]        | null         | null                
+1.78          | [36174, 52121]                      | null         | null                
+1.79          | 55360                               | null         | null                
+1.8           | 999999999                           | spike        | 0.0                
+1.81          | [25945, 69904, 73578]               | null         | null                
+1.82          | [48233, 54518, 65367]               | null         | null                
+1.83          | [38376, 61805, 62405]               | null         | null                
+1.85          | 66174                               | null         | null                
+1.87          | 47411                               | null         | null                
+1.89          | 58121                               | null         | null                
+1.9           | 37112                               | null         | null                
+1.91          | 39638                               | null         | null                
+1.92          | 67492                               | null         | null                
+1.93          | 33956                               | null         | null                
+1.94          | [43889, 48735, 51956]               | null         | null                
+1.96          | 43026                               | null         | null                
+1.97          | [48942, 56760]                      | null         | null                
+1.99          | [37137, 74999]                      | null         | null                
+2.0           | [26436, 37691, 44817]               | null         | null                
+2.01          | 35742                               | null         | null                
+2.03          | [44956, 57305]                      | null         | null                
+2.04          | 49281                               | null         | null                
+2.05          | 63528                               | null         | null                
+2.06          | [39728, 73717]                      | null         | null                
+2.07          | [39356, 40612]                      | null         | null                
+2.08          | [56371, 64675]                      | null         | null                
+2.09          | 38645                               | null         | null                
+2.1           | [28336, 31897, 43906, 62233, 66817] | null         | null                              
+;
+
+
+multivalued with MV_AVG
+required_capability: change_point
+
+FROM employees
+  | STATS salary=MV_SORT(VALUES(salary)) BY height
+  | EVAL salary = CASE(height == 1.5, [1, 22222, 33333], salary)
+  | EVAL salary = CASE(height == 1.63, [43210, -10000, 999999999], salary)
+  | EVAL salary = MV_AVG(salary)
+  | CHANGE_POINT salary ON height
+;
+
+height:double | salary:double      | type:keyword | pvalue:double
+1.41          | 40031.0            | null         | null         
+1.42          | 34142.5            | null         | null         
+1.44          | 40266.0            | null         | null         
+1.45          | 49095.0            | null         | null         
+1.46          | 39878.0            | null         | null         
+1.47          | 60408.0            | null         | null         
+1.48          | 44307.0            | null         | null         
+1.5           | 18518.666666666668 | null         | null         
+1.51          | 28035.0            | null         | null         
+1.52          | 41243.5            | null         | null         
+1.53          | 60079.333333333336 | null         | null         
+1.54          | 61358.0            | null         | null         
+1.55          | 36876.5            | null         | null         
+1.56          | 60335.0            | null         | null         
+1.57          | 38486.0            | null         | null         
+1.58          | 41701.5            | null         | null         
+1.59          | 36575.666666666664 | null         | null         
+1.61          | 55299.5            | null         | null         
+1.63          | 3.33344403E8       | spike        | 0.0          
+1.64          | 38992.0            | null         | null         
+1.66          | 28946.0            | null         | null         
+1.68          | 42155.5            | null         | null         
+1.69          | 45656.0            | null         | null         
+1.7           | 65092.25           | null         | null         
+1.74          | 53178.0            | null         | null         
+1.75          | 43429.0            | null         | null         
+1.77          | 54184.25           | null         | null         
+1.78          | 44147.5            | null         | null         
+1.79          | 55360.0            | null         | null         
+1.8           | 52833.0            | null         | null         
+1.81          | 56475.666666666664 | null         | null         
+1.82          | 56039.333333333336 | null         | null         
+1.83          | 54195.333333333336 | null         | null         
+1.85          | 66174.0            | null         | null         
+1.87          | 47411.0            | null         | null         
+1.89          | 58121.0            | null         | null         
+1.9           | 37112.0            | null         | null         
+1.91          | 39638.0            | null         | null         
+1.92          | 67492.0            | null         | null         
+1.93          | 33956.0            | null         | null         
+1.94          | 48193.333333333336 | null         | null         
+1.96          | 43026.0            | null         | null         
+1.97          | 52851.0            | null         | null         
+1.99          | 56068.0            | null         | null         
+2.0           | 36314.666666666664 | null         | null         
+2.01          | 35742.0            | null         | null         
+2.03          | 51130.5            | null         | null         
+2.04          | 49281.0            | null         | null         
+2.05          | 63528.0            | null         | null         
+2.06          | 56722.5            | null         | null         
+2.07          | 39984.0            | null         | null         
+2.08          | 60523.0            | null         | null         
+2.09          | 38645.0            | null         | null         
+2.1           | 46637.8            | null         | null                            
+;
+
+
+too much data (change point inside limit)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "I42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | WHERE type IS NOT NULL
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+key:keyword | value:integer | type:keyword | pvalue:double
+I42         | 1000          | step_change  | 0.0          
+;
+
+
+too much data (change point outside limit)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "L42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | WHERE type IS NOT NULL
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+key:keyword | value:integer | type:keyword | pvalue:double
+;
+
+
+too much data (assert output size)
+required_capability: change_point
+
+ROW key1=["A","B","C","D","E","F","G","H","I","J","K","L","M"], 
+    key2=["0","1","2","3","4","5","6","7","8","9"], 
+    key3=["0","1","2","3","4","5","6","7","8","9"]
+  | MV_EXPAND key1
+  | MV_EXPAND key2
+  | MV_EXPAND key3
+  | EVAL key=CONCAT(key1,key2,key3)
+  | EVAL value=CASE(key >= "I42", 1000, 1)
+  | KEEP key, value
+  | CHANGE_POINT value ON key AS type, pvalue
+  | STATS count=COUNT()
+;
+
+warning:Line 10:3: warnings during evaluation of [CHANGE_POINT value ON key AS type, pvalue]. Only first 20 failures recorded.
+warning:Line 10:3: java.lang.IllegalArgumentException: too many values; keeping only first 1000 values
+
+count:LONG
+1000      
+;
+
+
+detect trend_change (using row)
+required_capability: change_point
+
+ROW time = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
+  | MV_EXPAND time
+  | EVAL val = ABS(15-time)
+  | CHANGE_POINT val ON time
+;
+
+time:integer | val:integer | type:keyword | pvalue:double
+1            | 14          | null         | null                   
+2            | 13          | null         | null                   
+3            | 12          | null         | null                   
+4            | 11          | null         | null                   
+5            | 10          | null         | null                   
+6            | 9           | null         | null                   
+7            | 8           | null         | null                   
+8            | 7           | null         | null                   
+9            | 6           | null         | null                   
+10           | 5           | null         | null                   
+11           | 4           | null         | null                   
+12           | 3           | null         | null                   
+13           | 2           | null         | null                   
+14           | 1           | null         | null                   
+15           | 0           | trend_change | 1.2352704486638883E-112
+16           | 1           | null         | null                   
+17           | 2           | null         | null                   
+18           | 3           | null         | null                   
+19           | 4           | null         | null                   
+20           | 5           | null         | null                   
+21           | 6           | null         | null                   
+22           | 7           | null         | null                   
+23           | 8           | null         | null                   
+24           | 9           | null         | null                   
+25           | 10          | null         | null               
+;
+
+
+keys null column
+required_capability: change_point
+
+ROW key=NULL, value=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
+  | MV_EXPAND value
+  | CHANGE_POINT value ON key
+;
+
+key:null | value:integer | type:keyword | pvalue:double
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+null     | 1             | null         | null         
+;
+
+
+values null column
+required_capability: change_point
+
+ROW time=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24], values=NULL::INTEGER
+  | MV_EXPAND time
+  | CHANGE_POINT values ON time
+;
+
+warning: Line 3:3: evaluation of [CHANGE_POINT values ON time] failed, treating result as null. Only first 20 failures recorded.
+warning: Line 3:3: java.lang.IllegalArgumentException: not enough buckets to calculate change_point. Requires at least [22]; found [0]
+warning: Line 3:3: java.lang.IllegalArgumentException: values contain nulls; skipping them
+
+time:integer | values:integer | type:keyword | pvalue:double
+1            | null           | null         | null         
+2            | null           | null         | null         
+3            | null           | null         | null         
+4            | null           | null         | null         
+5            | null           | null         | null         
+6            | null           | null         | null         
+7            | null           | null         | null         
+8            | null           | null         | null         
+9            | null           | null         | null         
+10           | null           | null         | null         
+11           | null           | null         | null         
+12           | null           | null         | null         
+13           | null           | null         | null         
+14           | null           | null         | null         
+15           | null           | null         | null         
+16           | null           | null         | null         
+17           | null           | null         | null         
+18           | null           | null         | null         
+19           | null           | null         | null         
+20           | null           | null         | null         
+21           | null           | null         | null         
+22           | null           | null         | null         
+23           | null           | null         | null         
+24           | null           | null         | null         
+25           | null           | null         | null         
+;
+
+
+row with integer key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL value=CASE(key<13, 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:integer | value:integer | type:keyword | pvalue:double
+13          | 1             | step_change  | 0.0         
+;
+
+
+row with long key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_LONG(key), value=CASE(key<13, 0::LONG, 1::LONG)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:long | value:long | type:keyword | pvalue:double
+13       | 1          | step_change  | 0.0         
+;
+
+
+row with double key and value
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_DOUBLE(key), value=CASE(key<13, 0::DOUBLE, 1::DOUBLE)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:double | value:double | type:keyword | pvalue:double
+13         | 1            | step_change  | 0.0         
+;
+
+
+row with string key
+required_capability: change_point
+
+ROW key=["23","17","02","06","01","21","12","15","19","07","11","05","24","04","10","14","13","22","09","18","20","08","25","16","03"]
+  | MV_EXPAND key
+  | EVAL value=CASE(key<"13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:string | value:integer | type:keyword | pvalue:double
+13         | 1             | step_change  | 0.0         
+;
+
+
+row with datetime key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_DATETIME(key), value=CASE(key<"1970-01-01T00:00:00.013Z", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:datetime             | value:integer | type:keyword | pvalue:double
+1970-01-01T00:00:00.013Z | 1             | step_change  | 0.0          
+;
+
+
+row with ip key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_STRING(key), key=TO_IP(CONCAT(key,".",key,".",key,".",key)), value=CASE(key<"13.13.13.13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:ip      | value:integer | type:keyword | pvalue:double
+13.13.13.13 | 1             | step_change  | 0.0          
+;
+
+
+row with version key
+required_capability: change_point
+
+ROW key=[7,13,12,17,14,5,16,10,19,18,20,2,3,21,25,4,22,15,6,23,9,11,1,8,24]
+  | MV_EXPAND key
+  | EVAL key=TO_STRING(key), key=TO_VERSION(CONCAT(key,".",key,".",key)), value=CASE(key<"13.13.13", 0, 1)
+  | CHANGE_POINT value ON key
+  | WHERE type IS NOT NULL
+;
+
+key:version | value:integer | type:keyword | pvalue:double
+13.13.13    | 1             | step_change  | 0.0          
+;
+
+
+row with boolean key
+required_capability: change_point
+
+ROW key=[1,0,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,1,0,0,1,0,0,0,1]
+  | MV_EXPAND key
+  | EVAL key=TO_BOOLEAN(key), value=CASE(key==false, 0, 1)
+  | CHANGE_POINT value ON key
+;
+
+key:boolean | value:integer | type:keyword | pvalue:double
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+false       | 0             | null         | null         
+true        | 1             | step_change  | 0.0          
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+true        | 1             | null         | null         
+;

+ 23 - 6
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4

@@ -85,13 +85,14 @@ JOIN_LOOKUP : 'lookup'        -> pushMode(JOIN_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_METRICS :     {this.isDevVersion()}? 'metrics'       -> pushMode(METRICS_MODE);
+DEV_CHANGE_POINT : {this.isDevVersion()}? 'change_point'  -> pushMode(CHANGE_POINT_MODE);
+DEV_INLINESTATS :  {this.isDevVersion()}? 'inlinestats'   -> pushMode(EXPRESSION_MODE);
+DEV_LOOKUP :       {this.isDevVersion()}? 'lookup_🐔'     -> pushMode(LOOKUP_MODE);
+DEV_METRICS :      {this.isDevVersion()}? 'metrics'       -> pushMode(METRICS_MODE);
 // list of all JOIN commands
-DEV_JOIN_FULL :   {this.isDevVersion()}? 'full'          -> pushMode(JOIN_MODE);
-DEV_JOIN_LEFT :   {this.isDevVersion()}? 'left'          -> pushMode(JOIN_MODE);
-DEV_JOIN_RIGHT :  {this.isDevVersion()}? 'right'         -> pushMode(JOIN_MODE);
+DEV_JOIN_FULL :    {this.isDevVersion()}? 'full'          -> pushMode(JOIN_MODE);
+DEV_JOIN_LEFT :    {this.isDevVersion()}? 'left'          -> pushMode(JOIN_MODE);
+DEV_JOIN_RIGHT :   {this.isDevVersion()}? 'right'         -> pushMode(JOIN_MODE);
 
 
 //
@@ -638,3 +639,19 @@ CLOSING_METRICS_BY
 CLOSING_METRICS_PIPE
     : PIPE -> type(PIPE), popMode
     ;
+
+///
+/// CHANGE_POINT command
+///
+mode CHANGE_POINT_MODE;
+
+CHANGE_POINT_PIPE : PIPE -> type(PIPE), popMode;
+CHANGE_POINT_ON : ON -> type(ON);
+CHANGE_POINT_AS : AS -> type(AS);
+CHANGE_POINT_DOT: DOT -> type(DOT);
+CHANGE_POINT_COMMA: COMMA -> type(COMMA);
+CHANGE_POINT_QUOTED_IDENTIFIER: QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER);
+CHANGE_POINT_UNQUOTED_IDENTIFIER: UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER);
+CHANGE_POINT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN);
+CHANGE_POINT_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN);
+CHANGE_POINT_WS: WS -> channel(HIDDEN);

+ 164 - 160
x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.tokens

@@ -15,119 +15,123 @@ SORT=14
 STATS=15
 WHERE=16
 JOIN_LOOKUP=17
-DEV_INLINESTATS=18
-DEV_LOOKUP=19
-DEV_METRICS=20
-DEV_JOIN_FULL=21
-DEV_JOIN_LEFT=22
-DEV_JOIN_RIGHT=23
-UNKNOWN_CMD=24
-LINE_COMMENT=25
-MULTILINE_COMMENT=26
-WS=27
-PIPE=28
-QUOTED_STRING=29
-INTEGER_LITERAL=30
-DECIMAL_LITERAL=31
-BY=32
-AND=33
-ASC=34
-ASSIGN=35
-CAST_OP=36
-COLON=37
-COMMA=38
-DESC=39
-DOT=40
-FALSE=41
-FIRST=42
-IN=43
-IS=44
-LAST=45
-LIKE=46
-LP=47
-NOT=48
-NULL=49
-NULLS=50
-OR=51
-PARAM=52
-RLIKE=53
-RP=54
-TRUE=55
-EQ=56
-CIEQ=57
-NEQ=58
-LT=59
-LTE=60
-GT=61
-GTE=62
-PLUS=63
-MINUS=64
-ASTERISK=65
-SLASH=66
-PERCENT=67
-LEFT_BRACES=68
-RIGHT_BRACES=69
-NAMED_OR_POSITIONAL_PARAM=70
-OPENING_BRACKET=71
-CLOSING_BRACKET=72
-UNQUOTED_IDENTIFIER=73
-QUOTED_IDENTIFIER=74
-EXPR_LINE_COMMENT=75
-EXPR_MULTILINE_COMMENT=76
-EXPR_WS=77
-EXPLAIN_WS=78
-EXPLAIN_LINE_COMMENT=79
-EXPLAIN_MULTILINE_COMMENT=80
-METADATA=81
-UNQUOTED_SOURCE=82
-FROM_LINE_COMMENT=83
-FROM_MULTILINE_COMMENT=84
-FROM_WS=85
-ID_PATTERN=86
-PROJECT_LINE_COMMENT=87
-PROJECT_MULTILINE_COMMENT=88
-PROJECT_WS=89
-AS=90
-RENAME_LINE_COMMENT=91
-RENAME_MULTILINE_COMMENT=92
-RENAME_WS=93
-ON=94
-WITH=95
-ENRICH_POLICY_NAME=96
-ENRICH_LINE_COMMENT=97
-ENRICH_MULTILINE_COMMENT=98
-ENRICH_WS=99
-ENRICH_FIELD_LINE_COMMENT=100
-ENRICH_FIELD_MULTILINE_COMMENT=101
-ENRICH_FIELD_WS=102
-MVEXPAND_LINE_COMMENT=103
-MVEXPAND_MULTILINE_COMMENT=104
-MVEXPAND_WS=105
-INFO=106
-SHOW_LINE_COMMENT=107
-SHOW_MULTILINE_COMMENT=108
-SHOW_WS=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
-JOIN=120
-USING=121
-JOIN_LINE_COMMENT=122
-JOIN_MULTILINE_COMMENT=123
-JOIN_WS=124
-METRICS_LINE_COMMENT=125
-METRICS_MULTILINE_COMMENT=126
-METRICS_WS=127
-CLOSING_METRICS_LINE_COMMENT=128
-CLOSING_METRICS_MULTILINE_COMMENT=129
-CLOSING_METRICS_WS=130
+DEV_CHANGE_POINT=18
+DEV_INLINESTATS=19
+DEV_LOOKUP=20
+DEV_METRICS=21
+DEV_JOIN_FULL=22
+DEV_JOIN_LEFT=23
+DEV_JOIN_RIGHT=24
+UNKNOWN_CMD=25
+LINE_COMMENT=26
+MULTILINE_COMMENT=27
+WS=28
+PIPE=29
+QUOTED_STRING=30
+INTEGER_LITERAL=31
+DECIMAL_LITERAL=32
+BY=33
+AND=34
+ASC=35
+ASSIGN=36
+CAST_OP=37
+COLON=38
+COMMA=39
+DESC=40
+DOT=41
+FALSE=42
+FIRST=43
+IN=44
+IS=45
+LAST=46
+LIKE=47
+LP=48
+NOT=49
+NULL=50
+NULLS=51
+OR=52
+PARAM=53
+RLIKE=54
+RP=55
+TRUE=56
+EQ=57
+CIEQ=58
+NEQ=59
+LT=60
+LTE=61
+GT=62
+GTE=63
+PLUS=64
+MINUS=65
+ASTERISK=66
+SLASH=67
+PERCENT=68
+LEFT_BRACES=69
+RIGHT_BRACES=70
+NAMED_OR_POSITIONAL_PARAM=71
+OPENING_BRACKET=72
+CLOSING_BRACKET=73
+UNQUOTED_IDENTIFIER=74
+QUOTED_IDENTIFIER=75
+EXPR_LINE_COMMENT=76
+EXPR_MULTILINE_COMMENT=77
+EXPR_WS=78
+EXPLAIN_WS=79
+EXPLAIN_LINE_COMMENT=80
+EXPLAIN_MULTILINE_COMMENT=81
+METADATA=82
+UNQUOTED_SOURCE=83
+FROM_LINE_COMMENT=84
+FROM_MULTILINE_COMMENT=85
+FROM_WS=86
+ID_PATTERN=87
+PROJECT_LINE_COMMENT=88
+PROJECT_MULTILINE_COMMENT=89
+PROJECT_WS=90
+AS=91
+RENAME_LINE_COMMENT=92
+RENAME_MULTILINE_COMMENT=93
+RENAME_WS=94
+ON=95
+WITH=96
+ENRICH_POLICY_NAME=97
+ENRICH_LINE_COMMENT=98
+ENRICH_MULTILINE_COMMENT=99
+ENRICH_WS=100
+ENRICH_FIELD_LINE_COMMENT=101
+ENRICH_FIELD_MULTILINE_COMMENT=102
+ENRICH_FIELD_WS=103
+MVEXPAND_LINE_COMMENT=104
+MVEXPAND_MULTILINE_COMMENT=105
+MVEXPAND_WS=106
+INFO=107
+SHOW_LINE_COMMENT=108
+SHOW_MULTILINE_COMMENT=109
+SHOW_WS=110
+SETTING=111
+SETTING_LINE_COMMENT=112
+SETTTING_MULTILINE_COMMENT=113
+SETTING_WS=114
+LOOKUP_LINE_COMMENT=115
+LOOKUP_MULTILINE_COMMENT=116
+LOOKUP_WS=117
+LOOKUP_FIELD_LINE_COMMENT=118
+LOOKUP_FIELD_MULTILINE_COMMENT=119
+LOOKUP_FIELD_WS=120
+JOIN=121
+USING=122
+JOIN_LINE_COMMENT=123
+JOIN_MULTILINE_COMMENT=124
+JOIN_WS=125
+METRICS_LINE_COMMENT=126
+METRICS_MULTILINE_COMMENT=127
+METRICS_WS=128
+CLOSING_METRICS_LINE_COMMENT=129
+CLOSING_METRICS_MULTILINE_COMMENT=130
+CLOSING_METRICS_WS=131
+CHANGE_POINT_LINE_COMMENT=132
+CHANGE_POINT_MULTILINE_COMMENT=133
+CHANGE_POINT_WS=134
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -145,50 +149,50 @@ CLOSING_METRICS_WS=130
 'stats'=15
 'where'=16
 'lookup'=17
-'|'=28
-'by'=32
-'and'=33
-'asc'=34
-'='=35
-'::'=36
-':'=37
-','=38
-'desc'=39
-'.'=40
-'false'=41
-'first'=42
-'in'=43
-'is'=44
-'last'=45
-'like'=46
-'('=47
-'not'=48
-'null'=49
-'nulls'=50
-'or'=51
-'?'=52
-'rlike'=53
-')'=54
-'true'=55
-'=='=56
-'=~'=57
-'!='=58
-'<'=59
-'<='=60
-'>'=61
-'>='=62
-'+'=63
-'-'=64
-'*'=65
-'/'=66
-'%'=67
-'{'=68
-'}'=69
-']'=72
-'metadata'=81
-'as'=90
-'on'=94
-'with'=95
-'info'=106
-'join'=120
-'USING'=121
+'|'=29
+'by'=33
+'and'=34
+'asc'=35
+'='=36
+'::'=37
+':'=38
+','=39
+'desc'=40
+'.'=41
+'false'=42
+'first'=43
+'in'=44
+'is'=45
+'last'=46
+'like'=47
+'('=48
+'not'=49
+'null'=50
+'nulls'=51
+'or'=52
+'?'=53
+'rlike'=54
+')'=55
+'true'=56
+'=='=57
+'=~'=58
+'!='=59
+'<'=60
+'<='=61
+'>'=62
+'>='=63
+'+'=64
+'-'=65
+'*'=66
+'/'=67
+'%'=68
+'{'=69
+'}'=70
+']'=73
+'metadata'=82
+'as'=91
+'on'=95
+'with'=96
+'info'=107
+'join'=121
+'USING'=122

+ 5 - 0
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.g4

@@ -55,6 +55,7 @@ processingCommand
     // in development
     | {this.isDevVersion()}? inlinestatsCommand
     | {this.isDevVersion()}? lookupCommand
+    | {this.isDevVersion()}? changePointCommand
     ;
 
 whereCommand
@@ -339,3 +340,7 @@ joinCondition
 joinPredicate
     : valueExpression
     ;
+
+changePointCommand
+    : DEV_CHANGE_POINT value=qualifiedName (ON key=qualifiedName)? (AS targetType=qualifiedName COMMA targetPvalue=qualifiedName)?
+    ;

+ 164 - 160
x-pack/plugin/esql/src/main/antlr/EsqlBaseParser.tokens

@@ -15,119 +15,123 @@ SORT=14
 STATS=15
 WHERE=16
 JOIN_LOOKUP=17
-DEV_INLINESTATS=18
-DEV_LOOKUP=19
-DEV_METRICS=20
-DEV_JOIN_FULL=21
-DEV_JOIN_LEFT=22
-DEV_JOIN_RIGHT=23
-UNKNOWN_CMD=24
-LINE_COMMENT=25
-MULTILINE_COMMENT=26
-WS=27
-PIPE=28
-QUOTED_STRING=29
-INTEGER_LITERAL=30
-DECIMAL_LITERAL=31
-BY=32
-AND=33
-ASC=34
-ASSIGN=35
-CAST_OP=36
-COLON=37
-COMMA=38
-DESC=39
-DOT=40
-FALSE=41
-FIRST=42
-IN=43
-IS=44
-LAST=45
-LIKE=46
-LP=47
-NOT=48
-NULL=49
-NULLS=50
-OR=51
-PARAM=52
-RLIKE=53
-RP=54
-TRUE=55
-EQ=56
-CIEQ=57
-NEQ=58
-LT=59
-LTE=60
-GT=61
-GTE=62
-PLUS=63
-MINUS=64
-ASTERISK=65
-SLASH=66
-PERCENT=67
-LEFT_BRACES=68
-RIGHT_BRACES=69
-NAMED_OR_POSITIONAL_PARAM=70
-OPENING_BRACKET=71
-CLOSING_BRACKET=72
-UNQUOTED_IDENTIFIER=73
-QUOTED_IDENTIFIER=74
-EXPR_LINE_COMMENT=75
-EXPR_MULTILINE_COMMENT=76
-EXPR_WS=77
-EXPLAIN_WS=78
-EXPLAIN_LINE_COMMENT=79
-EXPLAIN_MULTILINE_COMMENT=80
-METADATA=81
-UNQUOTED_SOURCE=82
-FROM_LINE_COMMENT=83
-FROM_MULTILINE_COMMENT=84
-FROM_WS=85
-ID_PATTERN=86
-PROJECT_LINE_COMMENT=87
-PROJECT_MULTILINE_COMMENT=88
-PROJECT_WS=89
-AS=90
-RENAME_LINE_COMMENT=91
-RENAME_MULTILINE_COMMENT=92
-RENAME_WS=93
-ON=94
-WITH=95
-ENRICH_POLICY_NAME=96
-ENRICH_LINE_COMMENT=97
-ENRICH_MULTILINE_COMMENT=98
-ENRICH_WS=99
-ENRICH_FIELD_LINE_COMMENT=100
-ENRICH_FIELD_MULTILINE_COMMENT=101
-ENRICH_FIELD_WS=102
-MVEXPAND_LINE_COMMENT=103
-MVEXPAND_MULTILINE_COMMENT=104
-MVEXPAND_WS=105
-INFO=106
-SHOW_LINE_COMMENT=107
-SHOW_MULTILINE_COMMENT=108
-SHOW_WS=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
-JOIN=120
-USING=121
-JOIN_LINE_COMMENT=122
-JOIN_MULTILINE_COMMENT=123
-JOIN_WS=124
-METRICS_LINE_COMMENT=125
-METRICS_MULTILINE_COMMENT=126
-METRICS_WS=127
-CLOSING_METRICS_LINE_COMMENT=128
-CLOSING_METRICS_MULTILINE_COMMENT=129
-CLOSING_METRICS_WS=130
+DEV_CHANGE_POINT=18
+DEV_INLINESTATS=19
+DEV_LOOKUP=20
+DEV_METRICS=21
+DEV_JOIN_FULL=22
+DEV_JOIN_LEFT=23
+DEV_JOIN_RIGHT=24
+UNKNOWN_CMD=25
+LINE_COMMENT=26
+MULTILINE_COMMENT=27
+WS=28
+PIPE=29
+QUOTED_STRING=30
+INTEGER_LITERAL=31
+DECIMAL_LITERAL=32
+BY=33
+AND=34
+ASC=35
+ASSIGN=36
+CAST_OP=37
+COLON=38
+COMMA=39
+DESC=40
+DOT=41
+FALSE=42
+FIRST=43
+IN=44
+IS=45
+LAST=46
+LIKE=47
+LP=48
+NOT=49
+NULL=50
+NULLS=51
+OR=52
+PARAM=53
+RLIKE=54
+RP=55
+TRUE=56
+EQ=57
+CIEQ=58
+NEQ=59
+LT=60
+LTE=61
+GT=62
+GTE=63
+PLUS=64
+MINUS=65
+ASTERISK=66
+SLASH=67
+PERCENT=68
+LEFT_BRACES=69
+RIGHT_BRACES=70
+NAMED_OR_POSITIONAL_PARAM=71
+OPENING_BRACKET=72
+CLOSING_BRACKET=73
+UNQUOTED_IDENTIFIER=74
+QUOTED_IDENTIFIER=75
+EXPR_LINE_COMMENT=76
+EXPR_MULTILINE_COMMENT=77
+EXPR_WS=78
+EXPLAIN_WS=79
+EXPLAIN_LINE_COMMENT=80
+EXPLAIN_MULTILINE_COMMENT=81
+METADATA=82
+UNQUOTED_SOURCE=83
+FROM_LINE_COMMENT=84
+FROM_MULTILINE_COMMENT=85
+FROM_WS=86
+ID_PATTERN=87
+PROJECT_LINE_COMMENT=88
+PROJECT_MULTILINE_COMMENT=89
+PROJECT_WS=90
+AS=91
+RENAME_LINE_COMMENT=92
+RENAME_MULTILINE_COMMENT=93
+RENAME_WS=94
+ON=95
+WITH=96
+ENRICH_POLICY_NAME=97
+ENRICH_LINE_COMMENT=98
+ENRICH_MULTILINE_COMMENT=99
+ENRICH_WS=100
+ENRICH_FIELD_LINE_COMMENT=101
+ENRICH_FIELD_MULTILINE_COMMENT=102
+ENRICH_FIELD_WS=103
+MVEXPAND_LINE_COMMENT=104
+MVEXPAND_MULTILINE_COMMENT=105
+MVEXPAND_WS=106
+INFO=107
+SHOW_LINE_COMMENT=108
+SHOW_MULTILINE_COMMENT=109
+SHOW_WS=110
+SETTING=111
+SETTING_LINE_COMMENT=112
+SETTTING_MULTILINE_COMMENT=113
+SETTING_WS=114
+LOOKUP_LINE_COMMENT=115
+LOOKUP_MULTILINE_COMMENT=116
+LOOKUP_WS=117
+LOOKUP_FIELD_LINE_COMMENT=118
+LOOKUP_FIELD_MULTILINE_COMMENT=119
+LOOKUP_FIELD_WS=120
+JOIN=121
+USING=122
+JOIN_LINE_COMMENT=123
+JOIN_MULTILINE_COMMENT=124
+JOIN_WS=125
+METRICS_LINE_COMMENT=126
+METRICS_MULTILINE_COMMENT=127
+METRICS_WS=128
+CLOSING_METRICS_LINE_COMMENT=129
+CLOSING_METRICS_MULTILINE_COMMENT=130
+CLOSING_METRICS_WS=131
+CHANGE_POINT_LINE_COMMENT=132
+CHANGE_POINT_MULTILINE_COMMENT=133
+CHANGE_POINT_WS=134
 'dissect'=1
 'drop'=2
 'enrich'=3
@@ -145,50 +149,50 @@ CLOSING_METRICS_WS=130
 'stats'=15
 'where'=16
 'lookup'=17
-'|'=28
-'by'=32
-'and'=33
-'asc'=34
-'='=35
-'::'=36
-':'=37
-','=38
-'desc'=39
-'.'=40
-'false'=41
-'first'=42
-'in'=43
-'is'=44
-'last'=45
-'like'=46
-'('=47
-'not'=48
-'null'=49
-'nulls'=50
-'or'=51
-'?'=52
-'rlike'=53
-')'=54
-'true'=55
-'=='=56
-'=~'=57
-'!='=58
-'<'=59
-'<='=60
-'>'=61
-'>='=62
-'+'=63
-'-'=64
-'*'=65
-'/'=66
-'%'=67
-'{'=68
-'}'=69
-']'=72
-'metadata'=81
-'as'=90
-'on'=94
-'with'=95
-'info'=106
-'join'=120
-'USING'=121
+'|'=29
+'by'=33
+'and'=34
+'asc'=35
+'='=36
+'::'=37
+':'=38
+','=39
+'desc'=40
+'.'=41
+'false'=42
+'first'=43
+'in'=44
+'is'=45
+'last'=46
+'like'=47
+'('=48
+'not'=49
+'null'=50
+'nulls'=51
+'or'=52
+'?'=53
+'rlike'=54
+')'=55
+'true'=56
+'=='=57
+'=~'=58
+'!='=59
+'<'=60
+'<='=61
+'>'=62
+'>='=63
+'+'=64
+'-'=65
+'*'=66
+'/'=67
+'%'=68
+'{'=69
+'}'=70
+']'=73
+'metadata'=82
+'as'=91
+'on'=95
+'with'=96
+'info'=107
+'join'=121
+'USING'=122

+ 6 - 1
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/action/EsqlCapabilities.java

@@ -796,7 +796,12 @@ public class EsqlCapabilities {
         /**
          * Support for partial subset of metrics in aggregate_metric_double type
          */
-        AGGREGATE_METRIC_DOUBLE_PARTIAL_SUBMETRICS(AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG);
+        AGGREGATE_METRIC_DOUBLE_PARTIAL_SUBMETRICS(AGGREGATE_METRIC_DOUBLE_FEATURE_FLAG),
+
+        /**
+         * Support change point detection "CHANGE_POINT".
+         */
+        CHANGE_POINT(Build.current().isSnapshot());
 
         private final boolean enabled;
 

Файловите разлики са ограничени, защото са твърде много
+ 20 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.interp


+ 1178 - 1113
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseLexer.java

@@ -27,35 +27,37 @@ 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, MV_EXPAND=10, RENAME=11, ROW=12, SHOW=13, SORT=14, STATS=15, 
-    WHERE=16, JOIN_LOOKUP=17, DEV_INLINESTATS=18, DEV_LOOKUP=19, DEV_METRICS=20, 
-    DEV_JOIN_FULL=21, DEV_JOIN_LEFT=22, DEV_JOIN_RIGHT=23, UNKNOWN_CMD=24, 
-    LINE_COMMENT=25, MULTILINE_COMMENT=26, WS=27, PIPE=28, QUOTED_STRING=29, 
-    INTEGER_LITERAL=30, DECIMAL_LITERAL=31, BY=32, AND=33, ASC=34, ASSIGN=35, 
-    CAST_OP=36, COLON=37, COMMA=38, DESC=39, DOT=40, FALSE=41, FIRST=42, IN=43, 
-    IS=44, LAST=45, LIKE=46, LP=47, NOT=48, NULL=49, NULLS=50, OR=51, PARAM=52, 
-    RLIKE=53, RP=54, TRUE=55, EQ=56, CIEQ=57, NEQ=58, LT=59, LTE=60, GT=61, 
-    GTE=62, PLUS=63, MINUS=64, ASTERISK=65, SLASH=66, PERCENT=67, LEFT_BRACES=68, 
-    RIGHT_BRACES=69, NAMED_OR_POSITIONAL_PARAM=70, OPENING_BRACKET=71, CLOSING_BRACKET=72, 
-    UNQUOTED_IDENTIFIER=73, QUOTED_IDENTIFIER=74, EXPR_LINE_COMMENT=75, EXPR_MULTILINE_COMMENT=76, 
-    EXPR_WS=77, EXPLAIN_WS=78, EXPLAIN_LINE_COMMENT=79, EXPLAIN_MULTILINE_COMMENT=80, 
-    METADATA=81, UNQUOTED_SOURCE=82, FROM_LINE_COMMENT=83, FROM_MULTILINE_COMMENT=84, 
-    FROM_WS=85, ID_PATTERN=86, PROJECT_LINE_COMMENT=87, PROJECT_MULTILINE_COMMENT=88, 
-    PROJECT_WS=89, AS=90, RENAME_LINE_COMMENT=91, RENAME_MULTILINE_COMMENT=92, 
-    RENAME_WS=93, ON=94, WITH=95, ENRICH_POLICY_NAME=96, ENRICH_LINE_COMMENT=97, 
-    ENRICH_MULTILINE_COMMENT=98, ENRICH_WS=99, ENRICH_FIELD_LINE_COMMENT=100, 
-    ENRICH_FIELD_MULTILINE_COMMENT=101, ENRICH_FIELD_WS=102, MVEXPAND_LINE_COMMENT=103, 
-    MVEXPAND_MULTILINE_COMMENT=104, MVEXPAND_WS=105, INFO=106, SHOW_LINE_COMMENT=107, 
-    SHOW_MULTILINE_COMMENT=108, SHOW_WS=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, JOIN=120, USING=121, 
-    JOIN_LINE_COMMENT=122, JOIN_MULTILINE_COMMENT=123, JOIN_WS=124, METRICS_LINE_COMMENT=125, 
-    METRICS_MULTILINE_COMMENT=126, METRICS_WS=127, CLOSING_METRICS_LINE_COMMENT=128, 
-    CLOSING_METRICS_MULTILINE_COMMENT=129, CLOSING_METRICS_WS=130;
+    WHERE=16, JOIN_LOOKUP=17, DEV_CHANGE_POINT=18, DEV_INLINESTATS=19, DEV_LOOKUP=20, 
+    DEV_METRICS=21, DEV_JOIN_FULL=22, DEV_JOIN_LEFT=23, DEV_JOIN_RIGHT=24, 
+    UNKNOWN_CMD=25, LINE_COMMENT=26, MULTILINE_COMMENT=27, WS=28, PIPE=29, 
+    QUOTED_STRING=30, INTEGER_LITERAL=31, DECIMAL_LITERAL=32, BY=33, AND=34, 
+    ASC=35, ASSIGN=36, CAST_OP=37, COLON=38, COMMA=39, DESC=40, DOT=41, FALSE=42, 
+    FIRST=43, IN=44, IS=45, LAST=46, LIKE=47, LP=48, NOT=49, NULL=50, NULLS=51, 
+    OR=52, PARAM=53, RLIKE=54, RP=55, TRUE=56, EQ=57, CIEQ=58, NEQ=59, LT=60, 
+    LTE=61, GT=62, GTE=63, PLUS=64, MINUS=65, ASTERISK=66, SLASH=67, PERCENT=68, 
+    LEFT_BRACES=69, RIGHT_BRACES=70, NAMED_OR_POSITIONAL_PARAM=71, OPENING_BRACKET=72, 
+    CLOSING_BRACKET=73, UNQUOTED_IDENTIFIER=74, QUOTED_IDENTIFIER=75, EXPR_LINE_COMMENT=76, 
+    EXPR_MULTILINE_COMMENT=77, EXPR_WS=78, EXPLAIN_WS=79, EXPLAIN_LINE_COMMENT=80, 
+    EXPLAIN_MULTILINE_COMMENT=81, METADATA=82, UNQUOTED_SOURCE=83, FROM_LINE_COMMENT=84, 
+    FROM_MULTILINE_COMMENT=85, FROM_WS=86, ID_PATTERN=87, PROJECT_LINE_COMMENT=88, 
+    PROJECT_MULTILINE_COMMENT=89, PROJECT_WS=90, AS=91, RENAME_LINE_COMMENT=92, 
+    RENAME_MULTILINE_COMMENT=93, RENAME_WS=94, ON=95, WITH=96, ENRICH_POLICY_NAME=97, 
+    ENRICH_LINE_COMMENT=98, ENRICH_MULTILINE_COMMENT=99, ENRICH_WS=100, ENRICH_FIELD_LINE_COMMENT=101, 
+    ENRICH_FIELD_MULTILINE_COMMENT=102, ENRICH_FIELD_WS=103, MVEXPAND_LINE_COMMENT=104, 
+    MVEXPAND_MULTILINE_COMMENT=105, MVEXPAND_WS=106, INFO=107, SHOW_LINE_COMMENT=108, 
+    SHOW_MULTILINE_COMMENT=109, SHOW_WS=110, SETTING=111, SETTING_LINE_COMMENT=112, 
+    SETTTING_MULTILINE_COMMENT=113, SETTING_WS=114, LOOKUP_LINE_COMMENT=115, 
+    LOOKUP_MULTILINE_COMMENT=116, LOOKUP_WS=117, LOOKUP_FIELD_LINE_COMMENT=118, 
+    LOOKUP_FIELD_MULTILINE_COMMENT=119, LOOKUP_FIELD_WS=120, JOIN=121, USING=122, 
+    JOIN_LINE_COMMENT=123, JOIN_MULTILINE_COMMENT=124, JOIN_WS=125, METRICS_LINE_COMMENT=126, 
+    METRICS_MULTILINE_COMMENT=127, METRICS_WS=128, CLOSING_METRICS_LINE_COMMENT=129, 
+    CLOSING_METRICS_MULTILINE_COMMENT=130, CLOSING_METRICS_WS=131, CHANGE_POINT_LINE_COMMENT=132, 
+    CHANGE_POINT_MULTILINE_COMMENT=133, CHANGE_POINT_WS=134;
   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, 
-    LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, JOIN_MODE=13, METRICS_MODE=14, CLOSING_METRICS_MODE=15;
+    LOOKUP_MODE=11, LOOKUP_FIELD_MODE=12, JOIN_MODE=13, METRICS_MODE=14, CLOSING_METRICS_MODE=15, 
+    CHANGE_POINT_MODE=16;
   public static String[] channelNames = {
     "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
   };
@@ -64,31 +66,31 @@ public class EsqlBaseLexer extends LexerConfig {
     "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", "JOIN_MODE", "METRICS_MODE", 
-    "CLOSING_METRICS_MODE"
+    "CLOSING_METRICS_MODE", "CHANGE_POINT_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", 
-      "JOIN_LOOKUP", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", "DEV_JOIN_FULL", 
-      "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "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", "COLON", "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", "LEFT_BRACES", 
-      "RIGHT_BRACES", "NESTED_WHERE", "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", "PROJECT_PARAM", 
-      "PROJECT_NAMED_OR_POSITIONAL_PARAM", "UNQUOTED_ID_BODY_WITH_PATTERN", 
+      "JOIN_LOOKUP", "DEV_CHANGE_POINT", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", 
+      "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "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", "COLON", 
+      "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", "LEFT_BRACES", "RIGHT_BRACES", "NESTED_WHERE", "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", 
+      "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", 
       "RENAME_PARAM", "RENAME_NAMED_OR_POSITIONAL_PARAM", "AS", "RENAME_ID_PATTERN", 
@@ -115,7 +117,10 @@ public class EsqlBaseLexer extends LexerConfig {
       "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"
+      "CLOSING_METRICS_UNQUOTED_IDENTIFIER", "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE", 
+      "CHANGE_POINT_PIPE", "CHANGE_POINT_ON", "CHANGE_POINT_AS", "CHANGE_POINT_DOT", 
+      "CHANGE_POINT_COMMA", "CHANGE_POINT_QUOTED_IDENTIFIER", "CHANGE_POINT_UNQUOTED_IDENTIFIER", 
+      "CHANGE_POINT_LINE_COMMENT", "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS"
     };
   }
   public static final String[] ruleNames = makeRuleNames();
@@ -125,16 +130,16 @@ public class EsqlBaseLexer extends LexerConfig {
       null, "'dissect'", "'drop'", "'enrich'", "'eval'", "'explain'", "'from'", 
       "'grok'", "'keep'", "'limit'", "'mv_expand'", "'rename'", "'row'", "'show'", 
       "'sort'", "'stats'", "'where'", "'lookup'", null, null, 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, null, null, null, null, null, null, 
-      null, null, null, null, "'join'", "'USING'"
+      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, null, null, 
+      null, null, null, null, null, null, null, null, "'join'", "'USING'"
     };
   }
   private static final String[] _LITERAL_NAMES = makeLiteralNames();
@@ -142,9 +147,9 @@ public class EsqlBaseLexer extends LexerConfig {
     return new String[] {
       null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", 
       "KEEP", "LIMIT", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", 
-      "WHERE", "JOIN_LOOKUP", "DEV_INLINESTATS", "DEV_LOOKUP", "DEV_METRICS", 
-      "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", "LINE_COMMENT", 
-      "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", 
+      "WHERE", "JOIN_LOOKUP", "DEV_CHANGE_POINT", "DEV_INLINESTATS", "DEV_LOOKUP", 
+      "DEV_METRICS", "DEV_JOIN_FULL", "DEV_JOIN_LEFT", "DEV_JOIN_RIGHT", "UNKNOWN_CMD", 
+      "LINE_COMMENT", "MULTILINE_COMMENT", "WS", "PIPE", "QUOTED_STRING", "INTEGER_LITERAL", 
       "DECIMAL_LITERAL", "BY", "AND", "ASC", "ASSIGN", "CAST_OP", "COLON", 
       "COMMA", "DESC", "DOT", "FALSE", "FIRST", "IN", "IS", "LAST", "LIKE", 
       "LP", "NOT", "NULL", "NULLS", "OR", "PARAM", "RLIKE", "RP", "TRUE", "EQ", 
@@ -165,7 +170,8 @@ public class EsqlBaseLexer extends LexerConfig {
       "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", 
       "JOIN", "USING", "JOIN_LINE_COMMENT", "JOIN_MULTILINE_COMMENT", "JOIN_WS", 
       "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_LINE_COMMENT", 
-      "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS"
+      "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS", "CHANGE_POINT_LINE_COMMENT", 
+      "CHANGE_POINT_MULTILINE_COMMENT", "CHANGE_POINT_WS"
     };
   }
   private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -231,1114 +237,1173 @@ public class EsqlBaseLexer extends LexerConfig {
   public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
     switch (ruleIndex) {
     case 17:
-      return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex);
+      return DEV_CHANGE_POINT_sempred((RuleContext)_localctx, predIndex);
     case 18:
-      return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex);
+      return DEV_INLINESTATS_sempred((RuleContext)_localctx, predIndex);
     case 19:
-      return DEV_METRICS_sempred((RuleContext)_localctx, predIndex);
+      return DEV_LOOKUP_sempred((RuleContext)_localctx, predIndex);
     case 20:
-      return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex);
+      return DEV_METRICS_sempred((RuleContext)_localctx, predIndex);
     case 21:
-      return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex);
+      return DEV_JOIN_FULL_sempred((RuleContext)_localctx, predIndex);
     case 22:
+      return DEV_JOIN_LEFT_sempred((RuleContext)_localctx, predIndex);
+    case 23:
       return DEV_JOIN_RIGHT_sempred((RuleContext)_localctx, predIndex);
     }
     return true;
   }
-  private boolean DEV_INLINESTATS_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_CHANGE_POINT_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 0:
       return this.isDevVersion();
     }
     return true;
   }
-  private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_INLINESTATS_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 1:
       return this.isDevVersion();
     }
     return true;
   }
-  private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_LOOKUP_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 2:
       return this.isDevVersion();
     }
     return true;
   }
-  private boolean DEV_JOIN_FULL_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_METRICS_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 3:
       return this.isDevVersion();
     }
     return true;
   }
-  private boolean DEV_JOIN_LEFT_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_JOIN_FULL_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 4:
       return this.isDevVersion();
     }
     return true;
   }
-  private boolean DEV_JOIN_RIGHT_sempred(RuleContext _localctx, int predIndex) {
+  private boolean DEV_JOIN_LEFT_sempred(RuleContext _localctx, int predIndex) {
     switch (predIndex) {
     case 5:
       return this.isDevVersion();
     }
     return true;
   }
+  private boolean DEV_JOIN_RIGHT_sempred(RuleContext _localctx, int predIndex) {
+    switch (predIndex) {
+    case 6:
+      return this.isDevVersion();
+    }
+    return true;
+  }
 
   public static final String _serializedATN =
-    "\u0004\u0000\u0082\u0649\u0006\uffff\uffff\u0006\uffff\uffff\u0006\uffff"+
+    "\u0004\u0000\u0086\u0699\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\u0006\uffff\uffff\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\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007"+
-    "\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007"+
-    "\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007"+
-    "\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007"+
-    "\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007"+
-    "\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007"+
-    "\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007"+
-    "\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007"+
-    "\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007"+
-    ",\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u0007"+
-    "1\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u0007"+
-    "6\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007"+
-    ";\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007"+
-    "@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007D\u0002E\u0007"+
-    "E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007I\u0002J\u0007"+
-    "J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007N\u0002O\u0007"+
-    "O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007S\u0002T\u0007"+
-    "T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007X\u0002Y\u0007"+
-    "Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007]\u0002^\u0007"+
-    "^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007b\u0002c\u0007"+
-    "c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007g\u0002h\u0007"+
-    "h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007l\u0002m\u0007"+
-    "m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007q\u0002r\u0007"+
-    "r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002v\u0007v\u0002w\u0007"+
-    "w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002{\u0007{\u0002|\u0007"+
-    "|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f\u0002\u0080\u0007"+
-    "\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082\u0002\u0083\u0007"+
-    "\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085\u0002\u0086\u0007"+
-    "\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088\u0002\u0089\u0007"+
-    "\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b\u0002\u008c\u0007"+
-    "\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e\u0002\u008f\u0007"+
-    "\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091\u0002\u0092\u0007"+
-    "\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094\u0002\u0095\u0007"+
-    "\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097\u0002\u0098\u0007"+
-    "\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a\u0002\u009b\u0007"+
-    "\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d\u0002\u009e\u0007"+
-    "\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0\u0002\u00a1\u0007"+
-    "\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3\u0002\u00a4\u0007"+
-    "\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6\u0002\u00a7\u0007"+
-    "\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9\u0002\u00aa\u0007"+
-    "\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac\u0002\u00ad\u0007"+
-    "\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af\u0002\u00b0\u0007"+
-    "\u00b0\u0002\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\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\u0002\u00c5\u0007"+
-    "\u00c5\u0002\u00c6\u0007\u00c6\u0002\u00c7\u0007\u00c7\u0002\u00c8\u0007"+
-    "\u00c8\u0002\u00c9\u0007\u00c9\u0002\u00ca\u0007\u00ca\u0002\u00cb\u0007"+
-    "\u00cb\u0002\u00cc\u0007\u00cc\u0002\u00cd\u0007\u00cd\u0002\u00ce\u0007"+
-    "\u00ce\u0002\u00cf\u0007\u00cf\u0002\u00d0\u0007\u00d0\u0002\u00d1\u0007"+
-    "\u00d1\u0002\u00d2\u0007\u00d2\u0002\u00d3\u0007\u00d3\u0002\u00d4\u0007"+
-    "\u00d4\u0002\u00d5\u0007\u00d5\u0002\u00d6\u0007\u00d6\u0002\u00d7\u0007"+
-    "\u00d7\u0002\u00d8\u0007\u00d8\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\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\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\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\u0015\u0001"+
-    "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+
-    "\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+
-    "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0004\u0017\u028d"+
-    "\b\u0017\u000b\u0017\f\u0017\u028e\u0001\u0017\u0001\u0017\u0001\u0018"+
-    "\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0297\b\u0018\n\u0018"+
-    "\f\u0018\u029a\t\u0018\u0001\u0018\u0003\u0018\u029d\b\u0018\u0001\u0018"+
-    "\u0003\u0018\u02a0\b\u0018\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u02a9\b\u0019\n\u0019"+
-    "\f\u0019\u02ac\t\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+
-    "\u0001\u0019\u0001\u001a\u0004\u001a\u02b4\b\u001a\u000b\u001a\f\u001a"+
-    "\u02b5\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+
-    "\u001b\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001"+
-    "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0003 \u02c9"+
-    "\b \u0001 \u0004 \u02cc\b \u000b \f \u02cd\u0001!\u0001!\u0001\"\u0001"+
-    "\"\u0001#\u0001#\u0001#\u0003#\u02d7\b#\u0001$\u0001$\u0001%\u0001%\u0001"+
-    "%\u0003%\u02de\b%\u0001&\u0001&\u0001&\u0005&\u02e3\b&\n&\f&\u02e6\t&"+
-    "\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0005&\u02ee\b&\n&\f&\u02f1"+
-    "\t&\u0001&\u0001&\u0001&\u0001&\u0001&\u0003&\u02f8\b&\u0001&\u0003&\u02fb"+
-    "\b&\u0003&\u02fd\b&\u0001\'\u0004\'\u0300\b\'\u000b\'\f\'\u0301\u0001"+
-    "(\u0004(\u0305\b(\u000b(\f(\u0306\u0001(\u0001(\u0005(\u030b\b(\n(\f("+
-    "\u030e\t(\u0001(\u0001(\u0004(\u0312\b(\u000b(\f(\u0313\u0001(\u0004("+
-    "\u0317\b(\u000b(\f(\u0318\u0001(\u0001(\u0005(\u031d\b(\n(\f(\u0320\t"+
-    "(\u0003(\u0322\b(\u0001(\u0001(\u0001(\u0001(\u0004(\u0328\b(\u000b(\f"+
-    "(\u0329\u0001(\u0001(\u0003(\u032e\b(\u0001)\u0001)\u0001)\u0001*\u0001"+
-    "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001-\u0001"+
-    "-\u0001-\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00010\u00010\u0001"+
-    "0\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00012\u00013\u0001"+
-    "3\u00013\u00013\u00013\u00013\u00014\u00014\u00014\u00015\u00015\u0001"+
-    "5\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+
-    "7\u00018\u00018\u00019\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"+
-    "?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001A\u0001A\u0001A\u0001B\u0001"+
-    "B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001E\u0001E\u0001E\u0001"+
-    "F\u0001F\u0001G\u0001G\u0001G\u0001H\u0001H\u0001I\u0001I\u0001J\u0001"+
-    "J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001N\u0001N\u0001O\u0001"+
-    "O\u0001O\u0001O\u0001P\u0001P\u0001P\u0003P\u03b2\bP\u0001P\u0005P\u03b5"+
-    "\bP\nP\fP\u03b8\tP\u0001P\u0001P\u0004P\u03bc\bP\u000bP\fP\u03bd\u0003"+
-    "P\u03c0\bP\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0001"+
-    "R\u0001R\u0001S\u0001S\u0005S\u03ce\bS\nS\fS\u03d1\tS\u0001S\u0001S\u0003"+
-    "S\u03d5\bS\u0001S\u0004S\u03d8\bS\u000bS\fS\u03d9\u0003S\u03dc\bS\u0001"+
-    "T\u0001T\u0004T\u03e0\bT\u000bT\fT\u03e1\u0001T\u0001T\u0001U\u0001U\u0001"+
-    "V\u0001V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\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]\u0001]\u0001]\u0001^\u0001^\u0001^\u0001^\u0001^\u0001_\u0001"+
-    "_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001a\u0001a\u0001a\u0001"+
-    "a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001c\u0001c\u0001d\u0001"+
-    "d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001"+
-    "e\u0003e\u042f\be\u0001f\u0004f\u0432\bf\u000bf\ff\u0433\u0001g\u0001"+
-    "g\u0001g\u0001g\u0001h\u0001h\u0001h\u0001h\u0001i\u0001i\u0001i\u0001"+
-    "i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001k\u0001l\u0001"+
-    "l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001n\u0001n\u0001"+
-    "n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001p\u0001p\u0001"+
-    "q\u0001q\u0001q\u0001q\u0003q\u0463\bq\u0001r\u0001r\u0003r\u0467\br\u0001"+
-    "r\u0005r\u046a\br\nr\fr\u046d\tr\u0001r\u0001r\u0003r\u0471\br\u0001r"+
-    "\u0004r\u0474\br\u000br\fr\u0475\u0003r\u0478\br\u0001s\u0001s\u0004s"+
-    "\u047c\bs\u000bs\fs\u047d\u0001t\u0001t\u0001t\u0001t\u0001u\u0001u\u0001"+
-    "u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\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\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\u0083\u0001\u0083\u0001\u0083"+
-    "\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084\u0001\u0084"+
-    "\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085"+
-    "\u0001\u0085\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0087\u0004\u0087"+
-    "\u04d1\b\u0087\u000b\u0087\f\u0087\u04d2\u0001\u0087\u0001\u0087\u0003"+
-    "\u0087\u04d7\b\u0087\u0001\u0087\u0004\u0087\u04da\b\u0087\u000b\u0087"+
-    "\f\u0087\u04db\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\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\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\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\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\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\u00a6\u0001\u00a7"+
-    "\u0001\u00a7\u0001\u00a7\u0001\u00a7\u0001\u00a8\u0001\u00a8\u0001\u00a8"+
-    "\u0001\u00a8\u0001\u00a8\u0004\u00a8\u0569\b\u00a8\u000b\u00a8\f\u00a8"+
-    "\u056a\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\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"+
-    "\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\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\u00bb\u0001"+
-    "\u00bb\u0001\u00bb\u0001\u00bb\u0001\u00bc\u0001\u00bc\u0001\u00bc\u0001"+
-    "\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+
-    "\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00bf\u0001"+
-    "\u00bf\u0001\u00bf\u0001\u00bf\u0001\u00c0\u0001\u00c0\u0001\u00c0\u0001"+
+    "\uffff\u0006\uffff\uffff\u0006\uffff\uffff\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\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e"+
+    "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011"+
+    "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014"+
+    "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017"+
+    "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a"+
+    "\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d"+
+    "\u0002\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!"+
+    "\u0007!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002"+
+    "&\u0007&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002"+
+    "+\u0007+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u0002"+
+    "0\u00070\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u0002"+
+    "5\u00075\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002"+
+    ":\u0007:\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002"+
+    "?\u0007?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002"+
+    "D\u0007D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002"+
+    "I\u0007I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002"+
+    "N\u0007N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002"+
+    "S\u0007S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002"+
+    "X\u0007X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002"+
+    "]\u0007]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002"+
+    "b\u0007b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002"+
+    "g\u0007g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002"+
+    "l\u0007l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002"+
+    "q\u0007q\u0002r\u0007r\u0002s\u0007s\u0002t\u0007t\u0002u\u0007u\u0002"+
+    "v\u0007v\u0002w\u0007w\u0002x\u0007x\u0002y\u0007y\u0002z\u0007z\u0002"+
+    "{\u0007{\u0002|\u0007|\u0002}\u0007}\u0002~\u0007~\u0002\u007f\u0007\u007f"+
+    "\u0002\u0080\u0007\u0080\u0002\u0081\u0007\u0081\u0002\u0082\u0007\u0082"+
+    "\u0002\u0083\u0007\u0083\u0002\u0084\u0007\u0084\u0002\u0085\u0007\u0085"+
+    "\u0002\u0086\u0007\u0086\u0002\u0087\u0007\u0087\u0002\u0088\u0007\u0088"+
+    "\u0002\u0089\u0007\u0089\u0002\u008a\u0007\u008a\u0002\u008b\u0007\u008b"+
+    "\u0002\u008c\u0007\u008c\u0002\u008d\u0007\u008d\u0002\u008e\u0007\u008e"+
+    "\u0002\u008f\u0007\u008f\u0002\u0090\u0007\u0090\u0002\u0091\u0007\u0091"+
+    "\u0002\u0092\u0007\u0092\u0002\u0093\u0007\u0093\u0002\u0094\u0007\u0094"+
+    "\u0002\u0095\u0007\u0095\u0002\u0096\u0007\u0096\u0002\u0097\u0007\u0097"+
+    "\u0002\u0098\u0007\u0098\u0002\u0099\u0007\u0099\u0002\u009a\u0007\u009a"+
+    "\u0002\u009b\u0007\u009b\u0002\u009c\u0007\u009c\u0002\u009d\u0007\u009d"+
+    "\u0002\u009e\u0007\u009e\u0002\u009f\u0007\u009f\u0002\u00a0\u0007\u00a0"+
+    "\u0002\u00a1\u0007\u00a1\u0002\u00a2\u0007\u00a2\u0002\u00a3\u0007\u00a3"+
+    "\u0002\u00a4\u0007\u00a4\u0002\u00a5\u0007\u00a5\u0002\u00a6\u0007\u00a6"+
+    "\u0002\u00a7\u0007\u00a7\u0002\u00a8\u0007\u00a8\u0002\u00a9\u0007\u00a9"+
+    "\u0002\u00aa\u0007\u00aa\u0002\u00ab\u0007\u00ab\u0002\u00ac\u0007\u00ac"+
+    "\u0002\u00ad\u0007\u00ad\u0002\u00ae\u0007\u00ae\u0002\u00af\u0007\u00af"+
+    "\u0002\u00b0\u0007\u00b0\u0002\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\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"+
+    "\u0002\u00c5\u0007\u00c5\u0002\u00c6\u0007\u00c6\u0002\u00c7\u0007\u00c7"+
+    "\u0002\u00c8\u0007\u00c8\u0002\u00c9\u0007\u00c9\u0002\u00ca\u0007\u00ca"+
+    "\u0002\u00cb\u0007\u00cb\u0002\u00cc\u0007\u00cc\u0002\u00cd\u0007\u00cd"+
+    "\u0002\u00ce\u0007\u00ce\u0002\u00cf\u0007\u00cf\u0002\u00d0\u0007\u00d0"+
+    "\u0002\u00d1\u0007\u00d1\u0002\u00d2\u0007\u00d2\u0002\u00d3\u0007\u00d3"+
+    "\u0002\u00d4\u0007\u00d4\u0002\u00d5\u0007\u00d5\u0002\u00d6\u0007\u00d6"+
+    "\u0002\u00d7\u0007\u00d7\u0002\u00d8\u0007\u00d8\u0002\u00d9\u0007\u00d9"+
+    "\u0002\u00da\u0007\u00da\u0002\u00db\u0007\u00db\u0002\u00dc\u0007\u00dc"+
+    "\u0002\u00dd\u0007\u00dd\u0002\u00de\u0007\u00de\u0002\u00df\u0007\u00df"+
+    "\u0002\u00e0\u0007\u00e0\u0002\u00e1\u0007\u00e1\u0002\u00e2\u0007\u00e2"+
+    "\u0002\u00e3\u0007\u00e3\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\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\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\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\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
+    "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+
+    "\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+
+    "\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+
+    "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017"+
+    "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+
+    "\u0001\u0017\u0001\u0018\u0004\u0018\u02b4\b\u0018\u000b\u0018\f\u0018"+
+    "\u02b5\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+
+    "\u0019\u0005\u0019\u02be\b\u0019\n\u0019\f\u0019\u02c1\t\u0019\u0001\u0019"+
+    "\u0003\u0019\u02c4\b\u0019\u0001\u0019\u0003\u0019\u02c7\b\u0019\u0001"+
+    "\u0019\u0001\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001"+
+    "\u001a\u0005\u001a\u02d0\b\u001a\n\u001a\f\u001a\u02d3\t\u001a\u0001\u001a"+
+    "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0004\u001b"+
+    "\u02db\b\u001b\u000b\u001b\f\u001b\u02dc\u0001\u001b\u0001\u001b\u0001"+
+    "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001"+
+    "\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001"+
+    "!\u0001!\u0003!\u02f0\b!\u0001!\u0004!\u02f3\b!\u000b!\f!\u02f4\u0001"+
+    "\"\u0001\"\u0001#\u0001#\u0001$\u0001$\u0001$\u0003$\u02fe\b$\u0001%\u0001"+
+    "%\u0001&\u0001&\u0001&\u0003&\u0305\b&\u0001\'\u0001\'\u0001\'\u0005\'"+
+    "\u030a\b\'\n\'\f\'\u030d\t\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+
+    "\'\u0005\'\u0315\b\'\n\'\f\'\u0318\t\'\u0001\'\u0001\'\u0001\'\u0001\'"+
+    "\u0001\'\u0003\'\u031f\b\'\u0001\'\u0003\'\u0322\b\'\u0003\'\u0324\b\'"+
+    "\u0001(\u0004(\u0327\b(\u000b(\f(\u0328\u0001)\u0004)\u032c\b)\u000b)"+
+    "\f)\u032d\u0001)\u0001)\u0005)\u0332\b)\n)\f)\u0335\t)\u0001)\u0001)\u0004"+
+    ")\u0339\b)\u000b)\f)\u033a\u0001)\u0004)\u033e\b)\u000b)\f)\u033f\u0001"+
+    ")\u0001)\u0005)\u0344\b)\n)\f)\u0347\t)\u0003)\u0349\b)\u0001)\u0001)"+
+    "\u0001)\u0001)\u0004)\u034f\b)\u000b)\f)\u0350\u0001)\u0001)\u0003)\u0355"+
+    "\b)\u0001*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001,\u0001,\u0001"+
+    ",\u0001,\u0001-\u0001-\u0001.\u0001.\u0001.\u0001/\u0001/\u00010\u0001"+
+    "0\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00013\u00013\u0001"+
+    "3\u00013\u00013\u00013\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+
+    "5\u00015\u00015\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u0001"+
+    "7\u00018\u00018\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?\u0001?\u0001?\u0001@\u0001@\u0001A\u0001A\u0001A\u0001A\u0001"+
+    "A\u0001B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001D\u0001D\u0001D\u0001"+
+    "E\u0001E\u0001F\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001H\u0001"+
+    "I\u0001I\u0001J\u0001J\u0001K\u0001K\u0001L\u0001L\u0001M\u0001M\u0001"+
+    "N\u0001N\u0001O\u0001O\u0001P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001"+
+    "Q\u0003Q\u03d9\bQ\u0001Q\u0005Q\u03dc\bQ\nQ\fQ\u03df\tQ\u0001Q\u0001Q"+
+    "\u0004Q\u03e3\bQ\u000bQ\fQ\u03e4\u0003Q\u03e7\bQ\u0001R\u0001R\u0001R"+
+    "\u0001R\u0001R\u0001S\u0001S\u0001S\u0001S\u0001S\u0001T\u0001T\u0005"+
+    "T\u03f5\bT\nT\fT\u03f8\tT\u0001T\u0001T\u0003T\u03fc\bT\u0001T\u0004T"+
+    "\u03ff\bT\u000bT\fT\u0400\u0003T\u0403\bT\u0001U\u0001U\u0004U\u0407\b"+
+    "U\u000bU\fU\u0408\u0001U\u0001U\u0001V\u0001V\u0001W\u0001W\u0001W\u0001"+
+    "W\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001Y\u0001Y\u0001Z\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_\u0001_\u0001_\u0001`\u0001`\u0001`\u0001`\u0001"+
+    "a\u0001a\u0001a\u0001a\u0001b\u0001b\u0001b\u0001b\u0001c\u0001c\u0001"+
+    "c\u0001c\u0001d\u0001d\u0001d\u0001d\u0001e\u0001e\u0001e\u0001e\u0001"+
+    "e\u0001e\u0001e\u0001e\u0001e\u0001f\u0001f\u0001f\u0003f\u0456\bf\u0001"+
+    "g\u0004g\u0459\bg\u000bg\fg\u045a\u0001h\u0001h\u0001h\u0001h\u0001i\u0001"+
+    "i\u0001i\u0001i\u0001j\u0001j\u0001j\u0001j\u0001k\u0001k\u0001k\u0001"+
+    "k\u0001l\u0001l\u0001l\u0001l\u0001m\u0001m\u0001m\u0001m\u0001m\u0001"+
+    "n\u0001n\u0001n\u0001n\u0001o\u0001o\u0001o\u0001o\u0001p\u0001p\u0001"+
+    "p\u0001p\u0001q\u0001q\u0001q\u0001q\u0001r\u0001r\u0001r\u0001r\u0003"+
+    "r\u048a\br\u0001s\u0001s\u0003s\u048e\bs\u0001s\u0005s\u0491\bs\ns\fs"+
+    "\u0494\ts\u0001s\u0001s\u0003s\u0498\bs\u0001s\u0004s\u049b\bs\u000bs"+
+    "\fs\u049c\u0003s\u049f\bs\u0001t\u0001t\u0004t\u04a3\bt\u000bt\ft\u04a4"+
+    "\u0001u\u0001u\u0001u\u0001u\u0001v\u0001v\u0001v\u0001v\u0001w\u0001"+
+    "w\u0001w\u0001w\u0001x\u0001x\u0001x\u0001x\u0001x\u0001y\u0001y\u0001"+
+    "y\u0001y\u0001z\u0001z\u0001z\u0001z\u0001{\u0001{\u0001{\u0001{\u0001"+
+    "|\u0001|\u0001|\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\u0082\u0001\u0082\u0001\u0082\u0001\u0082\u0001\u0083\u0001\u0083"+
+    "\u0001\u0083\u0001\u0083\u0001\u0083\u0001\u0084\u0001\u0084\u0001\u0084"+
+    "\u0001\u0084\u0001\u0084\u0001\u0085\u0001\u0085\u0001\u0085\u0001\u0085"+
+    "\u0001\u0085\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086\u0001\u0086"+
+    "\u0001\u0086\u0001\u0086\u0001\u0087\u0001\u0087\u0001\u0088\u0004\u0088"+
+    "\u04f8\b\u0088\u000b\u0088\f\u0088\u04f9\u0001\u0088\u0001\u0088\u0003"+
+    "\u0088\u04fe\b\u0088\u0001\u0088\u0004\u0088\u0501\b\u0088\u000b\u0088"+
+    "\f\u0088\u0502\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\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\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\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\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\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\u00a9\u0004\u00a9\u0590\b\u00a9\u000b\u00a9\f\u00a9"+
+    "\u0591\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"+
+    "\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\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\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\u00bc\u0001"+
+    "\u00bc\u0001\u00bc\u0001\u00bc\u0001\u00bd\u0001\u00bd\u0001\u00bd\u0001"+
+    "\u00bd\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001\u00be\u0001"+
+    "\u00bf\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\u00c1\u0001\u00c1\u0001\u00c1\u0001"+
-    "\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c3\u0001\u00c3\u0001"+
-    "\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001\u00c4\u0001"+
-    "\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c6\u0001\u00c6\u0001"+
-    "\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001\u00c7\u0001"+
-    "\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c9\u0001\u00c9\u0001"+
-    "\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001\u00ca\u0001"+
-    "\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+
+    "\u00c1\u0001\u00c1\u0001\u00c1\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+
+    "\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001\u00c2\u0001"+
+    "\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c3\u0001\u00c4\u0001\u00c4\u0001"+
+    "\u00c4\u0001\u00c4\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001\u00c5\u0001"+
+    "\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c6\u0001\u00c7\u0001\u00c7\u0001"+
+    "\u00c7\u0001\u00c7\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001\u00c8\u0001"+
+    "\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00c9\u0001\u00ca\u0001\u00ca\u0001"+
+    "\u00ca\u0001\u00ca\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001\u00cb\u0001"+
     "\u00cb\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001\u00cc\u0001"+
-    "\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00ce\u0001"+
-    "\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001\u00cf\u0001\u00cf\u0001"+
-    "\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+
+    "\u00cc\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001\u00cd\u0001"+
+    "\u00cd\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00ce\u0001\u00cf\u0001"+
+    "\u00cf\u0001\u00cf\u0001\u00cf\u0001\u00d0\u0001\u00d0\u0001\u00d0\u0001"+
     "\u00d0\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001\u00d1\u0001"+
-    "\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d3\u0001"+
-    "\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001\u00d4\u0001\u00d4\u0001"+
-    "\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001"+
+    "\u00d1\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001\u00d2\u0001"+
+    "\u00d2\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d3\u0001\u00d4\u0001"+
+    "\u00d4\u0001\u00d4\u0001\u00d4\u0001\u00d5\u0001\u00d5\u0001\u00d5\u0001"+
     "\u00d5\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001\u00d6\u0001"+
     "\u00d6\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001\u00d7\u0001"+
-    "\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0002"+
-    "\u02aa\u02ef\u0000\u00d9\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\u001bF\u001cH\u0000J\u0000L\u0000N\u0000P\u0000R\u0000"+
-    "T\u0000V\u0000X\u0000Z\u0000\\\u001d^\u001e`\u001fb d!f\"h#j$l%n&p\'r"+
-    "(t)v*x+z,|-~.\u0080/\u00820\u00841\u00862\u00883\u008a4\u008c5\u008e6"+
-    "\u00907\u00928\u00949\u0096:\u0098;\u009a<\u009c=\u009e>\u00a0?\u00a2"+
-    "@\u00a4A\u00a6B\u00a8C\u00aaD\u00acE\u00ae\u0000\u00b0F\u00b2G\u00b4H"+
-    "\u00b6I\u00b8\u0000\u00baJ\u00bcK\u00beL\u00c0M\u00c2\u0000\u00c4\u0000"+
-    "\u00c6N\u00c8O\u00caP\u00cc\u0000\u00ce\u0000\u00d0\u0000\u00d2\u0000"+
-    "\u00d4\u0000\u00d6\u0000\u00d8Q\u00da\u0000\u00dcR\u00de\u0000\u00e0\u0000"+
-    "\u00e2S\u00e4T\u00e6U\u00e8\u0000\u00ea\u0000\u00ec\u0000\u00ee\u0000"+
-    "\u00f0\u0000\u00f2\u0000\u00f4\u0000\u00f6V\u00f8W\u00faX\u00fcY\u00fe"+
-    "\u0000\u0100\u0000\u0102\u0000\u0104\u0000\u0106\u0000\u0108\u0000\u010a"+
-    "Z\u010c\u0000\u010e[\u0110\\\u0112]\u0114\u0000\u0116\u0000\u0118^\u011a"+
-    "_\u011c\u0000\u011e`\u0120\u0000\u0122a\u0124b\u0126c\u0128\u0000\u012a"+
-    "\u0000\u012c\u0000\u012e\u0000\u0130\u0000\u0132\u0000\u0134\u0000\u0136"+
-    "\u0000\u0138\u0000\u013ad\u013ce\u013ef\u0140\u0000\u0142\u0000\u0144"+
-    "\u0000\u0146\u0000\u0148\u0000\u014a\u0000\u014cg\u014eh\u0150i\u0152"+
-    "\u0000\u0154j\u0156k\u0158l\u015am\u015c\u0000\u015e\u0000\u0160n\u0162"+
-    "o\u0164p\u0166q\u0168\u0000\u016a\u0000\u016c\u0000\u016e\u0000\u0170"+
-    "\u0000\u0172\u0000\u0174\u0000\u0176r\u0178s\u017at\u017c\u0000\u017e"+
-    "\u0000\u0180\u0000\u0182\u0000\u0184u\u0186v\u0188w\u018a\u0000\u018c"+
-    "x\u018e\u0000\u0190\u0000\u0192y\u0194\u0000\u0196\u0000\u0198\u0000\u019a"+
-    "\u0000\u019c\u0000\u019ez\u01a0{\u01a2|\u01a4\u0000\u01a6\u0000\u01a8"+
-    "\u0000\u01aa}\u01ac~\u01ae\u007f\u01b0\u0000\u01b2\u0000\u01b4\u0080\u01b6"+
-    "\u0081\u01b8\u0082\u01ba\u0000\u01bc\u0000\u01be\u0000\u01c0\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\u0000EE"+
-    "ee\u0002\u0000CCcc\u0002\u0000TTtt\u0002\u0000RRrr\u0002\u0000OOoo\u0002"+
-    "\u0000PPpp\u0002\u0000NNnn\u0002\u0000HHhh\u0002\u0000VVvv\u0002\u0000"+
-    "AAaa\u0002\u0000LLll\u0002\u0000XXxx\u0002\u0000FFff\u0002\u0000MMmm\u0002"+
-    "\u0000GGgg\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\u0000"+
-    "09\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"+
-    "  \"#,,//::<<>?\\\\||\u0002\u0000JJjj\u0664\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\u0000"+
-    "4\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\u0000"+
-    "B\u0001\u0000\u0000\u0000\u0000D\u0001\u0000\u0000\u0000\u0001F\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\u00ae\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"+
-    "\u0001\u00ba\u0001\u0000\u0000\u0000\u0001\u00bc\u0001\u0000\u0000\u0000"+
-    "\u0001\u00be\u0001\u0000\u0000\u0000\u0001\u00c0\u0001\u0000\u0000\u0000"+
-    "\u0002\u00c2\u0001\u0000\u0000\u0000\u0002\u00c4\u0001\u0000\u0000\u0000"+
-    "\u0002\u00c6\u0001\u0000\u0000\u0000\u0002\u00c8\u0001\u0000\u0000\u0000"+
-    "\u0002\u00ca\u0001\u0000\u0000\u0000\u0003\u00cc\u0001\u0000\u0000\u0000"+
-    "\u0003\u00ce\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\u00dc\u0001\u0000\u0000\u0000\u0003\u00de\u0001\u0000\u0000\u0000"+
-    "\u0003\u00e0\u0001\u0000\u0000\u0000\u0003\u00e2\u0001\u0000\u0000\u0000"+
-    "\u0003\u00e4\u0001\u0000\u0000\u0000\u0003\u00e6\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"+
-    "\u0004\u00f0\u0001\u0000\u0000\u0000\u0004\u00f6\u0001\u0000\u0000\u0000"+
-    "\u0004\u00f8\u0001\u0000\u0000\u0000\u0004\u00fa\u0001\u0000\u0000\u0000"+
-    "\u0004\u00fc\u0001\u0000\u0000\u0000\u0005\u00fe\u0001\u0000\u0000\u0000"+
-    "\u0005\u0100\u0001\u0000\u0000\u0000\u0005\u0102\u0001\u0000\u0000\u0000"+
-    "\u0005\u0104\u0001\u0000\u0000\u0000\u0005\u0106\u0001\u0000\u0000\u0000"+
-    "\u0005\u0108\u0001\u0000\u0000\u0000\u0005\u010a\u0001\u0000\u0000\u0000"+
-    "\u0005\u010c\u0001\u0000\u0000\u0000\u0005\u010e\u0001\u0000\u0000\u0000"+
-    "\u0005\u0110\u0001\u0000\u0000\u0000\u0005\u0112\u0001\u0000\u0000\u0000"+
-    "\u0006\u0114\u0001\u0000\u0000\u0000\u0006\u0116\u0001\u0000\u0000\u0000"+
-    "\u0006\u0118\u0001\u0000\u0000\u0000\u0006\u011a\u0001\u0000\u0000\u0000"+
-    "\u0006\u011e\u0001\u0000\u0000\u0000\u0006\u0120\u0001\u0000\u0000\u0000"+
-    "\u0006\u0122\u0001\u0000\u0000\u0000\u0006\u0124\u0001\u0000\u0000\u0000"+
-    "\u0006\u0126\u0001\u0000\u0000\u0000\u0007\u0128\u0001\u0000\u0000\u0000"+
-    "\u0007\u012a\u0001\u0000\u0000\u0000\u0007\u012c\u0001\u0000\u0000\u0000"+
-    "\u0007\u012e\u0001\u0000\u0000\u0000\u0007\u0130\u0001\u0000\u0000\u0000"+
-    "\u0007\u0132\u0001\u0000\u0000\u0000\u0007\u0134\u0001\u0000\u0000\u0000"+
-    "\u0007\u0136\u0001\u0000\u0000\u0000\u0007\u0138\u0001\u0000\u0000\u0000"+
-    "\u0007\u013a\u0001\u0000\u0000\u0000\u0007\u013c\u0001\u0000\u0000\u0000"+
-    "\u0007\u013e\u0001\u0000\u0000\u0000\b\u0140\u0001\u0000\u0000\u0000\b"+
-    "\u0142\u0001\u0000\u0000\u0000\b\u0144\u0001\u0000\u0000\u0000\b\u0146"+
-    "\u0001\u0000\u0000\u0000\b\u0148\u0001\u0000\u0000\u0000\b\u014a\u0001"+
-    "\u0000\u0000\u0000\b\u014c\u0001\u0000\u0000\u0000\b\u014e\u0001\u0000"+
-    "\u0000\u0000\b\u0150\u0001\u0000\u0000\u0000\t\u0152\u0001\u0000\u0000"+
-    "\u0000\t\u0154\u0001\u0000\u0000\u0000\t\u0156\u0001\u0000\u0000\u0000"+
-    "\t\u0158\u0001\u0000\u0000\u0000\t\u015a\u0001\u0000\u0000\u0000\n\u015c"+
-    "\u0001\u0000\u0000\u0000\n\u015e\u0001\u0000\u0000\u0000\n\u0160\u0001"+
-    "\u0000\u0000\u0000\n\u0162\u0001\u0000\u0000\u0000\n\u0164\u0001\u0000"+
-    "\u0000\u0000\n\u0166\u0001\u0000\u0000\u0000\u000b\u0168\u0001\u0000\u0000"+
-    "\u0000\u000b\u016a\u0001\u0000\u0000\u0000\u000b\u016c\u0001\u0000\u0000"+
-    "\u0000\u000b\u016e\u0001\u0000\u0000\u0000\u000b\u0170\u0001\u0000\u0000"+
-    "\u0000\u000b\u0172\u0001\u0000\u0000\u0000\u000b\u0174\u0001\u0000\u0000"+
-    "\u0000\u000b\u0176\u0001\u0000\u0000\u0000\u000b\u0178\u0001\u0000\u0000"+
-    "\u0000\u000b\u017a\u0001\u0000\u0000\u0000\f\u017c\u0001\u0000\u0000\u0000"+
-    "\f\u017e\u0001\u0000\u0000\u0000\f\u0180\u0001\u0000\u0000\u0000\f\u0182"+
-    "\u0001\u0000\u0000\u0000\f\u0184\u0001\u0000\u0000\u0000\f\u0186\u0001"+
-    "\u0000\u0000\u0000\f\u0188\u0001\u0000\u0000\u0000\r\u018a\u0001\u0000"+
-    "\u0000\u0000\r\u018c\u0001\u0000\u0000\u0000\r\u018e\u0001\u0000\u0000"+
-    "\u0000\r\u0190\u0001\u0000\u0000\u0000\r\u0192\u0001\u0000\u0000\u0000"+
-    "\r\u0194\u0001\u0000\u0000\u0000\r\u0196\u0001\u0000\u0000\u0000\r\u0198"+
-    "\u0001\u0000\u0000\u0000\r\u019a\u0001\u0000\u0000\u0000\r\u019c\u0001"+
-    "\u0000\u0000\u0000\r\u019e\u0001\u0000\u0000\u0000\r\u01a0\u0001\u0000"+
-    "\u0000\u0000\r\u01a2\u0001\u0000\u0000\u0000\u000e\u01a4\u0001\u0000\u0000"+
-    "\u0000\u000e\u01a6\u0001\u0000\u0000\u0000\u000e\u01a8\u0001\u0000\u0000"+
-    "\u0000\u000e\u01aa\u0001\u0000\u0000\u0000\u000e\u01ac\u0001\u0000\u0000"+
-    "\u0000\u000e\u01ae\u0001\u0000\u0000\u0000\u000f\u01b0\u0001\u0000\u0000"+
-    "\u0000\u000f\u01b2\u0001\u0000\u0000\u0000\u000f\u01b4\u0001\u0000\u0000"+
-    "\u0000\u000f\u01b6\u0001\u0000\u0000\u0000\u000f\u01b8\u0001\u0000\u0000"+
-    "\u0000\u000f\u01ba\u0001\u0000\u0000\u0000\u000f\u01bc\u0001\u0000\u0000"+
-    "\u0000\u000f\u01be\u0001\u0000\u0000\u0000\u000f\u01c0\u0001\u0000\u0000"+
-    "\u0000\u0010\u01c2\u0001\u0000\u0000\u0000\u0012\u01cc\u0001\u0000\u0000"+
-    "\u0000\u0014\u01d3\u0001\u0000\u0000\u0000\u0016\u01dc\u0001\u0000\u0000"+
-    "\u0000\u0018\u01e3\u0001\u0000\u0000\u0000\u001a\u01ed\u0001\u0000\u0000"+
-    "\u0000\u001c\u01f4\u0001\u0000\u0000\u0000\u001e\u01fb\u0001\u0000\u0000"+
-    "\u0000 \u0202\u0001\u0000\u0000\u0000\"\u020a\u0001\u0000\u0000\u0000"+
-    "$\u0216\u0001\u0000\u0000\u0000&\u021f\u0001\u0000\u0000\u0000(\u0225"+
-    "\u0001\u0000\u0000\u0000*\u022c\u0001\u0000\u0000\u0000,\u0233\u0001\u0000"+
-    "\u0000\u0000.\u023b\u0001\u0000\u0000\u00000\u0243\u0001\u0000\u0000\u0000"+
-    "2\u024c\u0001\u0000\u0000\u00004\u025b\u0001\u0000\u0000\u00006\u0267"+
-    "\u0001\u0000\u0000\u00008\u0272\u0001\u0000\u0000\u0000:\u027a\u0001\u0000"+
-    "\u0000\u0000<\u0282\u0001\u0000\u0000\u0000>\u028c\u0001\u0000\u0000\u0000"+
-    "@\u0292\u0001\u0000\u0000\u0000B\u02a3\u0001\u0000\u0000\u0000D\u02b3"+
-    "\u0001\u0000\u0000\u0000F\u02b9\u0001\u0000\u0000\u0000H\u02bd\u0001\u0000"+
-    "\u0000\u0000J\u02bf\u0001\u0000\u0000\u0000L\u02c1\u0001\u0000\u0000\u0000"+
-    "N\u02c4\u0001\u0000\u0000\u0000P\u02c6\u0001\u0000\u0000\u0000R\u02cf"+
-    "\u0001\u0000\u0000\u0000T\u02d1\u0001\u0000\u0000\u0000V\u02d6\u0001\u0000"+
-    "\u0000\u0000X\u02d8\u0001\u0000\u0000\u0000Z\u02dd\u0001\u0000\u0000\u0000"+
-    "\\\u02fc\u0001\u0000\u0000\u0000^\u02ff\u0001\u0000\u0000\u0000`\u032d"+
-    "\u0001\u0000\u0000\u0000b\u032f\u0001\u0000\u0000\u0000d\u0332\u0001\u0000"+
-    "\u0000\u0000f\u0336\u0001\u0000\u0000\u0000h\u033a\u0001\u0000\u0000\u0000"+
-    "j\u033c\u0001\u0000\u0000\u0000l\u033f\u0001\u0000\u0000\u0000n\u0341"+
-    "\u0001\u0000\u0000\u0000p\u0343\u0001\u0000\u0000\u0000r\u0348\u0001\u0000"+
-    "\u0000\u0000t\u034a\u0001\u0000\u0000\u0000v\u0350\u0001\u0000\u0000\u0000"+
-    "x\u0356\u0001\u0000\u0000\u0000z\u0359\u0001\u0000\u0000\u0000|\u035c"+
-    "\u0001\u0000\u0000\u0000~\u0361\u0001\u0000\u0000\u0000\u0080\u0366\u0001"+
-    "\u0000\u0000\u0000\u0082\u0368\u0001\u0000\u0000\u0000\u0084\u036c\u0001"+
-    "\u0000\u0000\u0000\u0086\u0371\u0001\u0000\u0000\u0000\u0088\u0377\u0001"+
-    "\u0000\u0000\u0000\u008a\u037a\u0001\u0000\u0000\u0000\u008c\u037c\u0001"+
-    "\u0000\u0000\u0000\u008e\u0382\u0001\u0000\u0000\u0000\u0090\u0384\u0001"+
-    "\u0000\u0000\u0000\u0092\u0389\u0001\u0000\u0000\u0000\u0094\u038c\u0001"+
-    "\u0000\u0000\u0000\u0096\u038f\u0001\u0000\u0000\u0000\u0098\u0392\u0001"+
-    "\u0000\u0000\u0000\u009a\u0394\u0001\u0000\u0000\u0000\u009c\u0397\u0001"+
-    "\u0000\u0000\u0000\u009e\u0399\u0001\u0000\u0000\u0000\u00a0\u039c\u0001"+
-    "\u0000\u0000\u0000\u00a2\u039e\u0001\u0000\u0000\u0000\u00a4\u03a0\u0001"+
-    "\u0000\u0000\u0000\u00a6\u03a2\u0001\u0000\u0000\u0000\u00a8\u03a4\u0001"+
-    "\u0000\u0000\u0000\u00aa\u03a6\u0001\u0000\u0000\u0000\u00ac\u03a8\u0001"+
-    "\u0000\u0000\u0000\u00ae\u03aa\u0001\u0000\u0000\u0000\u00b0\u03bf\u0001"+
-    "\u0000\u0000\u0000\u00b2\u03c1\u0001\u0000\u0000\u0000\u00b4\u03c6\u0001"+
-    "\u0000\u0000\u0000\u00b6\u03db\u0001\u0000\u0000\u0000\u00b8\u03dd\u0001"+
-    "\u0000\u0000\u0000\u00ba\u03e5\u0001\u0000\u0000\u0000\u00bc\u03e7\u0001"+
-    "\u0000\u0000\u0000\u00be\u03eb\u0001\u0000\u0000\u0000\u00c0\u03ef\u0001"+
-    "\u0000\u0000\u0000\u00c2\u03f3\u0001\u0000\u0000\u0000\u00c4\u03f8\u0001"+
-    "\u0000\u0000\u0000\u00c6\u03fd\u0001\u0000\u0000\u0000\u00c8\u0401\u0001"+
-    "\u0000\u0000\u0000\u00ca\u0405\u0001\u0000\u0000\u0000\u00cc\u0409\u0001"+
-    "\u0000\u0000\u0000\u00ce\u040e\u0001\u0000\u0000\u0000\u00d0\u0412\u0001"+
-    "\u0000\u0000\u0000\u00d2\u0416\u0001\u0000\u0000\u0000\u00d4\u041a\u0001"+
-    "\u0000\u0000\u0000\u00d6\u041e\u0001\u0000\u0000\u0000\u00d8\u0422\u0001"+
-    "\u0000\u0000\u0000\u00da\u042e\u0001\u0000\u0000\u0000\u00dc\u0431\u0001"+
-    "\u0000\u0000\u0000\u00de\u0435\u0001\u0000\u0000\u0000\u00e0\u0439\u0001"+
-    "\u0000\u0000\u0000\u00e2\u043d\u0001\u0000\u0000\u0000\u00e4\u0441\u0001"+
-    "\u0000\u0000\u0000\u00e6\u0445\u0001\u0000\u0000\u0000\u00e8\u0449\u0001"+
-    "\u0000\u0000\u0000\u00ea\u044e\u0001\u0000\u0000\u0000\u00ec\u0452\u0001"+
-    "\u0000\u0000\u0000\u00ee\u0456\u0001\u0000\u0000\u0000\u00f0\u045a\u0001"+
-    "\u0000\u0000\u0000\u00f2\u0462\u0001\u0000\u0000\u0000\u00f4\u0477\u0001"+
-    "\u0000\u0000\u0000\u00f6\u047b\u0001\u0000\u0000\u0000\u00f8\u047f\u0001"+
-    "\u0000\u0000\u0000\u00fa\u0483\u0001\u0000\u0000\u0000\u00fc\u0487\u0001"+
-    "\u0000\u0000\u0000\u00fe\u048b\u0001\u0000\u0000\u0000\u0100\u0490\u0001"+
-    "\u0000\u0000\u0000\u0102\u0494\u0001\u0000\u0000\u0000\u0104\u0498\u0001"+
-    "\u0000\u0000\u0000\u0106\u049c\u0001\u0000\u0000\u0000\u0108\u04a0\u0001"+
-    "\u0000\u0000\u0000\u010a\u04a4\u0001\u0000\u0000\u0000\u010c\u04a7\u0001"+
-    "\u0000\u0000\u0000\u010e\u04ab\u0001\u0000\u0000\u0000\u0110\u04af\u0001"+
-    "\u0000\u0000\u0000\u0112\u04b3\u0001\u0000\u0000\u0000\u0114\u04b7\u0001"+
-    "\u0000\u0000\u0000\u0116\u04bc\u0001\u0000\u0000\u0000\u0118\u04c1\u0001"+
-    "\u0000\u0000\u0000\u011a\u04c6\u0001\u0000\u0000\u0000\u011c\u04cd\u0001"+
-    "\u0000\u0000\u0000\u011e\u04d6\u0001\u0000\u0000\u0000\u0120\u04dd\u0001"+
-    "\u0000\u0000\u0000\u0122\u04e1\u0001\u0000\u0000\u0000\u0124\u04e5\u0001"+
-    "\u0000\u0000\u0000\u0126\u04e9\u0001\u0000\u0000\u0000\u0128\u04ed\u0001"+
-    "\u0000\u0000\u0000\u012a\u04f3\u0001\u0000\u0000\u0000\u012c\u04f7\u0001"+
-    "\u0000\u0000\u0000\u012e\u04fb\u0001\u0000\u0000\u0000\u0130\u04ff\u0001"+
-    "\u0000\u0000\u0000\u0132\u0503\u0001\u0000\u0000\u0000\u0134\u0507\u0001"+
-    "\u0000\u0000\u0000\u0136\u050b\u0001\u0000\u0000\u0000\u0138\u050f\u0001"+
-    "\u0000\u0000\u0000\u013a\u0513\u0001\u0000\u0000\u0000\u013c\u0517\u0001"+
-    "\u0000\u0000\u0000\u013e\u051b\u0001\u0000\u0000\u0000\u0140\u051f\u0001"+
-    "\u0000\u0000\u0000\u0142\u0524\u0001\u0000\u0000\u0000\u0144\u0528\u0001"+
-    "\u0000\u0000\u0000\u0146\u052c\u0001\u0000\u0000\u0000\u0148\u0530\u0001"+
-    "\u0000\u0000\u0000\u014a\u0534\u0001\u0000\u0000\u0000\u014c\u0538\u0001"+
-    "\u0000\u0000\u0000\u014e\u053c\u0001\u0000\u0000\u0000\u0150\u0540\u0001"+
-    "\u0000\u0000\u0000\u0152\u0544\u0001\u0000\u0000\u0000\u0154\u0549\u0001"+
-    "\u0000\u0000\u0000\u0156\u054e\u0001\u0000\u0000\u0000\u0158\u0552\u0001"+
-    "\u0000\u0000\u0000\u015a\u0556\u0001\u0000\u0000\u0000\u015c\u055a\u0001"+
-    "\u0000\u0000\u0000\u015e\u055f\u0001\u0000\u0000\u0000\u0160\u0568\u0001"+
-    "\u0000\u0000\u0000\u0162\u056c\u0001\u0000\u0000\u0000\u0164\u0570\u0001"+
-    "\u0000\u0000\u0000\u0166\u0574\u0001\u0000\u0000\u0000\u0168\u0578\u0001"+
-    "\u0000\u0000\u0000\u016a\u057d\u0001\u0000\u0000\u0000\u016c\u0581\u0001"+
-    "\u0000\u0000\u0000\u016e\u0585\u0001\u0000\u0000\u0000\u0170\u0589\u0001"+
-    "\u0000\u0000\u0000\u0172\u058e\u0001\u0000\u0000\u0000\u0174\u0592\u0001"+
-    "\u0000\u0000\u0000\u0176\u0596\u0001\u0000\u0000\u0000\u0178\u059a\u0001"+
-    "\u0000\u0000\u0000\u017a\u059e\u0001\u0000\u0000\u0000\u017c\u05a2\u0001"+
-    "\u0000\u0000\u0000\u017e\u05a8\u0001\u0000\u0000\u0000\u0180\u05ac\u0001"+
-    "\u0000\u0000\u0000\u0182\u05b0\u0001\u0000\u0000\u0000\u0184\u05b4\u0001"+
-    "\u0000\u0000\u0000\u0186\u05b8\u0001\u0000\u0000\u0000\u0188\u05bc\u0001"+
-    "\u0000\u0000\u0000\u018a\u05c0\u0001\u0000\u0000\u0000\u018c\u05c5\u0001"+
-    "\u0000\u0000\u0000\u018e\u05ca\u0001\u0000\u0000\u0000\u0190\u05ce\u0001"+
-    "\u0000\u0000\u0000\u0192\u05d4\u0001\u0000\u0000\u0000\u0194\u05dd\u0001"+
-    "\u0000\u0000\u0000\u0196\u05e1\u0001\u0000\u0000\u0000\u0198\u05e5\u0001"+
-    "\u0000\u0000\u0000\u019a\u05e9\u0001\u0000\u0000\u0000\u019c\u05ed\u0001"+
-    "\u0000\u0000\u0000\u019e\u05f1\u0001\u0000\u0000\u0000\u01a0\u05f5\u0001"+
-    "\u0000\u0000\u0000\u01a2\u05f9\u0001\u0000\u0000\u0000\u01a4\u05fd\u0001"+
-    "\u0000\u0000\u0000\u01a6\u0602\u0001\u0000\u0000\u0000\u01a8\u0608\u0001"+
-    "\u0000\u0000\u0000\u01aa\u060e\u0001\u0000\u0000\u0000\u01ac\u0612\u0001"+
-    "\u0000\u0000\u0000\u01ae\u0616\u0001\u0000\u0000\u0000\u01b0\u061a\u0001"+
-    "\u0000\u0000\u0000\u01b2\u0620\u0001\u0000\u0000\u0000\u01b4\u0626\u0001"+
-    "\u0000\u0000\u0000\u01b6\u062a\u0001\u0000\u0000\u0000\u01b8\u062e\u0001"+
-    "\u0000\u0000\u0000\u01ba\u0632\u0001\u0000\u0000\u0000\u01bc\u0638\u0001"+
-    "\u0000\u0000\u0000\u01be\u063e\u0001\u0000\u0000\u0000\u01c0\u0644\u0001"+
-    "\u0000\u0000\u0000\u01c2\u01c3\u0007\u0000\u0000\u0000\u01c3\u01c4\u0007"+
-    "\u0001\u0000\u0000\u01c4\u01c5\u0007\u0002\u0000\u0000\u01c5\u01c6\u0007"+
-    "\u0002\u0000\u0000\u01c6\u01c7\u0007\u0003\u0000\u0000\u01c7\u01c8\u0007"+
-    "\u0004\u0000\u0000\u01c8\u01c9\u0007\u0005\u0000\u0000\u01c9\u01ca\u0001"+
-    "\u0000\u0000\u0000\u01ca\u01cb\u0006\u0000\u0000\u0000\u01cb\u0011\u0001"+
-    "\u0000\u0000\u0000\u01cc\u01cd\u0007\u0000\u0000\u0000\u01cd\u01ce\u0007"+
-    "\u0006\u0000\u0000\u01ce\u01cf\u0007\u0007\u0000\u0000\u01cf\u01d0\u0007"+
-    "\b\u0000\u0000\u01d0\u01d1\u0001\u0000\u0000\u0000\u01d1\u01d2\u0006\u0001"+
-    "\u0001\u0000\u01d2\u0013\u0001\u0000\u0000\u0000\u01d3\u01d4\u0007\u0003"+
-    "\u0000\u0000\u01d4\u01d5\u0007\t\u0000\u0000\u01d5\u01d6\u0007\u0006\u0000"+
-    "\u0000\u01d6\u01d7\u0007\u0001\u0000\u0000\u01d7\u01d8\u0007\u0004\u0000"+
-    "\u0000\u01d8\u01d9\u0007\n\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000"+
-    "\u01da\u01db\u0006\u0002\u0002\u0000\u01db\u0015\u0001\u0000\u0000\u0000"+
-    "\u01dc\u01dd\u0007\u0003\u0000\u0000\u01dd\u01de\u0007\u000b\u0000\u0000"+
-    "\u01de\u01df\u0007\f\u0000\u0000\u01df\u01e0\u0007\r\u0000\u0000\u01e0"+
-    "\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e2\u0006\u0003\u0000\u0000\u01e2"+
-    "\u0017\u0001\u0000\u0000\u0000\u01e3\u01e4\u0007\u0003\u0000\u0000\u01e4"+
-    "\u01e5\u0007\u000e\u0000\u0000\u01e5\u01e6\u0007\b\u0000\u0000\u01e6\u01e7"+
-    "\u0007\r\u0000\u0000\u01e7\u01e8\u0007\f\u0000\u0000\u01e8\u01e9\u0007"+
-    "\u0001\u0000\u0000\u01e9\u01ea\u0007\t\u0000\u0000\u01ea\u01eb\u0001\u0000"+
-    "\u0000\u0000\u01eb\u01ec\u0006\u0004\u0003\u0000\u01ec\u0019\u0001\u0000"+
-    "\u0000\u0000\u01ed\u01ee\u0007\u000f\u0000\u0000\u01ee\u01ef\u0007\u0006"+
-    "\u0000\u0000\u01ef\u01f0\u0007\u0007\u0000\u0000\u01f0\u01f1\u0007\u0010"+
-    "\u0000\u0000\u01f1\u01f2\u0001\u0000\u0000\u0000\u01f2\u01f3\u0006\u0005"+
-    "\u0004\u0000\u01f3\u001b\u0001\u0000\u0000\u0000\u01f4\u01f5\u0007\u0011"+
-    "\u0000\u0000\u01f5\u01f6\u0007\u0006\u0000\u0000\u01f6\u01f7\u0007\u0007"+
-    "\u0000\u0000\u01f7\u01f8\u0007\u0012\u0000\u0000\u01f8\u01f9\u0001\u0000"+
-    "\u0000\u0000\u01f9\u01fa\u0006\u0006\u0000\u0000\u01fa\u001d\u0001\u0000"+
-    "\u0000\u0000\u01fb\u01fc\u0007\u0012\u0000\u0000\u01fc\u01fd\u0007\u0003"+
-    "\u0000\u0000\u01fd\u01fe\u0007\u0003\u0000\u0000\u01fe\u01ff\u0007\b\u0000"+
-    "\u0000\u01ff\u0200\u0001\u0000\u0000\u0000\u0200\u0201\u0006\u0007\u0001"+
-    "\u0000\u0201\u001f\u0001\u0000\u0000\u0000\u0202\u0203\u0007\r\u0000\u0000"+
-    "\u0203\u0204\u0007\u0001\u0000\u0000\u0204\u0205\u0007\u0010\u0000\u0000"+
-    "\u0205\u0206\u0007\u0001\u0000\u0000\u0206\u0207\u0007\u0005\u0000\u0000"+
-    "\u0207\u0208\u0001\u0000\u0000\u0000\u0208\u0209\u0006\b\u0000\u0000\u0209"+
-    "!\u0001\u0000\u0000\u0000\u020a\u020b\u0007\u0010\u0000\u0000\u020b\u020c"+
-    "\u0007\u000b\u0000\u0000\u020c\u020d\u0005_\u0000\u0000\u020d\u020e\u0007"+
-    "\u0003\u0000\u0000\u020e\u020f\u0007\u000e\u0000\u0000\u020f\u0210\u0007"+
-    "\b\u0000\u0000\u0210\u0211\u0007\f\u0000\u0000\u0211\u0212\u0007\t\u0000"+
-    "\u0000\u0212\u0213\u0007\u0000\u0000\u0000\u0213\u0214\u0001\u0000\u0000"+
-    "\u0000\u0214\u0215\u0006\t\u0005\u0000\u0215#\u0001\u0000\u0000\u0000"+
-    "\u0216\u0217\u0007\u0006\u0000\u0000\u0217\u0218\u0007\u0003\u0000\u0000"+
-    "\u0218\u0219\u0007\t\u0000\u0000\u0219\u021a\u0007\f\u0000\u0000\u021a"+
-    "\u021b\u0007\u0010\u0000\u0000\u021b\u021c\u0007\u0003\u0000\u0000\u021c"+
-    "\u021d\u0001\u0000\u0000\u0000\u021d\u021e\u0006\n\u0006\u0000\u021e%"+
-    "\u0001\u0000\u0000\u0000\u021f\u0220\u0007\u0006\u0000\u0000\u0220\u0221"+
-    "\u0007\u0007\u0000\u0000\u0221\u0222\u0007\u0013\u0000\u0000\u0222\u0223"+
-    "\u0001\u0000\u0000\u0000\u0223\u0224\u0006\u000b\u0000\u0000\u0224\'\u0001"+
-    "\u0000\u0000\u0000\u0225\u0226\u0007\u0002\u0000\u0000\u0226\u0227\u0007"+
-    "\n\u0000\u0000\u0227\u0228\u0007\u0007\u0000\u0000\u0228\u0229\u0007\u0013"+
-    "\u0000\u0000\u0229\u022a\u0001\u0000\u0000\u0000\u022a\u022b\u0006\f\u0007"+
-    "\u0000\u022b)\u0001\u0000\u0000\u0000\u022c\u022d\u0007\u0002\u0000\u0000"+
-    "\u022d\u022e\u0007\u0007\u0000\u0000\u022e\u022f\u0007\u0006\u0000\u0000"+
-    "\u022f\u0230\u0007\u0005\u0000\u0000\u0230\u0231\u0001\u0000\u0000\u0000"+
-    "\u0231\u0232\u0006\r\u0000\u0000\u0232+\u0001\u0000\u0000\u0000\u0233"+
-    "\u0234\u0007\u0002\u0000\u0000\u0234\u0235\u0007\u0005\u0000\u0000\u0235"+
-    "\u0236\u0007\f\u0000\u0000\u0236\u0237\u0007\u0005\u0000\u0000\u0237\u0238"+
-    "\u0007\u0002\u0000\u0000\u0238\u0239\u0001\u0000\u0000\u0000\u0239\u023a"+
-    "\u0006\u000e\u0000\u0000\u023a-\u0001\u0000\u0000\u0000\u023b\u023c\u0007"+
-    "\u0013\u0000\u0000\u023c\u023d\u0007\n\u0000\u0000\u023d\u023e\u0007\u0003"+
-    "\u0000\u0000\u023e\u023f\u0007\u0006\u0000\u0000\u023f\u0240\u0007\u0003"+
-    "\u0000\u0000\u0240\u0241\u0001\u0000\u0000\u0000\u0241\u0242\u0006\u000f"+
-    "\u0000\u0000\u0242/\u0001\u0000\u0000\u0000\u0243\u0244\u0007\r\u0000"+
-    "\u0000\u0244\u0245\u0007\u0007\u0000\u0000\u0245\u0246\u0007\u0007\u0000"+
-    "\u0000\u0246\u0247\u0007\u0012\u0000\u0000\u0247\u0248\u0007\u0014\u0000"+
-    "\u0000\u0248\u0249\u0007\b\u0000\u0000\u0249\u024a\u0001\u0000\u0000\u0000"+
-    "\u024a\u024b\u0006\u0010\b\u0000\u024b1\u0001\u0000\u0000\u0000\u024c"+
-    "\u024d\u0004\u0011\u0000\u0000\u024d\u024e\u0007\u0001\u0000\u0000\u024e"+
-    "\u024f\u0007\t\u0000\u0000\u024f\u0250\u0007\r\u0000\u0000\u0250\u0251"+
-    "\u0007\u0001\u0000\u0000\u0251\u0252\u0007\t\u0000\u0000\u0252\u0253\u0007"+
-    "\u0003\u0000\u0000\u0253\u0254\u0007\u0002\u0000\u0000\u0254\u0255\u0007"+
-    "\u0005\u0000\u0000\u0255\u0256\u0007\f\u0000\u0000\u0256\u0257\u0007\u0005"+
-    "\u0000\u0000\u0257\u0258\u0007\u0002\u0000\u0000\u0258\u0259\u0001\u0000"+
-    "\u0000\u0000\u0259\u025a\u0006\u0011\u0000\u0000\u025a3\u0001\u0000\u0000"+
-    "\u0000\u025b\u025c\u0004\u0012\u0001\u0000\u025c\u025d\u0007\r\u0000\u0000"+
-    "\u025d\u025e\u0007\u0007\u0000\u0000\u025e\u025f\u0007\u0007\u0000\u0000"+
-    "\u025f\u0260\u0007\u0012\u0000\u0000\u0260\u0261\u0007\u0014\u0000\u0000"+
-    "\u0261\u0262\u0007\b\u0000\u0000\u0262\u0263\u0005_\u0000\u0000\u0263"+
-    "\u0264\u0005\u8001\uf414\u0000\u0000\u0264\u0265\u0001\u0000\u0000\u0000"+
-    "\u0265\u0266\u0006\u0012\t\u0000\u02665\u0001\u0000\u0000\u0000\u0267"+
-    "\u0268\u0004\u0013\u0002\u0000\u0268\u0269\u0007\u0010\u0000\u0000\u0269"+
-    "\u026a\u0007\u0003\u0000\u0000\u026a\u026b\u0007\u0005\u0000\u0000\u026b"+
-    "\u026c\u0007\u0006\u0000\u0000\u026c\u026d\u0007\u0001\u0000\u0000\u026d"+
-    "\u026e\u0007\u0004\u0000\u0000\u026e\u026f\u0007\u0002\u0000\u0000\u026f"+
-    "\u0270\u0001\u0000\u0000\u0000\u0270\u0271\u0006\u0013\n\u0000\u02717"+
-    "\u0001\u0000\u0000\u0000\u0272\u0273\u0004\u0014\u0003\u0000\u0273\u0274"+
-    "\u0007\u000f\u0000\u0000\u0274\u0275\u0007\u0014\u0000\u0000\u0275\u0276"+
-    "\u0007\r\u0000\u0000\u0276\u0277\u0007\r\u0000\u0000\u0277\u0278\u0001"+
-    "\u0000\u0000\u0000\u0278\u0279\u0006\u0014\b\u0000\u02799\u0001\u0000"+
-    "\u0000\u0000\u027a\u027b\u0004\u0015\u0004\u0000\u027b\u027c\u0007\r\u0000"+
-    "\u0000\u027c\u027d\u0007\u0003\u0000\u0000\u027d\u027e\u0007\u000f\u0000"+
-    "\u0000\u027e\u027f\u0007\u0005\u0000\u0000\u027f\u0280\u0001\u0000\u0000"+
-    "\u0000\u0280\u0281\u0006\u0015\b\u0000\u0281;\u0001\u0000\u0000\u0000"+
-    "\u0282\u0283\u0004\u0016\u0005\u0000\u0283\u0284\u0007\u0006\u0000\u0000"+
-    "\u0284\u0285\u0007\u0001\u0000\u0000\u0285\u0286\u0007\u0011\u0000\u0000"+
-    "\u0286\u0287\u0007\n\u0000\u0000\u0287\u0288\u0007\u0005\u0000\u0000\u0288"+
-    "\u0289\u0001\u0000\u0000\u0000\u0289\u028a\u0006\u0016\b\u0000\u028a="+
-    "\u0001\u0000\u0000\u0000\u028b\u028d\b\u0015\u0000\u0000\u028c\u028b\u0001"+
-    "\u0000\u0000\u0000\u028d\u028e\u0001\u0000\u0000\u0000\u028e\u028c\u0001"+
-    "\u0000\u0000\u0000\u028e\u028f\u0001\u0000\u0000\u0000\u028f\u0290\u0001"+
-    "\u0000\u0000\u0000\u0290\u0291\u0006\u0017\u0000\u0000\u0291?\u0001\u0000"+
-    "\u0000\u0000\u0292\u0293\u0005/\u0000\u0000\u0293\u0294\u0005/\u0000\u0000"+
-    "\u0294\u0298\u0001\u0000\u0000\u0000\u0295\u0297\b\u0016\u0000\u0000\u0296"+
-    "\u0295\u0001\u0000\u0000\u0000\u0297\u029a\u0001\u0000\u0000\u0000\u0298"+
-    "\u0296\u0001\u0000\u0000\u0000\u0298\u0299\u0001\u0000\u0000\u0000\u0299"+
-    "\u029c\u0001\u0000\u0000\u0000\u029a\u0298\u0001\u0000\u0000\u0000\u029b"+
-    "\u029d\u0005\r\u0000\u0000\u029c\u029b\u0001\u0000\u0000\u0000\u029c\u029d"+
-    "\u0001\u0000\u0000\u0000\u029d\u029f\u0001\u0000\u0000\u0000\u029e\u02a0"+
-    "\u0005\n\u0000\u0000\u029f\u029e\u0001\u0000\u0000\u0000\u029f\u02a0\u0001"+
-    "\u0000\u0000\u0000\u02a0\u02a1\u0001\u0000\u0000\u0000\u02a1\u02a2\u0006"+
-    "\u0018\u000b\u0000\u02a2A\u0001\u0000\u0000\u0000\u02a3\u02a4\u0005/\u0000"+
-    "\u0000\u02a4\u02a5\u0005*\u0000\u0000\u02a5\u02aa\u0001\u0000\u0000\u0000"+
-    "\u02a6\u02a9\u0003B\u0019\u0000\u02a7\u02a9\t\u0000\u0000\u0000\u02a8"+
-    "\u02a6\u0001\u0000\u0000\u0000\u02a8\u02a7\u0001\u0000\u0000\u0000\u02a9"+
-    "\u02ac\u0001\u0000\u0000\u0000\u02aa\u02ab\u0001\u0000\u0000\u0000\u02aa"+
-    "\u02a8\u0001\u0000\u0000\u0000\u02ab\u02ad\u0001\u0000\u0000\u0000\u02ac"+
-    "\u02aa\u0001\u0000\u0000\u0000\u02ad\u02ae\u0005*\u0000\u0000\u02ae\u02af"+
-    "\u0005/\u0000\u0000\u02af\u02b0\u0001\u0000\u0000\u0000\u02b0\u02b1\u0006"+
-    "\u0019\u000b\u0000\u02b1C\u0001\u0000\u0000\u0000\u02b2\u02b4\u0007\u0017"+
-    "\u0000\u0000\u02b3\u02b2\u0001\u0000\u0000\u0000\u02b4\u02b5\u0001\u0000"+
-    "\u0000\u0000\u02b5\u02b3\u0001\u0000\u0000\u0000\u02b5\u02b6\u0001\u0000"+
-    "\u0000\u0000\u02b6\u02b7\u0001\u0000\u0000\u0000\u02b7\u02b8\u0006\u001a"+
-    "\u000b\u0000\u02b8E\u0001\u0000\u0000\u0000\u02b9\u02ba\u0005|\u0000\u0000"+
-    "\u02ba\u02bb\u0001\u0000\u0000\u0000\u02bb\u02bc\u0006\u001b\f\u0000\u02bc"+
-    "G\u0001\u0000\u0000\u0000\u02bd\u02be\u0007\u0018\u0000\u0000\u02beI\u0001"+
-    "\u0000\u0000\u0000\u02bf\u02c0\u0007\u0019\u0000\u0000\u02c0K\u0001\u0000"+
-    "\u0000\u0000\u02c1\u02c2\u0005\\\u0000\u0000\u02c2\u02c3\u0007\u001a\u0000"+
-    "\u0000\u02c3M\u0001\u0000\u0000\u0000\u02c4\u02c5\b\u001b\u0000\u0000"+
-    "\u02c5O\u0001\u0000\u0000\u0000\u02c6\u02c8\u0007\u0003\u0000\u0000\u02c7"+
-    "\u02c9\u0007\u001c\u0000\u0000\u02c8\u02c7\u0001\u0000\u0000\u0000\u02c8"+
-    "\u02c9\u0001\u0000\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000\u0000\u02ca"+
-    "\u02cc\u0003H\u001c\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000\u02cc\u02cd"+
-    "\u0001\u0000\u0000\u0000\u02cd\u02cb\u0001\u0000\u0000\u0000\u02cd\u02ce"+
-    "\u0001\u0000\u0000\u0000\u02ceQ\u0001\u0000\u0000\u0000\u02cf\u02d0\u0005"+
-    "@\u0000\u0000\u02d0S\u0001\u0000\u0000\u0000\u02d1\u02d2\u0005`\u0000"+
-    "\u0000\u02d2U\u0001\u0000\u0000\u0000\u02d3\u02d7\b\u001d\u0000\u0000"+
-    "\u02d4\u02d5\u0005`\u0000\u0000\u02d5\u02d7\u0005`\u0000\u0000\u02d6\u02d3"+
-    "\u0001\u0000\u0000\u0000\u02d6\u02d4\u0001\u0000\u0000\u0000\u02d7W\u0001"+
-    "\u0000\u0000\u0000\u02d8\u02d9\u0005_\u0000\u0000\u02d9Y\u0001\u0000\u0000"+
-    "\u0000\u02da\u02de\u0003J\u001d\u0000\u02db\u02de\u0003H\u001c\u0000\u02dc"+
-    "\u02de\u0003X$\u0000\u02dd\u02da\u0001\u0000\u0000\u0000\u02dd\u02db\u0001"+
-    "\u0000\u0000\u0000\u02dd\u02dc\u0001\u0000\u0000\u0000\u02de[\u0001\u0000"+
-    "\u0000\u0000\u02df\u02e4\u0005\"\u0000\u0000\u02e0\u02e3\u0003L\u001e"+
-    "\u0000\u02e1\u02e3\u0003N\u001f\u0000\u02e2\u02e0\u0001\u0000\u0000\u0000"+
-    "\u02e2\u02e1\u0001\u0000\u0000\u0000\u02e3\u02e6\u0001\u0000\u0000\u0000"+
-    "\u02e4\u02e2\u0001\u0000\u0000\u0000\u02e4\u02e5\u0001\u0000\u0000\u0000"+
-    "\u02e5\u02e7\u0001\u0000\u0000\u0000\u02e6\u02e4\u0001\u0000\u0000\u0000"+
-    "\u02e7\u02fd\u0005\"\u0000\u0000\u02e8\u02e9\u0005\"\u0000\u0000\u02e9"+
-    "\u02ea\u0005\"\u0000\u0000\u02ea\u02eb\u0005\"\u0000\u0000\u02eb\u02ef"+
-    "\u0001\u0000\u0000\u0000\u02ec\u02ee\b\u0016\u0000\u0000\u02ed\u02ec\u0001"+
-    "\u0000\u0000\u0000\u02ee\u02f1\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001"+
-    "\u0000\u0000\u0000\u02ef\u02ed\u0001\u0000\u0000\u0000\u02f0\u02f2\u0001"+
-    "\u0000\u0000\u0000\u02f1\u02ef\u0001\u0000\u0000\u0000\u02f2\u02f3\u0005"+
-    "\"\u0000\u0000\u02f3\u02f4\u0005\"\u0000\u0000\u02f4\u02f5\u0005\"\u0000"+
-    "\u0000\u02f5\u02f7\u0001\u0000\u0000\u0000\u02f6\u02f8\u0005\"\u0000\u0000"+
-    "\u02f7\u02f6\u0001\u0000\u0000\u0000\u02f7\u02f8\u0001\u0000\u0000\u0000"+
-    "\u02f8\u02fa\u0001\u0000\u0000\u0000\u02f9\u02fb\u0005\"\u0000\u0000\u02fa"+
-    "\u02f9\u0001\u0000\u0000\u0000\u02fa\u02fb\u0001\u0000\u0000\u0000\u02fb"+
-    "\u02fd\u0001\u0000\u0000\u0000\u02fc\u02df\u0001\u0000\u0000\u0000\u02fc"+
-    "\u02e8\u0001\u0000\u0000\u0000\u02fd]\u0001\u0000\u0000\u0000\u02fe\u0300"+
-    "\u0003H\u001c\u0000\u02ff\u02fe\u0001\u0000\u0000\u0000\u0300\u0301\u0001"+
-    "\u0000\u0000\u0000\u0301\u02ff\u0001\u0000\u0000\u0000\u0301\u0302\u0001"+
-    "\u0000\u0000\u0000\u0302_\u0001\u0000\u0000\u0000\u0303\u0305\u0003H\u001c"+
-    "\u0000\u0304\u0303\u0001\u0000\u0000\u0000\u0305\u0306\u0001\u0000\u0000"+
-    "\u0000\u0306\u0304\u0001\u0000\u0000\u0000\u0306\u0307\u0001\u0000\u0000"+
-    "\u0000\u0307\u0308\u0001\u0000\u0000\u0000\u0308\u030c\u0003r1\u0000\u0309"+
-    "\u030b\u0003H\u001c\u0000\u030a\u0309\u0001\u0000\u0000\u0000\u030b\u030e"+
-    "\u0001\u0000\u0000\u0000\u030c\u030a\u0001\u0000\u0000\u0000\u030c\u030d"+
-    "\u0001\u0000\u0000\u0000\u030d\u032e\u0001\u0000\u0000\u0000\u030e\u030c"+
-    "\u0001\u0000\u0000\u0000\u030f\u0311\u0003r1\u0000\u0310\u0312\u0003H"+
-    "\u001c\u0000\u0311\u0310\u0001\u0000\u0000\u0000\u0312\u0313\u0001\u0000"+
-    "\u0000\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0313\u0314\u0001\u0000"+
-    "\u0000\u0000\u0314\u032e\u0001\u0000\u0000\u0000\u0315\u0317\u0003H\u001c"+
-    "\u0000\u0316\u0315\u0001\u0000\u0000\u0000\u0317\u0318\u0001\u0000\u0000"+
-    "\u0000\u0318\u0316\u0001\u0000\u0000\u0000\u0318\u0319\u0001\u0000\u0000"+
-    "\u0000\u0319\u0321\u0001\u0000\u0000\u0000\u031a\u031e\u0003r1\u0000\u031b"+
-    "\u031d\u0003H\u001c\u0000\u031c\u031b\u0001\u0000\u0000\u0000\u031d\u0320"+
-    "\u0001\u0000\u0000\u0000\u031e\u031c\u0001\u0000\u0000\u0000\u031e\u031f"+
-    "\u0001\u0000\u0000\u0000\u031f\u0322\u0001\u0000\u0000\u0000\u0320\u031e"+
-    "\u0001\u0000\u0000\u0000\u0321\u031a\u0001\u0000\u0000\u0000\u0321\u0322"+
-    "\u0001\u0000\u0000\u0000\u0322\u0323\u0001\u0000\u0000\u0000\u0323\u0324"+
-    "\u0003P \u0000\u0324\u032e\u0001\u0000\u0000\u0000\u0325\u0327\u0003r"+
-    "1\u0000\u0326\u0328\u0003H\u001c\u0000\u0327\u0326\u0001\u0000\u0000\u0000"+
-    "\u0328\u0329\u0001\u0000\u0000\u0000\u0329\u0327\u0001\u0000\u0000\u0000"+
-    "\u0329\u032a\u0001\u0000\u0000\u0000\u032a\u032b\u0001\u0000\u0000\u0000"+
-    "\u032b\u032c\u0003P \u0000\u032c\u032e\u0001\u0000\u0000\u0000\u032d\u0304"+
-    "\u0001\u0000\u0000\u0000\u032d\u030f\u0001\u0000\u0000\u0000\u032d\u0316"+
-    "\u0001\u0000\u0000\u0000\u032d\u0325\u0001\u0000\u0000\u0000\u032ea\u0001"+
-    "\u0000\u0000\u0000\u032f\u0330\u0007\u001e\u0000\u0000\u0330\u0331\u0007"+
-    "\u001f\u0000\u0000\u0331c\u0001\u0000\u0000\u0000\u0332\u0333\u0007\f"+
-    "\u0000\u0000\u0333\u0334\u0007\t\u0000\u0000\u0334\u0335\u0007\u0000\u0000"+
-    "\u0000\u0335e\u0001\u0000\u0000\u0000\u0336\u0337\u0007\f\u0000\u0000"+
-    "\u0337\u0338\u0007\u0002\u0000\u0000\u0338\u0339\u0007\u0004\u0000\u0000"+
-    "\u0339g\u0001\u0000\u0000\u0000\u033a\u033b\u0005=\u0000\u0000\u033bi"+
-    "\u0001\u0000\u0000\u0000\u033c\u033d\u0005:\u0000\u0000\u033d\u033e\u0005"+
-    ":\u0000\u0000\u033ek\u0001\u0000\u0000\u0000\u033f\u0340\u0005:\u0000"+
-    "\u0000\u0340m\u0001\u0000\u0000\u0000\u0341\u0342\u0005,\u0000\u0000\u0342"+
-    "o\u0001\u0000\u0000\u0000\u0343\u0344\u0007\u0000\u0000\u0000\u0344\u0345"+
-    "\u0007\u0003\u0000\u0000\u0345\u0346\u0007\u0002\u0000\u0000\u0346\u0347"+
-    "\u0007\u0004\u0000\u0000\u0347q\u0001\u0000\u0000\u0000\u0348\u0349\u0005"+
-    ".\u0000\u0000\u0349s\u0001\u0000\u0000\u0000\u034a\u034b\u0007\u000f\u0000"+
-    "\u0000\u034b\u034c\u0007\f\u0000\u0000\u034c\u034d\u0007\r\u0000\u0000"+
-    "\u034d\u034e\u0007\u0002\u0000\u0000\u034e\u034f\u0007\u0003\u0000\u0000"+
-    "\u034fu\u0001\u0000\u0000\u0000\u0350\u0351\u0007\u000f\u0000\u0000\u0351"+
-    "\u0352\u0007\u0001\u0000\u0000\u0352\u0353\u0007\u0006\u0000\u0000\u0353"+
-    "\u0354\u0007\u0002\u0000\u0000\u0354\u0355\u0007\u0005\u0000\u0000\u0355"+
-    "w\u0001\u0000\u0000\u0000\u0356\u0357\u0007\u0001\u0000\u0000\u0357\u0358"+
-    "\u0007\t\u0000\u0000\u0358y\u0001\u0000\u0000\u0000\u0359\u035a\u0007"+
-    "\u0001\u0000\u0000\u035a\u035b\u0007\u0002\u0000\u0000\u035b{\u0001\u0000"+
-    "\u0000\u0000\u035c\u035d\u0007\r\u0000\u0000\u035d\u035e\u0007\f\u0000"+
-    "\u0000\u035e\u035f\u0007\u0002\u0000\u0000\u035f\u0360\u0007\u0005\u0000"+
-    "\u0000\u0360}\u0001\u0000\u0000\u0000\u0361\u0362\u0007\r\u0000\u0000"+
-    "\u0362\u0363\u0007\u0001\u0000\u0000\u0363\u0364\u0007\u0012\u0000\u0000"+
-    "\u0364\u0365\u0007\u0003\u0000\u0000\u0365\u007f\u0001\u0000\u0000\u0000"+
-    "\u0366\u0367\u0005(\u0000\u0000\u0367\u0081\u0001\u0000\u0000\u0000\u0368"+
-    "\u0369\u0007\t\u0000\u0000\u0369\u036a\u0007\u0007\u0000\u0000\u036a\u036b"+
-    "\u0007\u0005\u0000\u0000\u036b\u0083\u0001\u0000\u0000\u0000\u036c\u036d"+
-    "\u0007\t\u0000\u0000\u036d\u036e\u0007\u0014\u0000\u0000\u036e\u036f\u0007"+
-    "\r\u0000\u0000\u036f\u0370\u0007\r\u0000\u0000\u0370\u0085\u0001\u0000"+
-    "\u0000\u0000\u0371\u0372\u0007\t\u0000\u0000\u0372\u0373\u0007\u0014\u0000"+
-    "\u0000\u0373\u0374\u0007\r\u0000\u0000\u0374\u0375\u0007\r\u0000\u0000"+
-    "\u0375\u0376\u0007\u0002\u0000\u0000\u0376\u0087\u0001\u0000\u0000\u0000"+
-    "\u0377\u0378\u0007\u0007\u0000\u0000\u0378\u0379\u0007\u0006\u0000\u0000"+
-    "\u0379\u0089\u0001\u0000\u0000\u0000\u037a\u037b\u0005?\u0000\u0000\u037b"+
-    "\u008b\u0001\u0000\u0000\u0000\u037c\u037d\u0007\u0006\u0000\u0000\u037d"+
-    "\u037e\u0007\r\u0000\u0000\u037e\u037f\u0007\u0001\u0000\u0000\u037f\u0380"+
-    "\u0007\u0012\u0000\u0000\u0380\u0381\u0007\u0003\u0000\u0000\u0381\u008d"+
-    "\u0001\u0000\u0000\u0000\u0382\u0383\u0005)\u0000\u0000\u0383\u008f\u0001"+
-    "\u0000\u0000\u0000\u0384\u0385\u0007\u0005\u0000\u0000\u0385\u0386\u0007"+
-    "\u0006\u0000\u0000\u0386\u0387\u0007\u0014\u0000\u0000\u0387\u0388\u0007"+
-    "\u0003\u0000\u0000\u0388\u0091\u0001\u0000\u0000\u0000\u0389\u038a\u0005"+
-    "=\u0000\u0000\u038a\u038b\u0005=\u0000\u0000\u038b\u0093\u0001\u0000\u0000"+
-    "\u0000\u038c\u038d\u0005=\u0000\u0000\u038d\u038e\u0005~\u0000\u0000\u038e"+
-    "\u0095\u0001\u0000\u0000\u0000\u038f\u0390\u0005!\u0000\u0000\u0390\u0391"+
-    "\u0005=\u0000\u0000\u0391\u0097\u0001\u0000\u0000\u0000\u0392\u0393\u0005"+
-    "<\u0000\u0000\u0393\u0099\u0001\u0000\u0000\u0000\u0394\u0395\u0005<\u0000"+
-    "\u0000\u0395\u0396\u0005=\u0000\u0000\u0396\u009b\u0001\u0000\u0000\u0000"+
-    "\u0397\u0398\u0005>\u0000\u0000\u0398\u009d\u0001\u0000\u0000\u0000\u0399"+
-    "\u039a\u0005>\u0000\u0000\u039a\u039b\u0005=\u0000\u0000\u039b\u009f\u0001"+
-    "\u0000\u0000\u0000\u039c\u039d\u0005+\u0000\u0000\u039d\u00a1\u0001\u0000"+
-    "\u0000\u0000\u039e\u039f\u0005-\u0000\u0000\u039f\u00a3\u0001\u0000\u0000"+
-    "\u0000\u03a0\u03a1\u0005*\u0000\u0000\u03a1\u00a5\u0001\u0000\u0000\u0000"+
-    "\u03a2\u03a3\u0005/\u0000\u0000\u03a3\u00a7\u0001\u0000\u0000\u0000\u03a4"+
-    "\u03a5\u0005%\u0000\u0000\u03a5\u00a9\u0001\u0000\u0000\u0000\u03a6\u03a7"+
-    "\u0005{\u0000\u0000\u03a7\u00ab\u0001\u0000\u0000\u0000\u03a8\u03a9\u0005"+
-    "}\u0000\u0000\u03a9\u00ad\u0001\u0000\u0000\u0000\u03aa\u03ab\u0003.\u000f"+
-    "\u0000\u03ab\u03ac\u0001\u0000\u0000\u0000\u03ac\u03ad\u0006O\r\u0000"+
-    "\u03ad\u00af\u0001\u0000\u0000\u0000\u03ae\u03b1\u0003\u008a=\u0000\u03af"+
-    "\u03b2\u0003J\u001d\u0000\u03b0\u03b2\u0003X$\u0000\u03b1\u03af\u0001"+
-    "\u0000\u0000\u0000\u03b1\u03b0\u0001\u0000\u0000\u0000\u03b2\u03b6\u0001"+
-    "\u0000\u0000\u0000\u03b3\u03b5\u0003Z%\u0000\u03b4\u03b3\u0001\u0000\u0000"+
-    "\u0000\u03b5\u03b8\u0001\u0000\u0000\u0000\u03b6\u03b4\u0001\u0000\u0000"+
-    "\u0000\u03b6\u03b7\u0001\u0000\u0000\u0000\u03b7\u03c0\u0001\u0000\u0000"+
-    "\u0000\u03b8\u03b6\u0001\u0000\u0000\u0000\u03b9\u03bb\u0003\u008a=\u0000"+
-    "\u03ba\u03bc\u0003H\u001c\u0000\u03bb\u03ba\u0001\u0000\u0000\u0000\u03bc"+
-    "\u03bd\u0001\u0000\u0000\u0000\u03bd\u03bb\u0001\u0000\u0000\u0000\u03bd"+
-    "\u03be\u0001\u0000\u0000\u0000\u03be\u03c0\u0001\u0000\u0000\u0000\u03bf"+
-    "\u03ae\u0001\u0000\u0000\u0000\u03bf\u03b9\u0001\u0000\u0000\u0000\u03c0"+
-    "\u00b1\u0001\u0000\u0000\u0000\u03c1\u03c2\u0005[\u0000\u0000\u03c2\u03c3"+
-    "\u0001\u0000\u0000\u0000\u03c3\u03c4\u0006Q\u0000\u0000\u03c4\u03c5\u0006"+
-    "Q\u0000\u0000\u03c5\u00b3\u0001\u0000\u0000\u0000\u03c6\u03c7\u0005]\u0000"+
-    "\u0000\u03c7\u03c8\u0001\u0000\u0000\u0000\u03c8\u03c9\u0006R\f\u0000"+
-    "\u03c9\u03ca\u0006R\f\u0000\u03ca\u00b5\u0001\u0000\u0000\u0000\u03cb"+
-    "\u03cf\u0003J\u001d\u0000\u03cc\u03ce\u0003Z%\u0000\u03cd\u03cc\u0001"+
-    "\u0000\u0000\u0000\u03ce\u03d1\u0001\u0000\u0000\u0000\u03cf\u03cd\u0001"+
-    "\u0000\u0000\u0000\u03cf\u03d0\u0001\u0000\u0000\u0000\u03d0\u03dc\u0001"+
-    "\u0000\u0000\u0000\u03d1\u03cf\u0001\u0000\u0000\u0000\u03d2\u03d5\u0003"+
-    "X$\u0000\u03d3\u03d5\u0003R!\u0000\u03d4\u03d2\u0001\u0000\u0000\u0000"+
-    "\u03d4\u03d3\u0001\u0000\u0000\u0000\u03d5\u03d7\u0001\u0000\u0000\u0000"+
-    "\u03d6\u03d8\u0003Z%\u0000\u03d7\u03d6\u0001\u0000\u0000\u0000\u03d8\u03d9"+
-    "\u0001\u0000\u0000\u0000\u03d9\u03d7\u0001\u0000\u0000\u0000\u03d9\u03da"+
-    "\u0001\u0000\u0000\u0000\u03da\u03dc\u0001\u0000\u0000\u0000\u03db\u03cb"+
-    "\u0001\u0000\u0000\u0000\u03db\u03d4\u0001\u0000\u0000\u0000\u03dc\u00b7"+
-    "\u0001\u0000\u0000\u0000\u03dd\u03df\u0003T\"\u0000\u03de\u03e0\u0003"+
-    "V#\u0000\u03df\u03de\u0001\u0000\u0000\u0000\u03e0\u03e1\u0001\u0000\u0000"+
-    "\u0000\u03e1\u03df\u0001\u0000\u0000\u0000\u03e1\u03e2\u0001\u0000\u0000"+
-    "\u0000\u03e2\u03e3\u0001\u0000\u0000\u0000\u03e3\u03e4\u0003T\"\u0000"+
-    "\u03e4\u00b9\u0001\u0000\u0000\u0000\u03e5\u03e6\u0003\u00b8T\u0000\u03e6"+
-    "\u00bb\u0001\u0000\u0000\u0000\u03e7\u03e8\u0003@\u0018\u0000\u03e8\u03e9"+
-    "\u0001\u0000\u0000\u0000\u03e9\u03ea\u0006V\u000b\u0000\u03ea\u00bd\u0001"+
-    "\u0000\u0000\u0000\u03eb\u03ec\u0003B\u0019\u0000\u03ec\u03ed\u0001\u0000"+
-    "\u0000\u0000\u03ed\u03ee\u0006W\u000b\u0000\u03ee\u00bf\u0001\u0000\u0000"+
-    "\u0000\u03ef\u03f0\u0003D\u001a\u0000\u03f0\u03f1\u0001\u0000\u0000\u0000"+
-    "\u03f1\u03f2\u0006X\u000b\u0000\u03f2\u00c1\u0001\u0000\u0000\u0000\u03f3"+
-    "\u03f4\u0003\u00b2Q\u0000\u03f4\u03f5\u0001\u0000\u0000\u0000\u03f5\u03f6"+
-    "\u0006Y\u000e\u0000\u03f6\u03f7\u0006Y\u000f\u0000\u03f7\u00c3\u0001\u0000"+
-    "\u0000\u0000\u03f8\u03f9\u0003F\u001b\u0000\u03f9\u03fa\u0001\u0000\u0000"+
-    "\u0000\u03fa\u03fb\u0006Z\u0010\u0000\u03fb\u03fc\u0006Z\f\u0000\u03fc"+
-    "\u00c5\u0001\u0000\u0000\u0000\u03fd\u03fe\u0003D\u001a\u0000\u03fe\u03ff"+
-    "\u0001\u0000\u0000\u0000\u03ff\u0400\u0006[\u000b\u0000\u0400\u00c7\u0001"+
-    "\u0000\u0000\u0000\u0401\u0402\u0003@\u0018\u0000\u0402\u0403\u0001\u0000"+
-    "\u0000\u0000\u0403\u0404\u0006\\\u000b\u0000\u0404\u00c9\u0001\u0000\u0000"+
-    "\u0000\u0405\u0406\u0003B\u0019\u0000\u0406\u0407\u0001\u0000\u0000\u0000"+
-    "\u0407\u0408\u0006]\u000b\u0000\u0408\u00cb\u0001\u0000\u0000\u0000\u0409"+
-    "\u040a\u0003F\u001b\u0000\u040a\u040b\u0001\u0000\u0000\u0000\u040b\u040c"+
-    "\u0006^\u0010\u0000\u040c\u040d\u0006^\f\u0000\u040d\u00cd\u0001\u0000"+
-    "\u0000\u0000\u040e\u040f\u0003\u00b2Q\u0000\u040f\u0410\u0001\u0000\u0000"+
-    "\u0000\u0410\u0411\u0006_\u000e\u0000\u0411\u00cf\u0001\u0000\u0000\u0000"+
-    "\u0412\u0413\u0003\u00b4R\u0000\u0413\u0414\u0001\u0000\u0000\u0000\u0414"+
-    "\u0415\u0006`\u0011\u0000\u0415\u00d1\u0001\u0000\u0000\u0000\u0416\u0417"+
-    "\u0003l.\u0000\u0417\u0418\u0001\u0000\u0000\u0000\u0418\u0419\u0006a"+
-    "\u0012\u0000\u0419\u00d3\u0001\u0000\u0000\u0000\u041a\u041b\u0003n/\u0000"+
-    "\u041b\u041c\u0001\u0000\u0000\u0000\u041c\u041d\u0006b\u0013\u0000\u041d"+
-    "\u00d5\u0001\u0000\u0000\u0000\u041e\u041f\u0003h,\u0000\u041f\u0420\u0001"+
-    "\u0000\u0000\u0000\u0420\u0421\u0006c\u0014\u0000\u0421\u00d7\u0001\u0000"+
-    "\u0000\u0000\u0422\u0423\u0007\u0010\u0000\u0000\u0423\u0424\u0007\u0003"+
-    "\u0000\u0000\u0424\u0425\u0007\u0005\u0000\u0000\u0425\u0426\u0007\f\u0000"+
-    "\u0000\u0426\u0427\u0007\u0000\u0000\u0000\u0427\u0428\u0007\f\u0000\u0000"+
-    "\u0428\u0429\u0007\u0005\u0000\u0000\u0429\u042a\u0007\f\u0000\u0000\u042a"+
-    "\u00d9\u0001\u0000\u0000\u0000\u042b\u042f\b \u0000\u0000\u042c\u042d"+
-    "\u0005/\u0000\u0000\u042d\u042f\b!\u0000\u0000\u042e\u042b\u0001\u0000"+
-    "\u0000\u0000\u042e\u042c\u0001\u0000\u0000\u0000\u042f\u00db\u0001\u0000"+
-    "\u0000\u0000\u0430\u0432\u0003\u00dae\u0000\u0431\u0430\u0001\u0000\u0000"+
-    "\u0000\u0432\u0433\u0001\u0000\u0000\u0000\u0433\u0431\u0001\u0000\u0000"+
-    "\u0000\u0433\u0434\u0001\u0000\u0000\u0000\u0434\u00dd\u0001\u0000\u0000"+
-    "\u0000\u0435\u0436\u0003\u00dcf\u0000\u0436\u0437\u0001\u0000\u0000\u0000"+
-    "\u0437\u0438\u0006g\u0015\u0000\u0438\u00df\u0001\u0000\u0000\u0000\u0439"+
-    "\u043a\u0003\\&\u0000\u043a\u043b\u0001\u0000\u0000\u0000\u043b\u043c"+
-    "\u0006h\u0016\u0000\u043c\u00e1\u0001\u0000\u0000\u0000\u043d\u043e\u0003"+
-    "@\u0018\u0000\u043e\u043f\u0001\u0000\u0000\u0000\u043f\u0440\u0006i\u000b"+
-    "\u0000\u0440\u00e3\u0001\u0000\u0000\u0000\u0441\u0442\u0003B\u0019\u0000"+
-    "\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0006j\u000b\u0000\u0444"+
-    "\u00e5\u0001\u0000\u0000\u0000\u0445\u0446\u0003D\u001a\u0000\u0446\u0447"+
-    "\u0001\u0000\u0000\u0000\u0447\u0448\u0006k\u000b\u0000\u0448\u00e7\u0001"+
-    "\u0000\u0000\u0000\u0449\u044a\u0003F\u001b\u0000\u044a\u044b\u0001\u0000"+
-    "\u0000\u0000\u044b\u044c\u0006l\u0010\u0000\u044c\u044d\u0006l\f\u0000"+
-    "\u044d\u00e9\u0001\u0000\u0000\u0000\u044e\u044f\u0003r1\u0000\u044f\u0450"+
-    "\u0001\u0000\u0000\u0000\u0450\u0451\u0006m\u0017\u0000\u0451\u00eb\u0001"+
-    "\u0000\u0000\u0000\u0452\u0453\u0003n/\u0000\u0453\u0454\u0001\u0000\u0000"+
-    "\u0000\u0454\u0455\u0006n\u0013\u0000\u0455\u00ed\u0001\u0000\u0000\u0000"+
-    "\u0456\u0457\u0003\u008a=\u0000\u0457\u0458\u0001\u0000\u0000\u0000\u0458"+
-    "\u0459\u0006o\u0018\u0000\u0459\u00ef\u0001\u0000\u0000\u0000\u045a\u045b"+
-    "\u0003\u00b0P\u0000\u045b\u045c\u0001\u0000\u0000\u0000\u045c\u045d\u0006"+
-    "p\u0019\u0000\u045d\u00f1\u0001\u0000\u0000\u0000\u045e\u0463\u0003J\u001d"+
-    "\u0000\u045f\u0463\u0003H\u001c\u0000\u0460\u0463\u0003X$\u0000\u0461"+
-    "\u0463\u0003\u00a4J\u0000\u0462\u045e\u0001\u0000\u0000\u0000\u0462\u045f"+
-    "\u0001\u0000\u0000\u0000\u0462\u0460\u0001\u0000\u0000\u0000\u0462\u0461"+
-    "\u0001\u0000\u0000\u0000\u0463\u00f3\u0001\u0000\u0000\u0000\u0464\u0467"+
-    "\u0003J\u001d\u0000\u0465\u0467\u0003\u00a4J\u0000\u0466\u0464\u0001\u0000"+
-    "\u0000\u0000\u0466\u0465\u0001\u0000\u0000\u0000\u0467\u046b\u0001\u0000"+
-    "\u0000\u0000\u0468\u046a\u0003\u00f2q\u0000\u0469\u0468\u0001\u0000\u0000"+
-    "\u0000\u046a\u046d\u0001\u0000\u0000\u0000\u046b\u0469\u0001\u0000\u0000"+
-    "\u0000\u046b\u046c\u0001\u0000\u0000\u0000\u046c\u0478\u0001\u0000\u0000"+
-    "\u0000\u046d\u046b\u0001\u0000\u0000\u0000\u046e\u0471\u0003X$\u0000\u046f"+
-    "\u0471\u0003R!\u0000\u0470\u046e\u0001\u0000\u0000\u0000\u0470\u046f\u0001"+
-    "\u0000\u0000\u0000\u0471\u0473\u0001\u0000\u0000\u0000\u0472\u0474\u0003"+
-    "\u00f2q\u0000\u0473\u0472\u0001\u0000\u0000\u0000\u0474\u0475\u0001\u0000"+
-    "\u0000\u0000\u0475\u0473\u0001\u0000\u0000\u0000\u0475\u0476\u0001\u0000"+
-    "\u0000\u0000\u0476\u0478\u0001\u0000\u0000\u0000\u0477\u0466\u0001\u0000"+
-    "\u0000\u0000\u0477\u0470\u0001\u0000\u0000\u0000\u0478\u00f5\u0001\u0000"+
-    "\u0000\u0000\u0479\u047c\u0003\u00f4r\u0000\u047a\u047c\u0003\u00b8T\u0000"+
-    "\u047b\u0479\u0001\u0000\u0000\u0000\u047b\u047a\u0001\u0000\u0000\u0000"+
-    "\u047c\u047d\u0001\u0000\u0000\u0000\u047d\u047b\u0001\u0000\u0000\u0000"+
-    "\u047d\u047e\u0001\u0000\u0000\u0000\u047e\u00f7\u0001\u0000\u0000\u0000"+
-    "\u047f\u0480\u0003@\u0018\u0000\u0480\u0481\u0001\u0000\u0000\u0000\u0481"+
-    "\u0482\u0006t\u000b\u0000\u0482\u00f9\u0001\u0000\u0000\u0000\u0483\u0484"+
-    "\u0003B\u0019\u0000\u0484\u0485\u0001\u0000\u0000\u0000\u0485\u0486\u0006"+
-    "u\u000b\u0000\u0486\u00fb\u0001\u0000\u0000\u0000\u0487\u0488\u0003D\u001a"+
-    "\u0000\u0488\u0489\u0001\u0000\u0000\u0000\u0489\u048a\u0006v\u000b\u0000"+
-    "\u048a\u00fd\u0001\u0000\u0000\u0000\u048b\u048c\u0003F\u001b\u0000\u048c"+
-    "\u048d\u0001\u0000\u0000\u0000\u048d\u048e\u0006w\u0010\u0000\u048e\u048f"+
-    "\u0006w\f\u0000\u048f\u00ff\u0001\u0000\u0000\u0000\u0490\u0491\u0003"+
-    "h,\u0000\u0491\u0492\u0001\u0000\u0000\u0000\u0492\u0493\u0006x\u0014"+
-    "\u0000\u0493\u0101\u0001\u0000\u0000\u0000\u0494\u0495\u0003n/\u0000\u0495"+
-    "\u0496\u0001\u0000\u0000\u0000\u0496\u0497\u0006y\u0013\u0000\u0497\u0103"+
-    "\u0001\u0000\u0000\u0000\u0498\u0499\u0003r1\u0000\u0499\u049a\u0001\u0000"+
-    "\u0000\u0000\u049a\u049b\u0006z\u0017\u0000\u049b\u0105\u0001\u0000\u0000"+
-    "\u0000\u049c\u049d\u0003\u008a=\u0000\u049d\u049e\u0001\u0000\u0000\u0000"+
-    "\u049e\u049f\u0006{\u0018\u0000\u049f\u0107\u0001\u0000\u0000\u0000\u04a0"+
-    "\u04a1\u0003\u00b0P\u0000\u04a1\u04a2\u0001\u0000\u0000\u0000\u04a2\u04a3"+
-    "\u0006|\u0019\u0000\u04a3\u0109\u0001\u0000\u0000\u0000\u04a4\u04a5\u0007"+
-    "\f\u0000\u0000\u04a5\u04a6\u0007\u0002\u0000\u0000\u04a6\u010b\u0001\u0000"+
-    "\u0000\u0000\u04a7\u04a8\u0003\u00f6s\u0000\u04a8\u04a9\u0001\u0000\u0000"+
-    "\u0000\u04a9\u04aa\u0006~\u001a\u0000\u04aa\u010d\u0001\u0000\u0000\u0000"+
-    "\u04ab\u04ac\u0003@\u0018\u0000\u04ac\u04ad\u0001\u0000\u0000\u0000\u04ad"+
-    "\u04ae\u0006\u007f\u000b\u0000\u04ae\u010f\u0001\u0000\u0000\u0000\u04af"+
-    "\u04b0\u0003B\u0019\u0000\u04b0\u04b1\u0001\u0000\u0000\u0000\u04b1\u04b2"+
-    "\u0006\u0080\u000b\u0000\u04b2\u0111\u0001\u0000\u0000\u0000\u04b3\u04b4"+
-    "\u0003D\u001a\u0000\u04b4\u04b5\u0001\u0000\u0000\u0000\u04b5\u04b6\u0006"+
-    "\u0081\u000b\u0000\u04b6\u0113\u0001\u0000\u0000\u0000\u04b7\u04b8\u0003"+
-    "F\u001b\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000\u04b9\u04ba\u0006\u0082"+
-    "\u0010\u0000\u04ba\u04bb\u0006\u0082\f\u0000\u04bb\u0115\u0001\u0000\u0000"+
-    "\u0000\u04bc\u04bd\u0003\u00b2Q\u0000\u04bd\u04be\u0001\u0000\u0000\u0000"+
-    "\u04be\u04bf\u0006\u0083\u000e\u0000\u04bf\u04c0\u0006\u0083\u001b\u0000"+
-    "\u04c0\u0117\u0001\u0000\u0000\u0000\u04c1\u04c2\u0007\u0007\u0000\u0000"+
-    "\u04c2\u04c3\u0007\t\u0000\u0000\u04c3\u04c4\u0001\u0000\u0000\u0000\u04c4"+
-    "\u04c5\u0006\u0084\u001c\u0000\u04c5\u0119\u0001\u0000\u0000\u0000\u04c6"+
-    "\u04c7\u0007\u0013\u0000\u0000\u04c7\u04c8\u0007\u0001\u0000\u0000\u04c8"+
-    "\u04c9\u0007\u0005\u0000\u0000\u04c9\u04ca\u0007\n\u0000\u0000\u04ca\u04cb"+
-    "\u0001\u0000\u0000\u0000\u04cb\u04cc\u0006\u0085\u001c\u0000\u04cc\u011b"+
-    "\u0001\u0000\u0000\u0000\u04cd\u04ce\b\"\u0000\u0000\u04ce\u011d\u0001"+
-    "\u0000\u0000\u0000\u04cf\u04d1\u0003\u011c\u0086\u0000\u04d0\u04cf\u0001"+
-    "\u0000\u0000\u0000\u04d1\u04d2\u0001\u0000\u0000\u0000\u04d2\u04d0\u0001"+
-    "\u0000\u0000\u0000\u04d2\u04d3\u0001\u0000\u0000\u0000\u04d3\u04d4\u0001"+
-    "\u0000\u0000\u0000\u04d4\u04d5\u0003l.\u0000\u04d5\u04d7\u0001\u0000\u0000"+
-    "\u0000\u04d6\u04d0\u0001\u0000\u0000\u0000\u04d6\u04d7\u0001\u0000\u0000"+
-    "\u0000\u04d7\u04d9\u0001\u0000\u0000\u0000\u04d8\u04da\u0003\u011c\u0086"+
-    "\u0000\u04d9\u04d8\u0001\u0000\u0000\u0000\u04da\u04db\u0001\u0000\u0000"+
-    "\u0000\u04db\u04d9\u0001\u0000\u0000\u0000\u04db\u04dc\u0001\u0000\u0000"+
-    "\u0000\u04dc\u011f\u0001\u0000\u0000\u0000\u04dd\u04de\u0003\u011e\u0087"+
-    "\u0000\u04de\u04df\u0001\u0000\u0000\u0000\u04df\u04e0\u0006\u0088\u001d"+
-    "\u0000\u04e0\u0121\u0001\u0000\u0000\u0000\u04e1\u04e2\u0003@\u0018\u0000"+
-    "\u04e2\u04e3\u0001\u0000\u0000\u0000\u04e3\u04e4\u0006\u0089\u000b\u0000"+
-    "\u04e4\u0123\u0001\u0000\u0000\u0000\u04e5\u04e6\u0003B\u0019\u0000\u04e6"+
-    "\u04e7\u0001\u0000\u0000\u0000\u04e7\u04e8\u0006\u008a\u000b\u0000\u04e8"+
-    "\u0125\u0001\u0000\u0000\u0000\u04e9\u04ea\u0003D\u001a\u0000\u04ea\u04eb"+
-    "\u0001\u0000\u0000\u0000\u04eb\u04ec\u0006\u008b\u000b\u0000\u04ec\u0127"+
-    "\u0001\u0000\u0000\u0000\u04ed\u04ee\u0003F\u001b\u0000\u04ee\u04ef\u0001"+
-    "\u0000\u0000\u0000\u04ef\u04f0\u0006\u008c\u0010\u0000\u04f0\u04f1\u0006"+
-    "\u008c\f\u0000\u04f1\u04f2\u0006\u008c\f\u0000\u04f2\u0129\u0001\u0000"+
-    "\u0000\u0000\u04f3\u04f4\u0003h,\u0000\u04f4\u04f5\u0001\u0000\u0000\u0000"+
-    "\u04f5\u04f6\u0006\u008d\u0014\u0000\u04f6\u012b\u0001\u0000\u0000\u0000"+
-    "\u04f7\u04f8\u0003n/\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000\u04f9\u04fa"+
-    "\u0006\u008e\u0013\u0000\u04fa\u012d\u0001\u0000\u0000\u0000\u04fb\u04fc"+
-    "\u0003r1\u0000\u04fc\u04fd\u0001\u0000\u0000\u0000\u04fd\u04fe\u0006\u008f"+
-    "\u0017\u0000\u04fe\u012f\u0001\u0000\u0000\u0000\u04ff\u0500\u0003\u011a"+
-    "\u0085\u0000\u0500\u0501\u0001\u0000\u0000\u0000\u0501\u0502\u0006\u0090"+
-    "\u001e\u0000\u0502\u0131\u0001\u0000\u0000\u0000\u0503\u0504\u0003\u00f6"+
-    "s\u0000\u0504\u0505\u0001\u0000\u0000\u0000\u0505\u0506\u0006\u0091\u001a"+
-    "\u0000\u0506\u0133\u0001\u0000\u0000\u0000\u0507\u0508\u0003\u00baU\u0000"+
-    "\u0508\u0509\u0001\u0000\u0000\u0000\u0509\u050a\u0006\u0092\u001f\u0000"+
-    "\u050a\u0135\u0001\u0000\u0000\u0000\u050b\u050c\u0003\u008a=\u0000\u050c"+
-    "\u050d\u0001\u0000\u0000\u0000\u050d\u050e\u0006\u0093\u0018\u0000\u050e"+
-    "\u0137\u0001\u0000\u0000\u0000\u050f\u0510\u0003\u00b0P\u0000\u0510\u0511"+
-    "\u0001\u0000\u0000\u0000\u0511\u0512\u0006\u0094\u0019\u0000\u0512\u0139"+
-    "\u0001\u0000\u0000\u0000\u0513\u0514\u0003@\u0018\u0000\u0514\u0515\u0001"+
-    "\u0000\u0000\u0000\u0515\u0516\u0006\u0095\u000b\u0000\u0516\u013b\u0001"+
-    "\u0000\u0000\u0000\u0517\u0518\u0003B\u0019\u0000\u0518\u0519\u0001\u0000"+
-    "\u0000\u0000\u0519\u051a\u0006\u0096\u000b\u0000\u051a\u013d\u0001\u0000"+
-    "\u0000\u0000\u051b\u051c\u0003D\u001a\u0000\u051c\u051d\u0001\u0000\u0000"+
-    "\u0000\u051d\u051e\u0006\u0097\u000b\u0000\u051e\u013f\u0001\u0000\u0000"+
-    "\u0000\u051f\u0520\u0003F\u001b\u0000\u0520\u0521\u0001\u0000\u0000\u0000"+
-    "\u0521\u0522\u0006\u0098\u0010\u0000\u0522\u0523\u0006\u0098\f\u0000\u0523"+
-    "\u0141\u0001\u0000\u0000\u0000\u0524\u0525\u0003r1\u0000\u0525\u0526\u0001"+
-    "\u0000\u0000\u0000\u0526\u0527\u0006\u0099\u0017\u0000\u0527\u0143\u0001"+
-    "\u0000\u0000\u0000\u0528\u0529\u0003\u008a=\u0000\u0529\u052a\u0001\u0000"+
-    "\u0000\u0000\u052a\u052b\u0006\u009a\u0018\u0000\u052b\u0145\u0001\u0000"+
-    "\u0000\u0000\u052c\u052d\u0003\u00b0P\u0000\u052d\u052e\u0001\u0000\u0000"+
-    "\u0000\u052e\u052f\u0006\u009b\u0019\u0000\u052f\u0147\u0001\u0000\u0000"+
-    "\u0000\u0530\u0531\u0003\u00baU\u0000\u0531\u0532\u0001\u0000\u0000\u0000"+
-    "\u0532\u0533\u0006\u009c\u001f\u0000\u0533\u0149\u0001\u0000\u0000\u0000"+
-    "\u0534\u0535\u0003\u00b6S\u0000\u0535\u0536\u0001\u0000\u0000\u0000\u0536"+
-    "\u0537\u0006\u009d \u0000\u0537\u014b\u0001\u0000\u0000\u0000\u0538\u0539"+
-    "\u0003@\u0018\u0000\u0539\u053a\u0001\u0000\u0000\u0000\u053a\u053b\u0006"+
-    "\u009e\u000b\u0000\u053b\u014d\u0001\u0000\u0000\u0000\u053c\u053d\u0003"+
-    "B\u0019\u0000\u053d\u053e\u0001\u0000\u0000\u0000\u053e\u053f\u0006\u009f"+
-    "\u000b\u0000\u053f\u014f\u0001\u0000\u0000\u0000\u0540\u0541\u0003D\u001a"+
-    "\u0000\u0541\u0542\u0001\u0000\u0000\u0000\u0542\u0543\u0006\u00a0\u000b"+
-    "\u0000\u0543\u0151\u0001\u0000\u0000\u0000\u0544\u0545\u0003F\u001b\u0000"+
-    "\u0545\u0546\u0001\u0000\u0000\u0000\u0546\u0547\u0006\u00a1\u0010\u0000"+
-    "\u0547\u0548\u0006\u00a1\f\u0000\u0548\u0153\u0001\u0000\u0000\u0000\u0549"+
-    "\u054a\u0007\u0001\u0000\u0000\u054a\u054b\u0007\t\u0000\u0000\u054b\u054c"+
-    "\u0007\u000f\u0000\u0000\u054c\u054d\u0007\u0007\u0000\u0000\u054d\u0155"+
-    "\u0001\u0000\u0000\u0000\u054e\u054f\u0003@\u0018\u0000\u054f\u0550\u0001"+
-    "\u0000\u0000\u0000\u0550\u0551\u0006\u00a3\u000b\u0000\u0551\u0157\u0001"+
-    "\u0000\u0000\u0000\u0552\u0553\u0003B\u0019\u0000\u0553\u0554\u0001\u0000"+
-    "\u0000\u0000\u0554\u0555\u0006\u00a4\u000b\u0000\u0555\u0159\u0001\u0000"+
-    "\u0000\u0000\u0556\u0557\u0003D\u001a\u0000\u0557\u0558\u0001\u0000\u0000"+
-    "\u0000\u0558\u0559\u0006\u00a5\u000b\u0000\u0559\u015b\u0001\u0000\u0000"+
-    "\u0000\u055a\u055b\u0003\u00b4R\u0000\u055b\u055c\u0001\u0000\u0000\u0000"+
-    "\u055c\u055d\u0006\u00a6\u0011\u0000\u055d\u055e\u0006\u00a6\f\u0000\u055e"+
-    "\u015d\u0001\u0000\u0000\u0000\u055f\u0560\u0003l.\u0000\u0560\u0561\u0001"+
-    "\u0000\u0000\u0000\u0561\u0562\u0006\u00a7\u0012\u0000\u0562\u015f\u0001"+
-    "\u0000\u0000\u0000\u0563\u0569\u0003R!\u0000\u0564\u0569\u0003H\u001c"+
-    "\u0000\u0565\u0569\u0003r1\u0000\u0566\u0569\u0003J\u001d\u0000\u0567"+
-    "\u0569\u0003X$\u0000\u0568\u0563\u0001\u0000\u0000\u0000\u0568\u0564\u0001"+
-    "\u0000\u0000\u0000\u0568\u0565\u0001\u0000\u0000\u0000\u0568\u0566\u0001"+
-    "\u0000\u0000\u0000\u0568\u0567\u0001\u0000\u0000\u0000\u0569\u056a\u0001"+
-    "\u0000\u0000\u0000\u056a\u0568\u0001\u0000\u0000\u0000\u056a\u056b\u0001"+
-    "\u0000\u0000\u0000\u056b\u0161\u0001\u0000\u0000\u0000\u056c\u056d\u0003"+
-    "@\u0018\u0000\u056d\u056e\u0001\u0000\u0000\u0000\u056e\u056f\u0006\u00a9"+
-    "\u000b\u0000\u056f\u0163\u0001\u0000\u0000\u0000\u0570\u0571\u0003B\u0019"+
-    "\u0000\u0571\u0572\u0001\u0000\u0000\u0000\u0572\u0573\u0006\u00aa\u000b"+
-    "\u0000\u0573\u0165\u0001\u0000\u0000\u0000\u0574\u0575\u0003D\u001a\u0000"+
-    "\u0575\u0576\u0001\u0000\u0000\u0000\u0576\u0577\u0006\u00ab\u000b\u0000"+
-    "\u0577\u0167\u0001\u0000\u0000\u0000\u0578\u0579\u0003F\u001b\u0000\u0579"+
-    "\u057a\u0001\u0000\u0000\u0000\u057a\u057b\u0006\u00ac\u0010\u0000\u057b"+
-    "\u057c\u0006\u00ac\f\u0000\u057c\u0169\u0001\u0000\u0000\u0000\u057d\u057e"+
-    "\u0003l.\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580\u0006\u00ad"+
-    "\u0012\u0000\u0580\u016b\u0001\u0000\u0000\u0000\u0581\u0582\u0003n/\u0000"+
-    "\u0582\u0583\u0001\u0000\u0000\u0000\u0583\u0584\u0006\u00ae\u0013\u0000"+
-    "\u0584\u016d\u0001\u0000\u0000\u0000\u0585\u0586\u0003r1\u0000\u0586\u0587"+
-    "\u0001\u0000\u0000\u0000\u0587\u0588\u0006\u00af\u0017\u0000\u0588\u016f"+
-    "\u0001\u0000\u0000\u0000\u0589\u058a\u0003\u0118\u0084\u0000\u058a\u058b"+
-    "\u0001\u0000\u0000\u0000\u058b\u058c\u0006\u00b0!\u0000\u058c\u058d\u0006"+
-    "\u00b0\"\u0000\u058d\u0171\u0001\u0000\u0000\u0000\u058e\u058f\u0003\u00dc"+
-    "f\u0000\u058f\u0590\u0001\u0000\u0000\u0000\u0590\u0591\u0006\u00b1\u0015"+
-    "\u0000\u0591\u0173\u0001\u0000\u0000\u0000\u0592\u0593\u0003\\&\u0000"+
-    "\u0593\u0594\u0001\u0000\u0000\u0000\u0594\u0595\u0006\u00b2\u0016\u0000"+
-    "\u0595\u0175\u0001\u0000\u0000\u0000\u0596\u0597\u0003@\u0018\u0000\u0597"+
-    "\u0598\u0001\u0000\u0000\u0000\u0598\u0599\u0006\u00b3\u000b\u0000\u0599"+
-    "\u0177\u0001\u0000\u0000\u0000\u059a\u059b\u0003B\u0019\u0000\u059b\u059c"+
-    "\u0001\u0000\u0000\u0000\u059c\u059d\u0006\u00b4\u000b\u0000\u059d\u0179"+
-    "\u0001\u0000\u0000\u0000\u059e\u059f\u0003D\u001a\u0000\u059f\u05a0\u0001"+
-    "\u0000\u0000\u0000\u05a0\u05a1\u0006\u00b5\u000b\u0000\u05a1\u017b\u0001"+
-    "\u0000\u0000\u0000\u05a2\u05a3\u0003F\u001b\u0000\u05a3\u05a4\u0001\u0000"+
-    "\u0000\u0000\u05a4\u05a5\u0006\u00b6\u0010\u0000\u05a5\u05a6\u0006\u00b6"+
-    "\f\u0000\u05a6\u05a7\u0006\u00b6\f\u0000\u05a7\u017d\u0001\u0000\u0000"+
-    "\u0000\u05a8\u05a9\u0003n/\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa"+
-    "\u05ab\u0006\u00b7\u0013\u0000\u05ab\u017f\u0001\u0000\u0000\u0000\u05ac"+
-    "\u05ad\u0003r1\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u0006"+
-    "\u00b8\u0017\u0000\u05af\u0181\u0001\u0000\u0000\u0000\u05b0\u05b1\u0003"+
-    "\u00f6s\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0006\u00b9"+
-    "\u001a\u0000\u05b3\u0183\u0001\u0000\u0000\u0000\u05b4\u05b5\u0003@\u0018"+
-    "\u0000\u05b5\u05b6\u0001\u0000\u0000\u0000\u05b6\u05b7\u0006\u00ba\u000b"+
-    "\u0000\u05b7\u0185\u0001\u0000\u0000\u0000\u05b8\u05b9\u0003B\u0019\u0000"+
-    "\u05b9\u05ba\u0001\u0000\u0000\u0000\u05ba\u05bb\u0006\u00bb\u000b\u0000"+
-    "\u05bb\u0187\u0001\u0000\u0000\u0000\u05bc\u05bd\u0003D\u001a\u0000\u05bd"+
-    "\u05be\u0001\u0000\u0000\u0000\u05be\u05bf\u0006\u00bc\u000b\u0000\u05bf"+
-    "\u0189\u0001\u0000\u0000\u0000\u05c0\u05c1\u0003F\u001b\u0000\u05c1\u05c2"+
-    "\u0001\u0000\u0000\u0000\u05c2\u05c3\u0006\u00bd\u0010\u0000\u05c3\u05c4"+
-    "\u0006\u00bd\f\u0000\u05c4\u018b\u0001\u0000\u0000\u0000\u05c5\u05c6\u0007"+
-    "#\u0000\u0000\u05c6\u05c7\u0007\u0007\u0000\u0000\u05c7\u05c8\u0007\u0001"+
-    "\u0000\u0000\u05c8\u05c9\u0007\t\u0000\u0000\u05c9\u018d\u0001\u0000\u0000"+
-    "\u0000\u05ca\u05cb\u0003\u010a}\u0000\u05cb\u05cc\u0001\u0000\u0000\u0000"+
-    "\u05cc\u05cd\u0006\u00bf#\u0000\u05cd\u018f\u0001\u0000\u0000\u0000\u05ce"+
-    "\u05cf\u0003\u0118\u0084\u0000\u05cf\u05d0\u0001\u0000\u0000\u0000\u05d0"+
-    "\u05d1\u0006\u00c0!\u0000\u05d1\u05d2\u0006\u00c0\f\u0000\u05d2\u05d3"+
-    "\u0006\u00c0\u0000\u0000\u05d3\u0191\u0001\u0000\u0000\u0000\u05d4\u05d5"+
-    "\u0007\u0014\u0000\u0000\u05d5\u05d6\u0007\u0002\u0000\u0000\u05d6\u05d7"+
-    "\u0007\u0001\u0000\u0000\u05d7\u05d8\u0007\t\u0000\u0000\u05d8\u05d9\u0007"+
-    "\u0011\u0000\u0000\u05d9\u05da\u0001\u0000\u0000\u0000\u05da\u05db\u0006"+
-    "\u00c1\f\u0000\u05db\u05dc\u0006\u00c1\u0000\u0000\u05dc\u0193\u0001\u0000"+
-    "\u0000\u0000\u05dd\u05de\u0003\u00dcf\u0000\u05de\u05df\u0001\u0000\u0000"+
-    "\u0000\u05df\u05e0\u0006\u00c2\u0015\u0000\u05e0\u0195\u0001\u0000\u0000"+
-    "\u0000\u05e1\u05e2\u0003\\&\u0000\u05e2\u05e3\u0001\u0000\u0000\u0000"+
-    "\u05e3\u05e4\u0006\u00c3\u0016\u0000\u05e4\u0197\u0001\u0000\u0000\u0000"+
-    "\u05e5\u05e6\u0003l.\u0000\u05e6\u05e7\u0001\u0000\u0000\u0000\u05e7\u05e8"+
-    "\u0006\u00c4\u0012\u0000\u05e8\u0199\u0001\u0000\u0000\u0000\u05e9\u05ea"+
-    "\u0003\u00b6S\u0000\u05ea\u05eb\u0001\u0000\u0000\u0000\u05eb\u05ec\u0006"+
-    "\u00c5 \u0000\u05ec\u019b\u0001\u0000\u0000\u0000\u05ed\u05ee\u0003\u00ba"+
-    "U\u0000\u05ee\u05ef\u0001\u0000\u0000\u0000\u05ef\u05f0\u0006\u00c6\u001f"+
-    "\u0000\u05f0\u019d\u0001\u0000\u0000\u0000\u05f1\u05f2\u0003@\u0018\u0000"+
-    "\u05f2\u05f3\u0001\u0000\u0000\u0000\u05f3\u05f4\u0006\u00c7\u000b\u0000"+
-    "\u05f4\u019f\u0001\u0000\u0000\u0000\u05f5\u05f6\u0003B\u0019\u0000\u05f6"+
-    "\u05f7\u0001\u0000\u0000\u0000\u05f7\u05f8\u0006\u00c8\u000b\u0000\u05f8"+
-    "\u01a1\u0001\u0000\u0000\u0000\u05f9\u05fa\u0003D\u001a\u0000\u05fa\u05fb"+
-    "\u0001\u0000\u0000\u0000\u05fb\u05fc\u0006\u00c9\u000b\u0000\u05fc\u01a3"+
-    "\u0001\u0000\u0000\u0000\u05fd\u05fe\u0003F\u001b\u0000\u05fe\u05ff\u0001"+
-    "\u0000\u0000\u0000\u05ff\u0600\u0006\u00ca\u0010\u0000\u0600\u0601\u0006"+
-    "\u00ca\f\u0000\u0601\u01a5\u0001\u0000\u0000\u0000\u0602\u0603\u0003\u00dc"+
-    "f\u0000\u0603\u0604\u0001\u0000\u0000\u0000\u0604\u0605\u0006\u00cb\u0015"+
-    "\u0000\u0605\u0606\u0006\u00cb\f\u0000\u0606\u0607\u0006\u00cb$\u0000"+
-    "\u0607\u01a7\u0001\u0000\u0000\u0000\u0608\u0609\u0003\\&\u0000\u0609"+
-    "\u060a\u0001\u0000\u0000\u0000\u060a\u060b\u0006\u00cc\u0016\u0000\u060b"+
-    "\u060c\u0006\u00cc\f\u0000\u060c\u060d\u0006\u00cc$\u0000\u060d\u01a9"+
-    "\u0001\u0000\u0000\u0000\u060e\u060f\u0003@\u0018\u0000\u060f\u0610\u0001"+
-    "\u0000\u0000\u0000\u0610\u0611\u0006\u00cd\u000b\u0000\u0611\u01ab\u0001"+
-    "\u0000\u0000\u0000\u0612\u0613\u0003B\u0019\u0000\u0613\u0614\u0001\u0000"+
-    "\u0000\u0000\u0614\u0615\u0006\u00ce\u000b\u0000\u0615\u01ad\u0001\u0000"+
-    "\u0000\u0000\u0616\u0617\u0003D\u001a\u0000\u0617\u0618\u0001\u0000\u0000"+
-    "\u0000\u0618\u0619\u0006\u00cf\u000b\u0000\u0619\u01af\u0001\u0000\u0000"+
-    "\u0000\u061a\u061b\u0003l.\u0000\u061b\u061c\u0001\u0000\u0000\u0000\u061c"+
-    "\u061d\u0006\u00d0\u0012\u0000\u061d\u061e\u0006\u00d0\f\u0000\u061e\u061f"+
-    "\u0006\u00d0\n\u0000\u061f\u01b1\u0001\u0000\u0000\u0000\u0620\u0621\u0003"+
-    "n/\u0000\u0621\u0622\u0001\u0000\u0000\u0000\u0622\u0623\u0006\u00d1\u0013"+
-    "\u0000\u0623\u0624\u0006\u00d1\f\u0000\u0624\u0625\u0006\u00d1\n\u0000"+
-    "\u0625\u01b3\u0001\u0000\u0000\u0000\u0626\u0627\u0003@\u0018\u0000\u0627"+
-    "\u0628\u0001\u0000\u0000\u0000\u0628\u0629\u0006\u00d2\u000b\u0000\u0629"+
-    "\u01b5\u0001\u0000\u0000\u0000\u062a\u062b\u0003B\u0019\u0000\u062b\u062c"+
-    "\u0001\u0000\u0000\u0000\u062c\u062d\u0006\u00d3\u000b\u0000\u062d\u01b7"+
-    "\u0001\u0000\u0000\u0000\u062e\u062f\u0003D\u001a\u0000\u062f\u0630\u0001"+
-    "\u0000\u0000\u0000\u0630\u0631\u0006\u00d4\u000b\u0000\u0631\u01b9\u0001"+
-    "\u0000\u0000\u0000\u0632\u0633\u0003\u00baU\u0000\u0633\u0634\u0001\u0000"+
-    "\u0000\u0000\u0634\u0635\u0006\u00d5\f\u0000\u0635\u0636\u0006\u00d5\u0000"+
-    "\u0000\u0636\u0637\u0006\u00d5\u001f\u0000\u0637\u01bb\u0001\u0000\u0000"+
-    "\u0000\u0638\u0639\u0003\u00b6S\u0000\u0639\u063a\u0001\u0000\u0000\u0000"+
-    "\u063a\u063b\u0006\u00d6\f\u0000\u063b\u063c\u0006\u00d6\u0000\u0000\u063c"+
-    "\u063d\u0006\u00d6 \u0000\u063d\u01bd\u0001\u0000\u0000\u0000\u063e\u063f"+
-    "\u0003b)\u0000\u063f\u0640\u0001\u0000\u0000\u0000\u0640\u0641\u0006\u00d7"+
-    "\f\u0000\u0641\u0642\u0006\u00d7\u0000\u0000\u0642\u0643\u0006\u00d7%"+
-    "\u0000\u0643\u01bf\u0001\u0000\u0000\u0000\u0644\u0645\u0003F\u001b\u0000"+
-    "\u0645\u0646\u0001\u0000\u0000\u0000\u0646\u0647\u0006\u00d8\u0010\u0000"+
-    "\u0647\u0648\u0006\u00d8\f\u0000\u0648\u01c1\u0001\u0000\u0000\u0000B"+
-    "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e"+
-    "\u000f\u028e\u0298\u029c\u029f\u02a8\u02aa\u02b5\u02c8\u02cd\u02d6\u02dd"+
-    "\u02e2\u02e4\u02ef\u02f7\u02fa\u02fc\u0301\u0306\u030c\u0313\u0318\u031e"+
-    "\u0321\u0329\u032d\u03b1\u03b6\u03bd\u03bf\u03cf\u03d4\u03d9\u03db\u03e1"+
-    "\u042e\u0433\u0462\u0466\u046b\u0470\u0475\u0477\u047b\u047d\u04d2\u04d6"+
-    "\u04db\u0568\u056a&\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\r\u0000\u0005\u000b\u0000\u0005\u000e\u0000\u0000\u0001"+
-    "\u0000\u0004\u0000\u0000\u0007\u0010\u0000\u0007G\u0000\u0005\u0000\u0000"+
-    "\u0007\u001c\u0000\u0007H\u0000\u0007%\u0000\u0007&\u0000\u0007#\u0000"+
-    "\u0007R\u0000\u0007\u001d\u0000\u0007(\u0000\u00074\u0000\u0007F\u0000"+
-    "\u0007V\u0000\u0005\n\u0000\u0005\u0007\u0000\u0007`\u0000\u0007_\u0000"+
-    "\u0007J\u0000\u0007I\u0000\u0007^\u0000\u0005\f\u0000\u0007Z\u0000\u0005"+
-    "\u000f\u0000\u0007 \u0000";
+    "\u00d7\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001\u00d8\u0001"+
+    "\u00d8\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001\u00d9\u0001"+
+    "\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00da\u0001\u00db\u0001"+
+    "\u00db\u0001\u00db\u0001\u00db\u0001\u00dc\u0001\u00dc\u0001\u00dc\u0001"+
+    "\u00dc\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00dd\u0001\u00de\u0001"+
+    "\u00de\u0001\u00de\u0001\u00de\u0001\u00df\u0001\u00df\u0001\u00df\u0001"+
+    "\u00df\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e0\u0001\u00e1\u0001"+
+    "\u00e1\u0001\u00e1\u0001\u00e1\u0001\u00e2\u0001\u00e2\u0001\u00e2\u0001"+
+    "\u00e2\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0001\u00e3\u0002\u02d1\u0316"+
+    "\u0000\u00e4\u0011\u0001\u0013\u0002\u0015\u0003\u0017\u0004\u0019\u0005"+
+    "\u001b\u0006\u001d\u0007\u001f\b!\t#\n%\u000b\'\f)\r+\u000e-\u000f/\u0010"+
+    "1\u00113\u00125\u00137\u00149\u0015;\u0016=\u0017?\u0018A\u0019C\u001a"+
+    "E\u001bG\u001cI\u001dK\u0000M\u0000O\u0000Q\u0000S\u0000U\u0000W\u0000"+
+    "Y\u0000[\u0000]\u0000_\u001ea\u001fc e!g\"i#k$m%o&q\'s(u)w*y+{,}-\u007f"+
+    ".\u0081/\u00830\u00851\u00872\u00893\u008b4\u008d5\u008f6\u00917\u0093"+
+    "8\u00959\u0097:\u0099;\u009b<\u009d=\u009f>\u00a1?\u00a3@\u00a5A\u00a7"+
+    "B\u00a9C\u00abD\u00adE\u00afF\u00b1\u0000\u00b3G\u00b5H\u00b7I\u00b9J"+
+    "\u00bb\u0000\u00bdK\u00bfL\u00c1M\u00c3N\u00c5\u0000\u00c7\u0000\u00c9"+
+    "O\u00cbP\u00cdQ\u00cf\u0000\u00d1\u0000\u00d3\u0000\u00d5\u0000\u00d7"+
+    "\u0000\u00d9\u0000\u00dbR\u00dd\u0000\u00dfS\u00e1\u0000\u00e3\u0000\u00e5"+
+    "T\u00e7U\u00e9V\u00eb\u0000\u00ed\u0000\u00ef\u0000\u00f1\u0000\u00f3"+
+    "\u0000\u00f5\u0000\u00f7\u0000\u00f9W\u00fbX\u00fdY\u00ffZ\u0101\u0000"+
+    "\u0103\u0000\u0105\u0000\u0107\u0000\u0109\u0000\u010b\u0000\u010d[\u010f"+
+    "\u0000\u0111\\\u0113]\u0115^\u0117\u0000\u0119\u0000\u011b_\u011d`\u011f"+
+    "\u0000\u0121a\u0123\u0000\u0125b\u0127c\u0129d\u012b\u0000\u012d\u0000"+
+    "\u012f\u0000\u0131\u0000\u0133\u0000\u0135\u0000\u0137\u0000\u0139\u0000"+
+    "\u013b\u0000\u013de\u013ff\u0141g\u0143\u0000\u0145\u0000\u0147\u0000"+
+    "\u0149\u0000\u014b\u0000\u014d\u0000\u014fh\u0151i\u0153j\u0155\u0000"+
+    "\u0157k\u0159l\u015bm\u015dn\u015f\u0000\u0161\u0000\u0163o\u0165p\u0167"+
+    "q\u0169r\u016b\u0000\u016d\u0000\u016f\u0000\u0171\u0000\u0173\u0000\u0175"+
+    "\u0000\u0177\u0000\u0179s\u017bt\u017du\u017f\u0000\u0181\u0000\u0183"+
+    "\u0000\u0185\u0000\u0187v\u0189w\u018bx\u018d\u0000\u018fy\u0191\u0000"+
+    "\u0193\u0000\u0195z\u0197\u0000\u0199\u0000\u019b\u0000\u019d\u0000\u019f"+
+    "\u0000\u01a1{\u01a3|\u01a5}\u01a7\u0000\u01a9\u0000\u01ab\u0000\u01ad"+
+    "~\u01af\u007f\u01b1\u0080\u01b3\u0000\u01b5\u0000\u01b7\u0081\u01b9\u0082"+
+    "\u01bb\u0083\u01bd\u0000\u01bf\u0000\u01c1\u0000\u01c3\u0000\u01c5\u0000"+
+    "\u01c7\u0000\u01c9\u0000\u01cb\u0000\u01cd\u0000\u01cf\u0000\u01d1\u0000"+
+    "\u01d3\u0084\u01d5\u0085\u01d7\u0086\u0011\u0000\u0001\u0002\u0003\u0004"+
+    "\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010$\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  \"#,,//::<<>?\\\\||\u0002"+
+    "\u0000JJjj\u06b3\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\u00009\u0001\u0000\u0000\u0000\u0000;"+
+    "\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?\u0001\u0000"+
+    "\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000\u0000\u0000"+
+    "\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000\u0001I"+
+    "\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\u0001i\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\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\u00a9\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\u0001\u00b3\u0001\u0000\u0000\u0000\u0001\u00b5\u0001\u0000"+
+    "\u0000\u0000\u0001\u00b7\u0001\u0000\u0000\u0000\u0001\u00b9\u0001\u0000"+
+    "\u0000\u0000\u0001\u00bd\u0001\u0000\u0000\u0000\u0001\u00bf\u0001\u0000"+
+    "\u0000\u0000\u0001\u00c1\u0001\u0000\u0000\u0000\u0001\u00c3\u0001\u0000"+
+    "\u0000\u0000\u0002\u00c5\u0001\u0000\u0000\u0000\u0002\u00c7\u0001\u0000"+
+    "\u0000\u0000\u0002\u00c9\u0001\u0000\u0000\u0000\u0002\u00cb\u0001\u0000"+
+    "\u0000\u0000\u0002\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\u0003\u00d9\u0001\u0000\u0000\u0000\u0003\u00db\u0001\u0000"+
+    "\u0000\u0000\u0003\u00df\u0001\u0000\u0000\u0000\u0003\u00e1\u0001\u0000"+
+    "\u0000\u0000\u0003\u00e3\u0001\u0000\u0000\u0000\u0003\u00e5\u0001\u0000"+
+    "\u0000\u0000\u0003\u00e7\u0001\u0000\u0000\u0000\u0003\u00e9\u0001\u0000"+
+    "\u0000\u0000\u0004\u00eb\u0001\u0000\u0000\u0000\u0004\u00ed\u0001\u0000"+
+    "\u0000\u0000\u0004\u00ef\u0001\u0000\u0000\u0000\u0004\u00f1\u0001\u0000"+
+    "\u0000\u0000\u0004\u00f3\u0001\u0000\u0000\u0000\u0004\u00f9\u0001\u0000"+
+    "\u0000\u0000\u0004\u00fb\u0001\u0000\u0000\u0000\u0004\u00fd\u0001\u0000"+
+    "\u0000\u0000\u0004\u00ff\u0001\u0000\u0000\u0000\u0005\u0101\u0001\u0000"+
+    "\u0000\u0000\u0005\u0103\u0001\u0000\u0000\u0000\u0005\u0105\u0001\u0000"+
+    "\u0000\u0000\u0005\u0107\u0001\u0000\u0000\u0000\u0005\u0109\u0001\u0000"+
+    "\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0005\u010d\u0001\u0000"+
+    "\u0000\u0000\u0005\u010f\u0001\u0000\u0000\u0000\u0005\u0111\u0001\u0000"+
+    "\u0000\u0000\u0005\u0113\u0001\u0000\u0000\u0000\u0005\u0115\u0001\u0000"+
+    "\u0000\u0000\u0006\u0117\u0001\u0000\u0000\u0000\u0006\u0119\u0001\u0000"+
+    "\u0000\u0000\u0006\u011b\u0001\u0000\u0000\u0000\u0006\u011d\u0001\u0000"+
+    "\u0000\u0000\u0006\u0121\u0001\u0000\u0000\u0000\u0006\u0123\u0001\u0000"+
+    "\u0000\u0000\u0006\u0125\u0001\u0000\u0000\u0000\u0006\u0127\u0001\u0000"+
+    "\u0000\u0000\u0006\u0129\u0001\u0000\u0000\u0000\u0007\u012b\u0001\u0000"+
+    "\u0000\u0000\u0007\u012d\u0001\u0000\u0000\u0000\u0007\u012f\u0001\u0000"+
+    "\u0000\u0000\u0007\u0131\u0001\u0000\u0000\u0000\u0007\u0133\u0001\u0000"+
+    "\u0000\u0000\u0007\u0135\u0001\u0000\u0000\u0000\u0007\u0137\u0001\u0000"+
+    "\u0000\u0000\u0007\u0139\u0001\u0000\u0000\u0000\u0007\u013b\u0001\u0000"+
+    "\u0000\u0000\u0007\u013d\u0001\u0000\u0000\u0000\u0007\u013f\u0001\u0000"+
+    "\u0000\u0000\u0007\u0141\u0001\u0000\u0000\u0000\b\u0143\u0001\u0000\u0000"+
+    "\u0000\b\u0145\u0001\u0000\u0000\u0000\b\u0147\u0001\u0000\u0000\u0000"+
+    "\b\u0149\u0001\u0000\u0000\u0000\b\u014b\u0001\u0000\u0000\u0000\b\u014d"+
+    "\u0001\u0000\u0000\u0000\b\u014f\u0001\u0000\u0000\u0000\b\u0151\u0001"+
+    "\u0000\u0000\u0000\b\u0153\u0001\u0000\u0000\u0000\t\u0155\u0001\u0000"+
+    "\u0000\u0000\t\u0157\u0001\u0000\u0000\u0000\t\u0159\u0001\u0000\u0000"+
+    "\u0000\t\u015b\u0001\u0000\u0000\u0000\t\u015d\u0001\u0000\u0000\u0000"+
+    "\n\u015f\u0001\u0000\u0000\u0000\n\u0161\u0001\u0000\u0000\u0000\n\u0163"+
+    "\u0001\u0000\u0000\u0000\n\u0165\u0001\u0000\u0000\u0000\n\u0167\u0001"+
+    "\u0000\u0000\u0000\n\u0169\u0001\u0000\u0000\u0000\u000b\u016b\u0001\u0000"+
+    "\u0000\u0000\u000b\u016d\u0001\u0000\u0000\u0000\u000b\u016f\u0001\u0000"+
+    "\u0000\u0000\u000b\u0171\u0001\u0000\u0000\u0000\u000b\u0173\u0001\u0000"+
+    "\u0000\u0000\u000b\u0175\u0001\u0000\u0000\u0000\u000b\u0177\u0001\u0000"+
+    "\u0000\u0000\u000b\u0179\u0001\u0000\u0000\u0000\u000b\u017b\u0001\u0000"+
+    "\u0000\u0000\u000b\u017d\u0001\u0000\u0000\u0000\f\u017f\u0001\u0000\u0000"+
+    "\u0000\f\u0181\u0001\u0000\u0000\u0000\f\u0183\u0001\u0000\u0000\u0000"+
+    "\f\u0185\u0001\u0000\u0000\u0000\f\u0187\u0001\u0000\u0000\u0000\f\u0189"+
+    "\u0001\u0000\u0000\u0000\f\u018b\u0001\u0000\u0000\u0000\r\u018d\u0001"+
+    "\u0000\u0000\u0000\r\u018f\u0001\u0000\u0000\u0000\r\u0191\u0001\u0000"+
+    "\u0000\u0000\r\u0193\u0001\u0000\u0000\u0000\r\u0195\u0001\u0000\u0000"+
+    "\u0000\r\u0197\u0001\u0000\u0000\u0000\r\u0199\u0001\u0000\u0000\u0000"+
+    "\r\u019b\u0001\u0000\u0000\u0000\r\u019d\u0001\u0000\u0000\u0000\r\u019f"+
+    "\u0001\u0000\u0000\u0000\r\u01a1\u0001\u0000\u0000\u0000\r\u01a3\u0001"+
+    "\u0000\u0000\u0000\r\u01a5\u0001\u0000\u0000\u0000\u000e\u01a7\u0001\u0000"+
+    "\u0000\u0000\u000e\u01a9\u0001\u0000\u0000\u0000\u000e\u01ab\u0001\u0000"+
+    "\u0000\u0000\u000e\u01ad\u0001\u0000\u0000\u0000\u000e\u01af\u0001\u0000"+
+    "\u0000\u0000\u000e\u01b1\u0001\u0000\u0000\u0000\u000f\u01b3\u0001\u0000"+
+    "\u0000\u0000\u000f\u01b5\u0001\u0000\u0000\u0000\u000f\u01b7\u0001\u0000"+
+    "\u0000\u0000\u000f\u01b9\u0001\u0000\u0000\u0000\u000f\u01bb\u0001\u0000"+
+    "\u0000\u0000\u000f\u01bd\u0001\u0000\u0000\u0000\u000f\u01bf\u0001\u0000"+
+    "\u0000\u0000\u000f\u01c1\u0001\u0000\u0000\u0000\u000f\u01c3\u0001\u0000"+
+    "\u0000\u0000\u0010\u01c5\u0001\u0000\u0000\u0000\u0010\u01c7\u0001\u0000"+
+    "\u0000\u0000\u0010\u01c9\u0001\u0000\u0000\u0000\u0010\u01cb\u0001\u0000"+
+    "\u0000\u0000\u0010\u01cd\u0001\u0000\u0000\u0000\u0010\u01cf\u0001\u0000"+
+    "\u0000\u0000\u0010\u01d1\u0001\u0000\u0000\u0000\u0010\u01d3\u0001\u0000"+
+    "\u0000\u0000\u0010\u01d5\u0001\u0000\u0000\u0000\u0010\u01d7\u0001\u0000"+
+    "\u0000\u0000\u0011\u01d9\u0001\u0000\u0000\u0000\u0013\u01e3\u0001\u0000"+
+    "\u0000\u0000\u0015\u01ea\u0001\u0000\u0000\u0000\u0017\u01f3\u0001\u0000"+
+    "\u0000\u0000\u0019\u01fa\u0001\u0000\u0000\u0000\u001b\u0204\u0001\u0000"+
+    "\u0000\u0000\u001d\u020b\u0001\u0000\u0000\u0000\u001f\u0212\u0001\u0000"+
+    "\u0000\u0000!\u0219\u0001\u0000\u0000\u0000#\u0221\u0001\u0000\u0000\u0000"+
+    "%\u022d\u0001\u0000\u0000\u0000\'\u0236\u0001\u0000\u0000\u0000)\u023c"+
+    "\u0001\u0000\u0000\u0000+\u0243\u0001\u0000\u0000\u0000-\u024a\u0001\u0000"+
+    "\u0000\u0000/\u0252\u0001\u0000\u0000\u00001\u025a\u0001\u0000\u0000\u0000"+
+    "3\u0263\u0001\u0000\u0000\u00005\u0273\u0001\u0000\u0000\u00007\u0282"+
+    "\u0001\u0000\u0000\u00009\u028e\u0001\u0000\u0000\u0000;\u0299\u0001\u0000"+
+    "\u0000\u0000=\u02a1\u0001\u0000\u0000\u0000?\u02a9\u0001\u0000\u0000\u0000"+
+    "A\u02b3\u0001\u0000\u0000\u0000C\u02b9\u0001\u0000\u0000\u0000E\u02ca"+
+    "\u0001\u0000\u0000\u0000G\u02da\u0001\u0000\u0000\u0000I\u02e0\u0001\u0000"+
+    "\u0000\u0000K\u02e4\u0001\u0000\u0000\u0000M\u02e6\u0001\u0000\u0000\u0000"+
+    "O\u02e8\u0001\u0000\u0000\u0000Q\u02eb\u0001\u0000\u0000\u0000S\u02ed"+
+    "\u0001\u0000\u0000\u0000U\u02f6\u0001\u0000\u0000\u0000W\u02f8\u0001\u0000"+
+    "\u0000\u0000Y\u02fd\u0001\u0000\u0000\u0000[\u02ff\u0001\u0000\u0000\u0000"+
+    "]\u0304\u0001\u0000\u0000\u0000_\u0323\u0001\u0000\u0000\u0000a\u0326"+
+    "\u0001\u0000\u0000\u0000c\u0354\u0001\u0000\u0000\u0000e\u0356\u0001\u0000"+
+    "\u0000\u0000g\u0359\u0001\u0000\u0000\u0000i\u035d\u0001\u0000\u0000\u0000"+
+    "k\u0361\u0001\u0000\u0000\u0000m\u0363\u0001\u0000\u0000\u0000o\u0366"+
+    "\u0001\u0000\u0000\u0000q\u0368\u0001\u0000\u0000\u0000s\u036a\u0001\u0000"+
+    "\u0000\u0000u\u036f\u0001\u0000\u0000\u0000w\u0371\u0001\u0000\u0000\u0000"+
+    "y\u0377\u0001\u0000\u0000\u0000{\u037d\u0001\u0000\u0000\u0000}\u0380"+
+    "\u0001\u0000\u0000\u0000\u007f\u0383\u0001\u0000\u0000\u0000\u0081\u0388"+
+    "\u0001\u0000\u0000\u0000\u0083\u038d\u0001\u0000\u0000\u0000\u0085\u038f"+
+    "\u0001\u0000\u0000\u0000\u0087\u0393\u0001\u0000\u0000\u0000\u0089\u0398"+
+    "\u0001\u0000\u0000\u0000\u008b\u039e\u0001\u0000\u0000\u0000\u008d\u03a1"+
+    "\u0001\u0000\u0000\u0000\u008f\u03a3\u0001\u0000\u0000\u0000\u0091\u03a9"+
+    "\u0001\u0000\u0000\u0000\u0093\u03ab\u0001\u0000\u0000\u0000\u0095\u03b0"+
+    "\u0001\u0000\u0000\u0000\u0097\u03b3\u0001\u0000\u0000\u0000\u0099\u03b6"+
+    "\u0001\u0000\u0000\u0000\u009b\u03b9\u0001\u0000\u0000\u0000\u009d\u03bb"+
+    "\u0001\u0000\u0000\u0000\u009f\u03be\u0001\u0000\u0000\u0000\u00a1\u03c0"+
+    "\u0001\u0000\u0000\u0000\u00a3\u03c3\u0001\u0000\u0000\u0000\u00a5\u03c5"+
+    "\u0001\u0000\u0000\u0000\u00a7\u03c7\u0001\u0000\u0000\u0000\u00a9\u03c9"+
+    "\u0001\u0000\u0000\u0000\u00ab\u03cb\u0001\u0000\u0000\u0000\u00ad\u03cd"+
+    "\u0001\u0000\u0000\u0000\u00af\u03cf\u0001\u0000\u0000\u0000\u00b1\u03d1"+
+    "\u0001\u0000\u0000\u0000\u00b3\u03e6\u0001\u0000\u0000\u0000\u00b5\u03e8"+
+    "\u0001\u0000\u0000\u0000\u00b7\u03ed\u0001\u0000\u0000\u0000\u00b9\u0402"+
+    "\u0001\u0000\u0000\u0000\u00bb\u0404\u0001\u0000\u0000\u0000\u00bd\u040c"+
+    "\u0001\u0000\u0000\u0000\u00bf\u040e\u0001\u0000\u0000\u0000\u00c1\u0412"+
+    "\u0001\u0000\u0000\u0000\u00c3\u0416\u0001\u0000\u0000\u0000\u00c5\u041a"+
+    "\u0001\u0000\u0000\u0000\u00c7\u041f\u0001\u0000\u0000\u0000\u00c9\u0424"+
+    "\u0001\u0000\u0000\u0000\u00cb\u0428\u0001\u0000\u0000\u0000\u00cd\u042c"+
+    "\u0001\u0000\u0000\u0000\u00cf\u0430\u0001\u0000\u0000\u0000\u00d1\u0435"+
+    "\u0001\u0000\u0000\u0000\u00d3\u0439\u0001\u0000\u0000\u0000\u00d5\u043d"+
+    "\u0001\u0000\u0000\u0000\u00d7\u0441\u0001\u0000\u0000\u0000\u00d9\u0445"+
+    "\u0001\u0000\u0000\u0000\u00db\u0449\u0001\u0000\u0000\u0000\u00dd\u0455"+
+    "\u0001\u0000\u0000\u0000\u00df\u0458\u0001\u0000\u0000\u0000\u00e1\u045c"+
+    "\u0001\u0000\u0000\u0000\u00e3\u0460\u0001\u0000\u0000\u0000\u00e5\u0464"+
+    "\u0001\u0000\u0000\u0000\u00e7\u0468\u0001\u0000\u0000\u0000\u00e9\u046c"+
+    "\u0001\u0000\u0000\u0000\u00eb\u0470\u0001\u0000\u0000\u0000\u00ed\u0475"+
+    "\u0001\u0000\u0000\u0000\u00ef\u0479\u0001\u0000\u0000\u0000\u00f1\u047d"+
+    "\u0001\u0000\u0000\u0000\u00f3\u0481\u0001\u0000\u0000\u0000\u00f5\u0489"+
+    "\u0001\u0000\u0000\u0000\u00f7\u049e\u0001\u0000\u0000\u0000\u00f9\u04a2"+
+    "\u0001\u0000\u0000\u0000\u00fb\u04a6\u0001\u0000\u0000\u0000\u00fd\u04aa"+
+    "\u0001\u0000\u0000\u0000\u00ff\u04ae\u0001\u0000\u0000\u0000\u0101\u04b2"+
+    "\u0001\u0000\u0000\u0000\u0103\u04b7\u0001\u0000\u0000\u0000\u0105\u04bb"+
+    "\u0001\u0000\u0000\u0000\u0107\u04bf\u0001\u0000\u0000\u0000\u0109\u04c3"+
+    "\u0001\u0000\u0000\u0000\u010b\u04c7\u0001\u0000\u0000\u0000\u010d\u04cb"+
+    "\u0001\u0000\u0000\u0000\u010f\u04ce\u0001\u0000\u0000\u0000\u0111\u04d2"+
+    "\u0001\u0000\u0000\u0000\u0113\u04d6\u0001\u0000\u0000\u0000\u0115\u04da"+
+    "\u0001\u0000\u0000\u0000\u0117\u04de\u0001\u0000\u0000\u0000\u0119\u04e3"+
+    "\u0001\u0000\u0000\u0000\u011b\u04e8\u0001\u0000\u0000\u0000\u011d\u04ed"+
+    "\u0001\u0000\u0000\u0000\u011f\u04f4\u0001\u0000\u0000\u0000\u0121\u04fd"+
+    "\u0001\u0000\u0000\u0000\u0123\u0504\u0001\u0000\u0000\u0000\u0125\u0508"+
+    "\u0001\u0000\u0000\u0000\u0127\u050c\u0001\u0000\u0000\u0000\u0129\u0510"+
+    "\u0001\u0000\u0000\u0000\u012b\u0514\u0001\u0000\u0000\u0000\u012d\u051a"+
+    "\u0001\u0000\u0000\u0000\u012f\u051e\u0001\u0000\u0000\u0000\u0131\u0522"+
+    "\u0001\u0000\u0000\u0000\u0133\u0526\u0001\u0000\u0000\u0000\u0135\u052a"+
+    "\u0001\u0000\u0000\u0000\u0137\u052e\u0001\u0000\u0000\u0000\u0139\u0532"+
+    "\u0001\u0000\u0000\u0000\u013b\u0536\u0001\u0000\u0000\u0000\u013d\u053a"+
+    "\u0001\u0000\u0000\u0000\u013f\u053e\u0001\u0000\u0000\u0000\u0141\u0542"+
+    "\u0001\u0000\u0000\u0000\u0143\u0546\u0001\u0000\u0000\u0000\u0145\u054b"+
+    "\u0001\u0000\u0000\u0000\u0147\u054f\u0001\u0000\u0000\u0000\u0149\u0553"+
+    "\u0001\u0000\u0000\u0000\u014b\u0557\u0001\u0000\u0000\u0000\u014d\u055b"+
+    "\u0001\u0000\u0000\u0000\u014f\u055f\u0001\u0000\u0000\u0000\u0151\u0563"+
+    "\u0001\u0000\u0000\u0000\u0153\u0567\u0001\u0000\u0000\u0000\u0155\u056b"+
+    "\u0001\u0000\u0000\u0000\u0157\u0570\u0001\u0000\u0000\u0000\u0159\u0575"+
+    "\u0001\u0000\u0000\u0000\u015b\u0579\u0001\u0000\u0000\u0000\u015d\u057d"+
+    "\u0001\u0000\u0000\u0000\u015f\u0581\u0001\u0000\u0000\u0000\u0161\u0586"+
+    "\u0001\u0000\u0000\u0000\u0163\u058f\u0001\u0000\u0000\u0000\u0165\u0593"+
+    "\u0001\u0000\u0000\u0000\u0167\u0597\u0001\u0000\u0000\u0000\u0169\u059b"+
+    "\u0001\u0000\u0000\u0000\u016b\u059f\u0001\u0000\u0000\u0000\u016d\u05a4"+
+    "\u0001\u0000\u0000\u0000\u016f\u05a8\u0001\u0000\u0000\u0000\u0171\u05ac"+
+    "\u0001\u0000\u0000\u0000\u0173\u05b0\u0001\u0000\u0000\u0000\u0175\u05b5"+
+    "\u0001\u0000\u0000\u0000\u0177\u05b9\u0001\u0000\u0000\u0000\u0179\u05bd"+
+    "\u0001\u0000\u0000\u0000\u017b\u05c1\u0001\u0000\u0000\u0000\u017d\u05c5"+
+    "\u0001\u0000\u0000\u0000\u017f\u05c9\u0001\u0000\u0000\u0000\u0181\u05cf"+
+    "\u0001\u0000\u0000\u0000\u0183\u05d3\u0001\u0000\u0000\u0000\u0185\u05d7"+
+    "\u0001\u0000\u0000\u0000\u0187\u05db\u0001\u0000\u0000\u0000\u0189\u05df"+
+    "\u0001\u0000\u0000\u0000\u018b\u05e3\u0001\u0000\u0000\u0000\u018d\u05e7"+
+    "\u0001\u0000\u0000\u0000\u018f\u05ec\u0001\u0000\u0000\u0000\u0191\u05f1"+
+    "\u0001\u0000\u0000\u0000\u0193\u05f5\u0001\u0000\u0000\u0000\u0195\u05fb"+
+    "\u0001\u0000\u0000\u0000\u0197\u0604\u0001\u0000\u0000\u0000\u0199\u0608"+
+    "\u0001\u0000\u0000\u0000\u019b\u060c\u0001\u0000\u0000\u0000\u019d\u0610"+
+    "\u0001\u0000\u0000\u0000\u019f\u0614\u0001\u0000\u0000\u0000\u01a1\u0618"+
+    "\u0001\u0000\u0000\u0000\u01a3\u061c\u0001\u0000\u0000\u0000\u01a5\u0620"+
+    "\u0001\u0000\u0000\u0000\u01a7\u0624\u0001\u0000\u0000\u0000\u01a9\u0629"+
+    "\u0001\u0000\u0000\u0000\u01ab\u062f\u0001\u0000\u0000\u0000\u01ad\u0635"+
+    "\u0001\u0000\u0000\u0000\u01af\u0639\u0001\u0000\u0000\u0000\u01b1\u063d"+
+    "\u0001\u0000\u0000\u0000\u01b3\u0641\u0001\u0000\u0000\u0000\u01b5\u0647"+
+    "\u0001\u0000\u0000\u0000\u01b7\u064d\u0001\u0000\u0000\u0000\u01b9\u0651"+
+    "\u0001\u0000\u0000\u0000\u01bb\u0655\u0001\u0000\u0000\u0000\u01bd\u0659"+
+    "\u0001\u0000\u0000\u0000\u01bf\u065f\u0001\u0000\u0000\u0000\u01c1\u0665"+
+    "\u0001\u0000\u0000\u0000\u01c3\u066b\u0001\u0000\u0000\u0000\u01c5\u0670"+
+    "\u0001\u0000\u0000\u0000\u01c7\u0675\u0001\u0000\u0000\u0000\u01c9\u0679"+
+    "\u0001\u0000\u0000\u0000\u01cb\u067d\u0001\u0000\u0000\u0000\u01cd\u0681"+
+    "\u0001\u0000\u0000\u0000\u01cf\u0685\u0001\u0000\u0000\u0000\u01d1\u0689"+
+    "\u0001\u0000\u0000\u0000\u01d3\u068d\u0001\u0000\u0000\u0000\u01d5\u0691"+
+    "\u0001\u0000\u0000\u0000\u01d7\u0695\u0001\u0000\u0000\u0000\u01d9\u01da"+
+    "\u0007\u0000\u0000\u0000\u01da\u01db\u0007\u0001\u0000\u0000\u01db\u01dc"+
+    "\u0007\u0002\u0000\u0000\u01dc\u01dd\u0007\u0002\u0000\u0000\u01dd\u01de"+
+    "\u0007\u0003\u0000\u0000\u01de\u01df\u0007\u0004\u0000\u0000\u01df\u01e0"+
+    "\u0007\u0005\u0000\u0000\u01e0\u01e1\u0001\u0000\u0000\u0000\u01e1\u01e2"+
+    "\u0006\u0000\u0000\u0000\u01e2\u0012\u0001\u0000\u0000\u0000\u01e3\u01e4"+
+    "\u0007\u0000\u0000\u0000\u01e4\u01e5\u0007\u0006\u0000\u0000\u01e5\u01e6"+
+    "\u0007\u0007\u0000\u0000\u01e6\u01e7\u0007\b\u0000\u0000\u01e7\u01e8\u0001"+
+    "\u0000\u0000\u0000\u01e8\u01e9\u0006\u0001\u0001\u0000\u01e9\u0014\u0001"+
+    "\u0000\u0000\u0000\u01ea\u01eb\u0007\u0003\u0000\u0000\u01eb\u01ec\u0007"+
+    "\t\u0000\u0000\u01ec\u01ed\u0007\u0006\u0000\u0000\u01ed\u01ee\u0007\u0001"+
+    "\u0000\u0000\u01ee\u01ef\u0007\u0004\u0000\u0000\u01ef\u01f0\u0007\n\u0000"+
+    "\u0000\u01f0\u01f1\u0001\u0000\u0000\u0000\u01f1\u01f2\u0006\u0002\u0002"+
+    "\u0000\u01f2\u0016\u0001\u0000\u0000\u0000\u01f3\u01f4\u0007\u0003\u0000"+
+    "\u0000\u01f4\u01f5\u0007\u000b\u0000\u0000\u01f5\u01f6\u0007\f\u0000\u0000"+
+    "\u01f6\u01f7\u0007\r\u0000\u0000\u01f7\u01f8\u0001\u0000\u0000\u0000\u01f8"+
+    "\u01f9\u0006\u0003\u0000\u0000\u01f9\u0018\u0001\u0000\u0000\u0000\u01fa"+
+    "\u01fb\u0007\u0003\u0000\u0000\u01fb\u01fc\u0007\u000e\u0000\u0000\u01fc"+
+    "\u01fd\u0007\b\u0000\u0000\u01fd\u01fe\u0007\r\u0000\u0000\u01fe\u01ff"+
+    "\u0007\f\u0000\u0000\u01ff\u0200\u0007\u0001\u0000\u0000\u0200\u0201\u0007"+
+    "\t\u0000\u0000\u0201\u0202\u0001\u0000\u0000\u0000\u0202\u0203\u0006\u0004"+
+    "\u0003\u0000\u0203\u001a\u0001\u0000\u0000\u0000\u0204\u0205\u0007\u000f"+
+    "\u0000\u0000\u0205\u0206\u0007\u0006\u0000\u0000\u0206\u0207\u0007\u0007"+
+    "\u0000\u0000\u0207\u0208\u0007\u0010\u0000\u0000\u0208\u0209\u0001\u0000"+
+    "\u0000\u0000\u0209\u020a\u0006\u0005\u0004\u0000\u020a\u001c\u0001\u0000"+
+    "\u0000\u0000\u020b\u020c\u0007\u0011\u0000\u0000\u020c\u020d\u0007\u0006"+
+    "\u0000\u0000\u020d\u020e\u0007\u0007\u0000\u0000\u020e\u020f\u0007\u0012"+
+    "\u0000\u0000\u020f\u0210\u0001\u0000\u0000\u0000\u0210\u0211\u0006\u0006"+
+    "\u0000\u0000\u0211\u001e\u0001\u0000\u0000\u0000\u0212\u0213\u0007\u0012"+
+    "\u0000\u0000\u0213\u0214\u0007\u0003\u0000\u0000\u0214\u0215\u0007\u0003"+
+    "\u0000\u0000\u0215\u0216\u0007\b\u0000\u0000\u0216\u0217\u0001\u0000\u0000"+
+    "\u0000\u0217\u0218\u0006\u0007\u0001\u0000\u0218 \u0001\u0000\u0000\u0000"+
+    "\u0219\u021a\u0007\r\u0000\u0000\u021a\u021b\u0007\u0001\u0000\u0000\u021b"+
+    "\u021c\u0007\u0010\u0000\u0000\u021c\u021d\u0007\u0001\u0000\u0000\u021d"+
+    "\u021e\u0007\u0005\u0000\u0000\u021e\u021f\u0001\u0000\u0000\u0000\u021f"+
+    "\u0220\u0006\b\u0000\u0000\u0220\"\u0001\u0000\u0000\u0000\u0221\u0222"+
+    "\u0007\u0010\u0000\u0000\u0222\u0223\u0007\u000b\u0000\u0000\u0223\u0224"+
+    "\u0005_\u0000\u0000\u0224\u0225\u0007\u0003\u0000\u0000\u0225\u0226\u0007"+
+    "\u000e\u0000\u0000\u0226\u0227\u0007\b\u0000\u0000\u0227\u0228\u0007\f"+
+    "\u0000\u0000\u0228\u0229\u0007\t\u0000\u0000\u0229\u022a\u0007\u0000\u0000"+
+    "\u0000\u022a\u022b\u0001\u0000\u0000\u0000\u022b\u022c\u0006\t\u0005\u0000"+
+    "\u022c$\u0001\u0000\u0000\u0000\u022d\u022e\u0007\u0006\u0000\u0000\u022e"+
+    "\u022f\u0007\u0003\u0000\u0000\u022f\u0230\u0007\t\u0000\u0000\u0230\u0231"+
+    "\u0007\f\u0000\u0000\u0231\u0232\u0007\u0010\u0000\u0000\u0232\u0233\u0007"+
+    "\u0003\u0000\u0000\u0233\u0234\u0001\u0000\u0000\u0000\u0234\u0235\u0006"+
+    "\n\u0006\u0000\u0235&\u0001\u0000\u0000\u0000\u0236\u0237\u0007\u0006"+
+    "\u0000\u0000\u0237\u0238\u0007\u0007\u0000\u0000\u0238\u0239\u0007\u0013"+
+    "\u0000\u0000\u0239\u023a\u0001\u0000\u0000\u0000\u023a\u023b\u0006\u000b"+
+    "\u0000\u0000\u023b(\u0001\u0000\u0000\u0000\u023c\u023d\u0007\u0002\u0000"+
+    "\u0000\u023d\u023e\u0007\n\u0000\u0000\u023e\u023f\u0007\u0007\u0000\u0000"+
+    "\u023f\u0240\u0007\u0013\u0000\u0000\u0240\u0241\u0001\u0000\u0000\u0000"+
+    "\u0241\u0242\u0006\f\u0007\u0000\u0242*\u0001\u0000\u0000\u0000\u0243"+
+    "\u0244\u0007\u0002\u0000\u0000\u0244\u0245\u0007\u0007\u0000\u0000\u0245"+
+    "\u0246\u0007\u0006\u0000\u0000\u0246\u0247\u0007\u0005\u0000\u0000\u0247"+
+    "\u0248\u0001\u0000\u0000\u0000\u0248\u0249\u0006\r\u0000\u0000\u0249,"+
+    "\u0001\u0000\u0000\u0000\u024a\u024b\u0007\u0002\u0000\u0000\u024b\u024c"+
+    "\u0007\u0005\u0000\u0000\u024c\u024d\u0007\f\u0000\u0000\u024d\u024e\u0007"+
+    "\u0005\u0000\u0000\u024e\u024f\u0007\u0002\u0000\u0000\u024f\u0250\u0001"+
+    "\u0000\u0000\u0000\u0250\u0251\u0006\u000e\u0000\u0000\u0251.\u0001\u0000"+
+    "\u0000\u0000\u0252\u0253\u0007\u0013\u0000\u0000\u0253\u0254\u0007\n\u0000"+
+    "\u0000\u0254\u0255\u0007\u0003\u0000\u0000\u0255\u0256\u0007\u0006\u0000"+
+    "\u0000\u0256\u0257\u0007\u0003\u0000\u0000\u0257\u0258\u0001\u0000\u0000"+
+    "\u0000\u0258\u0259\u0006\u000f\u0000\u0000\u02590\u0001\u0000\u0000\u0000"+
+    "\u025a\u025b\u0007\r\u0000\u0000\u025b\u025c\u0007\u0007\u0000\u0000\u025c"+
+    "\u025d\u0007\u0007\u0000\u0000\u025d\u025e\u0007\u0012\u0000\u0000\u025e"+
+    "\u025f\u0007\u0014\u0000\u0000\u025f\u0260\u0007\b\u0000\u0000\u0260\u0261"+
+    "\u0001\u0000\u0000\u0000\u0261\u0262\u0006\u0010\b\u0000\u02622\u0001"+
+    "\u0000\u0000\u0000\u0263\u0264\u0004\u0011\u0000\u0000\u0264\u0265\u0007"+
+    "\u0004\u0000\u0000\u0265\u0266\u0007\n\u0000\u0000\u0266\u0267\u0007\f"+
+    "\u0000\u0000\u0267\u0268\u0007\t\u0000\u0000\u0268\u0269\u0007\u0011\u0000"+
+    "\u0000\u0269\u026a\u0007\u0003\u0000\u0000\u026a\u026b\u0005_\u0000\u0000"+
+    "\u026b\u026c\u0007\b\u0000\u0000\u026c\u026d\u0007\u0007\u0000\u0000\u026d"+
+    "\u026e\u0007\u0001\u0000\u0000\u026e\u026f\u0007\t\u0000\u0000\u026f\u0270"+
+    "\u0007\u0005\u0000\u0000\u0270\u0271\u0001\u0000\u0000\u0000\u0271\u0272"+
+    "\u0006\u0011\t\u0000\u02724\u0001\u0000\u0000\u0000\u0273\u0274\u0004"+
+    "\u0012\u0001\u0000\u0274\u0275\u0007\u0001\u0000\u0000\u0275\u0276\u0007"+
+    "\t\u0000\u0000\u0276\u0277\u0007\r\u0000\u0000\u0277\u0278\u0007\u0001"+
+    "\u0000\u0000\u0278\u0279\u0007\t\u0000\u0000\u0279\u027a\u0007\u0003\u0000"+
+    "\u0000\u027a\u027b\u0007\u0002\u0000\u0000\u027b\u027c\u0007\u0005\u0000"+
+    "\u0000\u027c\u027d\u0007\f\u0000\u0000\u027d\u027e\u0007\u0005\u0000\u0000"+
+    "\u027e\u027f\u0007\u0002\u0000\u0000\u027f\u0280\u0001\u0000\u0000\u0000"+
+    "\u0280\u0281\u0006\u0012\u0000\u0000\u02816\u0001\u0000\u0000\u0000\u0282"+
+    "\u0283\u0004\u0013\u0002\u0000\u0283\u0284\u0007\r\u0000\u0000\u0284\u0285"+
+    "\u0007\u0007\u0000\u0000\u0285\u0286\u0007\u0007\u0000\u0000\u0286\u0287"+
+    "\u0007\u0012\u0000\u0000\u0287\u0288\u0007\u0014\u0000\u0000\u0288\u0289"+
+    "\u0007\b\u0000\u0000\u0289\u028a\u0005_\u0000\u0000\u028a\u028b\u0005"+
+    "\u8001\uf414\u0000\u0000\u028b\u028c\u0001\u0000\u0000\u0000\u028c\u028d"+
+    "\u0006\u0013\n\u0000\u028d8\u0001\u0000\u0000\u0000\u028e\u028f\u0004"+
+    "\u0014\u0003\u0000\u028f\u0290\u0007\u0010\u0000\u0000\u0290\u0291\u0007"+
+    "\u0003\u0000\u0000\u0291\u0292\u0007\u0005\u0000\u0000\u0292\u0293\u0007"+
+    "\u0006\u0000\u0000\u0293\u0294\u0007\u0001\u0000\u0000\u0294\u0295\u0007"+
+    "\u0004\u0000\u0000\u0295\u0296\u0007\u0002\u0000\u0000\u0296\u0297\u0001"+
+    "\u0000\u0000\u0000\u0297\u0298\u0006\u0014\u000b\u0000\u0298:\u0001\u0000"+
+    "\u0000\u0000\u0299\u029a\u0004\u0015\u0004\u0000\u029a\u029b\u0007\u000f"+
+    "\u0000\u0000\u029b\u029c\u0007\u0014\u0000\u0000\u029c\u029d\u0007\r\u0000"+
+    "\u0000\u029d\u029e\u0007\r\u0000\u0000\u029e\u029f\u0001\u0000\u0000\u0000"+
+    "\u029f\u02a0\u0006\u0015\b\u0000\u02a0<\u0001\u0000\u0000\u0000\u02a1"+
+    "\u02a2\u0004\u0016\u0005\u0000\u02a2\u02a3\u0007\r\u0000\u0000\u02a3\u02a4"+
+    "\u0007\u0003\u0000\u0000\u02a4\u02a5\u0007\u000f\u0000\u0000\u02a5\u02a6"+
+    "\u0007\u0005\u0000\u0000\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u02a8"+
+    "\u0006\u0016\b\u0000\u02a8>\u0001\u0000\u0000\u0000\u02a9\u02aa\u0004"+
+    "\u0017\u0006\u0000\u02aa\u02ab\u0007\u0006\u0000\u0000\u02ab\u02ac\u0007"+
+    "\u0001\u0000\u0000\u02ac\u02ad\u0007\u0011\u0000\u0000\u02ad\u02ae\u0007"+
+    "\n\u0000\u0000\u02ae\u02af\u0007\u0005\u0000\u0000\u02af\u02b0\u0001\u0000"+
+    "\u0000\u0000\u02b0\u02b1\u0006\u0017\b\u0000\u02b1@\u0001\u0000\u0000"+
+    "\u0000\u02b2\u02b4\b\u0015\u0000\u0000\u02b3\u02b2\u0001\u0000\u0000\u0000"+
+    "\u02b4\u02b5\u0001\u0000\u0000\u0000\u02b5\u02b3\u0001\u0000\u0000\u0000"+
+    "\u02b5\u02b6\u0001\u0000\u0000\u0000\u02b6\u02b7\u0001\u0000\u0000\u0000"+
+    "\u02b7\u02b8\u0006\u0018\u0000\u0000\u02b8B\u0001\u0000\u0000\u0000\u02b9"+
+    "\u02ba\u0005/\u0000\u0000\u02ba\u02bb\u0005/\u0000\u0000\u02bb\u02bf\u0001"+
+    "\u0000\u0000\u0000\u02bc\u02be\b\u0016\u0000\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\u02c3\u0001\u0000"+
+    "\u0000\u0000\u02c1\u02bf\u0001\u0000\u0000\u0000\u02c2\u02c4\u0005\r\u0000"+
+    "\u0000\u02c3\u02c2\u0001\u0000\u0000\u0000\u02c3\u02c4\u0001\u0000\u0000"+
+    "\u0000\u02c4\u02c6\u0001\u0000\u0000\u0000\u02c5\u02c7\u0005\n\u0000\u0000"+
+    "\u02c6\u02c5\u0001\u0000\u0000\u0000\u02c6\u02c7\u0001\u0000\u0000\u0000"+
+    "\u02c7\u02c8\u0001\u0000\u0000\u0000\u02c8\u02c9\u0006\u0019\f\u0000\u02c9"+
+    "D\u0001\u0000\u0000\u0000\u02ca\u02cb\u0005/\u0000\u0000\u02cb\u02cc\u0005"+
+    "*\u0000\u0000\u02cc\u02d1\u0001\u0000\u0000\u0000\u02cd\u02d0\u0003E\u001a"+
+    "\u0000\u02ce\u02d0\t\u0000\u0000\u0000\u02cf\u02cd\u0001\u0000\u0000\u0000"+
+    "\u02cf\u02ce\u0001\u0000\u0000\u0000\u02d0\u02d3\u0001\u0000\u0000\u0000"+
+    "\u02d1\u02d2\u0001\u0000\u0000\u0000\u02d1\u02cf\u0001\u0000\u0000\u0000"+
+    "\u02d2\u02d4\u0001\u0000\u0000\u0000\u02d3\u02d1\u0001\u0000\u0000\u0000"+
+    "\u02d4\u02d5\u0005*\u0000\u0000\u02d5\u02d6\u0005/\u0000\u0000\u02d6\u02d7"+
+    "\u0001\u0000\u0000\u0000\u02d7\u02d8\u0006\u001a\f\u0000\u02d8F\u0001"+
+    "\u0000\u0000\u0000\u02d9\u02db\u0007\u0017\u0000\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\u0006\u001b\f\u0000\u02dfH\u0001\u0000"+
+    "\u0000\u0000\u02e0\u02e1\u0005|\u0000\u0000\u02e1\u02e2\u0001\u0000\u0000"+
+    "\u0000\u02e2\u02e3\u0006\u001c\r\u0000\u02e3J\u0001\u0000\u0000\u0000"+
+    "\u02e4\u02e5\u0007\u0018\u0000\u0000\u02e5L\u0001\u0000\u0000\u0000\u02e6"+
+    "\u02e7\u0007\u0019\u0000\u0000\u02e7N\u0001\u0000\u0000\u0000\u02e8\u02e9"+
+    "\u0005\\\u0000\u0000\u02e9\u02ea\u0007\u001a\u0000\u0000\u02eaP\u0001"+
+    "\u0000\u0000\u0000\u02eb\u02ec\b\u001b\u0000\u0000\u02ecR\u0001\u0000"+
+    "\u0000\u0000\u02ed\u02ef\u0007\u0003\u0000\u0000\u02ee\u02f0\u0007\u001c"+
+    "\u0000\u0000\u02ef\u02ee\u0001\u0000\u0000\u0000\u02ef\u02f0\u0001\u0000"+
+    "\u0000\u0000\u02f0\u02f2\u0001\u0000\u0000\u0000\u02f1\u02f3\u0003K\u001d"+
+    "\u0000\u02f2\u02f1\u0001\u0000\u0000\u0000\u02f3\u02f4\u0001\u0000\u0000"+
+    "\u0000\u02f4\u02f2\u0001\u0000\u0000\u0000\u02f4\u02f5\u0001\u0000\u0000"+
+    "\u0000\u02f5T\u0001\u0000\u0000\u0000\u02f6\u02f7\u0005@\u0000\u0000\u02f7"+
+    "V\u0001\u0000\u0000\u0000\u02f8\u02f9\u0005`\u0000\u0000\u02f9X\u0001"+
+    "\u0000\u0000\u0000\u02fa\u02fe\b\u001d\u0000\u0000\u02fb\u02fc\u0005`"+
+    "\u0000\u0000\u02fc\u02fe\u0005`\u0000\u0000\u02fd\u02fa\u0001\u0000\u0000"+
+    "\u0000\u02fd\u02fb\u0001\u0000\u0000\u0000\u02feZ\u0001\u0000\u0000\u0000"+
+    "\u02ff\u0300\u0005_\u0000\u0000\u0300\\\u0001\u0000\u0000\u0000\u0301"+
+    "\u0305\u0003M\u001e\u0000\u0302\u0305\u0003K\u001d\u0000\u0303\u0305\u0003"+
+    "[%\u0000\u0304\u0301\u0001\u0000\u0000\u0000\u0304\u0302\u0001\u0000\u0000"+
+    "\u0000\u0304\u0303\u0001\u0000\u0000\u0000\u0305^\u0001\u0000\u0000\u0000"+
+    "\u0306\u030b\u0005\"\u0000\u0000\u0307\u030a\u0003O\u001f\u0000\u0308"+
+    "\u030a\u0003Q \u0000\u0309\u0307\u0001\u0000\u0000\u0000\u0309\u0308\u0001"+
+    "\u0000\u0000\u0000\u030a\u030d\u0001\u0000\u0000\u0000\u030b\u0309\u0001"+
+    "\u0000\u0000\u0000\u030b\u030c\u0001\u0000\u0000\u0000\u030c\u030e\u0001"+
+    "\u0000\u0000\u0000\u030d\u030b\u0001\u0000\u0000\u0000\u030e\u0324\u0005"+
+    "\"\u0000\u0000\u030f\u0310\u0005\"\u0000\u0000\u0310\u0311\u0005\"\u0000"+
+    "\u0000\u0311\u0312\u0005\"\u0000\u0000\u0312\u0316\u0001\u0000\u0000\u0000"+
+    "\u0313\u0315\b\u0016\u0000\u0000\u0314\u0313\u0001\u0000\u0000\u0000\u0315"+
+    "\u0318\u0001\u0000\u0000\u0000\u0316\u0317\u0001\u0000\u0000\u0000\u0316"+
+    "\u0314\u0001\u0000\u0000\u0000\u0317\u0319\u0001\u0000\u0000\u0000\u0318"+
+    "\u0316\u0001\u0000\u0000\u0000\u0319\u031a\u0005\"\u0000\u0000\u031a\u031b"+
+    "\u0005\"\u0000\u0000\u031b\u031c\u0005\"\u0000\u0000\u031c\u031e\u0001"+
+    "\u0000\u0000\u0000\u031d\u031f\u0005\"\u0000\u0000\u031e\u031d\u0001\u0000"+
+    "\u0000\u0000\u031e\u031f\u0001\u0000\u0000\u0000\u031f\u0321\u0001\u0000"+
+    "\u0000\u0000\u0320\u0322\u0005\"\u0000\u0000\u0321\u0320\u0001\u0000\u0000"+
+    "\u0000\u0321\u0322\u0001\u0000\u0000\u0000\u0322\u0324\u0001\u0000\u0000"+
+    "\u0000\u0323\u0306\u0001\u0000\u0000\u0000\u0323\u030f\u0001\u0000\u0000"+
+    "\u0000\u0324`\u0001\u0000\u0000\u0000\u0325\u0327\u0003K\u001d\u0000\u0326"+
+    "\u0325\u0001\u0000\u0000\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0328"+
+    "\u0326\u0001\u0000\u0000\u0000\u0328\u0329\u0001\u0000\u0000\u0000\u0329"+
+    "b\u0001\u0000\u0000\u0000\u032a\u032c\u0003K\u001d\u0000\u032b\u032a\u0001"+
+    "\u0000\u0000\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032d\u032b\u0001"+
+    "\u0000\u0000\u0000\u032d\u032e\u0001\u0000\u0000\u0000\u032e\u032f\u0001"+
+    "\u0000\u0000\u0000\u032f\u0333\u0003u2\u0000\u0330\u0332\u0003K\u001d"+
+    "\u0000\u0331\u0330\u0001\u0000\u0000\u0000\u0332\u0335\u0001\u0000\u0000"+
+    "\u0000\u0333\u0331\u0001\u0000\u0000\u0000\u0333\u0334\u0001\u0000\u0000"+
+    "\u0000\u0334\u0355\u0001\u0000\u0000\u0000\u0335\u0333\u0001\u0000\u0000"+
+    "\u0000\u0336\u0338\u0003u2\u0000\u0337\u0339\u0003K\u001d\u0000\u0338"+
+    "\u0337\u0001\u0000\u0000\u0000\u0339\u033a\u0001\u0000\u0000\u0000\u033a"+
+    "\u0338\u0001\u0000\u0000\u0000\u033a\u033b\u0001\u0000\u0000\u0000\u033b"+
+    "\u0355\u0001\u0000\u0000\u0000\u033c\u033e\u0003K\u001d\u0000\u033d\u033c"+
+    "\u0001\u0000\u0000\u0000\u033e\u033f\u0001\u0000\u0000\u0000\u033f\u033d"+
+    "\u0001\u0000\u0000\u0000\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0348"+
+    "\u0001\u0000\u0000\u0000\u0341\u0345\u0003u2\u0000\u0342\u0344\u0003K"+
+    "\u001d\u0000\u0343\u0342\u0001\u0000\u0000\u0000\u0344\u0347\u0001\u0000"+
+    "\u0000\u0000\u0345\u0343\u0001\u0000\u0000\u0000\u0345\u0346\u0001\u0000"+
+    "\u0000\u0000\u0346\u0349\u0001\u0000\u0000\u0000\u0347\u0345\u0001\u0000"+
+    "\u0000\u0000\u0348\u0341\u0001\u0000\u0000\u0000\u0348\u0349\u0001\u0000"+
+    "\u0000\u0000\u0349\u034a\u0001\u0000\u0000\u0000\u034a\u034b\u0003S!\u0000"+
+    "\u034b\u0355\u0001\u0000\u0000\u0000\u034c\u034e\u0003u2\u0000\u034d\u034f"+
+    "\u0003K\u001d\u0000\u034e\u034d\u0001\u0000\u0000\u0000\u034f\u0350\u0001"+
+    "\u0000\u0000\u0000\u0350\u034e\u0001\u0000\u0000\u0000\u0350\u0351\u0001"+
+    "\u0000\u0000\u0000\u0351\u0352\u0001\u0000\u0000\u0000\u0352\u0353\u0003"+
+    "S!\u0000\u0353\u0355\u0001\u0000\u0000\u0000\u0354\u032b\u0001\u0000\u0000"+
+    "\u0000\u0354\u0336\u0001\u0000\u0000\u0000\u0354\u033d\u0001\u0000\u0000"+
+    "\u0000\u0354\u034c\u0001\u0000\u0000\u0000\u0355d\u0001\u0000\u0000\u0000"+
+    "\u0356\u0357\u0007\u001e\u0000\u0000\u0357\u0358\u0007\u001f\u0000\u0000"+
+    "\u0358f\u0001\u0000\u0000\u0000\u0359\u035a\u0007\f\u0000\u0000\u035a"+
+    "\u035b\u0007\t\u0000\u0000\u035b\u035c\u0007\u0000\u0000\u0000\u035ch"+
+    "\u0001\u0000\u0000\u0000\u035d\u035e\u0007\f\u0000\u0000\u035e\u035f\u0007"+
+    "\u0002\u0000\u0000\u035f\u0360\u0007\u0004\u0000\u0000\u0360j\u0001\u0000"+
+    "\u0000\u0000\u0361\u0362\u0005=\u0000\u0000\u0362l\u0001\u0000\u0000\u0000"+
+    "\u0363\u0364\u0005:\u0000\u0000\u0364\u0365\u0005:\u0000\u0000\u0365n"+
+    "\u0001\u0000\u0000\u0000\u0366\u0367\u0005:\u0000\u0000\u0367p\u0001\u0000"+
+    "\u0000\u0000\u0368\u0369\u0005,\u0000\u0000\u0369r\u0001\u0000\u0000\u0000"+
+    "\u036a\u036b\u0007\u0000\u0000\u0000\u036b\u036c\u0007\u0003\u0000\u0000"+
+    "\u036c\u036d\u0007\u0002\u0000\u0000\u036d\u036e\u0007\u0004\u0000\u0000"+
+    "\u036et\u0001\u0000\u0000\u0000\u036f\u0370\u0005.\u0000\u0000\u0370v"+
+    "\u0001\u0000\u0000\u0000\u0371\u0372\u0007\u000f\u0000\u0000\u0372\u0373"+
+    "\u0007\f\u0000\u0000\u0373\u0374\u0007\r\u0000\u0000\u0374\u0375\u0007"+
+    "\u0002\u0000\u0000\u0375\u0376\u0007\u0003\u0000\u0000\u0376x\u0001\u0000"+
+    "\u0000\u0000\u0377\u0378\u0007\u000f\u0000\u0000\u0378\u0379\u0007\u0001"+
+    "\u0000\u0000\u0379\u037a\u0007\u0006\u0000\u0000\u037a\u037b\u0007\u0002"+
+    "\u0000\u0000\u037b\u037c\u0007\u0005\u0000\u0000\u037cz\u0001\u0000\u0000"+
+    "\u0000\u037d\u037e\u0007\u0001\u0000\u0000\u037e\u037f\u0007\t\u0000\u0000"+
+    "\u037f|\u0001\u0000\u0000\u0000\u0380\u0381\u0007\u0001\u0000\u0000\u0381"+
+    "\u0382\u0007\u0002\u0000\u0000\u0382~\u0001\u0000\u0000\u0000\u0383\u0384"+
+    "\u0007\r\u0000\u0000\u0384\u0385\u0007\f\u0000\u0000\u0385\u0386\u0007"+
+    "\u0002\u0000\u0000\u0386\u0387\u0007\u0005\u0000\u0000\u0387\u0080\u0001"+
+    "\u0000\u0000\u0000\u0388\u0389\u0007\r\u0000\u0000\u0389\u038a\u0007\u0001"+
+    "\u0000\u0000\u038a\u038b\u0007\u0012\u0000\u0000\u038b\u038c\u0007\u0003"+
+    "\u0000\u0000\u038c\u0082\u0001\u0000\u0000\u0000\u038d\u038e\u0005(\u0000"+
+    "\u0000\u038e\u0084\u0001\u0000\u0000\u0000\u038f\u0390\u0007\t\u0000\u0000"+
+    "\u0390\u0391\u0007\u0007\u0000\u0000\u0391\u0392\u0007\u0005\u0000\u0000"+
+    "\u0392\u0086\u0001\u0000\u0000\u0000\u0393\u0394\u0007\t\u0000\u0000\u0394"+
+    "\u0395\u0007\u0014\u0000\u0000\u0395\u0396\u0007\r\u0000\u0000\u0396\u0397"+
+    "\u0007\r\u0000\u0000\u0397\u0088\u0001\u0000\u0000\u0000\u0398\u0399\u0007"+
+    "\t\u0000\u0000\u0399\u039a\u0007\u0014\u0000\u0000\u039a\u039b\u0007\r"+
+    "\u0000\u0000\u039b\u039c\u0007\r\u0000\u0000\u039c\u039d\u0007\u0002\u0000"+
+    "\u0000\u039d\u008a\u0001\u0000\u0000\u0000\u039e\u039f\u0007\u0007\u0000"+
+    "\u0000\u039f\u03a0\u0007\u0006\u0000\u0000\u03a0\u008c\u0001\u0000\u0000"+
+    "\u0000\u03a1\u03a2\u0005?\u0000\u0000\u03a2\u008e\u0001\u0000\u0000\u0000"+
+    "\u03a3\u03a4\u0007\u0006\u0000\u0000\u03a4\u03a5\u0007\r\u0000\u0000\u03a5"+
+    "\u03a6\u0007\u0001\u0000\u0000\u03a6\u03a7\u0007\u0012\u0000\u0000\u03a7"+
+    "\u03a8\u0007\u0003\u0000\u0000\u03a8\u0090\u0001\u0000\u0000\u0000\u03a9"+
+    "\u03aa\u0005)\u0000\u0000\u03aa\u0092\u0001\u0000\u0000\u0000\u03ab\u03ac"+
+    "\u0007\u0005\u0000\u0000\u03ac\u03ad\u0007\u0006\u0000\u0000\u03ad\u03ae"+
+    "\u0007\u0014\u0000\u0000\u03ae\u03af\u0007\u0003\u0000\u0000\u03af\u0094"+
+    "\u0001\u0000\u0000\u0000\u03b0\u03b1\u0005=\u0000\u0000\u03b1\u03b2\u0005"+
+    "=\u0000\u0000\u03b2\u0096\u0001\u0000\u0000\u0000\u03b3\u03b4\u0005=\u0000"+
+    "\u0000\u03b4\u03b5\u0005~\u0000\u0000\u03b5\u0098\u0001\u0000\u0000\u0000"+
+    "\u03b6\u03b7\u0005!\u0000\u0000\u03b7\u03b8\u0005=\u0000\u0000\u03b8\u009a"+
+    "\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005<\u0000\u0000\u03ba\u009c\u0001"+
+    "\u0000\u0000\u0000\u03bb\u03bc\u0005<\u0000\u0000\u03bc\u03bd\u0005=\u0000"+
+    "\u0000\u03bd\u009e\u0001\u0000\u0000\u0000\u03be\u03bf\u0005>\u0000\u0000"+
+    "\u03bf\u00a0\u0001\u0000\u0000\u0000\u03c0\u03c1\u0005>\u0000\u0000\u03c1"+
+    "\u03c2\u0005=\u0000\u0000\u03c2\u00a2\u0001\u0000\u0000\u0000\u03c3\u03c4"+
+    "\u0005+\u0000\u0000\u03c4\u00a4\u0001\u0000\u0000\u0000\u03c5\u03c6\u0005"+
+    "-\u0000\u0000\u03c6\u00a6\u0001\u0000\u0000\u0000\u03c7\u03c8\u0005*\u0000"+
+    "\u0000\u03c8\u00a8\u0001\u0000\u0000\u0000\u03c9\u03ca\u0005/\u0000\u0000"+
+    "\u03ca\u00aa\u0001\u0000\u0000\u0000\u03cb\u03cc\u0005%\u0000\u0000\u03cc"+
+    "\u00ac\u0001\u0000\u0000\u0000\u03cd\u03ce\u0005{\u0000\u0000\u03ce\u00ae"+
+    "\u0001\u0000\u0000\u0000\u03cf\u03d0\u0005}\u0000\u0000\u03d0\u00b0\u0001"+
+    "\u0000\u0000\u0000\u03d1\u03d2\u0003/\u000f\u0000\u03d2\u03d3\u0001\u0000"+
+    "\u0000\u0000\u03d3\u03d4\u0006P\u000e\u0000\u03d4\u00b2\u0001\u0000\u0000"+
+    "\u0000\u03d5\u03d8\u0003\u008d>\u0000\u03d6\u03d9\u0003M\u001e\u0000\u03d7"+
+    "\u03d9\u0003[%\u0000\u03d8\u03d6\u0001\u0000\u0000\u0000\u03d8\u03d7\u0001"+
+    "\u0000\u0000\u0000\u03d9\u03dd\u0001\u0000\u0000\u0000\u03da\u03dc\u0003"+
+    "]&\u0000\u03db\u03da\u0001\u0000\u0000\u0000\u03dc\u03df\u0001\u0000\u0000"+
+    "\u0000\u03dd\u03db\u0001\u0000\u0000\u0000\u03dd\u03de\u0001\u0000\u0000"+
+    "\u0000\u03de\u03e7\u0001\u0000\u0000\u0000\u03df\u03dd\u0001\u0000\u0000"+
+    "\u0000\u03e0\u03e2\u0003\u008d>\u0000\u03e1\u03e3\u0003K\u001d\u0000\u03e2"+
+    "\u03e1\u0001\u0000\u0000\u0000\u03e3\u03e4\u0001\u0000\u0000\u0000\u03e4"+
+    "\u03e2\u0001\u0000\u0000\u0000\u03e4\u03e5\u0001\u0000\u0000\u0000\u03e5"+
+    "\u03e7\u0001\u0000\u0000\u0000\u03e6\u03d5\u0001\u0000\u0000\u0000\u03e6"+
+    "\u03e0\u0001\u0000\u0000\u0000\u03e7\u00b4\u0001\u0000\u0000\u0000\u03e8"+
+    "\u03e9\u0005[\u0000\u0000\u03e9\u03ea\u0001\u0000\u0000\u0000\u03ea\u03eb"+
+    "\u0006R\u0000\u0000\u03eb\u03ec\u0006R\u0000\u0000\u03ec\u00b6\u0001\u0000"+
+    "\u0000\u0000\u03ed\u03ee\u0005]\u0000\u0000\u03ee\u03ef\u0001\u0000\u0000"+
+    "\u0000\u03ef\u03f0\u0006S\r\u0000\u03f0\u03f1\u0006S\r\u0000\u03f1\u00b8"+
+    "\u0001\u0000\u0000\u0000\u03f2\u03f6\u0003M\u001e\u0000\u03f3\u03f5\u0003"+
+    "]&\u0000\u03f4\u03f3\u0001\u0000\u0000\u0000\u03f5\u03f8\u0001\u0000\u0000"+
+    "\u0000\u03f6\u03f4\u0001\u0000\u0000\u0000\u03f6\u03f7\u0001\u0000\u0000"+
+    "\u0000\u03f7\u0403\u0001\u0000\u0000\u0000\u03f8\u03f6\u0001\u0000\u0000"+
+    "\u0000\u03f9\u03fc\u0003[%\u0000\u03fa\u03fc\u0003U\"\u0000\u03fb\u03f9"+
+    "\u0001\u0000\u0000\u0000\u03fb\u03fa\u0001\u0000\u0000\u0000\u03fc\u03fe"+
+    "\u0001\u0000\u0000\u0000\u03fd\u03ff\u0003]&\u0000\u03fe\u03fd\u0001\u0000"+
+    "\u0000\u0000\u03ff\u0400\u0001\u0000\u0000\u0000\u0400\u03fe\u0001\u0000"+
+    "\u0000\u0000\u0400\u0401\u0001\u0000\u0000\u0000\u0401\u0403\u0001\u0000"+
+    "\u0000\u0000\u0402\u03f2\u0001\u0000\u0000\u0000\u0402\u03fb\u0001\u0000"+
+    "\u0000\u0000\u0403\u00ba\u0001\u0000\u0000\u0000\u0404\u0406\u0003W#\u0000"+
+    "\u0405\u0407\u0003Y$\u0000\u0406\u0405\u0001\u0000\u0000\u0000\u0407\u0408"+
+    "\u0001\u0000\u0000\u0000\u0408\u0406\u0001\u0000\u0000\u0000\u0408\u0409"+
+    "\u0001\u0000\u0000\u0000\u0409\u040a\u0001\u0000\u0000\u0000\u040a\u040b"+
+    "\u0003W#\u0000\u040b\u00bc\u0001\u0000\u0000\u0000\u040c\u040d\u0003\u00bb"+
+    "U\u0000\u040d\u00be\u0001\u0000\u0000\u0000\u040e\u040f\u0003C\u0019\u0000"+
+    "\u040f\u0410\u0001\u0000\u0000\u0000\u0410\u0411\u0006W\f\u0000\u0411"+
+    "\u00c0\u0001\u0000\u0000\u0000\u0412\u0413\u0003E\u001a\u0000\u0413\u0414"+
+    "\u0001\u0000\u0000\u0000\u0414\u0415\u0006X\f\u0000\u0415\u00c2\u0001"+
+    "\u0000\u0000\u0000\u0416\u0417\u0003G\u001b\u0000\u0417\u0418\u0001\u0000"+
+    "\u0000\u0000\u0418\u0419\u0006Y\f\u0000\u0419\u00c4\u0001\u0000\u0000"+
+    "\u0000\u041a\u041b\u0003\u00b5R\u0000\u041b\u041c\u0001\u0000\u0000\u0000"+
+    "\u041c\u041d\u0006Z\u000f\u0000\u041d\u041e\u0006Z\u0010\u0000\u041e\u00c6"+
+    "\u0001\u0000\u0000\u0000\u041f\u0420\u0003I\u001c\u0000\u0420\u0421\u0001"+
+    "\u0000\u0000\u0000\u0421\u0422\u0006[\u0011\u0000\u0422\u0423\u0006[\r"+
+    "\u0000\u0423\u00c8\u0001\u0000\u0000\u0000\u0424\u0425\u0003G\u001b\u0000"+
+    "\u0425\u0426\u0001\u0000\u0000\u0000\u0426\u0427\u0006\\\f\u0000\u0427"+
+    "\u00ca\u0001\u0000\u0000\u0000\u0428\u0429\u0003C\u0019\u0000\u0429\u042a"+
+    "\u0001\u0000\u0000\u0000\u042a\u042b\u0006]\f\u0000\u042b\u00cc\u0001"+
+    "\u0000\u0000\u0000\u042c\u042d\u0003E\u001a\u0000\u042d\u042e\u0001\u0000"+
+    "\u0000\u0000\u042e\u042f\u0006^\f\u0000\u042f\u00ce\u0001\u0000\u0000"+
+    "\u0000\u0430\u0431\u0003I\u001c\u0000\u0431\u0432\u0001\u0000\u0000\u0000"+
+    "\u0432\u0433\u0006_\u0011\u0000\u0433\u0434\u0006_\r\u0000\u0434\u00d0"+
+    "\u0001\u0000\u0000\u0000\u0435\u0436\u0003\u00b5R\u0000\u0436\u0437\u0001"+
+    "\u0000\u0000\u0000\u0437\u0438\u0006`\u000f\u0000\u0438\u00d2\u0001\u0000"+
+    "\u0000\u0000\u0439\u043a\u0003\u00b7S\u0000\u043a\u043b\u0001\u0000\u0000"+
+    "\u0000\u043b\u043c\u0006a\u0012\u0000\u043c\u00d4\u0001\u0000\u0000\u0000"+
+    "\u043d\u043e\u0003o/\u0000\u043e\u043f\u0001\u0000\u0000\u0000\u043f\u0440"+
+    "\u0006b\u0013\u0000\u0440\u00d6\u0001\u0000\u0000\u0000\u0441\u0442\u0003"+
+    "q0\u0000\u0442\u0443\u0001\u0000\u0000\u0000\u0443\u0444\u0006c\u0014"+
+    "\u0000\u0444\u00d8\u0001\u0000\u0000\u0000\u0445\u0446\u0003k-\u0000\u0446"+
+    "\u0447\u0001\u0000\u0000\u0000\u0447\u0448\u0006d\u0015\u0000\u0448\u00da"+
+    "\u0001\u0000\u0000\u0000\u0449\u044a\u0007\u0010\u0000\u0000\u044a\u044b"+
+    "\u0007\u0003\u0000\u0000\u044b\u044c\u0007\u0005\u0000\u0000\u044c\u044d"+
+    "\u0007\f\u0000\u0000\u044d\u044e\u0007\u0000\u0000\u0000\u044e\u044f\u0007"+
+    "\f\u0000\u0000\u044f\u0450\u0007\u0005\u0000\u0000\u0450\u0451\u0007\f"+
+    "\u0000\u0000\u0451\u00dc\u0001\u0000\u0000\u0000\u0452\u0456\b \u0000"+
+    "\u0000\u0453\u0454\u0005/\u0000\u0000\u0454\u0456\b!\u0000\u0000\u0455"+
+    "\u0452\u0001\u0000\u0000\u0000\u0455\u0453\u0001\u0000\u0000\u0000\u0456"+
+    "\u00de\u0001\u0000\u0000\u0000\u0457\u0459\u0003\u00ddf\u0000\u0458\u0457"+
+    "\u0001\u0000\u0000\u0000\u0459\u045a\u0001\u0000\u0000\u0000\u045a\u0458"+
+    "\u0001\u0000\u0000\u0000\u045a\u045b\u0001\u0000\u0000\u0000\u045b\u00e0"+
+    "\u0001\u0000\u0000\u0000\u045c\u045d\u0003\u00dfg\u0000\u045d\u045e\u0001"+
+    "\u0000\u0000\u0000\u045e\u045f\u0006h\u0016\u0000\u045f\u00e2\u0001\u0000"+
+    "\u0000\u0000\u0460\u0461\u0003_\'\u0000\u0461\u0462\u0001\u0000\u0000"+
+    "\u0000\u0462\u0463\u0006i\u0017\u0000\u0463\u00e4\u0001\u0000\u0000\u0000"+
+    "\u0464\u0465\u0003C\u0019\u0000\u0465\u0466\u0001\u0000\u0000\u0000\u0466"+
+    "\u0467\u0006j\f\u0000\u0467\u00e6\u0001\u0000\u0000\u0000\u0468\u0469"+
+    "\u0003E\u001a\u0000\u0469\u046a\u0001\u0000\u0000\u0000\u046a\u046b\u0006"+
+    "k\f\u0000\u046b\u00e8\u0001\u0000\u0000\u0000\u046c\u046d\u0003G\u001b"+
+    "\u0000\u046d\u046e\u0001\u0000\u0000\u0000\u046e\u046f\u0006l\f\u0000"+
+    "\u046f\u00ea\u0001\u0000\u0000\u0000\u0470\u0471\u0003I\u001c\u0000\u0471"+
+    "\u0472\u0001\u0000\u0000\u0000\u0472\u0473\u0006m\u0011\u0000\u0473\u0474"+
+    "\u0006m\r\u0000\u0474\u00ec\u0001\u0000\u0000\u0000\u0475\u0476\u0003"+
+    "u2\u0000\u0476\u0477\u0001\u0000\u0000\u0000\u0477\u0478\u0006n\u0018"+
+    "\u0000\u0478\u00ee\u0001\u0000\u0000\u0000\u0479\u047a\u0003q0\u0000\u047a"+
+    "\u047b\u0001\u0000\u0000\u0000\u047b\u047c\u0006o\u0014\u0000\u047c\u00f0"+
+    "\u0001\u0000\u0000\u0000\u047d\u047e\u0003\u008d>\u0000\u047e\u047f\u0001"+
+    "\u0000\u0000\u0000\u047f\u0480\u0006p\u0019\u0000\u0480\u00f2\u0001\u0000"+
+    "\u0000\u0000\u0481\u0482\u0003\u00b3Q\u0000\u0482\u0483\u0001\u0000\u0000"+
+    "\u0000\u0483\u0484\u0006q\u001a\u0000\u0484\u00f4\u0001\u0000\u0000\u0000"+
+    "\u0485\u048a\u0003M\u001e\u0000\u0486\u048a\u0003K\u001d\u0000\u0487\u048a"+
+    "\u0003[%\u0000\u0488\u048a\u0003\u00a7K\u0000\u0489\u0485\u0001\u0000"+
+    "\u0000\u0000\u0489\u0486\u0001\u0000\u0000\u0000\u0489\u0487\u0001\u0000"+
+    "\u0000\u0000\u0489\u0488\u0001\u0000\u0000\u0000\u048a\u00f6\u0001\u0000"+
+    "\u0000\u0000\u048b\u048e\u0003M\u001e\u0000\u048c\u048e\u0003\u00a7K\u0000"+
+    "\u048d\u048b\u0001\u0000\u0000\u0000\u048d\u048c\u0001\u0000\u0000\u0000"+
+    "\u048e\u0492\u0001\u0000\u0000\u0000\u048f\u0491\u0003\u00f5r\u0000\u0490"+
+    "\u048f\u0001\u0000\u0000\u0000\u0491\u0494\u0001\u0000\u0000\u0000\u0492"+
+    "\u0490\u0001\u0000\u0000\u0000\u0492\u0493\u0001\u0000\u0000\u0000\u0493"+
+    "\u049f\u0001\u0000\u0000\u0000\u0494\u0492\u0001\u0000\u0000\u0000\u0495"+
+    "\u0498\u0003[%\u0000\u0496\u0498\u0003U\"\u0000\u0497\u0495\u0001\u0000"+
+    "\u0000\u0000\u0497\u0496\u0001\u0000\u0000\u0000\u0498\u049a\u0001\u0000"+
+    "\u0000\u0000\u0499\u049b\u0003\u00f5r\u0000\u049a\u0499\u0001\u0000\u0000"+
+    "\u0000\u049b\u049c\u0001\u0000\u0000\u0000\u049c\u049a\u0001\u0000\u0000"+
+    "\u0000\u049c\u049d\u0001\u0000\u0000\u0000\u049d\u049f\u0001\u0000\u0000"+
+    "\u0000\u049e\u048d\u0001\u0000\u0000\u0000\u049e\u0497\u0001\u0000\u0000"+
+    "\u0000\u049f\u00f8\u0001\u0000\u0000\u0000\u04a0\u04a3\u0003\u00f7s\u0000"+
+    "\u04a1\u04a3\u0003\u00bbU\u0000\u04a2\u04a0\u0001\u0000\u0000\u0000\u04a2"+
+    "\u04a1\u0001\u0000\u0000\u0000\u04a3\u04a4\u0001\u0000\u0000\u0000\u04a4"+
+    "\u04a2\u0001\u0000\u0000\u0000\u04a4\u04a5\u0001\u0000\u0000\u0000\u04a5"+
+    "\u00fa\u0001\u0000\u0000\u0000\u04a6\u04a7\u0003C\u0019\u0000\u04a7\u04a8"+
+    "\u0001\u0000\u0000\u0000\u04a8\u04a9\u0006u\f\u0000\u04a9\u00fc\u0001"+
+    "\u0000\u0000\u0000\u04aa\u04ab\u0003E\u001a\u0000\u04ab\u04ac\u0001\u0000"+
+    "\u0000\u0000\u04ac\u04ad\u0006v\f\u0000\u04ad\u00fe\u0001\u0000\u0000"+
+    "\u0000\u04ae\u04af\u0003G\u001b\u0000\u04af\u04b0\u0001\u0000\u0000\u0000"+
+    "\u04b0\u04b1\u0006w\f\u0000\u04b1\u0100\u0001\u0000\u0000\u0000\u04b2"+
+    "\u04b3\u0003I\u001c\u0000\u04b3\u04b4\u0001\u0000\u0000\u0000\u04b4\u04b5"+
+    "\u0006x\u0011\u0000\u04b5\u04b6\u0006x\r\u0000\u04b6\u0102\u0001\u0000"+
+    "\u0000\u0000\u04b7\u04b8\u0003k-\u0000\u04b8\u04b9\u0001\u0000\u0000\u0000"+
+    "\u04b9\u04ba\u0006y\u0015\u0000\u04ba\u0104\u0001\u0000\u0000\u0000\u04bb"+
+    "\u04bc\u0003q0\u0000\u04bc\u04bd\u0001\u0000\u0000\u0000\u04bd\u04be\u0006"+
+    "z\u0014\u0000\u04be\u0106\u0001\u0000\u0000\u0000\u04bf\u04c0\u0003u2"+
+    "\u0000\u04c0\u04c1\u0001\u0000\u0000\u0000\u04c1\u04c2\u0006{\u0018\u0000"+
+    "\u04c2\u0108\u0001\u0000\u0000\u0000\u04c3\u04c4\u0003\u008d>\u0000\u04c4"+
+    "\u04c5\u0001\u0000\u0000\u0000\u04c5\u04c6\u0006|\u0019\u0000\u04c6\u010a"+
+    "\u0001\u0000\u0000\u0000\u04c7\u04c8\u0003\u00b3Q\u0000\u04c8\u04c9\u0001"+
+    "\u0000\u0000\u0000\u04c9\u04ca\u0006}\u001a\u0000\u04ca\u010c\u0001\u0000"+
+    "\u0000\u0000\u04cb\u04cc\u0007\f\u0000\u0000\u04cc\u04cd\u0007\u0002\u0000"+
+    "\u0000\u04cd\u010e\u0001\u0000\u0000\u0000\u04ce\u04cf\u0003\u00f9t\u0000"+
+    "\u04cf\u04d0\u0001\u0000\u0000\u0000\u04d0\u04d1\u0006\u007f\u001b\u0000"+
+    "\u04d1\u0110\u0001\u0000\u0000\u0000\u04d2\u04d3\u0003C\u0019\u0000\u04d3"+
+    "\u04d4\u0001\u0000\u0000\u0000\u04d4\u04d5\u0006\u0080\f\u0000\u04d5\u0112"+
+    "\u0001\u0000\u0000\u0000\u04d6\u04d7\u0003E\u001a\u0000\u04d7\u04d8\u0001"+
+    "\u0000\u0000\u0000\u04d8\u04d9\u0006\u0081\f\u0000\u04d9\u0114\u0001\u0000"+
+    "\u0000\u0000\u04da\u04db\u0003G\u001b\u0000\u04db\u04dc\u0001\u0000\u0000"+
+    "\u0000\u04dc\u04dd\u0006\u0082\f\u0000\u04dd\u0116\u0001\u0000\u0000\u0000"+
+    "\u04de\u04df\u0003I\u001c\u0000\u04df\u04e0\u0001\u0000\u0000\u0000\u04e0"+
+    "\u04e1\u0006\u0083\u0011\u0000\u04e1\u04e2\u0006\u0083\r\u0000\u04e2\u0118"+
+    "\u0001\u0000\u0000\u0000\u04e3\u04e4\u0003\u00b5R\u0000\u04e4\u04e5\u0001"+
+    "\u0000\u0000\u0000\u04e5\u04e6\u0006\u0084\u000f\u0000\u04e6\u04e7\u0006"+
+    "\u0084\u001c\u0000\u04e7\u011a\u0001\u0000\u0000\u0000\u04e8\u04e9\u0007"+
+    "\u0007\u0000\u0000\u04e9\u04ea\u0007\t\u0000\u0000\u04ea\u04eb\u0001\u0000"+
+    "\u0000\u0000\u04eb\u04ec\u0006\u0085\u001d\u0000\u04ec\u011c\u0001\u0000"+
+    "\u0000\u0000\u04ed\u04ee\u0007\u0013\u0000\u0000\u04ee\u04ef\u0007\u0001"+
+    "\u0000\u0000\u04ef\u04f0\u0007\u0005\u0000\u0000\u04f0\u04f1\u0007\n\u0000"+
+    "\u0000\u04f1\u04f2\u0001\u0000\u0000\u0000\u04f2\u04f3\u0006\u0086\u001d"+
+    "\u0000\u04f3\u011e\u0001\u0000\u0000\u0000\u04f4\u04f5\b\"\u0000\u0000"+
+    "\u04f5\u0120\u0001\u0000\u0000\u0000\u04f6\u04f8\u0003\u011f\u0087\u0000"+
+    "\u04f7\u04f6\u0001\u0000\u0000\u0000\u04f8\u04f9\u0001\u0000\u0000\u0000"+
+    "\u04f9\u04f7\u0001\u0000\u0000\u0000\u04f9\u04fa\u0001\u0000\u0000\u0000"+
+    "\u04fa\u04fb\u0001\u0000\u0000\u0000\u04fb\u04fc\u0003o/\u0000\u04fc\u04fe"+
+    "\u0001\u0000\u0000\u0000\u04fd\u04f7\u0001\u0000\u0000\u0000\u04fd\u04fe"+
+    "\u0001\u0000\u0000\u0000\u04fe\u0500\u0001\u0000\u0000\u0000\u04ff\u0501"+
+    "\u0003\u011f\u0087\u0000\u0500\u04ff\u0001\u0000\u0000\u0000\u0501\u0502"+
+    "\u0001\u0000\u0000\u0000\u0502\u0500\u0001\u0000\u0000\u0000\u0502\u0503"+
+    "\u0001\u0000\u0000\u0000\u0503\u0122\u0001\u0000\u0000\u0000\u0504\u0505"+
+    "\u0003\u0121\u0088\u0000\u0505\u0506\u0001\u0000\u0000\u0000\u0506\u0507"+
+    "\u0006\u0089\u001e\u0000\u0507\u0124\u0001\u0000\u0000\u0000\u0508\u0509"+
+    "\u0003C\u0019\u0000\u0509\u050a\u0001\u0000\u0000\u0000\u050a\u050b\u0006"+
+    "\u008a\f\u0000\u050b\u0126\u0001\u0000\u0000\u0000\u050c\u050d\u0003E"+
+    "\u001a\u0000\u050d\u050e\u0001\u0000\u0000\u0000\u050e\u050f\u0006\u008b"+
+    "\f\u0000\u050f\u0128\u0001\u0000\u0000\u0000\u0510\u0511\u0003G\u001b"+
+    "\u0000\u0511\u0512\u0001\u0000\u0000\u0000\u0512\u0513\u0006\u008c\f\u0000"+
+    "\u0513\u012a\u0001\u0000\u0000\u0000\u0514\u0515\u0003I\u001c\u0000\u0515"+
+    "\u0516\u0001\u0000\u0000\u0000\u0516\u0517\u0006\u008d\u0011\u0000\u0517"+
+    "\u0518\u0006\u008d\r\u0000\u0518\u0519\u0006\u008d\r\u0000\u0519\u012c"+
+    "\u0001\u0000\u0000\u0000\u051a\u051b\u0003k-\u0000\u051b\u051c\u0001\u0000"+
+    "\u0000\u0000\u051c\u051d\u0006\u008e\u0015\u0000\u051d\u012e\u0001\u0000"+
+    "\u0000\u0000\u051e\u051f\u0003q0\u0000\u051f\u0520\u0001\u0000\u0000\u0000"+
+    "\u0520\u0521\u0006\u008f\u0014\u0000\u0521\u0130\u0001\u0000\u0000\u0000"+
+    "\u0522\u0523\u0003u2\u0000\u0523\u0524\u0001\u0000\u0000\u0000\u0524\u0525"+
+    "\u0006\u0090\u0018\u0000\u0525\u0132\u0001\u0000\u0000\u0000\u0526\u0527"+
+    "\u0003\u011d\u0086\u0000\u0527\u0528\u0001\u0000\u0000\u0000\u0528\u0529"+
+    "\u0006\u0091\u001f\u0000\u0529\u0134\u0001\u0000\u0000\u0000\u052a\u052b"+
+    "\u0003\u00f9t\u0000\u052b\u052c\u0001\u0000\u0000\u0000\u052c\u052d\u0006"+
+    "\u0092\u001b\u0000\u052d\u0136\u0001\u0000\u0000\u0000\u052e\u052f\u0003"+
+    "\u00bdV\u0000\u052f\u0530\u0001\u0000\u0000\u0000\u0530\u0531\u0006\u0093"+
+    " \u0000\u0531\u0138\u0001\u0000\u0000\u0000\u0532\u0533\u0003\u008d>\u0000"+
+    "\u0533\u0534\u0001\u0000\u0000\u0000\u0534\u0535\u0006\u0094\u0019\u0000"+
+    "\u0535\u013a\u0001\u0000\u0000\u0000\u0536\u0537\u0003\u00b3Q\u0000\u0537"+
+    "\u0538\u0001\u0000\u0000\u0000\u0538\u0539\u0006\u0095\u001a\u0000\u0539"+
+    "\u013c\u0001\u0000\u0000\u0000\u053a\u053b\u0003C\u0019\u0000\u053b\u053c"+
+    "\u0001\u0000\u0000\u0000\u053c\u053d\u0006\u0096\f\u0000\u053d\u013e\u0001"+
+    "\u0000\u0000\u0000\u053e\u053f\u0003E\u001a\u0000\u053f\u0540\u0001\u0000"+
+    "\u0000\u0000\u0540\u0541\u0006\u0097\f\u0000\u0541\u0140\u0001\u0000\u0000"+
+    "\u0000\u0542\u0543\u0003G\u001b\u0000\u0543\u0544\u0001\u0000\u0000\u0000"+
+    "\u0544\u0545\u0006\u0098\f\u0000\u0545\u0142\u0001\u0000\u0000\u0000\u0546"+
+    "\u0547\u0003I\u001c\u0000\u0547\u0548\u0001\u0000\u0000\u0000\u0548\u0549"+
+    "\u0006\u0099\u0011\u0000\u0549\u054a\u0006\u0099\r\u0000\u054a\u0144\u0001"+
+    "\u0000\u0000\u0000\u054b\u054c\u0003u2\u0000\u054c\u054d\u0001\u0000\u0000"+
+    "\u0000\u054d\u054e\u0006\u009a\u0018\u0000\u054e\u0146\u0001\u0000\u0000"+
+    "\u0000\u054f\u0550\u0003\u008d>\u0000\u0550\u0551\u0001\u0000\u0000\u0000"+
+    "\u0551\u0552\u0006\u009b\u0019\u0000\u0552\u0148\u0001\u0000\u0000\u0000"+
+    "\u0553\u0554\u0003\u00b3Q\u0000\u0554\u0555\u0001\u0000\u0000\u0000\u0555"+
+    "\u0556\u0006\u009c\u001a\u0000\u0556\u014a\u0001\u0000\u0000\u0000\u0557"+
+    "\u0558\u0003\u00bdV\u0000\u0558\u0559\u0001\u0000\u0000\u0000\u0559\u055a"+
+    "\u0006\u009d \u0000\u055a\u014c\u0001\u0000\u0000\u0000\u055b\u055c\u0003"+
+    "\u00b9T\u0000\u055c\u055d\u0001\u0000\u0000\u0000\u055d\u055e\u0006\u009e"+
+    "!\u0000\u055e\u014e\u0001\u0000\u0000\u0000\u055f\u0560\u0003C\u0019\u0000"+
+    "\u0560\u0561\u0001\u0000\u0000\u0000\u0561\u0562\u0006\u009f\f\u0000\u0562"+
+    "\u0150\u0001\u0000\u0000\u0000\u0563\u0564\u0003E\u001a\u0000\u0564\u0565"+
+    "\u0001\u0000\u0000\u0000\u0565\u0566\u0006\u00a0\f\u0000\u0566\u0152\u0001"+
+    "\u0000\u0000\u0000\u0567\u0568\u0003G\u001b\u0000\u0568\u0569\u0001\u0000"+
+    "\u0000\u0000\u0569\u056a\u0006\u00a1\f\u0000\u056a\u0154\u0001\u0000\u0000"+
+    "\u0000\u056b\u056c\u0003I\u001c\u0000\u056c\u056d\u0001\u0000\u0000\u0000"+
+    "\u056d\u056e\u0006\u00a2\u0011\u0000\u056e\u056f\u0006\u00a2\r\u0000\u056f"+
+    "\u0156\u0001\u0000\u0000\u0000\u0570\u0571\u0007\u0001\u0000\u0000\u0571"+
+    "\u0572\u0007\t\u0000\u0000\u0572\u0573\u0007\u000f\u0000\u0000\u0573\u0574"+
+    "\u0007\u0007\u0000\u0000\u0574\u0158\u0001\u0000\u0000\u0000\u0575\u0576"+
+    "\u0003C\u0019\u0000\u0576\u0577\u0001\u0000\u0000\u0000\u0577\u0578\u0006"+
+    "\u00a4\f\u0000\u0578\u015a\u0001\u0000\u0000\u0000\u0579\u057a\u0003E"+
+    "\u001a\u0000\u057a\u057b\u0001\u0000\u0000\u0000\u057b\u057c\u0006\u00a5"+
+    "\f\u0000\u057c\u015c\u0001\u0000\u0000\u0000\u057d\u057e\u0003G\u001b"+
+    "\u0000\u057e\u057f\u0001\u0000\u0000\u0000\u057f\u0580\u0006\u00a6\f\u0000"+
+    "\u0580\u015e\u0001\u0000\u0000\u0000\u0581\u0582\u0003\u00b7S\u0000\u0582"+
+    "\u0583\u0001\u0000\u0000\u0000\u0583\u0584\u0006\u00a7\u0012\u0000\u0584"+
+    "\u0585\u0006\u00a7\r\u0000\u0585\u0160\u0001\u0000\u0000\u0000\u0586\u0587"+
+    "\u0003o/\u0000\u0587\u0588\u0001\u0000\u0000\u0000\u0588\u0589\u0006\u00a8"+
+    "\u0013\u0000\u0589\u0162\u0001\u0000\u0000\u0000\u058a\u0590\u0003U\""+
+    "\u0000\u058b\u0590\u0003K\u001d\u0000\u058c\u0590\u0003u2\u0000\u058d"+
+    "\u0590\u0003M\u001e\u0000\u058e\u0590\u0003[%\u0000\u058f\u058a\u0001"+
+    "\u0000\u0000\u0000\u058f\u058b\u0001\u0000\u0000\u0000\u058f\u058c\u0001"+
+    "\u0000\u0000\u0000\u058f\u058d\u0001\u0000\u0000\u0000\u058f\u058e\u0001"+
+    "\u0000\u0000\u0000\u0590\u0591\u0001\u0000\u0000\u0000\u0591\u058f\u0001"+
+    "\u0000\u0000\u0000\u0591\u0592\u0001\u0000\u0000\u0000\u0592\u0164\u0001"+
+    "\u0000\u0000\u0000\u0593\u0594\u0003C\u0019\u0000\u0594\u0595\u0001\u0000"+
+    "\u0000\u0000\u0595\u0596\u0006\u00aa\f\u0000\u0596\u0166\u0001\u0000\u0000"+
+    "\u0000\u0597\u0598\u0003E\u001a\u0000\u0598\u0599\u0001\u0000\u0000\u0000"+
+    "\u0599\u059a\u0006\u00ab\f\u0000\u059a\u0168\u0001\u0000\u0000\u0000\u059b"+
+    "\u059c\u0003G\u001b\u0000\u059c\u059d\u0001\u0000\u0000\u0000\u059d\u059e"+
+    "\u0006\u00ac\f\u0000\u059e\u016a\u0001\u0000\u0000\u0000\u059f\u05a0\u0003"+
+    "I\u001c\u0000\u05a0\u05a1\u0001\u0000\u0000\u0000\u05a1\u05a2\u0006\u00ad"+
+    "\u0011\u0000\u05a2\u05a3\u0006\u00ad\r\u0000\u05a3\u016c\u0001\u0000\u0000"+
+    "\u0000\u05a4\u05a5\u0003o/\u0000\u05a5\u05a6\u0001\u0000\u0000\u0000\u05a6"+
+    "\u05a7\u0006\u00ae\u0013\u0000\u05a7\u016e\u0001\u0000\u0000\u0000\u05a8"+
+    "\u05a9\u0003q0\u0000\u05a9\u05aa\u0001\u0000\u0000\u0000\u05aa\u05ab\u0006"+
+    "\u00af\u0014\u0000\u05ab\u0170\u0001\u0000\u0000\u0000\u05ac\u05ad\u0003"+
+    "u2\u0000\u05ad\u05ae\u0001\u0000\u0000\u0000\u05ae\u05af\u0006\u00b0\u0018"+
+    "\u0000\u05af\u0172\u0001\u0000\u0000\u0000\u05b0\u05b1\u0003\u011b\u0085"+
+    "\u0000\u05b1\u05b2\u0001\u0000\u0000\u0000\u05b2\u05b3\u0006\u00b1\"\u0000"+
+    "\u05b3\u05b4\u0006\u00b1#\u0000\u05b4\u0174\u0001\u0000\u0000\u0000\u05b5"+
+    "\u05b6\u0003\u00dfg\u0000\u05b6\u05b7\u0001\u0000\u0000\u0000\u05b7\u05b8"+
+    "\u0006\u00b2\u0016\u0000\u05b8\u0176\u0001\u0000\u0000\u0000\u05b9\u05ba"+
+    "\u0003_\'\u0000\u05ba\u05bb\u0001\u0000\u0000\u0000\u05bb\u05bc\u0006"+
+    "\u00b3\u0017\u0000\u05bc\u0178\u0001\u0000\u0000\u0000\u05bd\u05be\u0003"+
+    "C\u0019\u0000\u05be\u05bf\u0001\u0000\u0000\u0000\u05bf\u05c0\u0006\u00b4"+
+    "\f\u0000\u05c0\u017a\u0001\u0000\u0000\u0000\u05c1\u05c2\u0003E\u001a"+
+    "\u0000\u05c2\u05c3\u0001\u0000\u0000\u0000\u05c3\u05c4\u0006\u00b5\f\u0000"+
+    "\u05c4\u017c\u0001\u0000\u0000\u0000\u05c5\u05c6\u0003G\u001b\u0000\u05c6"+
+    "\u05c7\u0001\u0000\u0000\u0000\u05c7\u05c8\u0006\u00b6\f\u0000\u05c8\u017e"+
+    "\u0001\u0000\u0000\u0000\u05c9\u05ca\u0003I\u001c\u0000\u05ca\u05cb\u0001"+
+    "\u0000\u0000\u0000\u05cb\u05cc\u0006\u00b7\u0011\u0000\u05cc\u05cd\u0006"+
+    "\u00b7\r\u0000\u05cd\u05ce\u0006\u00b7\r\u0000\u05ce\u0180\u0001\u0000"+
+    "\u0000\u0000\u05cf\u05d0\u0003q0\u0000\u05d0\u05d1\u0001\u0000\u0000\u0000"+
+    "\u05d1\u05d2\u0006\u00b8\u0014\u0000\u05d2\u0182\u0001\u0000\u0000\u0000"+
+    "\u05d3\u05d4\u0003u2\u0000\u05d4\u05d5\u0001\u0000\u0000\u0000\u05d5\u05d6"+
+    "\u0006\u00b9\u0018\u0000\u05d6\u0184\u0001\u0000\u0000\u0000\u05d7\u05d8"+
+    "\u0003\u00f9t\u0000\u05d8\u05d9\u0001\u0000\u0000\u0000\u05d9\u05da\u0006"+
+    "\u00ba\u001b\u0000\u05da\u0186\u0001\u0000\u0000\u0000\u05db\u05dc\u0003"+
+    "C\u0019\u0000\u05dc\u05dd\u0001\u0000\u0000\u0000\u05dd\u05de\u0006\u00bb"+
+    "\f\u0000\u05de\u0188\u0001\u0000\u0000\u0000\u05df\u05e0\u0003E\u001a"+
+    "\u0000\u05e0\u05e1\u0001\u0000\u0000\u0000\u05e1\u05e2\u0006\u00bc\f\u0000"+
+    "\u05e2\u018a\u0001\u0000\u0000\u0000\u05e3\u05e4\u0003G\u001b\u0000\u05e4"+
+    "\u05e5\u0001\u0000\u0000\u0000\u05e5\u05e6\u0006\u00bd\f\u0000\u05e6\u018c"+
+    "\u0001\u0000\u0000\u0000\u05e7\u05e8\u0003I\u001c\u0000\u05e8\u05e9\u0001"+
+    "\u0000\u0000\u0000\u05e9\u05ea\u0006\u00be\u0011\u0000\u05ea\u05eb\u0006"+
+    "\u00be\r\u0000\u05eb\u018e\u0001\u0000\u0000\u0000\u05ec\u05ed\u0007#"+
+    "\u0000\u0000\u05ed\u05ee\u0007\u0007\u0000\u0000\u05ee\u05ef\u0007\u0001"+
+    "\u0000\u0000\u05ef\u05f0\u0007\t\u0000\u0000\u05f0\u0190\u0001\u0000\u0000"+
+    "\u0000\u05f1\u05f2\u0003\u010d~\u0000\u05f2\u05f3\u0001\u0000\u0000\u0000"+
+    "\u05f3\u05f4\u0006\u00c0$\u0000\u05f4\u0192\u0001\u0000\u0000\u0000\u05f5"+
+    "\u05f6\u0003\u011b\u0085\u0000\u05f6\u05f7\u0001\u0000\u0000\u0000\u05f7"+
+    "\u05f8\u0006\u00c1\"\u0000\u05f8\u05f9\u0006\u00c1\r\u0000\u05f9\u05fa"+
+    "\u0006\u00c1\u0000\u0000\u05fa\u0194\u0001\u0000\u0000\u0000\u05fb\u05fc"+
+    "\u0007\u0014\u0000\u0000\u05fc\u05fd\u0007\u0002\u0000\u0000\u05fd\u05fe"+
+    "\u0007\u0001\u0000\u0000\u05fe\u05ff\u0007\t\u0000\u0000\u05ff\u0600\u0007"+
+    "\u0011\u0000\u0000\u0600\u0601\u0001\u0000\u0000\u0000\u0601\u0602\u0006"+
+    "\u00c2\r\u0000\u0602\u0603\u0006\u00c2\u0000\u0000\u0603\u0196\u0001\u0000"+
+    "\u0000\u0000\u0604\u0605\u0003\u00dfg\u0000\u0605\u0606\u0001\u0000\u0000"+
+    "\u0000\u0606\u0607\u0006\u00c3\u0016\u0000\u0607\u0198\u0001\u0000\u0000"+
+    "\u0000\u0608\u0609\u0003_\'\u0000\u0609\u060a\u0001\u0000\u0000\u0000"+
+    "\u060a\u060b\u0006\u00c4\u0017\u0000\u060b\u019a\u0001\u0000\u0000\u0000"+
+    "\u060c\u060d\u0003o/\u0000\u060d\u060e\u0001\u0000\u0000\u0000\u060e\u060f"+
+    "\u0006\u00c5\u0013\u0000\u060f\u019c\u0001\u0000\u0000\u0000\u0610\u0611"+
+    "\u0003\u00b9T\u0000\u0611\u0612\u0001\u0000\u0000\u0000\u0612\u0613\u0006"+
+    "\u00c6!\u0000\u0613\u019e\u0001\u0000\u0000\u0000\u0614\u0615\u0003\u00bd"+
+    "V\u0000\u0615\u0616\u0001\u0000\u0000\u0000\u0616\u0617\u0006\u00c7 \u0000"+
+    "\u0617\u01a0\u0001\u0000\u0000\u0000\u0618\u0619\u0003C\u0019\u0000\u0619"+
+    "\u061a\u0001\u0000\u0000\u0000\u061a\u061b\u0006\u00c8\f\u0000\u061b\u01a2"+
+    "\u0001\u0000\u0000\u0000\u061c\u061d\u0003E\u001a\u0000\u061d\u061e\u0001"+
+    "\u0000\u0000\u0000\u061e\u061f\u0006\u00c9\f\u0000\u061f\u01a4\u0001\u0000"+
+    "\u0000\u0000\u0620\u0621\u0003G\u001b\u0000\u0621\u0622\u0001\u0000\u0000"+
+    "\u0000\u0622\u0623\u0006\u00ca\f\u0000\u0623\u01a6\u0001\u0000\u0000\u0000"+
+    "\u0624\u0625\u0003I\u001c\u0000\u0625\u0626\u0001\u0000\u0000\u0000\u0626"+
+    "\u0627\u0006\u00cb\u0011\u0000\u0627\u0628\u0006\u00cb\r\u0000\u0628\u01a8"+
+    "\u0001\u0000\u0000\u0000\u0629\u062a\u0003\u00dfg\u0000\u062a\u062b\u0001"+
+    "\u0000\u0000\u0000\u062b\u062c\u0006\u00cc\u0016\u0000\u062c\u062d\u0006"+
+    "\u00cc\r\u0000\u062d\u062e\u0006\u00cc%\u0000\u062e\u01aa\u0001\u0000"+
+    "\u0000\u0000\u062f\u0630\u0003_\'\u0000\u0630\u0631\u0001\u0000\u0000"+
+    "\u0000\u0631\u0632\u0006\u00cd\u0017\u0000\u0632\u0633\u0006\u00cd\r\u0000"+
+    "\u0633\u0634\u0006\u00cd%\u0000\u0634\u01ac\u0001\u0000\u0000\u0000\u0635"+
+    "\u0636\u0003C\u0019\u0000\u0636\u0637\u0001\u0000\u0000\u0000\u0637\u0638"+
+    "\u0006\u00ce\f\u0000\u0638\u01ae\u0001\u0000\u0000\u0000\u0639\u063a\u0003"+
+    "E\u001a\u0000\u063a\u063b\u0001\u0000\u0000\u0000\u063b\u063c\u0006\u00cf"+
+    "\f\u0000\u063c\u01b0\u0001\u0000\u0000\u0000\u063d\u063e\u0003G\u001b"+
+    "\u0000\u063e\u063f\u0001\u0000\u0000\u0000\u063f\u0640\u0006\u00d0\f\u0000"+
+    "\u0640\u01b2\u0001\u0000\u0000\u0000\u0641\u0642\u0003o/\u0000\u0642\u0643"+
+    "\u0001\u0000\u0000\u0000\u0643\u0644\u0006\u00d1\u0013\u0000\u0644\u0645"+
+    "\u0006\u00d1\r\u0000\u0645\u0646\u0006\u00d1\u000b\u0000\u0646\u01b4\u0001"+
+    "\u0000\u0000\u0000\u0647\u0648\u0003q0\u0000\u0648\u0649\u0001\u0000\u0000"+
+    "\u0000\u0649\u064a\u0006\u00d2\u0014\u0000\u064a\u064b\u0006\u00d2\r\u0000"+
+    "\u064b\u064c\u0006\u00d2\u000b\u0000\u064c\u01b6\u0001\u0000\u0000\u0000"+
+    "\u064d\u064e\u0003C\u0019\u0000\u064e\u064f\u0001\u0000\u0000\u0000\u064f"+
+    "\u0650\u0006\u00d3\f\u0000\u0650\u01b8\u0001\u0000\u0000\u0000\u0651\u0652"+
+    "\u0003E\u001a\u0000\u0652\u0653\u0001\u0000\u0000\u0000\u0653\u0654\u0006"+
+    "\u00d4\f\u0000\u0654\u01ba\u0001\u0000\u0000\u0000\u0655\u0656\u0003G"+
+    "\u001b\u0000\u0656\u0657\u0001\u0000\u0000\u0000\u0657\u0658\u0006\u00d5"+
+    "\f\u0000\u0658\u01bc\u0001\u0000\u0000\u0000\u0659\u065a\u0003\u00bdV"+
+    "\u0000\u065a\u065b\u0001\u0000\u0000\u0000\u065b\u065c\u0006\u00d6\r\u0000"+
+    "\u065c\u065d\u0006\u00d6\u0000\u0000\u065d\u065e\u0006\u00d6 \u0000\u065e"+
+    "\u01be\u0001\u0000\u0000\u0000\u065f\u0660\u0003\u00b9T\u0000\u0660\u0661"+
+    "\u0001\u0000\u0000\u0000\u0661\u0662\u0006\u00d7\r\u0000\u0662\u0663\u0006"+
+    "\u00d7\u0000\u0000\u0663\u0664\u0006\u00d7!\u0000\u0664\u01c0\u0001\u0000"+
+    "\u0000\u0000\u0665\u0666\u0003e*\u0000\u0666\u0667\u0001\u0000\u0000\u0000"+
+    "\u0667\u0668\u0006\u00d8\r\u0000\u0668\u0669\u0006\u00d8\u0000\u0000\u0669"+
+    "\u066a\u0006\u00d8&\u0000\u066a\u01c2\u0001\u0000\u0000\u0000\u066b\u066c"+
+    "\u0003I\u001c\u0000\u066c\u066d\u0001\u0000\u0000\u0000\u066d\u066e\u0006"+
+    "\u00d9\u0011\u0000\u066e\u066f\u0006\u00d9\r\u0000\u066f\u01c4\u0001\u0000"+
+    "\u0000\u0000\u0670\u0671\u0003I\u001c\u0000\u0671\u0672\u0001\u0000\u0000"+
+    "\u0000\u0672\u0673\u0006\u00da\u0011\u0000\u0673\u0674\u0006\u00da\r\u0000"+
+    "\u0674\u01c6\u0001\u0000\u0000\u0000\u0675\u0676\u0003\u011b\u0085\u0000"+
+    "\u0676\u0677\u0001\u0000\u0000\u0000\u0677\u0678\u0006\u00db\"\u0000\u0678"+
+    "\u01c8\u0001\u0000\u0000\u0000\u0679\u067a\u0003\u010d~\u0000\u067a\u067b"+
+    "\u0001\u0000\u0000\u0000\u067b\u067c\u0006\u00dc$\u0000\u067c\u01ca\u0001"+
+    "\u0000\u0000\u0000\u067d\u067e\u0003u2\u0000\u067e\u067f\u0001\u0000\u0000"+
+    "\u0000\u067f\u0680\u0006\u00dd\u0018\u0000\u0680\u01cc\u0001\u0000\u0000"+
+    "\u0000\u0681\u0682\u0003q0\u0000\u0682\u0683\u0001\u0000\u0000\u0000\u0683"+
+    "\u0684\u0006\u00de\u0014\u0000\u0684\u01ce\u0001\u0000\u0000\u0000\u0685"+
+    "\u0686\u0003\u00bdV\u0000\u0686\u0687\u0001\u0000\u0000\u0000\u0687\u0688"+
+    "\u0006\u00df \u0000\u0688\u01d0\u0001\u0000\u0000\u0000\u0689\u068a\u0003"+
+    "\u00b9T\u0000\u068a\u068b\u0001\u0000\u0000\u0000\u068b\u068c\u0006\u00e0"+
+    "!\u0000\u068c\u01d2\u0001\u0000\u0000\u0000\u068d\u068e\u0003C\u0019\u0000"+
+    "\u068e\u068f\u0001\u0000\u0000\u0000\u068f\u0690\u0006\u00e1\f\u0000\u0690"+
+    "\u01d4\u0001\u0000\u0000\u0000\u0691\u0692\u0003E\u001a\u0000\u0692\u0693"+
+    "\u0001\u0000\u0000\u0000\u0693\u0694\u0006\u00e2\f\u0000\u0694\u01d6\u0001"+
+    "\u0000\u0000\u0000\u0695\u0696\u0003G\u001b\u0000\u0696\u0697\u0001\u0000"+
+    "\u0000\u0000\u0697\u0698\u0006\u00e3\f\u0000\u0698\u01d8\u0001\u0000\u0000"+
+    "\u0000C\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f"+
+    "\r\u000e\u000f\u0010\u02b5\u02bf\u02c3\u02c6\u02cf\u02d1\u02dc\u02ef\u02f4"+
+    "\u02fd\u0304\u0309\u030b\u0316\u031e\u0321\u0323\u0328\u032d\u0333\u033a"+
+    "\u033f\u0345\u0348\u0350\u0354\u03d8\u03dd\u03e4\u03e6\u03f6\u03fb\u0400"+
+    "\u0402\u0408\u0455\u045a\u0489\u048d\u0492\u0497\u049c\u049e\u04a2\u04a4"+
+    "\u04f9\u04fd\u0502\u058f\u0591\'\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\r\u0000\u0005\u0010\u0000\u0005\u000b\u0000"+
+    "\u0005\u000e\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0007\u0010\u0000"+
+    "\u0007H\u0000\u0005\u0000\u0000\u0007\u001d\u0000\u0007I\u0000\u0007&"+
+    "\u0000\u0007\'\u0000\u0007$\u0000\u0007S\u0000\u0007\u001e\u0000\u0007"+
+    ")\u0000\u00075\u0000\u0007G\u0000\u0007W\u0000\u0005\n\u0000\u0005\u0007"+
+    "\u0000\u0007a\u0000\u0007`\u0000\u0007K\u0000\u0007J\u0000\u0007_\u0000"+
+    "\u0005\f\u0000\u0007[\u0000\u0005\u000f\u0000\u0007!\u0000";
   public static final ATN _ATN =
     new ATNDeserializer().deserialize(_serializedATN.toCharArray());
   static {

Файловите разлики са ограничени, защото са твърде много
+ 9 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.interp


Файловите разлики са ограничени, защото са твърде много
+ 194 - 179
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParser.java


+ 12 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseListener.java

@@ -1100,6 +1100,18 @@ public class EsqlBaseParserBaseListener implements EsqlBaseParserListener {
    * <p>The default implementation does nothing.</p>
    */
   @Override public void exitJoinPredicate(EsqlBaseParser.JoinPredicateContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void enterChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation does nothing.</p>
+   */
+  @Override public void exitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { }
 
   /**
    * {@inheritDoc}

+ 7 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserBaseVisitor.java

@@ -650,4 +650,11 @@ public class EsqlBaseParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
    * {@link #visitChildren} on {@code ctx}.</p>
    */
   @Override public T visitJoinPredicate(EsqlBaseParser.JoinPredicateContext ctx) { return visitChildren(ctx); }
+  /**
+   * {@inheritDoc}
+   *
+   * <p>The default implementation returns the result of calling
+   * {@link #visitChildren} on {@code ctx}.</p>
+   */
+  @Override public T visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) { return visitChildren(ctx); }
 }

+ 10 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserListener.java

@@ -981,4 +981,14 @@ public interface EsqlBaseParserListener extends ParseTreeListener {
    * @param ctx the parse tree
    */
   void exitJoinPredicate(EsqlBaseParser.JoinPredicateContext ctx);
+  /**
+   * Enter a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   */
+  void enterChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
+  /**
+   * Exit a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   */
+  void exitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
 }

+ 6 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/EsqlBaseParserVisitor.java

@@ -591,4 +591,10 @@ public interface EsqlBaseParserVisitor<T> extends ParseTreeVisitor<T> {
    * @return the visitor result
    */
   T visitJoinPredicate(EsqlBaseParser.JoinPredicateContext ctx);
+  /**
+   * Visit a parse tree produced by {@link EsqlBaseParser#changePointCommand}.
+   * @param ctx the parse tree
+   * @return the visitor result
+   */
+  T visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx);
 }

+ 20 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/LogicalPlanBuilder.java

@@ -30,6 +30,7 @@ import org.elasticsearch.xpack.esql.core.expression.FoldContext;
 import org.elasticsearch.xpack.esql.core.expression.Literal;
 import org.elasticsearch.xpack.esql.core.expression.MetadataAttribute;
 import org.elasticsearch.xpack.esql.core.expression.NamedExpression;
+import org.elasticsearch.xpack.esql.core.expression.ReferenceAttribute;
 import org.elasticsearch.xpack.esql.core.expression.UnresolvedAttribute;
 import org.elasticsearch.xpack.esql.core.expression.UnresolvedStar;
 import org.elasticsearch.xpack.esql.core.tree.Source;
@@ -40,6 +41,7 @@ import org.elasticsearch.xpack.esql.expression.UnresolvedNamePattern;
 import org.elasticsearch.xpack.esql.expression.function.UnresolvedFunction;
 import org.elasticsearch.xpack.esql.plan.IndexPattern;
 import org.elasticsearch.xpack.esql.plan.logical.Aggregate;
+import org.elasticsearch.xpack.esql.plan.logical.ChangePoint;
 import org.elasticsearch.xpack.esql.plan.logical.Dissect;
 import org.elasticsearch.xpack.esql.plan.logical.Drop;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
@@ -443,6 +445,24 @@ public class LogicalPlanBuilder extends ExpressionBuilder {
         };
     }
 
+    @Override
+    public PlanFactory visitChangePointCommand(EsqlBaseParser.ChangePointCommandContext ctx) {
+        Source src = source(ctx);
+        Attribute value = visitQualifiedName(ctx.value);
+        Attribute key = ctx.key == null ? new UnresolvedAttribute(src, "@timestamp") : visitQualifiedName(ctx.key);
+        Attribute targetType = new ReferenceAttribute(
+            src,
+            ctx.targetType == null ? "type" : visitQualifiedName(ctx.targetType).name(),
+            DataType.KEYWORD
+        );
+        Attribute targetPvalue = new ReferenceAttribute(
+            src,
+            ctx.targetPvalue == null ? "pvalue" : visitQualifiedName(ctx.targetPvalue).name(),
+            DataType.DOUBLE
+        );
+        return child -> new ChangePoint(src, child, value, key, targetType, targetPvalue);
+    }
+
     private static Tuple<Mode, String> parsePolicyName(Token policyToken) {
         String stringValue = policyToken.getText();
         int index = stringValue.indexOf(":");

+ 2 - 2
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/PlanWritables.java

@@ -57,7 +57,7 @@ public class PlanWritables {
     public static List<NamedWriteableRegistry.Entry> getNamedWriteables() {
         List<NamedWriteableRegistry.Entry> entries = new ArrayList<>();
         entries.addAll(logical());
-        entries.addAll(phsyical());
+        entries.addAll(physical());
         return entries;
     }
 
@@ -84,7 +84,7 @@ public class PlanWritables {
         );
     }
 
-    public static List<NamedWriteableRegistry.Entry> phsyical() {
+    public static List<NamedWriteableRegistry.Entry> physical() {
         return List.of(
             AggregateExec.ENTRY,
             DissectExec.ENTRY,

+ 156 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/logical/ChangePoint.java

@@ -0,0 +1,156 @@
+/*
+ * 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.plan.logical;
+
+import org.elasticsearch.common.io.stream.StreamOutput;
+import org.elasticsearch.compute.operator.ChangePointOperator;
+import org.elasticsearch.xpack.esql.capabilities.PostAnalysisVerificationAware;
+import org.elasticsearch.xpack.esql.common.Failures;
+import org.elasticsearch.xpack.esql.core.expression.Attribute;
+import org.elasticsearch.xpack.esql.core.expression.AttributeSet;
+import org.elasticsearch.xpack.esql.core.expression.Expressions;
+import org.elasticsearch.xpack.esql.core.expression.Literal;
+import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.core.type.DataType;
+import org.elasticsearch.xpack.esql.expression.NamedExpressions;
+import org.elasticsearch.xpack.esql.expression.Order;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+import static org.elasticsearch.xpack.esql.common.Failure.fail;
+
+/**
+ * Plan that detects change points in a list of values. See also:
+ * <ul>
+ * <li> {@link org.elasticsearch.compute.operator.ChangePointOperator}
+ * <li> {@link org.elasticsearch.xpack.ml.aggs.changepoint.ChangePointDetector}
+ * </ul>
+ *
+ * ChangePoint should always run on the coordinating node after the data is collected
+ * in sorted order by key. This is enforced by adding OrderBy in the surrogate plan.
+ * Furthermore, ChangePoint should be called with at most 1000 data points. That's
+ * enforced by the Limit in the surrogate plan.
+ */
+public class ChangePoint extends UnaryPlan implements SurrogateLogicalPlan, PostAnalysisVerificationAware {
+
+    private final Attribute value;
+    private final Attribute key;
+    private final Attribute targetType;
+    private final Attribute targetPvalue;
+
+    private List<Attribute> output;
+
+    public ChangePoint(Source source, LogicalPlan child, Attribute value, Attribute key, Attribute targetType, Attribute targetPvalue) {
+        super(source, child);
+        this.value = value;
+        this.key = key;
+        this.targetType = targetType;
+        this.targetPvalue = targetPvalue;
+    }
+
+    @Override
+    public void writeTo(StreamOutput out) throws IOException {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    public String getWriteableName() {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    protected NodeInfo<ChangePoint> info() {
+        return NodeInfo.create(this, ChangePoint::new, child(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public UnaryPlan replaceChild(LogicalPlan newChild) {
+        return new ChangePoint(source(), newChild, value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public List<Attribute> output() {
+        if (output == null) {
+            output = NamedExpressions.mergeOutputAttributes(List.of(targetType, targetPvalue), child().output());
+        }
+        return output;
+    }
+
+    public Attribute value() {
+        return value;
+    }
+
+    public Attribute key() {
+        return key;
+    }
+
+    public Attribute targetType() {
+        return targetType;
+    }
+
+    public Attribute targetPvalue() {
+        return targetPvalue;
+    }
+
+    @Override
+    protected AttributeSet computeReferences() {
+        return Expressions.references(List.of(key, value));
+    }
+
+    @Override
+    public boolean expressionsResolved() {
+        return value.resolved() && key.resolved();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+            && Objects.equals(value, ((ChangePoint) other).value)
+            && Objects.equals(key, ((ChangePoint) other).key)
+            && Objects.equals(targetType, ((ChangePoint) other).targetType)
+            && Objects.equals(targetPvalue, ((ChangePoint) other).targetPvalue);
+    }
+
+    private Order order() {
+        return new Order(source(), key, Order.OrderDirection.ASC, Order.NullsPosition.ANY);
+    }
+
+    @Override
+    public LogicalPlan surrogate() {
+        OrderBy orderBy = new OrderBy(source(), child(), List.of(order()));
+        // The first Limit of N+1 data points is necessary to generate a possible warning,
+        Limit limit = new Limit(
+            source(),
+            new Literal(Source.EMPTY, ChangePointOperator.INPUT_VALUE_COUNT_LIMIT + 1, DataType.INTEGER),
+            orderBy
+        );
+        ChangePoint changePoint = new ChangePoint(source(), limit, value, key, targetType, targetPvalue);
+        // The second Limit of N data points is to truncate the output.
+        return new Limit(source(), new Literal(Source.EMPTY, ChangePointOperator.INPUT_VALUE_COUNT_LIMIT, DataType.INTEGER), changePoint);
+    }
+
+    @Override
+    public void postAnalysisVerification(Failures failures) {
+        // Key must be sortable
+        Order order = order();
+        if (DataType.isSortable(order.dataType()) == false) {
+            failures.add(fail(this, "change point key [" + key.name() + "] must be sortable"));
+        }
+        // Value must be a number
+        if (value.dataType().isNumeric() == false) {
+            failures.add(fail(this, "change point value [" + value.name() + "] must be numeric"));
+        }
+    }
+}

+ 107 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/plan/physical/ChangePointExec.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.plan.physical;
+
+import org.elasticsearch.common.io.stream.StreamOutput;
+import org.elasticsearch.xpack.esql.core.expression.Attribute;
+import org.elasticsearch.xpack.esql.core.expression.AttributeSet;
+import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
+import org.elasticsearch.xpack.esql.core.tree.Source;
+import org.elasticsearch.xpack.esql.expression.NamedExpressions;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Objects;
+
+public class ChangePointExec extends UnaryExec {
+
+    private final Attribute value;
+    private final Attribute key;
+    private final Attribute targetType;
+    private final Attribute targetPvalue;
+
+    private List<Attribute> output;
+
+    public ChangePointExec(
+        Source source,
+        PhysicalPlan child,
+        Attribute value,
+        Attribute key,
+        Attribute targetType,
+        Attribute targetPvalue
+    ) {
+        super(source, child);
+        this.value = value;
+        this.key = key;
+        this.targetType = targetType;
+        this.targetPvalue = targetPvalue;
+    }
+
+    @Override
+    public void writeTo(StreamOutput out) throws IOException {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    public String getWriteableName() {
+        throw new UnsupportedOperationException("not serialized");
+    }
+
+    @Override
+    protected NodeInfo<? extends ChangePointExec> info() {
+        return NodeInfo.create(this, ChangePointExec::new, child(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public ChangePointExec replaceChild(PhysicalPlan newChild) {
+        return new ChangePointExec(source(), newChild, value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    protected AttributeSet computeReferences() {
+        return key.references().combine(value.references());
+    }
+
+    @Override
+    public List<Attribute> output() {
+        if (output == null) {
+            output = NamedExpressions.mergeOutputAttributes(List.of(targetType, targetPvalue), child().output());
+        }
+        return output;
+    }
+
+    public Attribute value() {
+        return value;
+    }
+
+    public Attribute key() {
+        return key;
+    }
+
+    public Attribute targetType() {
+        return targetType;
+    }
+
+    public Attribute targetPvalue() {
+        return targetPvalue;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(super.hashCode(), value, key, targetType, targetPvalue);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        return super.equals(other)
+            && Objects.equals(value, ((ChangePointExec) other).value)
+            && Objects.equals(key, ((ChangePointExec) other).key)
+            && Objects.equals(targetType, ((ChangePointExec) other).targetType)
+            && Objects.equals(targetPvalue, ((ChangePointExec) other).targetPvalue);
+    }
+}

+ 20 - 2
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/LocalExecutionPlanner.java

@@ -17,12 +17,14 @@ import org.elasticsearch.compute.data.ElementType;
 import org.elasticsearch.compute.data.LocalCircuitBreaker;
 import org.elasticsearch.compute.data.Page;
 import org.elasticsearch.compute.lucene.LuceneOperator;
+import org.elasticsearch.compute.operator.ChangePointOperator;
 import org.elasticsearch.compute.operator.ColumnExtractOperator;
 import org.elasticsearch.compute.operator.ColumnLoadOperator;
 import org.elasticsearch.compute.operator.Driver;
 import org.elasticsearch.compute.operator.DriverContext;
 import org.elasticsearch.compute.operator.EvalOperator.EvalOperatorFactory;
 import org.elasticsearch.compute.operator.FilterOperator.FilterOperatorFactory;
+import org.elasticsearch.compute.operator.LimitOperator;
 import org.elasticsearch.compute.operator.LocalSourceOperator;
 import org.elasticsearch.compute.operator.LocalSourceOperator.LocalSourceFactory;
 import org.elasticsearch.compute.operator.MvExpandOperator;
@@ -71,6 +73,7 @@ import org.elasticsearch.xpack.esql.evaluator.EvalMapper;
 import org.elasticsearch.xpack.esql.evaluator.command.GrokEvaluatorExtracter;
 import org.elasticsearch.xpack.esql.expression.Order;
 import org.elasticsearch.xpack.esql.plan.physical.AggregateExec;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.DissectExec;
 import org.elasticsearch.xpack.esql.plan.physical.EnrichExec;
 import org.elasticsearch.xpack.esql.plan.physical.EsQueryExec;
@@ -110,7 +113,6 @@ import java.util.stream.Stream;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.joining;
-import static org.elasticsearch.compute.operator.LimitOperator.Factory;
 import static org.elasticsearch.compute.operator.ProjectOperator.ProjectOperatorFactory;
 import static org.elasticsearch.xpack.esql.type.EsqlDataTypeConverter.stringToInt;
 
@@ -221,6 +223,8 @@ public class LocalExecutionPlanner {
             return planLimit(limit, context);
         } else if (node instanceof MvExpandExec mvExpand) {
             return planMvExpand(mvExpand, context);
+        } else if (node instanceof ChangePointExec changePoint) {
+            return planChangePoint(changePoint, context);
         }
         // source nodes
         else if (node instanceof EsQueryExec esQuery) {
@@ -684,7 +688,7 @@ public class LocalExecutionPlanner {
 
     private PhysicalOperation planLimit(LimitExec limit, LocalExecutionPlannerContext context) {
         PhysicalOperation source = plan(limit.child(), context);
-        return source.with(new Factory((Integer) limit.limit().fold(context.foldCtx)), source.layout);
+        return source.with(new LimitOperator.Factory((Integer) limit.limit().fold(context.foldCtx)), source.layout);
     }
 
     private PhysicalOperation planMvExpand(MvExpandExec mvExpandExec, LocalExecutionPlannerContext context) {
@@ -698,6 +702,20 @@ public class LocalExecutionPlanner {
         );
     }
 
+    private PhysicalOperation planChangePoint(ChangePointExec changePoint, LocalExecutionPlannerContext context) {
+        PhysicalOperation source = plan(changePoint.child(), context);
+        Layout layout = source.layout.builder().append(changePoint.targetType()).append(changePoint.targetPvalue()).build();
+        return source.with(
+            new ChangePointOperator.Factory(
+                layout.get(changePoint.value().id()).channel(),
+                changePoint.sourceText(),
+                changePoint.sourceLocation().getLineNumber(),
+                changePoint.sourceLocation().getColumnNumber()
+            ),
+            layout
+        );
+    }
+
     /**
      * Immutable physical operation.
      */

+ 13 - 0
x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/planner/mapper/MapperUtils.java

@@ -13,6 +13,7 @@ import org.elasticsearch.xpack.esql.EsqlIllegalArgumentException;
 import org.elasticsearch.xpack.esql.core.expression.Attribute;
 import org.elasticsearch.xpack.esql.core.expression.FoldContext;
 import org.elasticsearch.xpack.esql.plan.logical.Aggregate;
+import org.elasticsearch.xpack.esql.plan.logical.ChangePoint;
 import org.elasticsearch.xpack.esql.plan.logical.Dissect;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
 import org.elasticsearch.xpack.esql.plan.logical.Eval;
@@ -26,6 +27,7 @@ import org.elasticsearch.xpack.esql.plan.logical.UnaryPlan;
 import org.elasticsearch.xpack.esql.plan.logical.local.LocalRelation;
 import org.elasticsearch.xpack.esql.plan.logical.show.ShowInfo;
 import org.elasticsearch.xpack.esql.plan.physical.AggregateExec;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.DissectExec;
 import org.elasticsearch.xpack.esql.plan.physical.EnrichExec;
 import org.elasticsearch.xpack.esql.plan.physical.EvalExec;
@@ -98,6 +100,17 @@ class MapperUtils {
             return new MvExpandExec(mvExpand.source(), child, mvExpand.target(), mvExpand.expanded());
         }
 
+        if (p instanceof ChangePoint changePoint) {
+            return new ChangePointExec(
+                changePoint.source(),
+                child,
+                changePoint.value(),
+                changePoint.key(),
+                changePoint.targetType(),
+                changePoint.targetPvalue()
+            );
+        }
+
         return unsupported(p);
     }
 

+ 2 - 4
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/CsvTests.java

@@ -74,6 +74,7 @@ import org.elasticsearch.xpack.esql.optimizer.TestLocalPhysicalPlanOptimizer;
 import org.elasticsearch.xpack.esql.parser.EsqlParser;
 import org.elasticsearch.xpack.esql.plan.logical.Enrich;
 import org.elasticsearch.xpack.esql.plan.logical.LogicalPlan;
+import org.elasticsearch.xpack.esql.plan.physical.ChangePointExec;
 import org.elasticsearch.xpack.esql.plan.physical.HashJoinExec;
 import org.elasticsearch.xpack.esql.plan.physical.LocalSourceExec;
 import org.elasticsearch.xpack.esql.plan.physical.OutputExec;
@@ -564,12 +565,9 @@ public class CsvTests extends ESTestCase {
 
     // Asserts that the serialization and deserialization of the plan creates an equivalent plan.
     private void opportunisticallyAssertPlanSerialization(PhysicalPlan plan) {
-
-        // skip plans with localSourceExec
-        if (plan.anyMatch(p -> p instanceof LocalSourceExec || p instanceof HashJoinExec)) {
+        if (plan.anyMatch(p -> p instanceof LocalSourceExec || p instanceof HashJoinExec || p instanceof ChangePointExec)) {
             return;
         }
-
         SerializationTestUtils.assertSerialization(plan, configuration);
     }
 

+ 63 - 7
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.Strings;
 import org.elasticsearch.common.logging.LoggerMessageFormat;
 import org.elasticsearch.test.ESTestCase;
 import org.elasticsearch.xpack.esql.VerificationException;
@@ -36,11 +37,24 @@ import java.util.Set;
 import static org.elasticsearch.xpack.esql.EsqlTestUtils.paramAsConstant;
 import static org.elasticsearch.xpack.esql.EsqlTestUtils.withDefaultLimitWarning;
 import static org.elasticsearch.xpack.esql.analysis.AnalyzerTestUtils.loadMapping;
+import static org.elasticsearch.xpack.esql.core.type.DataType.BOOLEAN;
+import static org.elasticsearch.xpack.esql.core.type.DataType.CARTESIAN_POINT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.CARTESIAN_SHAPE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_DOUBLE;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_INTEGER;
 import static org.elasticsearch.xpack.esql.core.type.DataType.COUNTER_LONG;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DATETIME;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DATE_NANOS;
+import static org.elasticsearch.xpack.esql.core.type.DataType.DOUBLE;
+import static org.elasticsearch.xpack.esql.core.type.DataType.FLOAT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.GEO_POINT;
+import static org.elasticsearch.xpack.esql.core.type.DataType.GEO_SHAPE;
+import static org.elasticsearch.xpack.esql.core.type.DataType.INTEGER;
+import static org.elasticsearch.xpack.esql.core.type.DataType.IP;
 import static org.elasticsearch.xpack.esql.core.type.DataType.KEYWORD;
+import static org.elasticsearch.xpack.esql.core.type.DataType.LONG;
 import static org.elasticsearch.xpack.esql.core.type.DataType.UNSIGNED_LONG;
+import static org.elasticsearch.xpack.esql.core.type.DataType.VERSION;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.instanceOf;
@@ -2003,6 +2017,54 @@ public class VerifierTests extends ESTestCase {
         );
     }
 
+    public void testChangePoint() {
+        var airports = AnalyzerTestUtils.analyzer(loadMapping("mapping-airports.json", "airports"));
+        assertEquals("1:30: Unknown column [blahblah]", error("FROM airports | CHANGE_POINT blahblah ON scalerank", airports));
+        assertEquals("1:43: Unknown column [blahblah]", error("FROM airports | CHANGE_POINT scalerank ON blahblah", airports));
+        // TODO: nicer error message for missing default column "@timestamp"
+        assertEquals("1:17: Unknown column [@timestamp]", error("FROM airports | CHANGE_POINT scalerank", airports));
+    }
+
+    public void testChangePoint_keySortable() {
+        List<DataType> sortableTypes = List.of(BOOLEAN, DOUBLE, DATE_NANOS, DATETIME, INTEGER, IP, KEYWORD, LONG, UNSIGNED_LONG, VERSION);
+        List<DataType> unsortableTypes = List.of(CARTESIAN_POINT, CARTESIAN_SHAPE, GEO_POINT, GEO_SHAPE);
+        for (DataType type : sortableTypes) {
+            query(Strings.format("ROW key=NULL::%s, value=0\n | CHANGE_POINT value ON key", type));
+        }
+        for (DataType type : unsortableTypes) {
+            assertEquals(
+                "2:4: change point key [key] must be sortable",
+                error(Strings.format("ROW key=NULL::%s, value=0\n | CHANGE_POINT value ON key", type))
+            );
+        }
+    }
+
+    public void testChangePoint_valueNumeric() {
+        List<DataType> numericTypes = List.of(DOUBLE, INTEGER, LONG, UNSIGNED_LONG);
+        List<DataType> nonNumericTypes = List.of(
+            BOOLEAN,
+            CARTESIAN_POINT,
+            CARTESIAN_SHAPE,
+            DATE_NANOS,
+            DATETIME,
+            GEO_POINT,
+            GEO_SHAPE,
+            IP,
+            KEYWORD,
+            VERSION
+        );
+        for (DataType type : numericTypes) {
+            query(Strings.format("ROW key=0, value=NULL::%s\n | CHANGE_POINT value ON key", type));
+        }
+        for (DataType type : nonNumericTypes) {
+            assertEquals(
+                "2:4: change point value [value] must be numeric",
+                error(Strings.format("ROW key=0, value=NULL::%s\n | CHANGE_POINT value ON key", type))
+            );
+        }
+        assertEquals("2:4: change point value [value] must be numeric", error("ROW key=0, value=NULL\n | CHANGE_POINT value ON key"));
+    }
+
     public void testSortByAggregate() {
         assertEquals("1:18: Aggregate functions are not allowed in SORT [COUNT]", error("ROW a = 1 | SORT count(*)"));
         assertEquals("1:28: Aggregate functions are not allowed in SORT [COUNT]", error("ROW a = 1 | SORT to_string(count(*))"));
@@ -2036,13 +2098,7 @@ public class VerifierTests extends ESTestCase {
         query("FROM test | WHERE match(first_name, \"Jean\", {\"auto_generate_synonyms_phrase_query\": true})");
 
         // Check all data types for available options
-        DataType[] optionTypes = new DataType[] {
-            DataType.INTEGER,
-            DataType.LONG,
-            DataType.FLOAT,
-            DataType.DOUBLE,
-            DataType.KEYWORD,
-            DataType.BOOLEAN };
+        DataType[] optionTypes = new DataType[] { INTEGER, LONG, FLOAT, DOUBLE, KEYWORD, BOOLEAN };
         for (Map.Entry<String, DataType> allowedOptions : Match.ALLOWED_OPTIONS.entrySet()) {
             String optionName = allowedOptions.getKey();
             DataType optionType = allowedOptions.getValue();

+ 3 - 0
x-pack/plugin/ml/src/main/java/module-info.java

@@ -37,8 +37,11 @@ module org.elasticsearch.ml {
 
     exports org.elasticsearch.xpack.ml;
     exports org.elasticsearch.xpack.ml.action;
+    exports org.elasticsearch.xpack.ml.aggs;
     exports org.elasticsearch.xpack.ml.aggs.categorization;
+    exports org.elasticsearch.xpack.ml.aggs.changepoint;
     exports org.elasticsearch.xpack.ml.autoscaling;
     exports org.elasticsearch.xpack.ml.job.categorization;
     exports org.elasticsearch.xpack.ml.notifications;
+
 }

+ 4 - 0
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/aggs/changepoint/ChangeType.java

@@ -121,6 +121,10 @@ public interface ChangeType extends NamedWriteable, NamedXContentObject {
             return NAME;
         }
 
+        public String getReason() {
+            return reason;
+        }
+
         @Override
         public boolean equals(Object o) {
             if (this == o) return true;

Някои файлове не бяха показани, защото твърде много файлове са промени