Bring painless docs closer to reality
This commit is contained in:
parent
8925400f67
commit
001a060c84
|
@ -96,6 +96,8 @@ include::scripting/groovy.asciidoc[]
|
||||||
|
|
||||||
include::scripting/painless.asciidoc[]
|
include::scripting/painless.asciidoc[]
|
||||||
|
|
||||||
|
include::scripting/painless-syntax.asciidoc[]
|
||||||
|
|
||||||
include::scripting/expression.asciidoc[]
|
include::scripting/expression.asciidoc[]
|
||||||
|
|
||||||
include::scripting/native.asciidoc[]
|
include::scripting/native.asciidoc[]
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
[[modules-scripting-painless-syntax]]
|
||||||
|
=== Painless Syntax
|
||||||
|
|
||||||
|
experimental[The Painless scripting language is new and is still marked as experimental. The syntax or API may be changed in the future in non-backwards compatible ways if required.]
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-types]]
|
||||||
|
=== Variable types
|
||||||
|
|
||||||
|
Painless supports all of https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html[Java's types],
|
||||||
|
including array types, but adds some additional built-in types.
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-def]]
|
||||||
|
==== Def
|
||||||
|
|
||||||
|
The dynamic type `def` serves as a placeholder for any other type. It adopts the behavior
|
||||||
|
of whatever runtime type it represents.
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-strings]]
|
||||||
|
==== String
|
||||||
|
|
||||||
|
String constants can be declared with single quotes, to avoid escaping horrors with JSON:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
def mystring = 'foo';
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-lists]]
|
||||||
|
==== List
|
||||||
|
|
||||||
|
Lists can be created explicitly (e.g. `new ArrayList()`) or initialized similar to Groovy:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
def list = [1,2,3];
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Lists can also be accessed similar to arrays: they support subscript and `.length`:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
def list = [1,2,3];
|
||||||
|
return list[0]
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-maps]]
|
||||||
|
==== Map
|
||||||
|
|
||||||
|
Maps can be created explicitly (e.g. `new HashMap()`) or initialized similar to Groovy:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
def person = ['name': 'Joe', 'age': 63];
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Map keys can also be accessed as properties.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
def person = ['name': 'Joe', 'age': 63];
|
||||||
|
person.retired = true;
|
||||||
|
return person.name
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Map keys can also be accessed via subscript (for keys containing special characters):
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
return map['something-absurd!']
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-pattern]]
|
||||||
|
==== Pattern
|
||||||
|
|
||||||
|
Regular expression constants are directly supported:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
Pattern p = /[aeiou]/
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Patterns can only be created via this mechanism. This ensures fast performance, regular expressions
|
||||||
|
are always constants and compiled efficiently a single time.
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[modules-scripting-painless-regex-flags]]
|
||||||
|
==== Pattern flags
|
||||||
|
|
||||||
|
You can define flags on patterns in Painless by adding characters after the
|
||||||
|
trailing `/` like `/foo/i` or `/foo \w #comment/iUx`. Painless exposes all the
|
||||||
|
flags from
|
||||||
|
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html[Java's Pattern class]
|
||||||
|
using these characters:
|
||||||
|
|
||||||
|
[cols="<,<,<",options="header",]
|
||||||
|
|=======================================================================
|
||||||
|
| Character | Java Constant | Example
|
||||||
|
|`c` | CANON_EQ | `'å' ==~ /å/c` (open in hex editor to see)
|
||||||
|
|`i` | CASE_INSENSITIVE | `'A' ==~ /a/i`
|
||||||
|
|`l` | LITERAL | `'[a]' ==~ /[a]/l`
|
||||||
|
|`m` | MULTILINE | `'a\nb\nc' =~ /^b$/m`
|
||||||
|
|`s` | DOTALL (aka single line) | `'a\nb\nc' =~ /.b./s`
|
||||||
|
|`U` | UNICODE_CHARACTER_CLASS | `'Ɛ' ==~ /\\w/U`
|
||||||
|
|`u` | UNICODE_CASE | `'Ɛ' ==~ /ɛ/iu`
|
||||||
|
|`x` | COMMENTS (aka extended) | `'a' ==~ /a #comment/x`
|
||||||
|
|=======================================================================
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-operators]]
|
||||||
|
=== Operators
|
||||||
|
|
||||||
|
All of Java's https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html[operators] are
|
||||||
|
supported with the same precedence, promotion, and semantics.
|
||||||
|
|
||||||
|
There are only a few minor differences and add-ons:
|
||||||
|
|
||||||
|
* `==` behaves as Java's for numeric types, but for non-numeric types acts as https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-[`Object.equals()`]
|
||||||
|
* `===` and `!==` support exact reference comparison (e.g. `x === y`)
|
||||||
|
* `=~` true if a portion of the text matches a pattern (e.g. `x =~ /b/`)
|
||||||
|
* `==~` true if the entire text matches a pattern (e.g. `x ==~ /[Bb]ob/`)
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-control-flow]]
|
||||||
|
=== Control flow
|
||||||
|
|
||||||
|
Java's https://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html[control flow statements] are supported, with the exception
|
||||||
|
of the `switch` statement.
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-functions]]
|
||||||
|
=== Functions
|
||||||
|
|
||||||
|
Functions can be declared at the beginning of the script, for example:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
boolean isNegative(def x) { x < 0 }
|
||||||
|
...
|
||||||
|
if (isNegative(someVar)) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
[float]
|
||||||
|
[[painless-lambda-expressions]]
|
||||||
|
=== Lambda expressions
|
||||||
|
Lambda expressions and method references work the same as https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html[Java's].
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------------------------------------
|
||||||
|
list.removeIf(item -> item == 2);
|
||||||
|
list.removeIf((int item) -> item == 2);
|
||||||
|
list.removeIf((int item) -> { item == 2 });
|
||||||
|
list.sort((x, y) -> x - y);
|
||||||
|
list.sort(Integer::compare);
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
Method references to functions within the script can be accomplished using `this`, e.g. `list.sort(this::mycompare)`.
|
|
@ -8,9 +8,7 @@ by default. It is designed specifically for use with Elasticsearch and can
|
||||||
safely be used with `inline` and `stored` scripting, which is enabled by
|
safely be used with `inline` and `stored` scripting, which is enabled by
|
||||||
default.
|
default.
|
||||||
|
|
||||||
A Painless script is essentially a single function. Painless does not provide support
|
The Painless syntax is similar to http://groovy-lang.org/index.html[Groovy].
|
||||||
for defining multiple functions within a script. The Painless syntax is similar to
|
|
||||||
http://groovy-lang.org/index.html[Groovy].
|
|
||||||
|
|
||||||
You can use Painless anywhere a script can be used in Elasticsearch--simply set the `lang` parameter
|
You can use Painless anywhere a script can be used in Elasticsearch--simply set the `lang` parameter
|
||||||
to `painless`.
|
to `painless`.
|
||||||
|
@ -19,22 +17,15 @@ to `painless`.
|
||||||
[float]
|
[float]
|
||||||
== Painless Features
|
== Painless Features
|
||||||
|
|
||||||
* Control flow: `for` loops, `while` loops, `do/while` loops, `if/else`
|
* Fast performance: https://benchmarks.elastic.co/index.html#search_qps_scripts[several times faster] than the alternatives.
|
||||||
|
|
||||||
* Fully Typed: all available types/methods described in <<painless-api, Painless API>>
|
* Safety: Fine-grained <<painless-api, whitelist>> with method call/field granularity.
|
||||||
|
|
||||||
* Arithmetic operators: multiplication `*`, division `/`, addition `+`, subtraction `-`, precedence `( )`
|
* Optional typing: Variables and parameters can use explicit types or the dynamic `def` type.
|
||||||
|
|
||||||
* Comparison operators: less than `<`, less than or equal to `<=`, greater than `>`, greater than or equal to `>=`, equal to `==`, and not equal to `!=`, reference equals `===`, reference not equals `!==`
|
* Syntax: Extends Java's syntax with a subset of Groovy for ease of use. See the <<modules-scripting-painless-syntax, Syntax Overview>>.
|
||||||
|
|
||||||
* Boolean operators: not `!`, and `&&`, or `||`
|
|
||||||
|
|
||||||
* Bitwise operators: shift left `<<`, shift right `>>`, unsigned shift `>>>`, and `&`, or `|`, xor `^`, not `~`
|
|
||||||
|
|
||||||
* Shortcuts for list, map access using the dot `.` operator
|
|
||||||
|
|
||||||
* Native support for regular expressions with `/pattern/`, `=~`, and `==~`
|
|
||||||
|
|
||||||
|
* Optimizations: Designed specifically for Elasticsearch scripting.
|
||||||
|
|
||||||
[[painless-examples]]
|
[[painless-examples]]
|
||||||
[float]
|
[float]
|
||||||
|
@ -74,7 +65,7 @@ PUT hockey/player/_bulk?refresh
|
||||||
[float]
|
[float]
|
||||||
=== Accessing Doc Values from Painless
|
=== Accessing Doc Values from Painless
|
||||||
|
|
||||||
Document values can be accessed from a `Map<String,def>` named `doc`.
|
Document values can be accessed from a `Map` named `doc`.
|
||||||
|
|
||||||
For example, the following script calculates a player's total goals. This example uses a strongly typed `int` and a `for` loop.
|
For example, the following script calculates a player's total goals. This example uses a strongly typed `int` and a `for` loop.
|
||||||
|
|
||||||
|
@ -268,528 +259,27 @@ Note: all of the `_update_by_query` examples above could really do with a
|
||||||
because script queries aren't able to use the inverted index to limit the
|
because script queries aren't able to use the inverted index to limit the
|
||||||
documents that they have to check.
|
documents that they have to check.
|
||||||
|
|
||||||
We intentionally don't allow scripts to call `Pattern.compile` to get a new
|
|
||||||
pattern on the fly because building a `Pattern` is (comparatively) slow.
|
|
||||||
Pattern literals (`/apattern/`) have fancy constant extraction so no matter
|
|
||||||
where they show up in the painless script they are built only when the script
|
|
||||||
is first used. It is fairly similar to how `String` literals work in Java.
|
|
||||||
|
|
||||||
[float]
|
[float]
|
||||||
[[modules-scripting-painless-regex-flags]]
|
|
||||||
==== Regular expression flags
|
|
||||||
|
|
||||||
You can define flags on patterns in Painless by adding characters after the
|
|
||||||
trailing `/` like `/foo/i` or `/foo \w #comment/iUx`. Painless exposes all the
|
|
||||||
flags from
|
|
||||||
https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html[Java's Pattern class]
|
|
||||||
using these characters:
|
|
||||||
|
|
||||||
[cols="<,<,<",options="header",]
|
|
||||||
|=======================================================================
|
|
||||||
| Character | Java Constant | Example
|
|
||||||
|`c` | CANON_EQ | `'å' ==~ /å/c` (open in hex editor to see)
|
|
||||||
|`i` | CASE_INSENSITIVE | `'A' ==~ /a/i`
|
|
||||||
|`l` | LITERAL | `'[a]' ==~ /[a]/l`
|
|
||||||
|`m` | MULTILINE | `'a\nb\nc' =~ /^b$/m`
|
|
||||||
|`s` | DOTALL (aka single line) | `'a\nb\nc' =~ /.b./s`
|
|
||||||
|`U` | UNICODE_CHARACTER_CLASS | `'Ɛ' ==~ /\\w/U`
|
|
||||||
|`u` | UNICODE_CASE | `'Ɛ' ==~ /ɛ/iu`
|
|
||||||
|`x` | COMMENTS (aka extended) | `'a' ==~ /a #comment/x`
|
|
||||||
|=======================================================================
|
|
||||||
|
|
||||||
|
|
||||||
[[painless-api]]
|
[[painless-api]]
|
||||||
[float]
|
|
||||||
== Painless API
|
== Painless API
|
||||||
|
|
||||||
The following types are available for use in the Painless language. Most types and methods map directly to their Java equivalents--for more information, see the corresponding https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html[Javadoc].
|
The following Java packages are available for use in the Painless language:
|
||||||
|
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html[java.lang]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/math/package-summary.html[java.math]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/text/package-summary.html[java.text]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html[java.time]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/time/chrono/package-summary.html[java.time.chrono]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/time/format/package-summary.html[java.time.format]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/time/temporal/package-summary.html[java.time.temporal]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/time/zone/package-summary.html[java.time.zone]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/util/package-summary.html[java.util]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html[java.util.function]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/util/regex/package-summary.html[java.util.regex]
|
||||||
|
* https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html[java.util.stream]
|
||||||
|
|
||||||
[float]
|
Note that unsafe classes and methods are not included, there is no support for:
|
||||||
=== Dynamic Types
|
|
||||||
|
|
||||||
* `def` (This type can be used to represent any other type.)
|
* Manipulation of processes and threads
|
||||||
|
* Input/Output
|
||||||
[float]
|
* Reflection
|
||||||
=== Basic Types
|
|
||||||
|
|
||||||
* `void`
|
|
||||||
* `boolean`
|
|
||||||
* `short`
|
|
||||||
* `char`
|
|
||||||
* `int`
|
|
||||||
* `long`
|
|
||||||
* `float`
|
|
||||||
* `double`
|
|
||||||
|
|
||||||
[float]
|
|
||||||
=== Complex Types
|
|
||||||
|
|
||||||
Non-static methods/members in superclasses are available to subclasses.
|
|
||||||
Generic types with unspecified generic parameters are parameters of type `def`.
|
|
||||||
|
|
||||||
-----
|
|
||||||
ArithmeticException extends Exception
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
ArrayList extends List
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
ArrayList<Object> extends List<Object>
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
ArrayList<String> extends List<String>
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Boolean extends Object
|
|
||||||
<init>(boolean)
|
|
||||||
static Boolean valueOf(boolean)
|
|
||||||
boolean booleanValue()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Character extends Object
|
|
||||||
<init>(char)
|
|
||||||
static Character valueOf(char)
|
|
||||||
char charValue()
|
|
||||||
static char MIN_VALUE
|
|
||||||
static char MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
CharSequence extends Object
|
|
||||||
char charAt(int)
|
|
||||||
int length()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Collection extends Object
|
|
||||||
boolean add(def)
|
|
||||||
void clear()
|
|
||||||
boolean contains(def)
|
|
||||||
boolean isEmpty()
|
|
||||||
Iterator iterator()
|
|
||||||
boolean remove(def)
|
|
||||||
int size()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Collection<Object> extends Object
|
|
||||||
boolean add(Object)
|
|
||||||
void clear()
|
|
||||||
boolean contains(Object)
|
|
||||||
boolean isEmpty()
|
|
||||||
Iterator iterator()
|
|
||||||
boolean remove(Object)
|
|
||||||
int size()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Collection<String> extends Object
|
|
||||||
boolean add(String)
|
|
||||||
void clear()
|
|
||||||
boolean contains(String)
|
|
||||||
boolean isEmpty()
|
|
||||||
Iterator iterator()
|
|
||||||
boolean remove(String)
|
|
||||||
int size()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Double extends Number
|
|
||||||
<init>(double)
|
|
||||||
static Double valueOf(double)
|
|
||||||
static double MIN_VALUE
|
|
||||||
static double MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Exception extends Object
|
|
||||||
String getMessage()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Float extends Number
|
|
||||||
<init>(float)
|
|
||||||
static Float valueOf(float)
|
|
||||||
static float MIN_VALUE
|
|
||||||
static float MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
HashMap extends Map
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
HashMap<Object,Object> extends Map<Object,Object>
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
HashMap<String,def> extends Map<String,def>
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
HashMap<String,Object> extends Map<String,Object>
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
IllegalArgument extends Exception
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
IllegalState extends Exception
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Integer extends Number
|
|
||||||
<init>(int)
|
|
||||||
static Integer valueOf(int)
|
|
||||||
static int MIN_VALUE
|
|
||||||
static int MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Iterator extends Object
|
|
||||||
boolean hasNext()
|
|
||||||
def next()
|
|
||||||
void remove()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Iterator<String> extends Object
|
|
||||||
boolean hasNext()
|
|
||||||
String next()
|
|
||||||
void remove()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
List extends Collection
|
|
||||||
def set(int, def)
|
|
||||||
def get(int)
|
|
||||||
def remove(int)
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
List<Object> extends Collection
|
|
||||||
Object set(int, Object)
|
|
||||||
Object get(int)
|
|
||||||
Object remove(int)
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
List<String> extends Collection
|
|
||||||
String set(int, String)
|
|
||||||
String get(int)
|
|
||||||
String remove(int)
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Long extends Number
|
|
||||||
<init>(long)
|
|
||||||
static Long valueOf(long)
|
|
||||||
static long MIN_VALUE
|
|
||||||
static long MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Map extends Object
|
|
||||||
def put (def, def)
|
|
||||||
def get (def)
|
|
||||||
def remove (def)
|
|
||||||
boolean isEmpty()
|
|
||||||
int size()
|
|
||||||
boolean containsKey(def)
|
|
||||||
boolean containsValue(def)
|
|
||||||
Set keySet()
|
|
||||||
Collection values()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Map<Object,Object> extends Object
|
|
||||||
Object put (Object, Object)
|
|
||||||
Object get (Object)
|
|
||||||
Object remove (Object)
|
|
||||||
boolean isEmpty()
|
|
||||||
int size()
|
|
||||||
boolean containsKey(Object)
|
|
||||||
boolean containsValue(Object)
|
|
||||||
Set keySet()
|
|
||||||
Collection values()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Map<String,def> extends Object
|
|
||||||
def put (String, def)
|
|
||||||
def get (String)
|
|
||||||
def remove (String)
|
|
||||||
boolean isEmpty()
|
|
||||||
int size()
|
|
||||||
boolean containsKey(String)
|
|
||||||
boolean containsValue(def)
|
|
||||||
Set<String> keySet()
|
|
||||||
Collection values()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Map<String,Object> extends Object
|
|
||||||
Object put (String, Object)
|
|
||||||
Object get (String)
|
|
||||||
Object remove (String)
|
|
||||||
boolean isEmpty()
|
|
||||||
int size()
|
|
||||||
boolean containsKey(String)
|
|
||||||
boolean containsValue(Object)
|
|
||||||
Set<String> keySet()
|
|
||||||
Collection values()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Number extends Object
|
|
||||||
short shortValue()
|
|
||||||
short shortValue()
|
|
||||||
int intValue()
|
|
||||||
long longValue()
|
|
||||||
float floatValue()
|
|
||||||
double doubleValue()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Object
|
|
||||||
String toString()
|
|
||||||
boolean equals(Object)
|
|
||||||
int hashCode()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Set extends Collection
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Set<Object> extends Collection<Object>
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Set<String> extends Collection<String>
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Short extends Number
|
|
||||||
<init>(short)
|
|
||||||
static Short valueOf(short)
|
|
||||||
static short MIN_VALUE
|
|
||||||
static short MAX_VALUE
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
String extends CharSequence
|
|
||||||
<init>(String)
|
|
||||||
int codePointAt(int)
|
|
||||||
int compareTo(String)
|
|
||||||
String concat(String)
|
|
||||||
boolean endsWith(String)
|
|
||||||
int indexOf(String, int)
|
|
||||||
boolean isEmpty()
|
|
||||||
String replace(CharSequence, CharSequence)
|
|
||||||
boolean startsWith(String)
|
|
||||||
String substring(int, int)
|
|
||||||
char[] toCharArray()
|
|
||||||
String trim()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
NumberFormatException extends Exception
|
|
||||||
<init>()
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Void extends Object
|
|
||||||
-----
|
|
||||||
|
|
||||||
[float]
|
|
||||||
==== Utility Classes
|
|
||||||
|
|
||||||
-----
|
|
||||||
Math
|
|
||||||
static double abs(double)
|
|
||||||
static float fabs(float)
|
|
||||||
static long labs(long)
|
|
||||||
static int iabs(int)
|
|
||||||
static double acos(double)
|
|
||||||
static double asin(double)
|
|
||||||
static double atan(double)
|
|
||||||
static double atan2(double)
|
|
||||||
static double cbrt(double)
|
|
||||||
static double ceil(double)
|
|
||||||
static double cos(double)
|
|
||||||
static double cosh(double)
|
|
||||||
static double exp(double)
|
|
||||||
static double expm1(double)
|
|
||||||
static double floor(double)
|
|
||||||
static double hypt(double, double)
|
|
||||||
static double abs(double)
|
|
||||||
static double log(double)
|
|
||||||
static double log10(double)
|
|
||||||
static double log1p(double)
|
|
||||||
static double max(double, double)
|
|
||||||
static float fmax(float, float)
|
|
||||||
static long lmax(long, long)
|
|
||||||
static int imax(int, int)
|
|
||||||
static double min(double, double)
|
|
||||||
static float fmin(float, float)
|
|
||||||
static long lmin(long, long)
|
|
||||||
static int imin(int, int)
|
|
||||||
static double pow(double, double)
|
|
||||||
static double random()
|
|
||||||
static double rint(double)
|
|
||||||
static long round(double)
|
|
||||||
static double sin(double)
|
|
||||||
static double sinh(double)
|
|
||||||
static double sqrt(double)
|
|
||||||
static double tan(double)
|
|
||||||
static double tanh(double)
|
|
||||||
static double toDegrees(double)
|
|
||||||
static double toRadians(double)
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Utility
|
|
||||||
static boolean NumberToboolean(Number)
|
|
||||||
static char NumberTochar(Number)
|
|
||||||
static Boolean NumberToBoolean(Number)
|
|
||||||
static Short NumberToShort(Number)
|
|
||||||
static Character NumberToCharacter(Number)
|
|
||||||
static Integer NumberToInteger(Number)
|
|
||||||
static Long NumberToLong(Number)
|
|
||||||
static Float NumberToFloat(Number)
|
|
||||||
static Double NumberToDouble(Number)
|
|
||||||
static byte booleanTobyte(boolean)
|
|
||||||
static short booleanToshort(boolean)
|
|
||||||
static char booleanTochar(boolean)
|
|
||||||
static int booleanToint(boolean)
|
|
||||||
static long booleanTolong(boolean)
|
|
||||||
static float booleanTofloat(boolean)
|
|
||||||
static double booleanTodouble(boolean)
|
|
||||||
static Integer booleanToInteger(boolean)
|
|
||||||
static byte BooleanTobyte(Boolean)
|
|
||||||
static short BooleanToshort(Boolean)
|
|
||||||
static char BooleanTochar(Boolean)
|
|
||||||
static int BooleanToint(Boolean)
|
|
||||||
static long BooleanTolong(Boolean)
|
|
||||||
static float BooleanTofloat(Boolean)
|
|
||||||
static double BooleanTodouble(Boolean)
|
|
||||||
static Byte BooleanToByte(Boolean)
|
|
||||||
static Short BooleanToShort(Boolean)
|
|
||||||
static Character BooleanToCharacter(Boolean)
|
|
||||||
static Integer BooleanToInteger(Boolean)
|
|
||||||
static Long BooleanToLong(Boolean)
|
|
||||||
static Float BooleanToFloat(Boolean)
|
|
||||||
static Double BooleanToDouble(Boolean)
|
|
||||||
static boolean byteToboolean(byte)
|
|
||||||
static Short byteToShort(byte)
|
|
||||||
static Character byteToCharacter(byte)
|
|
||||||
static Integer byteToInteger(byte)
|
|
||||||
static Long byteToLong(byte)
|
|
||||||
static Float byteToFloat(byte)
|
|
||||||
static Double byteToDouble(byte)
|
|
||||||
static boolean ByteToboolean(Byte)
|
|
||||||
static char ByteTochar(Byte)
|
|
||||||
static boolean shortToboolean(short)
|
|
||||||
static Byte shortToByte(short)
|
|
||||||
static Character shortToCharacter(short)
|
|
||||||
static Integer shortToInteger(short)
|
|
||||||
static Long shortToLong(short)
|
|
||||||
static Float shortToFloat(short)
|
|
||||||
static Double shortToDouble(short)
|
|
||||||
static boolean ShortToboolean(Short)
|
|
||||||
static char ShortTochar(Short)
|
|
||||||
static boolean charToboolean(char)
|
|
||||||
static Byte charToByte(char)
|
|
||||||
static Short charToShort(char)
|
|
||||||
static Integer charToInteger(char)
|
|
||||||
static Long charToLong(char)
|
|
||||||
static Float charToFloat(char)
|
|
||||||
static Double charToDouble(char)
|
|
||||||
static boolean CharacterToboolean(Character)
|
|
||||||
static byte CharacterTobyte(Character)
|
|
||||||
static short CharacterToshort(Character)
|
|
||||||
static int CharacterToint(Character)
|
|
||||||
static long CharacterTolong(Character)
|
|
||||||
static float CharacterTofloat(Character)
|
|
||||||
static double CharacterTodouble(Character)
|
|
||||||
static Boolean CharacterToBoolean(Character)
|
|
||||||
static Byte CharacterToByte(Character)
|
|
||||||
static Short CharacterToShort(Character)
|
|
||||||
static Integer CharacterToInteger(Character)
|
|
||||||
static Long CharacterToLong(Character)
|
|
||||||
static Float CharacterToFloat(Character)
|
|
||||||
static Double CharacterToDouble(Character)
|
|
||||||
static boolean intToboolean(int)
|
|
||||||
static Byte intToByte(int)
|
|
||||||
static Short intToShort(int)
|
|
||||||
static Character intToCharacter(int)
|
|
||||||
static Long intToLong(int)
|
|
||||||
static Float intToFloat(int)
|
|
||||||
static Double intToDouble(int)
|
|
||||||
static boolean IntegerToboolean(Integer)
|
|
||||||
static char IntegerTochar(Integer)
|
|
||||||
static boolean longToboolean(long)
|
|
||||||
static Byte longToByte(long)
|
|
||||||
static Short longToShort(long)
|
|
||||||
static Character longToCharacter(long)
|
|
||||||
static Integer longToInteger(long)
|
|
||||||
static Float longToFloat(long)
|
|
||||||
static Double longToDouble(long)
|
|
||||||
static boolean LongToboolean(Long)
|
|
||||||
static char LongTochar(Long)
|
|
||||||
static boolean floatToboolean(float)
|
|
||||||
static Byte floatToByte(float)
|
|
||||||
static Short floatToShort(float)
|
|
||||||
static Character floatToCharacter(float)
|
|
||||||
static Integer floatToInteger(float)
|
|
||||||
static Long floatToLong(float)
|
|
||||||
static Double floatToDouble(float)
|
|
||||||
static boolean FloatToboolean(Float)
|
|
||||||
static char FloatTochar(Float)
|
|
||||||
static boolean doubleToboolean(double)
|
|
||||||
static Byte doubleToByte(double)
|
|
||||||
static Short doubleToShort(double)
|
|
||||||
static Character doubleToCharacter(double)
|
|
||||||
static Integer doubleToInteger(double)
|
|
||||||
static Long doubleToLong(double)
|
|
||||||
static Float doubleToFloat(double)
|
|
||||||
static boolean DoubleToboolean(Double)
|
|
||||||
static char DoubleTochar(Double)
|
|
||||||
-----
|
|
||||||
|
|
||||||
-----
|
|
||||||
Def
|
|
||||||
static boolean defToboolean(def)
|
|
||||||
static byte defTobyte(def)
|
|
||||||
static short defToshort(def)
|
|
||||||
static char defTochar(def)
|
|
||||||
static int defToint(def)
|
|
||||||
static long defTolong(def)
|
|
||||||
static float defTofloat(def)
|
|
||||||
static double defTodouble(def)
|
|
||||||
static Boolean defToBoolean(def)
|
|
||||||
static Byte defToByte(def)
|
|
||||||
static Character defToCharacter(def)
|
|
||||||
static Integer defToInteger(def)
|
|
||||||
static Long defToLong(def)
|
|
||||||
static Float defToFloat(def)
|
|
||||||
static Double defToDouble(def)
|
|
||||||
-----
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ TRY: 'try';
|
||||||
CATCH: 'catch';
|
CATCH: 'catch';
|
||||||
THROW: 'throw';
|
THROW: 'throw';
|
||||||
THIS: 'this';
|
THIS: 'this';
|
||||||
|
INSTANCEOF: 'instanceof';
|
||||||
|
|
||||||
BOOLNOT: '!';
|
BOOLNOT: '!';
|
||||||
BWNOT: '~';
|
BWNOT: '~';
|
||||||
|
|
|
@ -22,62 +22,63 @@ TRY=21
|
||||||
CATCH=22
|
CATCH=22
|
||||||
THROW=23
|
THROW=23
|
||||||
THIS=24
|
THIS=24
|
||||||
BOOLNOT=25
|
INSTANCEOF=25
|
||||||
BWNOT=26
|
BOOLNOT=26
|
||||||
MUL=27
|
BWNOT=27
|
||||||
DIV=28
|
MUL=28
|
||||||
REM=29
|
DIV=29
|
||||||
ADD=30
|
REM=30
|
||||||
SUB=31
|
ADD=31
|
||||||
LSH=32
|
SUB=32
|
||||||
RSH=33
|
LSH=33
|
||||||
USH=34
|
RSH=34
|
||||||
LT=35
|
USH=35
|
||||||
LTE=36
|
LT=36
|
||||||
GT=37
|
LTE=37
|
||||||
GTE=38
|
GT=38
|
||||||
EQ=39
|
GTE=39
|
||||||
EQR=40
|
EQ=40
|
||||||
NE=41
|
EQR=41
|
||||||
NER=42
|
NE=42
|
||||||
BWAND=43
|
NER=43
|
||||||
XOR=44
|
BWAND=44
|
||||||
BWOR=45
|
XOR=45
|
||||||
BOOLAND=46
|
BWOR=46
|
||||||
BOOLOR=47
|
BOOLAND=47
|
||||||
COND=48
|
BOOLOR=48
|
||||||
COLON=49
|
COND=49
|
||||||
REF=50
|
COLON=50
|
||||||
ARROW=51
|
REF=51
|
||||||
FIND=52
|
ARROW=52
|
||||||
MATCH=53
|
FIND=53
|
||||||
INCR=54
|
MATCH=54
|
||||||
DECR=55
|
INCR=55
|
||||||
ASSIGN=56
|
DECR=56
|
||||||
AADD=57
|
ASSIGN=57
|
||||||
ASUB=58
|
AADD=58
|
||||||
AMUL=59
|
ASUB=59
|
||||||
ADIV=60
|
AMUL=60
|
||||||
AREM=61
|
ADIV=61
|
||||||
AAND=62
|
AREM=62
|
||||||
AXOR=63
|
AAND=63
|
||||||
AOR=64
|
AXOR=64
|
||||||
ALSH=65
|
AOR=65
|
||||||
ARSH=66
|
ALSH=66
|
||||||
AUSH=67
|
ARSH=67
|
||||||
OCTAL=68
|
AUSH=68
|
||||||
HEX=69
|
OCTAL=69
|
||||||
INTEGER=70
|
HEX=70
|
||||||
DECIMAL=71
|
INTEGER=71
|
||||||
STRING=72
|
DECIMAL=72
|
||||||
REGEX=73
|
STRING=73
|
||||||
TRUE=74
|
REGEX=74
|
||||||
FALSE=75
|
TRUE=75
|
||||||
NULL=76
|
FALSE=76
|
||||||
TYPE=77
|
NULL=77
|
||||||
ID=78
|
TYPE=78
|
||||||
DOTINTEGER=79
|
ID=79
|
||||||
DOTID=80
|
DOTINTEGER=80
|
||||||
|
DOTID=81
|
||||||
'{'=3
|
'{'=3
|
||||||
'}'=4
|
'}'=4
|
||||||
'['=5
|
'['=5
|
||||||
|
@ -100,49 +101,50 @@ DOTID=80
|
||||||
'catch'=22
|
'catch'=22
|
||||||
'throw'=23
|
'throw'=23
|
||||||
'this'=24
|
'this'=24
|
||||||
'!'=25
|
'instanceof'=25
|
||||||
'~'=26
|
'!'=26
|
||||||
'*'=27
|
'~'=27
|
||||||
'/'=28
|
'*'=28
|
||||||
'%'=29
|
'/'=29
|
||||||
'+'=30
|
'%'=30
|
||||||
'-'=31
|
'+'=31
|
||||||
'<<'=32
|
'-'=32
|
||||||
'>>'=33
|
'<<'=33
|
||||||
'>>>'=34
|
'>>'=34
|
||||||
'<'=35
|
'>>>'=35
|
||||||
'<='=36
|
'<'=36
|
||||||
'>'=37
|
'<='=37
|
||||||
'>='=38
|
'>'=38
|
||||||
'=='=39
|
'>='=39
|
||||||
'==='=40
|
'=='=40
|
||||||
'!='=41
|
'==='=41
|
||||||
'!=='=42
|
'!='=42
|
||||||
'&'=43
|
'!=='=43
|
||||||
'^'=44
|
'&'=44
|
||||||
'|'=45
|
'^'=45
|
||||||
'&&'=46
|
'|'=46
|
||||||
'||'=47
|
'&&'=47
|
||||||
'?'=48
|
'||'=48
|
||||||
':'=49
|
'?'=49
|
||||||
'::'=50
|
':'=50
|
||||||
'->'=51
|
'::'=51
|
||||||
'=~'=52
|
'->'=52
|
||||||
'==~'=53
|
'=~'=53
|
||||||
'++'=54
|
'==~'=54
|
||||||
'--'=55
|
'++'=55
|
||||||
'='=56
|
'--'=56
|
||||||
'+='=57
|
'='=57
|
||||||
'-='=58
|
'+='=58
|
||||||
'*='=59
|
'-='=59
|
||||||
'/='=60
|
'*='=60
|
||||||
'%='=61
|
'/='=61
|
||||||
'&='=62
|
'%='=62
|
||||||
'^='=63
|
'&='=63
|
||||||
'|='=64
|
'^='=64
|
||||||
'<<='=65
|
'|='=65
|
||||||
'>>='=66
|
'<<='=66
|
||||||
'>>>='=67
|
'>>='=67
|
||||||
'true'=74
|
'>>>='=68
|
||||||
'false'=75
|
'true'=75
|
||||||
'null'=76
|
'false'=76
|
||||||
|
'null'=77
|
||||||
|
|
|
@ -105,6 +105,7 @@ expression returns [boolean s = true]
|
||||||
| expression ( FIND | MATCH ) expression { $s = false; } # binary
|
| expression ( FIND | MATCH ) expression { $s = false; } # binary
|
||||||
| expression ( LSH | RSH | USH ) expression { $s = false; } # binary
|
| expression ( LSH | RSH | USH ) expression { $s = false; } # binary
|
||||||
| expression ( LT | LTE | GT | GTE ) expression { $s = false; } # comp
|
| expression ( LT | LTE | GT | GTE ) expression { $s = false; } # comp
|
||||||
|
| expression INSTANCEOF decltype { $s = false; } # instanceof
|
||||||
| expression ( EQ | EQR | NE | NER ) expression { $s = false; } # comp
|
| expression ( EQ | EQR | NE | NER ) expression { $s = false; } # comp
|
||||||
| expression BWAND expression { $s = false; } # binary
|
| expression BWAND expression { $s = false; } # binary
|
||||||
| expression XOR expression { $s = false; } # binary
|
| expression XOR expression { $s = false; } # binary
|
||||||
|
|
|
@ -22,62 +22,63 @@ TRY=21
|
||||||
CATCH=22
|
CATCH=22
|
||||||
THROW=23
|
THROW=23
|
||||||
THIS=24
|
THIS=24
|
||||||
BOOLNOT=25
|
INSTANCEOF=25
|
||||||
BWNOT=26
|
BOOLNOT=26
|
||||||
MUL=27
|
BWNOT=27
|
||||||
DIV=28
|
MUL=28
|
||||||
REM=29
|
DIV=29
|
||||||
ADD=30
|
REM=30
|
||||||
SUB=31
|
ADD=31
|
||||||
LSH=32
|
SUB=32
|
||||||
RSH=33
|
LSH=33
|
||||||
USH=34
|
RSH=34
|
||||||
LT=35
|
USH=35
|
||||||
LTE=36
|
LT=36
|
||||||
GT=37
|
LTE=37
|
||||||
GTE=38
|
GT=38
|
||||||
EQ=39
|
GTE=39
|
||||||
EQR=40
|
EQ=40
|
||||||
NE=41
|
EQR=41
|
||||||
NER=42
|
NE=42
|
||||||
BWAND=43
|
NER=43
|
||||||
XOR=44
|
BWAND=44
|
||||||
BWOR=45
|
XOR=45
|
||||||
BOOLAND=46
|
BWOR=46
|
||||||
BOOLOR=47
|
BOOLAND=47
|
||||||
COND=48
|
BOOLOR=48
|
||||||
COLON=49
|
COND=49
|
||||||
REF=50
|
COLON=50
|
||||||
ARROW=51
|
REF=51
|
||||||
FIND=52
|
ARROW=52
|
||||||
MATCH=53
|
FIND=53
|
||||||
INCR=54
|
MATCH=54
|
||||||
DECR=55
|
INCR=55
|
||||||
ASSIGN=56
|
DECR=56
|
||||||
AADD=57
|
ASSIGN=57
|
||||||
ASUB=58
|
AADD=58
|
||||||
AMUL=59
|
ASUB=59
|
||||||
ADIV=60
|
AMUL=60
|
||||||
AREM=61
|
ADIV=61
|
||||||
AAND=62
|
AREM=62
|
||||||
AXOR=63
|
AAND=63
|
||||||
AOR=64
|
AXOR=64
|
||||||
ALSH=65
|
AOR=65
|
||||||
ARSH=66
|
ALSH=66
|
||||||
AUSH=67
|
ARSH=67
|
||||||
OCTAL=68
|
AUSH=68
|
||||||
HEX=69
|
OCTAL=69
|
||||||
INTEGER=70
|
HEX=70
|
||||||
DECIMAL=71
|
INTEGER=71
|
||||||
STRING=72
|
DECIMAL=72
|
||||||
REGEX=73
|
STRING=73
|
||||||
TRUE=74
|
REGEX=74
|
||||||
FALSE=75
|
TRUE=75
|
||||||
NULL=76
|
FALSE=76
|
||||||
TYPE=77
|
NULL=77
|
||||||
ID=78
|
TYPE=78
|
||||||
DOTINTEGER=79
|
ID=79
|
||||||
DOTID=80
|
DOTINTEGER=80
|
||||||
|
DOTID=81
|
||||||
'{'=3
|
'{'=3
|
||||||
'}'=4
|
'}'=4
|
||||||
'['=5
|
'['=5
|
||||||
|
@ -100,49 +101,50 @@ DOTID=80
|
||||||
'catch'=22
|
'catch'=22
|
||||||
'throw'=23
|
'throw'=23
|
||||||
'this'=24
|
'this'=24
|
||||||
'!'=25
|
'instanceof'=25
|
||||||
'~'=26
|
'!'=26
|
||||||
'*'=27
|
'~'=27
|
||||||
'/'=28
|
'*'=28
|
||||||
'%'=29
|
'/'=29
|
||||||
'+'=30
|
'%'=30
|
||||||
'-'=31
|
'+'=31
|
||||||
'<<'=32
|
'-'=32
|
||||||
'>>'=33
|
'<<'=33
|
||||||
'>>>'=34
|
'>>'=34
|
||||||
'<'=35
|
'>>>'=35
|
||||||
'<='=36
|
'<'=36
|
||||||
'>'=37
|
'<='=37
|
||||||
'>='=38
|
'>'=38
|
||||||
'=='=39
|
'>='=39
|
||||||
'==='=40
|
'=='=40
|
||||||
'!='=41
|
'==='=41
|
||||||
'!=='=42
|
'!='=42
|
||||||
'&'=43
|
'!=='=43
|
||||||
'^'=44
|
'&'=44
|
||||||
'|'=45
|
'^'=45
|
||||||
'&&'=46
|
'|'=46
|
||||||
'||'=47
|
'&&'=47
|
||||||
'?'=48
|
'||'=48
|
||||||
':'=49
|
'?'=49
|
||||||
'::'=50
|
':'=50
|
||||||
'->'=51
|
'::'=51
|
||||||
'=~'=52
|
'->'=52
|
||||||
'==~'=53
|
'=~'=53
|
||||||
'++'=54
|
'==~'=54
|
||||||
'--'=55
|
'++'=55
|
||||||
'='=56
|
'--'=56
|
||||||
'+='=57
|
'='=57
|
||||||
'-='=58
|
'+='=58
|
||||||
'*='=59
|
'-='=59
|
||||||
'/='=60
|
'*='=60
|
||||||
'%='=61
|
'/='=61
|
||||||
'&='=62
|
'%='=62
|
||||||
'^='=63
|
'&='=63
|
||||||
'|='=64
|
'^='=64
|
||||||
'<<='=65
|
'|='=65
|
||||||
'>>='=66
|
'<<='=66
|
||||||
'>>>='=67
|
'>>='=67
|
||||||
'true'=74
|
'>>>='=68
|
||||||
'false'=75
|
'true'=75
|
||||||
'null'=76
|
'false'=76
|
||||||
|
'null'=77
|
||||||
|
|
|
@ -64,6 +64,30 @@ public class Augmentation {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Converts this Iterable to a Collection. Returns the original Iterable if it is already a Collection. */
|
||||||
|
public static <T> Collection<T> asCollection(Iterable<T> receiver) {
|
||||||
|
if (receiver instanceof Collection) {
|
||||||
|
return (Collection<T>)receiver;
|
||||||
|
}
|
||||||
|
List<T> list = new ArrayList<>();
|
||||||
|
for (T t : receiver) {
|
||||||
|
list.add(t);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Converts this Iterable to a List. Returns the original Iterable if it is already a List. */
|
||||||
|
public static <T> List<T> asList(Iterable<T> receiver) {
|
||||||
|
if (receiver instanceof List) {
|
||||||
|
return (List<T>)receiver;
|
||||||
|
}
|
||||||
|
List<T> list = new ArrayList<>();
|
||||||
|
for (T t : receiver) {
|
||||||
|
list.add(t);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
/** Counts the number of occurrences which satisfy the given predicate from inside this Iterable. */
|
/** Counts the number of occurrences which satisfy the given predicate from inside this Iterable. */
|
||||||
public static <T> int count(Iterable<T> receiver, Predicate<T> predicate) {
|
public static <T> int count(Iterable<T> receiver, Predicate<T> predicate) {
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -155,6 +179,17 @@ public class Augmentation {
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sums the result of an Iterable
|
||||||
|
*/
|
||||||
|
public static <T extends Number> double sum(Iterable<T> receiver) {
|
||||||
|
double sum = 0;
|
||||||
|
for (T t : receiver) {
|
||||||
|
sum += t.doubleValue();
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sums the result of applying a function to each item of an Iterable.
|
* Sums the result of applying a function to each item of an Iterable.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,14 +22,14 @@ class PainlessLexer extends Lexer {
|
||||||
public static final int
|
public static final int
|
||||||
WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
|
WS=1, COMMENT=2, LBRACK=3, RBRACK=4, LBRACE=5, RBRACE=6, LP=7, RP=8, DOT=9,
|
||||||
COMMA=10, SEMICOLON=11, IF=12, ELSE=13, WHILE=14, DO=15, FOR=16, CONTINUE=17,
|
COMMA=10, SEMICOLON=11, IF=12, ELSE=13, WHILE=14, DO=15, FOR=16, CONTINUE=17,
|
||||||
BREAK=18, RETURN=19, NEW=20, TRY=21, CATCH=22, THROW=23, THIS=24, BOOLNOT=25,
|
BREAK=18, RETURN=19, NEW=20, TRY=21, CATCH=22, THROW=23, THIS=24, INSTANCEOF=25,
|
||||||
BWNOT=26, MUL=27, DIV=28, REM=29, ADD=30, SUB=31, LSH=32, RSH=33, USH=34,
|
BOOLNOT=26, BWNOT=27, MUL=28, DIV=29, REM=30, ADD=31, SUB=32, LSH=33,
|
||||||
LT=35, LTE=36, GT=37, GTE=38, EQ=39, EQR=40, NE=41, NER=42, BWAND=43,
|
RSH=34, USH=35, LT=36, LTE=37, GT=38, GTE=39, EQ=40, EQR=41, NE=42, NER=43,
|
||||||
XOR=44, BWOR=45, BOOLAND=46, BOOLOR=47, COND=48, COLON=49, REF=50, ARROW=51,
|
BWAND=44, XOR=45, BWOR=46, BOOLAND=47, BOOLOR=48, COND=49, COLON=50, REF=51,
|
||||||
FIND=52, MATCH=53, INCR=54, DECR=55, ASSIGN=56, AADD=57, ASUB=58, AMUL=59,
|
ARROW=52, FIND=53, MATCH=54, INCR=55, DECR=56, ASSIGN=57, AADD=58, ASUB=59,
|
||||||
ADIV=60, AREM=61, AAND=62, AXOR=63, AOR=64, ALSH=65, ARSH=66, AUSH=67,
|
AMUL=60, ADIV=61, AREM=62, AAND=63, AXOR=64, AOR=65, ALSH=66, ARSH=67,
|
||||||
OCTAL=68, HEX=69, INTEGER=70, DECIMAL=71, STRING=72, REGEX=73, TRUE=74,
|
AUSH=68, OCTAL=69, HEX=70, INTEGER=71, DECIMAL=72, STRING=73, REGEX=74,
|
||||||
FALSE=75, NULL=76, TYPE=77, ID=78, DOTINTEGER=79, DOTID=80;
|
TRUE=75, FALSE=76, NULL=77, TYPE=78, ID=79, DOTINTEGER=80, DOTID=81;
|
||||||
public static final int AFTER_DOT = 1;
|
public static final int AFTER_DOT = 1;
|
||||||
public static String[] modeNames = {
|
public static String[] modeNames = {
|
||||||
"DEFAULT_MODE", "AFTER_DOT"
|
"DEFAULT_MODE", "AFTER_DOT"
|
||||||
|
@ -38,9 +38,9 @@ class PainlessLexer extends Lexer {
|
||||||
public static final String[] ruleNames = {
|
public static final String[] ruleNames = {
|
||||||
"WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP", "DOT",
|
"WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP", "DOT",
|
||||||
"COMMA", "SEMICOLON", "IF", "ELSE", "WHILE", "DO", "FOR", "CONTINUE",
|
"COMMA", "SEMICOLON", "IF", "ELSE", "WHILE", "DO", "FOR", "CONTINUE",
|
||||||
"BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS", "BOOLNOT",
|
"BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS", "INSTANCEOF",
|
||||||
"BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH", "RSH", "USH", "LT",
|
"BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH", "RSH", "USH",
|
||||||
"LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND", "XOR", "BWOR",
|
"LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND", "XOR", "BWOR",
|
||||||
"BOOLAND", "BOOLOR", "COND", "COLON", "REF", "ARROW", "FIND", "MATCH",
|
"BOOLAND", "BOOLOR", "COND", "COLON", "REF", "ARROW", "FIND", "MATCH",
|
||||||
"INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV", "AREM", "AAND",
|
"INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV", "AREM", "AAND",
|
||||||
"AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX", "INTEGER", "DECIMAL",
|
"AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX", "INTEGER", "DECIMAL",
|
||||||
|
@ -51,20 +51,20 @@ class PainlessLexer extends Lexer {
|
||||||
private static final String[] _LITERAL_NAMES = {
|
private static final String[] _LITERAL_NAMES = {
|
||||||
null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "','",
|
null, null, null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "','",
|
||||||
"';'", "'if'", "'else'", "'while'", "'do'", "'for'", "'continue'", "'break'",
|
"';'", "'if'", "'else'", "'while'", "'do'", "'for'", "'continue'", "'break'",
|
||||||
"'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'", "'!'", "'~'",
|
"'return'", "'new'", "'try'", "'catch'", "'throw'", "'this'", "'instanceof'",
|
||||||
"'*'", "'/'", "'%'", "'+'", "'-'", "'<<'", "'>>'", "'>>>'", "'<'", "'<='",
|
"'!'", "'~'", "'*'", "'/'", "'%'", "'+'", "'-'", "'<<'", "'>>'", "'>>>'",
|
||||||
"'>'", "'>='", "'=='", "'==='", "'!='", "'!=='", "'&'", "'^'", "'|'",
|
"'<'", "'<='", "'>'", "'>='", "'=='", "'==='", "'!='", "'!=='", "'&'",
|
||||||
"'&&'", "'||'", "'?'", "':'", "'::'", "'->'", "'=~'", "'==~'", "'++'",
|
"'^'", "'|'", "'&&'", "'||'", "'?'", "':'", "'::'", "'->'", "'=~'", "'==~'",
|
||||||
"'--'", "'='", "'+='", "'-='", "'*='", "'/='", "'%='", "'&='", "'^='",
|
"'++'", "'--'", "'='", "'+='", "'-='", "'*='", "'/='", "'%='", "'&='",
|
||||||
"'|='", "'<<='", "'>>='", "'>>>='", null, null, null, null, null, null,
|
"'^='", "'|='", "'<<='", "'>>='", "'>>>='", null, null, null, null, null,
|
||||||
"'true'", "'false'", "'null'"
|
null, "'true'", "'false'", "'null'"
|
||||||
};
|
};
|
||||||
private static final String[] _SYMBOLIC_NAMES = {
|
private static final String[] _SYMBOLIC_NAMES = {
|
||||||
null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
|
null, "WS", "COMMENT", "LBRACK", "RBRACK", "LBRACE", "RBRACE", "LP", "RP",
|
||||||
"DOT", "COMMA", "SEMICOLON", "IF", "ELSE", "WHILE", "DO", "FOR", "CONTINUE",
|
"DOT", "COMMA", "SEMICOLON", "IF", "ELSE", "WHILE", "DO", "FOR", "CONTINUE",
|
||||||
"BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS", "BOOLNOT",
|
"BREAK", "RETURN", "NEW", "TRY", "CATCH", "THROW", "THIS", "INSTANCEOF",
|
||||||
"BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH", "RSH", "USH", "LT",
|
"BOOLNOT", "BWNOT", "MUL", "DIV", "REM", "ADD", "SUB", "LSH", "RSH", "USH",
|
||||||
"LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND", "XOR", "BWOR",
|
"LT", "LTE", "GT", "GTE", "EQ", "EQR", "NE", "NER", "BWAND", "XOR", "BWOR",
|
||||||
"BOOLAND", "BOOLOR", "COND", "COLON", "REF", "ARROW", "FIND", "MATCH",
|
"BOOLAND", "BOOLOR", "COND", "COLON", "REF", "ARROW", "FIND", "MATCH",
|
||||||
"INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV", "AREM", "AAND",
|
"INCR", "DECR", "ASSIGN", "AADD", "ASUB", "AMUL", "ADIV", "AREM", "AAND",
|
||||||
"AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX", "INTEGER", "DECIMAL",
|
"AXOR", "AOR", "ALSH", "ARSH", "AUSH", "OCTAL", "HEX", "INTEGER", "DECIMAL",
|
||||||
|
@ -128,11 +128,11 @@ class PainlessLexer extends Lexer {
|
||||||
@Override
|
@Override
|
||||||
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
|
public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
|
||||||
switch (ruleIndex) {
|
switch (ruleIndex) {
|
||||||
case 27:
|
case 28:
|
||||||
return DIV_sempred((RuleContext)_localctx, predIndex);
|
return DIV_sempred((RuleContext)_localctx, predIndex);
|
||||||
case 72:
|
case 73:
|
||||||
return REGEX_sempred((RuleContext)_localctx, predIndex);
|
return REGEX_sempred((RuleContext)_localctx, predIndex);
|
||||||
case 76:
|
case 77:
|
||||||
return TYPE_sempred((RuleContext)_localctx, predIndex);
|
return TYPE_sempred((RuleContext)_localctx, predIndex);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -160,7 +160,7 @@ class PainlessLexer extends Lexer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String _serializedATN =
|
public static final String _serializedATN =
|
||||||
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2R\u0239\b\1\b\1\4"+
|
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2S\u0246\b\1\b\1\4"+
|
||||||
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
|
"\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+
|
||||||
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
|
"\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
|
||||||
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
|
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
|
||||||
|
@ -169,196 +169,201 @@ class PainlessLexer extends Lexer {
|
||||||
"+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+
|
"+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+
|
||||||
"\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+
|
"\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t"+
|
||||||
"=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+
|
"=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4"+
|
||||||
"I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\3\2\6\2\u00a6\n\2"+
|
"I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\3\2\6\2\u00a8"+
|
||||||
"\r\2\16\2\u00a7\3\2\3\2\3\3\3\3\3\3\3\3\7\3\u00b0\n\3\f\3\16\3\u00b3\13"+
|
"\n\2\r\2\16\2\u00a9\3\2\3\2\3\3\3\3\3\3\3\3\7\3\u00b2\n\3\f\3\16\3\u00b5"+
|
||||||
"\3\3\3\3\3\3\3\3\3\3\3\7\3\u00ba\n\3\f\3\16\3\u00bd\13\3\3\3\3\3\5\3\u00c1"+
|
"\13\3\3\3\3\3\3\3\3\3\3\3\7\3\u00bc\n\3\f\3\16\3\u00bf\13\3\3\3\3\3\5"+
|
||||||
"\n\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3"+
|
"\3\u00c3\n\3\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3"+
|
||||||
"\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17"+
|
"\n\3\n\3\n\3\n\3\13\3\13\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+
|
||||||
"\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22"+
|
"\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22"+
|
||||||
"\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24"+
|
"\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23"+
|
||||||
"\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27"+
|
"\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
|
||||||
"\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31"+
|
"\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31"+
|
||||||
"\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+
|
"\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32"+
|
||||||
"\3\37\3 \3 \3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3#\3$\3$\3%\3%\3%\3&\3&\3\'"+
|
"\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3 \3 \3!"+
|
||||||
"\3\'\3\'\3(\3(\3(\3)\3)\3)\3)\3*\3*\3*\3+\3+\3+\3+\3,\3,\3-\3-\3.\3.\3"+
|
"\3!\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'\3\'\3(\3(\3(\3"+
|
||||||
"/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3"+
|
")\3)\3)\3*\3*\3*\3*\3+\3+\3+\3,\3,\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3"+
|
||||||
"\64\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\67\3\67\3\67\38\38\38\39\39\3"+
|
"\60\3\61\3\61\3\61\3\62\3\62\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3"+
|
||||||
":\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3@\3@\3@\3A\3A\3"+
|
"\66\3\66\3\66\3\67\3\67\3\67\3\67\38\38\38\39\39\39\3:\3:\3;\3;\3;\3<"+
|
||||||
"A\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\6E\u019a\nE\rE\16E\u019b"+
|
"\3<\3<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C"+
|
||||||
"\3E\5E\u019f\nE\3F\3F\3F\6F\u01a4\nF\rF\16F\u01a5\3F\5F\u01a9\nF\3G\3"+
|
"\3C\3D\3D\3D\3D\3E\3E\3E\3E\3E\3F\3F\6F\u01a7\nF\rF\16F\u01a8\3F\5F\u01ac"+
|
||||||
"G\3G\7G\u01ae\nG\fG\16G\u01b1\13G\5G\u01b3\nG\3G\5G\u01b6\nG\3H\3H\3H"+
|
"\nF\3G\3G\3G\6G\u01b1\nG\rG\16G\u01b2\3G\5G\u01b6\nG\3H\3H\3H\7H\u01bb"+
|
||||||
"\7H\u01bb\nH\fH\16H\u01be\13H\5H\u01c0\nH\3H\3H\6H\u01c4\nH\rH\16H\u01c5"+
|
"\nH\fH\16H\u01be\13H\5H\u01c0\nH\3H\5H\u01c3\nH\3I\3I\3I\7I\u01c8\nI\f"+
|
||||||
"\5H\u01c8\nH\3H\3H\5H\u01cc\nH\3H\6H\u01cf\nH\rH\16H\u01d0\5H\u01d3\n"+
|
"I\16I\u01cb\13I\5I\u01cd\nI\3I\3I\6I\u01d1\nI\rI\16I\u01d2\5I\u01d5\n"+
|
||||||
"H\3H\5H\u01d6\nH\3I\3I\3I\3I\3I\3I\7I\u01de\nI\fI\16I\u01e1\13I\3I\3I"+
|
"I\3I\3I\5I\u01d9\nI\3I\6I\u01dc\nI\rI\16I\u01dd\5I\u01e0\nI\3I\5I\u01e3"+
|
||||||
"\3I\3I\3I\3I\3I\7I\u01ea\nI\fI\16I\u01ed\13I\3I\5I\u01f0\nI\3J\3J\3J\3"+
|
"\nI\3J\3J\3J\3J\3J\3J\7J\u01eb\nJ\fJ\16J\u01ee\13J\3J\3J\3J\3J\3J\3J\3"+
|
||||||
"J\6J\u01f6\nJ\rJ\16J\u01f7\3J\3J\7J\u01fc\nJ\fJ\16J\u01ff\13J\3J\3J\3"+
|
"J\7J\u01f7\nJ\fJ\16J\u01fa\13J\3J\5J\u01fd\nJ\3K\3K\3K\3K\6K\u0203\nK"+
|
||||||
"K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\7N\u0217\n"+
|
"\rK\16K\u0204\3K\3K\7K\u0209\nK\fK\16K\u020c\13K\3K\3K\3L\3L\3L\3L\3L"+
|
||||||
"N\fN\16N\u021a\13N\3N\3N\3O\3O\7O\u0220\nO\fO\16O\u0223\13O\3P\3P\3P\7"+
|
"\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\7O\u0224\nO\fO\16O\u0227"+
|
||||||
"P\u0228\nP\fP\16P\u022b\13P\5P\u022d\nP\3P\3P\3Q\3Q\7Q\u0233\nQ\fQ\16"+
|
"\13O\3O\3O\3P\3P\7P\u022d\nP\fP\16P\u0230\13P\3Q\3Q\3Q\7Q\u0235\nQ\fQ"+
|
||||||
"Q\u0236\13Q\3Q\3Q\6\u00b1\u00bb\u01df\u01eb\2R\4\3\6\4\b\5\n\6\f\7\16"+
|
"\16Q\u0238\13Q\5Q\u023a\nQ\3Q\3Q\3R\3R\7R\u0240\nR\fR\16R\u0243\13R\3"+
|
||||||
"\b\20\t\22\n\24\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26"+
|
"R\3R\6\u00b3\u00bd\u01ec\u01f8\2S\4\3\6\4\b\5\n\6\f\7\16\b\20\t\22\n\24"+
|
||||||
",\27.\30\60\31\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T"+
|
"\13\26\f\30\r\32\16\34\17\36\20 \21\"\22$\23&\24(\25*\26,\27.\30\60\31"+
|
||||||
"+V,X-Z.\\/^\60`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v<x=z>|?~@\u0080A\u0082"+
|
"\62\32\64\33\66\348\35:\36<\37> @!B\"D#F$H%J&L\'N(P)R*T+V,X-Z.\\/^\60"+
|
||||||
"B\u0084C\u0086D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096"+
|
"`\61b\62d\63f\64h\65j\66l\67n8p9r:t;v<x=z>|?~@\u0080A\u0082B\u0084C\u0086"+
|
||||||
"L\u0098M\u009aN\u009cO\u009eP\u00a0Q\u00a2R\4\2\3\24\5\2\13\f\17\17\""+
|
"D\u0088E\u008aF\u008cG\u008eH\u0090I\u0092J\u0094K\u0096L\u0098M\u009a"+
|
||||||
"\"\4\2\f\f\17\17\3\2\629\4\2NNnn\4\2ZZzz\5\2\62;CHch\3\2\63;\3\2\62;\b"+
|
"N\u009cO\u009eP\u00a0Q\u00a2R\u00a4S\4\2\3\24\5\2\13\f\17\17\"\"\4\2\f"+
|
||||||
"\2FFHHNNffhhnn\4\2GGgg\4\2--//\4\2HHhh\4\2$$^^\4\2\f\f\61\61\3\2\f\f\t"+
|
"\f\17\17\3\2\629\4\2NNnn\4\2ZZzz\5\2\62;CHch\3\2\63;\3\2\62;\b\2FFHHN"+
|
||||||
"\2WWeekknouuwwzz\5\2C\\aac|\6\2\62;C\\aac|\u0259\2\4\3\2\2\2\2\6\3\2\2"+
|
"Nffhhnn\4\2GGgg\4\2--//\4\2HHhh\4\2$$^^\4\2\f\f\61\61\3\2\f\f\t\2WWee"+
|
||||||
"\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22"+
|
"kknouuwwzz\5\2C\\aac|\6\2\62;C\\aac|\u0266\2\4\3\2\2\2\2\6\3\2\2\2\2\b"+
|
||||||
"\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2"+
|
"\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2\2\20\3\2\2\2\2\22\3\2\2"+
|
||||||
"\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2"+
|
"\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32\3\2\2\2\2\34\3\2\2\2\2"+
|
||||||
"\2\2\2*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3"+
|
"\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2&\3\2\2\2\2(\3\2\2\2\2"+
|
||||||
"\2\2\2\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2"+
|
"*\3\2\2\2\2,\3\2\2\2\2.\3\2\2\2\2\60\3\2\2\2\2\62\3\2\2\2\2\64\3\2\2\2"+
|
||||||
"\2\2\2B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2"+
|
"\2\66\3\2\2\2\28\3\2\2\2\2:\3\2\2\2\2<\3\2\2\2\2>\3\2\2\2\2@\3\2\2\2\2"+
|
||||||
"\2N\3\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z"+
|
"B\3\2\2\2\2D\3\2\2\2\2F\3\2\2\2\2H\3\2\2\2\2J\3\2\2\2\2L\3\2\2\2\2N\3"+
|
||||||
"\3\2\2\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3"+
|
"\2\2\2\2P\3\2\2\2\2R\3\2\2\2\2T\3\2\2\2\2V\3\2\2\2\2X\3\2\2\2\2Z\3\2\2"+
|
||||||
"\2\2\2\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2"+
|
"\2\2\\\3\2\2\2\2^\3\2\2\2\2`\3\2\2\2\2b\3\2\2\2\2d\3\2\2\2\2f\3\2\2\2"+
|
||||||
"\2\2t\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2"+
|
"\2h\3\2\2\2\2j\3\2\2\2\2l\3\2\2\2\2n\3\2\2\2\2p\3\2\2\2\2r\3\2\2\2\2t"+
|
||||||
"\u0080\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088"+
|
"\3\2\2\2\2v\3\2\2\2\2x\3\2\2\2\2z\3\2\2\2\2|\3\2\2\2\2~\3\2\2\2\2\u0080"+
|
||||||
"\3\2\2\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2"+
|
"\3\2\2\2\2\u0082\3\2\2\2\2\u0084\3\2\2\2\2\u0086\3\2\2\2\2\u0088\3\2\2"+
|
||||||
"\2\2\u0092\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a"+
|
"\2\2\u008a\3\2\2\2\2\u008c\3\2\2\2\2\u008e\3\2\2\2\2\u0090\3\2\2\2\2\u0092"+
|
||||||
"\3\2\2\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\3\u00a0\3\2\2\2\3\u00a2\3\2\2"+
|
"\3\2\2\2\2\u0094\3\2\2\2\2\u0096\3\2\2\2\2\u0098\3\2\2\2\2\u009a\3\2\2"+
|
||||||
"\2\4\u00a5\3\2\2\2\6\u00c0\3\2\2\2\b\u00c4\3\2\2\2\n\u00c6\3\2\2\2\f\u00c8"+
|
"\2\2\u009c\3\2\2\2\2\u009e\3\2\2\2\2\u00a0\3\2\2\2\3\u00a2\3\2\2\2\3\u00a4"+
|
||||||
"\3\2\2\2\16\u00ca\3\2\2\2\20\u00cc\3\2\2\2\22\u00ce\3\2\2\2\24\u00d0\3"+
|
"\3\2\2\2\4\u00a7\3\2\2\2\6\u00c2\3\2\2\2\b\u00c6\3\2\2\2\n\u00c8\3\2\2"+
|
||||||
"\2\2\2\26\u00d4\3\2\2\2\30\u00d6\3\2\2\2\32\u00d8\3\2\2\2\34\u00db\3\2"+
|
"\2\f\u00ca\3\2\2\2\16\u00cc\3\2\2\2\20\u00ce\3\2\2\2\22\u00d0\3\2\2\2"+
|
||||||
"\2\2\36\u00e0\3\2\2\2 \u00e6\3\2\2\2\"\u00e9\3\2\2\2$\u00ed\3\2\2\2&\u00f6"+
|
"\24\u00d2\3\2\2\2\26\u00d6\3\2\2\2\30\u00d8\3\2\2\2\32\u00da\3\2\2\2\34"+
|
||||||
"\3\2\2\2(\u00fc\3\2\2\2*\u0103\3\2\2\2,\u0107\3\2\2\2.\u010b\3\2\2\2\60"+
|
"\u00dd\3\2\2\2\36\u00e2\3\2\2\2 \u00e8\3\2\2\2\"\u00eb\3\2\2\2$\u00ef"+
|
||||||
"\u0111\3\2\2\2\62\u0117\3\2\2\2\64\u011c\3\2\2\2\66\u011e\3\2\2\28\u0120"+
|
"\3\2\2\2&\u00f8\3\2\2\2(\u00fe\3\2\2\2*\u0105\3\2\2\2,\u0109\3\2\2\2."+
|
||||||
"\3\2\2\2:\u0122\3\2\2\2<\u0125\3\2\2\2>\u0127\3\2\2\2@\u0129\3\2\2\2B"+
|
"\u010d\3\2\2\2\60\u0113\3\2\2\2\62\u0119\3\2\2\2\64\u011e\3\2\2\2\66\u0129"+
|
||||||
"\u012b\3\2\2\2D\u012e\3\2\2\2F\u0131\3\2\2\2H\u0135\3\2\2\2J\u0137\3\2"+
|
"\3\2\2\28\u012b\3\2\2\2:\u012d\3\2\2\2<\u012f\3\2\2\2>\u0132\3\2\2\2@"+
|
||||||
"\2\2L\u013a\3\2\2\2N\u013c\3\2\2\2P\u013f\3\2\2\2R\u0142\3\2\2\2T\u0146"+
|
"\u0134\3\2\2\2B\u0136\3\2\2\2D\u0138\3\2\2\2F\u013b\3\2\2\2H\u013e\3\2"+
|
||||||
"\3\2\2\2V\u0149\3\2\2\2X\u014d\3\2\2\2Z\u014f\3\2\2\2\\\u0151\3\2\2\2"+
|
"\2\2J\u0142\3\2\2\2L\u0144\3\2\2\2N\u0147\3\2\2\2P\u0149\3\2\2\2R\u014c"+
|
||||||
"^\u0153\3\2\2\2`\u0156\3\2\2\2b\u0159\3\2\2\2d\u015b\3\2\2\2f\u015d\3"+
|
"\3\2\2\2T\u014f\3\2\2\2V\u0153\3\2\2\2X\u0156\3\2\2\2Z\u015a\3\2\2\2\\"+
|
||||||
"\2\2\2h\u0160\3\2\2\2j\u0163\3\2\2\2l\u0166\3\2\2\2n\u016a\3\2\2\2p\u016d"+
|
"\u015c\3\2\2\2^\u015e\3\2\2\2`\u0160\3\2\2\2b\u0163\3\2\2\2d\u0166\3\2"+
|
||||||
"\3\2\2\2r\u0170\3\2\2\2t\u0172\3\2\2\2v\u0175\3\2\2\2x\u0178\3\2\2\2z"+
|
"\2\2f\u0168\3\2\2\2h\u016a\3\2\2\2j\u016d\3\2\2\2l\u0170\3\2\2\2n\u0173"+
|
||||||
"\u017b\3\2\2\2|\u017e\3\2\2\2~\u0181\3\2\2\2\u0080\u0184\3\2\2\2\u0082"+
|
"\3\2\2\2p\u0177\3\2\2\2r\u017a\3\2\2\2t\u017d\3\2\2\2v\u017f\3\2\2\2x"+
|
||||||
"\u0187\3\2\2\2\u0084\u018a\3\2\2\2\u0086\u018e\3\2\2\2\u0088\u0192\3\2"+
|
"\u0182\3\2\2\2z\u0185\3\2\2\2|\u0188\3\2\2\2~\u018b\3\2\2\2\u0080\u018e"+
|
||||||
"\2\2\u008a\u0197\3\2\2\2\u008c\u01a0\3\2\2\2\u008e\u01b2\3\2\2\2\u0090"+
|
"\3\2\2\2\u0082\u0191\3\2\2\2\u0084\u0194\3\2\2\2\u0086\u0197\3\2\2\2\u0088"+
|
||||||
"\u01bf\3\2\2\2\u0092\u01ef\3\2\2\2\u0094\u01f1\3\2\2\2\u0096\u0202\3\2"+
|
"\u019b\3\2\2\2\u008a\u019f\3\2\2\2\u008c\u01a4\3\2\2\2\u008e\u01ad\3\2"+
|
||||||
"\2\2\u0098\u0207\3\2\2\2\u009a\u020d\3\2\2\2\u009c\u0212\3\2\2\2\u009e"+
|
"\2\2\u0090\u01bf\3\2\2\2\u0092\u01cc\3\2\2\2\u0094\u01fc\3\2\2\2\u0096"+
|
||||||
"\u021d\3\2\2\2\u00a0\u022c\3\2\2\2\u00a2\u0230\3\2\2\2\u00a4\u00a6\t\2"+
|
"\u01fe\3\2\2\2\u0098\u020f\3\2\2\2\u009a\u0214\3\2\2\2\u009c\u021a\3\2"+
|
||||||
"\2\2\u00a5\u00a4\3\2\2\2\u00a6\u00a7\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a7"+
|
"\2\2\u009e\u021f\3\2\2\2\u00a0\u022a\3\2\2\2\u00a2\u0239\3\2\2\2\u00a4"+
|
||||||
"\u00a8\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00aa\b\2\2\2\u00aa\5\3\2\2\2"+
|
"\u023d\3\2\2\2\u00a6\u00a8\t\2\2\2\u00a7\u00a6\3\2\2\2\u00a8\u00a9\3\2"+
|
||||||
"\u00ab\u00ac\7\61\2\2\u00ac\u00ad\7\61\2\2\u00ad\u00b1\3\2\2\2\u00ae\u00b0"+
|
"\2\2\u00a9\u00a7\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab"+
|
||||||
"\13\2\2\2\u00af\u00ae\3\2\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00b2\3\2\2\2"+
|
"\u00ac\b\2\2\2\u00ac\5\3\2\2\2\u00ad\u00ae\7\61\2\2\u00ae\u00af\7\61\2"+
|
||||||
"\u00b1\u00af\3\2\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00c1"+
|
"\2\u00af\u00b3\3\2\2\2\u00b0\u00b2\13\2\2\2\u00b1\u00b0\3\2\2\2\u00b2"+
|
||||||
"\t\3\2\2\u00b5\u00b6\7\61\2\2\u00b6\u00b7\7,\2\2\u00b7\u00bb\3\2\2\2\u00b8"+
|
"\u00b5\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b6\3\2"+
|
||||||
"\u00ba\13\2\2\2\u00b9\u00b8\3\2\2\2\u00ba\u00bd\3\2\2\2\u00bb\u00bc\3"+
|
"\2\2\u00b5\u00b3\3\2\2\2\u00b6\u00c3\t\3\2\2\u00b7\u00b8\7\61\2\2\u00b8"+
|
||||||
"\2\2\2\u00bb\u00b9\3\2\2\2\u00bc\u00be\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be"+
|
"\u00b9\7,\2\2\u00b9\u00bd\3\2\2\2\u00ba\u00bc\13\2\2\2\u00bb\u00ba\3\2"+
|
||||||
"\u00bf\7,\2\2\u00bf\u00c1\7\61\2\2\u00c0\u00ab\3\2\2\2\u00c0\u00b5\3\2"+
|
"\2\2\u00bc\u00bf\3\2\2\2\u00bd\u00be\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be"+
|
||||||
"\2\2\u00c1\u00c2\3\2\2\2\u00c2\u00c3\b\3\2\2\u00c3\7\3\2\2\2\u00c4\u00c5"+
|
"\u00c0\3\2\2\2\u00bf\u00bd\3\2\2\2\u00c0\u00c1\7,\2\2\u00c1\u00c3\7\61"+
|
||||||
"\7}\2\2\u00c5\t\3\2\2\2\u00c6\u00c7\7\177\2\2\u00c7\13\3\2\2\2\u00c8\u00c9"+
|
"\2\2\u00c2\u00ad\3\2\2\2\u00c2\u00b7\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4"+
|
||||||
"\7]\2\2\u00c9\r\3\2\2\2\u00ca\u00cb\7_\2\2\u00cb\17\3\2\2\2\u00cc\u00cd"+
|
"\u00c5\b\3\2\2\u00c5\7\3\2\2\2\u00c6\u00c7\7}\2\2\u00c7\t\3\2\2\2\u00c8"+
|
||||||
"\7*\2\2\u00cd\21\3\2\2\2\u00ce\u00cf\7+\2\2\u00cf\23\3\2\2\2\u00d0\u00d1"+
|
"\u00c9\7\177\2\2\u00c9\13\3\2\2\2\u00ca\u00cb\7]\2\2\u00cb\r\3\2\2\2\u00cc"+
|
||||||
"\7\60\2\2\u00d1\u00d2\3\2\2\2\u00d2\u00d3\b\n\3\2\u00d3\25\3\2\2\2\u00d4"+
|
"\u00cd\7_\2\2\u00cd\17\3\2\2\2\u00ce\u00cf\7*\2\2\u00cf\21\3\2\2\2\u00d0"+
|
||||||
"\u00d5\7.\2\2\u00d5\27\3\2\2\2\u00d6\u00d7\7=\2\2\u00d7\31\3\2\2\2\u00d8"+
|
"\u00d1\7+\2\2\u00d1\23\3\2\2\2\u00d2\u00d3\7\60\2\2\u00d3\u00d4\3\2\2"+
|
||||||
"\u00d9\7k\2\2\u00d9\u00da\7h\2\2\u00da\33\3\2\2\2\u00db\u00dc\7g\2\2\u00dc"+
|
"\2\u00d4\u00d5\b\n\3\2\u00d5\25\3\2\2\2\u00d6\u00d7\7.\2\2\u00d7\27\3"+
|
||||||
"\u00dd\7n\2\2\u00dd\u00de\7u\2\2\u00de\u00df\7g\2\2\u00df\35\3\2\2\2\u00e0"+
|
"\2\2\2\u00d8\u00d9\7=\2\2\u00d9\31\3\2\2\2\u00da\u00db\7k\2\2\u00db\u00dc"+
|
||||||
"\u00e1\7y\2\2\u00e1\u00e2\7j\2\2\u00e2\u00e3\7k\2\2\u00e3\u00e4\7n\2\2"+
|
"\7h\2\2\u00dc\33\3\2\2\2\u00dd\u00de\7g\2\2\u00de\u00df\7n\2\2\u00df\u00e0"+
|
||||||
"\u00e4\u00e5\7g\2\2\u00e5\37\3\2\2\2\u00e6\u00e7\7f\2\2\u00e7\u00e8\7"+
|
"\7u\2\2\u00e0\u00e1\7g\2\2\u00e1\35\3\2\2\2\u00e2\u00e3\7y\2\2\u00e3\u00e4"+
|
||||||
"q\2\2\u00e8!\3\2\2\2\u00e9\u00ea\7h\2\2\u00ea\u00eb\7q\2\2\u00eb\u00ec"+
|
"\7j\2\2\u00e4\u00e5\7k\2\2\u00e5\u00e6\7n\2\2\u00e6\u00e7\7g\2\2\u00e7"+
|
||||||
"\7t\2\2\u00ec#\3\2\2\2\u00ed\u00ee\7e\2\2\u00ee\u00ef\7q\2\2\u00ef\u00f0"+
|
"\37\3\2\2\2\u00e8\u00e9\7f\2\2\u00e9\u00ea\7q\2\2\u00ea!\3\2\2\2\u00eb"+
|
||||||
"\7p\2\2\u00f0\u00f1\7v\2\2\u00f1\u00f2\7k\2\2\u00f2\u00f3\7p\2\2\u00f3"+
|
"\u00ec\7h\2\2\u00ec\u00ed\7q\2\2\u00ed\u00ee\7t\2\2\u00ee#\3\2\2\2\u00ef"+
|
||||||
"\u00f4\7w\2\2\u00f4\u00f5\7g\2\2\u00f5%\3\2\2\2\u00f6\u00f7\7d\2\2\u00f7"+
|
"\u00f0\7e\2\2\u00f0\u00f1\7q\2\2\u00f1\u00f2\7p\2\2\u00f2\u00f3\7v\2\2"+
|
||||||
"\u00f8\7t\2\2\u00f8\u00f9\7g\2\2\u00f9\u00fa\7c\2\2\u00fa\u00fb\7m\2\2"+
|
"\u00f3\u00f4\7k\2\2\u00f4\u00f5\7p\2\2\u00f5\u00f6\7w\2\2\u00f6\u00f7"+
|
||||||
"\u00fb\'\3\2\2\2\u00fc\u00fd\7t\2\2\u00fd\u00fe\7g\2\2\u00fe\u00ff\7v"+
|
"\7g\2\2\u00f7%\3\2\2\2\u00f8\u00f9\7d\2\2\u00f9\u00fa\7t\2\2\u00fa\u00fb"+
|
||||||
"\2\2\u00ff\u0100\7w\2\2\u0100\u0101\7t\2\2\u0101\u0102\7p\2\2\u0102)\3"+
|
"\7g\2\2\u00fb\u00fc\7c\2\2\u00fc\u00fd\7m\2\2\u00fd\'\3\2\2\2\u00fe\u00ff"+
|
||||||
"\2\2\2\u0103\u0104\7p\2\2\u0104\u0105\7g\2\2\u0105\u0106\7y\2\2\u0106"+
|
"\7t\2\2\u00ff\u0100\7g\2\2\u0100\u0101\7v\2\2\u0101\u0102\7w\2\2\u0102"+
|
||||||
"+\3\2\2\2\u0107\u0108\7v\2\2\u0108\u0109\7t\2\2\u0109\u010a\7{\2\2\u010a"+
|
"\u0103\7t\2\2\u0103\u0104\7p\2\2\u0104)\3\2\2\2\u0105\u0106\7p\2\2\u0106"+
|
||||||
"-\3\2\2\2\u010b\u010c\7e\2\2\u010c\u010d\7c\2\2\u010d\u010e\7v\2\2\u010e"+
|
"\u0107\7g\2\2\u0107\u0108\7y\2\2\u0108+\3\2\2\2\u0109\u010a\7v\2\2\u010a"+
|
||||||
"\u010f\7e\2\2\u010f\u0110\7j\2\2\u0110/\3\2\2\2\u0111\u0112\7v\2\2\u0112"+
|
"\u010b\7t\2\2\u010b\u010c\7{\2\2\u010c-\3\2\2\2\u010d\u010e\7e\2\2\u010e"+
|
||||||
"\u0113\7j\2\2\u0113\u0114\7t\2\2\u0114\u0115\7q\2\2\u0115\u0116\7y\2\2"+
|
"\u010f\7c\2\2\u010f\u0110\7v\2\2\u0110\u0111\7e\2\2\u0111\u0112\7j\2\2"+
|
||||||
"\u0116\61\3\2\2\2\u0117\u0118\7v\2\2\u0118\u0119\7j\2\2\u0119\u011a\7"+
|
"\u0112/\3\2\2\2\u0113\u0114\7v\2\2\u0114\u0115\7j\2\2\u0115\u0116\7t\2"+
|
||||||
"k\2\2\u011a\u011b\7u\2\2\u011b\63\3\2\2\2\u011c\u011d\7#\2\2\u011d\65"+
|
"\2\u0116\u0117\7q\2\2\u0117\u0118\7y\2\2\u0118\61\3\2\2\2\u0119\u011a"+
|
||||||
"\3\2\2\2\u011e\u011f\7\u0080\2\2\u011f\67\3\2\2\2\u0120\u0121\7,\2\2\u0121"+
|
"\7v\2\2\u011a\u011b\7j\2\2\u011b\u011c\7k\2\2\u011c\u011d\7u\2\2\u011d"+
|
||||||
"9\3\2\2\2\u0122\u0123\7\61\2\2\u0123\u0124\6\35\2\2\u0124;\3\2\2\2\u0125"+
|
"\63\3\2\2\2\u011e\u011f\7k\2\2\u011f\u0120\7p\2\2\u0120\u0121\7u\2\2\u0121"+
|
||||||
"\u0126\7\'\2\2\u0126=\3\2\2\2\u0127\u0128\7-\2\2\u0128?\3\2\2\2\u0129"+
|
"\u0122\7v\2\2\u0122\u0123\7c\2\2\u0123\u0124\7p\2\2\u0124\u0125\7e\2\2"+
|
||||||
"\u012a\7/\2\2\u012aA\3\2\2\2\u012b\u012c\7>\2\2\u012c\u012d\7>\2\2\u012d"+
|
"\u0125\u0126\7g\2\2\u0126\u0127\7q\2\2\u0127\u0128\7h\2\2\u0128\65\3\2"+
|
||||||
"C\3\2\2\2\u012e\u012f\7@\2\2\u012f\u0130\7@\2\2\u0130E\3\2\2\2\u0131\u0132"+
|
"\2\2\u0129\u012a\7#\2\2\u012a\67\3\2\2\2\u012b\u012c\7\u0080\2\2\u012c"+
|
||||||
"\7@\2\2\u0132\u0133\7@\2\2\u0133\u0134\7@\2\2\u0134G\3\2\2\2\u0135\u0136"+
|
"9\3\2\2\2\u012d\u012e\7,\2\2\u012e;\3\2\2\2\u012f\u0130\7\61\2\2\u0130"+
|
||||||
"\7>\2\2\u0136I\3\2\2\2\u0137\u0138\7>\2\2\u0138\u0139\7?\2\2\u0139K\3"+
|
"\u0131\6\36\2\2\u0131=\3\2\2\2\u0132\u0133\7\'\2\2\u0133?\3\2\2\2\u0134"+
|
||||||
"\2\2\2\u013a\u013b\7@\2\2\u013bM\3\2\2\2\u013c\u013d\7@\2\2\u013d\u013e"+
|
"\u0135\7-\2\2\u0135A\3\2\2\2\u0136\u0137\7/\2\2\u0137C\3\2\2\2\u0138\u0139"+
|
||||||
"\7?\2\2\u013eO\3\2\2\2\u013f\u0140\7?\2\2\u0140\u0141\7?\2\2\u0141Q\3"+
|
"\7>\2\2\u0139\u013a\7>\2\2\u013aE\3\2\2\2\u013b\u013c\7@\2\2\u013c\u013d"+
|
||||||
"\2\2\2\u0142\u0143\7?\2\2\u0143\u0144\7?\2\2\u0144\u0145\7?\2\2\u0145"+
|
"\7@\2\2\u013dG\3\2\2\2\u013e\u013f\7@\2\2\u013f\u0140\7@\2\2\u0140\u0141"+
|
||||||
"S\3\2\2\2\u0146\u0147\7#\2\2\u0147\u0148\7?\2\2\u0148U\3\2\2\2\u0149\u014a"+
|
"\7@\2\2\u0141I\3\2\2\2\u0142\u0143\7>\2\2\u0143K\3\2\2\2\u0144\u0145\7"+
|
||||||
"\7#\2\2\u014a\u014b\7?\2\2\u014b\u014c\7?\2\2\u014cW\3\2\2\2\u014d\u014e"+
|
">\2\2\u0145\u0146\7?\2\2\u0146M\3\2\2\2\u0147\u0148\7@\2\2\u0148O\3\2"+
|
||||||
"\7(\2\2\u014eY\3\2\2\2\u014f\u0150\7`\2\2\u0150[\3\2\2\2\u0151\u0152\7"+
|
"\2\2\u0149\u014a\7@\2\2\u014a\u014b\7?\2\2\u014bQ\3\2\2\2\u014c\u014d"+
|
||||||
"~\2\2\u0152]\3\2\2\2\u0153\u0154\7(\2\2\u0154\u0155\7(\2\2\u0155_\3\2"+
|
"\7?\2\2\u014d\u014e\7?\2\2\u014eS\3\2\2\2\u014f\u0150\7?\2\2\u0150\u0151"+
|
||||||
"\2\2\u0156\u0157\7~\2\2\u0157\u0158\7~\2\2\u0158a\3\2\2\2\u0159\u015a"+
|
"\7?\2\2\u0151\u0152\7?\2\2\u0152U\3\2\2\2\u0153\u0154\7#\2\2\u0154\u0155"+
|
||||||
"\7A\2\2\u015ac\3\2\2\2\u015b\u015c\7<\2\2\u015ce\3\2\2\2\u015d\u015e\7"+
|
"\7?\2\2\u0155W\3\2\2\2\u0156\u0157\7#\2\2\u0157\u0158\7?\2\2\u0158\u0159"+
|
||||||
"<\2\2\u015e\u015f\7<\2\2\u015fg\3\2\2\2\u0160\u0161\7/\2\2\u0161\u0162"+
|
"\7?\2\2\u0159Y\3\2\2\2\u015a\u015b\7(\2\2\u015b[\3\2\2\2\u015c\u015d\7"+
|
||||||
"\7@\2\2\u0162i\3\2\2\2\u0163\u0164\7?\2\2\u0164\u0165\7\u0080\2\2\u0165"+
|
"`\2\2\u015d]\3\2\2\2\u015e\u015f\7~\2\2\u015f_\3\2\2\2\u0160\u0161\7("+
|
||||||
"k\3\2\2\2\u0166\u0167\7?\2\2\u0167\u0168\7?\2\2\u0168\u0169\7\u0080\2"+
|
"\2\2\u0161\u0162\7(\2\2\u0162a\3\2\2\2\u0163\u0164\7~\2\2\u0164\u0165"+
|
||||||
"\2\u0169m\3\2\2\2\u016a\u016b\7-\2\2\u016b\u016c\7-\2\2\u016co\3\2\2\2"+
|
"\7~\2\2\u0165c\3\2\2\2\u0166\u0167\7A\2\2\u0167e\3\2\2\2\u0168\u0169\7"+
|
||||||
"\u016d\u016e\7/\2\2\u016e\u016f\7/\2\2\u016fq\3\2\2\2\u0170\u0171\7?\2"+
|
"<\2\2\u0169g\3\2\2\2\u016a\u016b\7<\2\2\u016b\u016c\7<\2\2\u016ci\3\2"+
|
||||||
"\2\u0171s\3\2\2\2\u0172\u0173\7-\2\2\u0173\u0174\7?\2\2\u0174u\3\2\2\2"+
|
"\2\2\u016d\u016e\7/\2\2\u016e\u016f\7@\2\2\u016fk\3\2\2\2\u0170\u0171"+
|
||||||
"\u0175\u0176\7/\2\2\u0176\u0177\7?\2\2\u0177w\3\2\2\2\u0178\u0179\7,\2"+
|
"\7?\2\2\u0171\u0172\7\u0080\2\2\u0172m\3\2\2\2\u0173\u0174\7?\2\2\u0174"+
|
||||||
"\2\u0179\u017a\7?\2\2\u017ay\3\2\2\2\u017b\u017c\7\61\2\2\u017c\u017d"+
|
"\u0175\7?\2\2\u0175\u0176\7\u0080\2\2\u0176o\3\2\2\2\u0177\u0178\7-\2"+
|
||||||
"\7?\2\2\u017d{\3\2\2\2\u017e\u017f\7\'\2\2\u017f\u0180\7?\2\2\u0180}\3"+
|
"\2\u0178\u0179\7-\2\2\u0179q\3\2\2\2\u017a\u017b\7/\2\2\u017b\u017c\7"+
|
||||||
"\2\2\2\u0181\u0182\7(\2\2\u0182\u0183\7?\2\2\u0183\177\3\2\2\2\u0184\u0185"+
|
"/\2\2\u017cs\3\2\2\2\u017d\u017e\7?\2\2\u017eu\3\2\2\2\u017f\u0180\7-"+
|
||||||
"\7`\2\2\u0185\u0186\7?\2\2\u0186\u0081\3\2\2\2\u0187\u0188\7~\2\2\u0188"+
|
"\2\2\u0180\u0181\7?\2\2\u0181w\3\2\2\2\u0182\u0183\7/\2\2\u0183\u0184"+
|
||||||
"\u0189\7?\2\2\u0189\u0083\3\2\2\2\u018a\u018b\7>\2\2\u018b\u018c\7>\2"+
|
"\7?\2\2\u0184y\3\2\2\2\u0185\u0186\7,\2\2\u0186\u0187\7?\2\2\u0187{\3"+
|
||||||
"\2\u018c\u018d\7?\2\2\u018d\u0085\3\2\2\2\u018e\u018f\7@\2\2\u018f\u0190"+
|
"\2\2\2\u0188\u0189\7\61\2\2\u0189\u018a\7?\2\2\u018a}\3\2\2\2\u018b\u018c"+
|
||||||
"\7@\2\2\u0190\u0191\7?\2\2\u0191\u0087\3\2\2\2\u0192\u0193\7@\2\2\u0193"+
|
"\7\'\2\2\u018c\u018d\7?\2\2\u018d\177\3\2\2\2\u018e\u018f\7(\2\2\u018f"+
|
||||||
"\u0194\7@\2\2\u0194\u0195\7@\2\2\u0195\u0196\7?\2\2\u0196\u0089\3\2\2"+
|
"\u0190\7?\2\2\u0190\u0081\3\2\2\2\u0191\u0192\7`\2\2\u0192\u0193\7?\2"+
|
||||||
"\2\u0197\u0199\7\62\2\2\u0198\u019a\t\4\2\2\u0199\u0198\3\2\2\2\u019a"+
|
"\2\u0193\u0083\3\2\2\2\u0194\u0195\7~\2\2\u0195\u0196\7?\2\2\u0196\u0085"+
|
||||||
"\u019b\3\2\2\2\u019b\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019e\3\2"+
|
"\3\2\2\2\u0197\u0198\7>\2\2\u0198\u0199\7>\2\2\u0199\u019a\7?\2\2\u019a"+
|
||||||
"\2\2\u019d\u019f\t\5\2\2\u019e\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f"+
|
"\u0087\3\2\2\2\u019b\u019c\7@\2\2\u019c\u019d\7@\2\2\u019d\u019e\7?\2"+
|
||||||
"\u008b\3\2\2\2\u01a0\u01a1\7\62\2\2\u01a1\u01a3\t\6\2\2\u01a2\u01a4\t"+
|
"\2\u019e\u0089\3\2\2\2\u019f\u01a0\7@\2\2\u01a0\u01a1\7@\2\2\u01a1\u01a2"+
|
||||||
"\7\2\2\u01a3\u01a2\3\2\2\2\u01a4\u01a5\3\2\2\2\u01a5\u01a3\3\2\2\2\u01a5"+
|
"\7@\2\2\u01a2\u01a3\7?\2\2\u01a3\u008b\3\2\2\2\u01a4\u01a6\7\62\2\2\u01a5"+
|
||||||
"\u01a6\3\2\2\2\u01a6\u01a8\3\2\2\2\u01a7\u01a9\t\5\2\2\u01a8\u01a7\3\2"+
|
"\u01a7\t\4\2\2\u01a6\u01a5\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a6\3\2"+
|
||||||
"\2\2\u01a8\u01a9\3\2\2\2\u01a9\u008d\3\2\2\2\u01aa\u01b3\7\62\2\2\u01ab"+
|
"\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01ab\3\2\2\2\u01aa\u01ac\t\5\2\2\u01ab"+
|
||||||
"\u01af\t\b\2\2\u01ac\u01ae\t\t\2\2\u01ad\u01ac\3\2\2\2\u01ae\u01b1\3\2"+
|
"\u01aa\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u008d\3\2\2\2\u01ad\u01ae\7\62"+
|
||||||
"\2\2\u01af\u01ad\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0\u01b3\3\2\2\2\u01b1"+
|
"\2\2\u01ae\u01b0\t\6\2\2\u01af\u01b1\t\7\2\2\u01b0\u01af\3\2\2\2\u01b1"+
|
||||||
"\u01af\3\2\2\2\u01b2\u01aa\3\2\2\2\u01b2\u01ab\3\2\2\2\u01b3\u01b5\3\2"+
|
"\u01b2\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b5\3\2"+
|
||||||
"\2\2\u01b4\u01b6\t\n\2\2\u01b5\u01b4\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6"+
|
"\2\2\u01b4\u01b6\t\5\2\2\u01b5\u01b4\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6"+
|
||||||
"\u008f\3\2\2\2\u01b7\u01c0\7\62\2\2\u01b8\u01bc\t\b\2\2\u01b9\u01bb\t"+
|
"\u008f\3\2\2\2\u01b7\u01c0\7\62\2\2\u01b8\u01bc\t\b\2\2\u01b9\u01bb\t"+
|
||||||
"\t\2\2\u01ba\u01b9\3\2\2\2\u01bb\u01be\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bc"+
|
"\t\2\2\u01ba\u01b9\3\2\2\2\u01bb\u01be\3\2\2\2\u01bc\u01ba\3\2\2\2\u01bc"+
|
||||||
"\u01bd\3\2\2\2\u01bd\u01c0\3\2\2\2\u01be\u01bc\3\2\2\2\u01bf\u01b7\3\2"+
|
"\u01bd\3\2\2\2\u01bd\u01c0\3\2\2\2\u01be\u01bc\3\2\2\2\u01bf\u01b7\3\2"+
|
||||||
"\2\2\u01bf\u01b8\3\2\2\2\u01c0\u01c7\3\2\2\2\u01c1\u01c3\5\24\n\2\u01c2"+
|
"\2\2\u01bf\u01b8\3\2\2\2\u01c0\u01c2\3\2\2\2\u01c1\u01c3\t\n\2\2\u01c2"+
|
||||||
"\u01c4\t\t\2\2\u01c3\u01c2\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c3\3\2"+
|
"\u01c1\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u0091\3\2\2\2\u01c4\u01cd\7\62"+
|
||||||
"\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c8\3\2\2\2\u01c7\u01c1\3\2\2\2\u01c7"+
|
"\2\2\u01c5\u01c9\t\b\2\2\u01c6\u01c8\t\t\2\2\u01c7\u01c6\3\2\2\2\u01c8"+
|
||||||
"\u01c8\3\2\2\2\u01c8\u01d2\3\2\2\2\u01c9\u01cb\t\13\2\2\u01ca\u01cc\t"+
|
"\u01cb\3\2\2\2\u01c9\u01c7\3\2\2\2\u01c9\u01ca\3\2\2\2\u01ca\u01cd\3\2"+
|
||||||
"\f\2\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3\2\2\2\u01cc\u01ce\3\2\2\2\u01cd"+
|
"\2\2\u01cb\u01c9\3\2\2\2\u01cc\u01c4\3\2\2\2\u01cc\u01c5\3\2\2\2\u01cd"+
|
||||||
"\u01cf\t\t\2\2\u01ce\u01cd\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01ce\3\2"+
|
"\u01d4\3\2\2\2\u01ce\u01d0\5\24\n\2\u01cf\u01d1\t\t\2\2\u01d0\u01cf\3"+
|
||||||
"\2\2\u01d0\u01d1\3\2\2\2\u01d1\u01d3\3\2\2\2\u01d2\u01c9\3\2\2\2\u01d2"+
|
"\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d0\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3"+
|
||||||
"\u01d3\3\2\2\2\u01d3\u01d5\3\2\2\2\u01d4\u01d6\t\r\2\2\u01d5\u01d4\3\2"+
|
"\u01d5\3\2\2\2\u01d4\u01ce\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01df\3\2"+
|
||||||
"\2\2\u01d5\u01d6\3\2\2\2\u01d6\u0091\3\2\2\2\u01d7\u01df\7$\2\2\u01d8"+
|
"\2\2\u01d6\u01d8\t\13\2\2\u01d7\u01d9\t\f\2\2\u01d8\u01d7\3\2\2\2\u01d8"+
|
||||||
"\u01d9\7^\2\2\u01d9\u01de\7$\2\2\u01da\u01db\7^\2\2\u01db\u01de\7^\2\2"+
|
"\u01d9\3\2\2\2\u01d9\u01db\3\2\2\2\u01da\u01dc\t\t\2\2\u01db\u01da\3\2"+
|
||||||
"\u01dc\u01de\n\16\2\2\u01dd\u01d8\3\2\2\2\u01dd\u01da\3\2\2\2\u01dd\u01dc"+
|
"\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01db\3\2\2\2\u01dd\u01de\3\2\2\2\u01de"+
|
||||||
"\3\2\2\2\u01de\u01e1\3\2\2\2\u01df\u01e0\3\2\2\2\u01df\u01dd\3\2\2\2\u01e0"+
|
"\u01e0\3\2\2\2\u01df\u01d6\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e2\3\2"+
|
||||||
"\u01e2\3\2\2\2\u01e1\u01df\3\2\2\2\u01e2\u01f0\7$\2\2\u01e3\u01eb\7)\2"+
|
"\2\2\u01e1\u01e3\t\r\2\2\u01e2\u01e1\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3"+
|
||||||
"\2\u01e4\u01e5\7^\2\2\u01e5\u01ea\7)\2\2\u01e6\u01e7\7^\2\2\u01e7\u01ea"+
|
"\u0093\3\2\2\2\u01e4\u01ec\7$\2\2\u01e5\u01e6\7^\2\2\u01e6\u01eb\7$\2"+
|
||||||
"\7^\2\2\u01e8\u01ea\n\16\2\2\u01e9\u01e4\3\2\2\2\u01e9\u01e6\3\2\2\2\u01e9"+
|
"\2\u01e7\u01e8\7^\2\2\u01e8\u01eb\7^\2\2\u01e9\u01eb\n\16\2\2\u01ea\u01e5"+
|
||||||
"\u01e8\3\2\2\2\u01ea\u01ed\3\2\2\2\u01eb\u01ec\3\2\2\2\u01eb\u01e9\3\2"+
|
"\3\2\2\2\u01ea\u01e7\3\2\2\2\u01ea\u01e9\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec"+
|
||||||
"\2\2\u01ec\u01ee\3\2\2\2\u01ed\u01eb\3\2\2\2\u01ee\u01f0\7)\2\2\u01ef"+
|
"\u01ed\3\2\2\2\u01ec\u01ea\3\2\2\2\u01ed\u01ef\3\2\2\2\u01ee\u01ec\3\2"+
|
||||||
"\u01d7\3\2\2\2\u01ef\u01e3\3\2\2\2\u01f0\u0093\3\2\2\2\u01f1\u01f5\7\61"+
|
"\2\2\u01ef\u01fd\7$\2\2\u01f0\u01f8\7)\2\2\u01f1\u01f2\7^\2\2\u01f2\u01f7"+
|
||||||
"\2\2\u01f2\u01f6\n\17\2\2\u01f3\u01f4\7^\2\2\u01f4\u01f6\n\20\2\2\u01f5"+
|
"\7)\2\2\u01f3\u01f4\7^\2\2\u01f4\u01f7\7^\2\2\u01f5\u01f7\n\16\2\2\u01f6"+
|
||||||
"\u01f2\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f7\3\2\2\2\u01f7\u01f5\3\2"+
|
"\u01f1\3\2\2\2\u01f6\u01f3\3\2\2\2\u01f6\u01f5\3\2\2\2\u01f7\u01fa\3\2"+
|
||||||
"\2\2\u01f7\u01f8\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fd\7\61\2\2\u01fa"+
|
"\2\2\u01f8\u01f9\3\2\2\2\u01f8\u01f6\3\2\2\2\u01f9\u01fb\3\2\2\2\u01fa"+
|
||||||
"\u01fc\t\21\2\2\u01fb\u01fa\3\2\2\2\u01fc\u01ff\3\2\2\2\u01fd\u01fb\3"+
|
"\u01f8\3\2\2\2\u01fb\u01fd\7)\2\2\u01fc\u01e4\3\2\2\2\u01fc\u01f0\3\2"+
|
||||||
"\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u0200\3\2\2\2\u01ff\u01fd\3\2\2\2\u0200"+
|
"\2\2\u01fd\u0095\3\2\2\2\u01fe\u0202\7\61\2\2\u01ff\u0203\n\17\2\2\u0200"+
|
||||||
"\u0201\6J\3\2\u0201\u0095\3\2\2\2\u0202\u0203\7v\2\2\u0203\u0204\7t\2"+
|
"\u0201\7^\2\2\u0201\u0203\n\20\2\2\u0202\u01ff\3\2\2\2\u0202\u0200\3\2"+
|
||||||
"\2\u0204\u0205\7w\2\2\u0205\u0206\7g\2\2\u0206\u0097\3\2\2\2\u0207\u0208"+
|
"\2\2\u0203\u0204\3\2\2\2\u0204\u0202\3\2\2\2\u0204\u0205\3\2\2\2\u0205"+
|
||||||
"\7h\2\2\u0208\u0209\7c\2\2\u0209\u020a\7n\2\2\u020a\u020b\7u\2\2\u020b"+
|
"\u0206\3\2\2\2\u0206\u020a\7\61\2\2\u0207\u0209\t\21\2\2\u0208\u0207\3"+
|
||||||
"\u020c\7g\2\2\u020c\u0099\3\2\2\2\u020d\u020e\7p\2\2\u020e\u020f\7w\2"+
|
"\2\2\2\u0209\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b"+
|
||||||
"\2\u020f\u0210\7n\2\2\u0210\u0211\7n\2\2\u0211\u009b\3\2\2\2\u0212\u0218"+
|
"\u020d\3\2\2\2\u020c\u020a\3\2\2\2\u020d\u020e\6K\3\2\u020e\u0097\3\2"+
|
||||||
"\5\u009eO\2\u0213\u0214\5\24\n\2\u0214\u0215\5\u009eO\2\u0215\u0217\3"+
|
"\2\2\u020f\u0210\7v\2\2\u0210\u0211\7t\2\2\u0211\u0212\7w\2\2\u0212\u0213"+
|
||||||
"\2\2\2\u0216\u0213\3\2\2\2\u0217\u021a\3\2\2\2\u0218\u0216\3\2\2\2\u0218"+
|
"\7g\2\2\u0213\u0099\3\2\2\2\u0214\u0215\7h\2\2\u0215\u0216\7c\2\2\u0216"+
|
||||||
"\u0219\3\2\2\2\u0219\u021b\3\2\2\2\u021a\u0218\3\2\2\2\u021b\u021c\6N"+
|
"\u0217\7n\2\2\u0217\u0218\7u\2\2\u0218\u0219\7g\2\2\u0219\u009b\3\2\2"+
|
||||||
"\4\2\u021c\u009d\3\2\2\2\u021d\u0221\t\22\2\2\u021e\u0220\t\23\2\2\u021f"+
|
"\2\u021a\u021b\7p\2\2\u021b\u021c\7w\2\2\u021c\u021d\7n\2\2\u021d\u021e"+
|
||||||
"\u021e\3\2\2\2\u0220\u0223\3\2\2\2\u0221\u021f\3\2\2\2\u0221\u0222\3\2"+
|
"\7n\2\2\u021e\u009d\3\2\2\2\u021f\u0225\5\u00a0P\2\u0220\u0221\5\24\n"+
|
||||||
"\2\2\u0222\u009f\3\2\2\2\u0223\u0221\3\2\2\2\u0224\u022d\7\62\2\2\u0225"+
|
"\2\u0221\u0222\5\u00a0P\2\u0222\u0224\3\2\2\2\u0223\u0220\3\2\2\2\u0224"+
|
||||||
"\u0229\t\b\2\2\u0226\u0228\t\t\2\2\u0227\u0226\3\2\2\2\u0228\u022b\3\2"+
|
"\u0227\3\2\2\2\u0225\u0223\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0228\3\2"+
|
||||||
"\2\2\u0229\u0227\3\2\2\2\u0229\u022a\3\2\2\2\u022a\u022d\3\2\2\2\u022b"+
|
"\2\2\u0227\u0225\3\2\2\2\u0228\u0229\6O\4\2\u0229\u009f\3\2\2\2\u022a"+
|
||||||
"\u0229\3\2\2\2\u022c\u0224\3\2\2\2\u022c\u0225\3\2\2\2\u022d\u022e\3\2"+
|
"\u022e\t\22\2\2\u022b\u022d\t\23\2\2\u022c\u022b\3\2\2\2\u022d\u0230\3"+
|
||||||
"\2\2\u022e\u022f\bP\4\2\u022f\u00a1\3\2\2\2\u0230\u0234\t\22\2\2\u0231"+
|
"\2\2\2\u022e\u022c\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u00a1\3\2\2\2\u0230"+
|
||||||
"\u0233\t\23\2\2\u0232\u0231\3\2\2\2\u0233\u0236\3\2\2\2\u0234\u0232\3"+
|
"\u022e\3\2\2\2\u0231\u023a\7\62\2\2\u0232\u0236\t\b\2\2\u0233\u0235\t"+
|
||||||
"\2\2\2\u0234\u0235\3\2\2\2\u0235\u0237\3\2\2\2\u0236\u0234\3\2\2\2\u0237"+
|
"\t\2\2\u0234\u0233\3\2\2\2\u0235\u0238\3\2\2\2\u0236\u0234\3\2\2\2\u0236"+
|
||||||
"\u0238\bQ\4\2\u0238\u00a3\3\2\2\2$\2\3\u00a7\u00b1\u00bb\u00c0\u019b\u019e"+
|
"\u0237\3\2\2\2\u0237\u023a\3\2\2\2\u0238\u0236\3\2\2\2\u0239\u0231\3\2"+
|
||||||
"\u01a5\u01a8\u01af\u01b2\u01b5\u01bc\u01bf\u01c5\u01c7\u01cb\u01d0\u01d2"+
|
"\2\2\u0239\u0232\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023c\bQ\4\2\u023c"+
|
||||||
"\u01d5\u01dd\u01df\u01e9\u01eb\u01ef\u01f5\u01f7\u01fd\u0218\u0221\u0229"+
|
"\u00a3\3\2\2\2\u023d\u0241\t\22\2\2\u023e\u0240\t\23\2\2\u023f\u023e\3"+
|
||||||
"\u022c\u0234\5\b\2\2\4\3\2\4\2\2";
|
"\2\2\2\u0240\u0243\3\2\2\2\u0241\u023f\3\2\2\2\u0241\u0242\3\2\2\2\u0242"+
|
||||||
|
"\u0244\3\2\2\2\u0243\u0241\3\2\2\2\u0244\u0245\bR\4\2\u0245\u00a5\3\2"+
|
||||||
|
"\2\2$\2\3\u00a9\u00b3\u00bd\u00c2\u01a8\u01ab\u01b2\u01b5\u01bc\u01bf"+
|
||||||
|
"\u01c2\u01c9\u01cc\u01d2\u01d4\u01d8\u01dd\u01df\u01e2\u01ea\u01ec\u01f6"+
|
||||||
|
"\u01f8\u01fc\u0202\u0204\u020a\u0225\u022e\u0236\u0239\u0241\5\b\2\2\4"+
|
||||||
|
"\3\2\4\2\2";
|
||||||
public static final ATN _ATN =
|
public static final ATN _ATN =
|
||||||
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
|
||||||
static {
|
static {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -228,6 +228,13 @@ class PainlessParserBaseVisitor<T> extends AbstractParseTreeVisitor<T> implement
|
||||||
* {@link #visitChildren} on {@code ctx}.</p>
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
*/
|
*/
|
||||||
@Override public T visitBinary(PainlessParser.BinaryContext ctx) { return visitChildren(ctx); }
|
@Override public T visitBinary(PainlessParser.BinaryContext ctx) { return visitChildren(ctx); }
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* <p>The default implementation returns the result of calling
|
||||||
|
* {@link #visitChildren} on {@code ctx}.</p>
|
||||||
|
*/
|
||||||
|
@Override public T visitInstanceof(PainlessParser.InstanceofContext ctx) { return visitChildren(ctx); }
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*
|
*
|
||||||
|
|
|
@ -214,6 +214,13 @@ interface PainlessParserVisitor<T> extends ParseTreeVisitor<T> {
|
||||||
* @return the visitor result
|
* @return the visitor result
|
||||||
*/
|
*/
|
||||||
T visitBinary(PainlessParser.BinaryContext ctx);
|
T visitBinary(PainlessParser.BinaryContext ctx);
|
||||||
|
/**
|
||||||
|
* Visit a parse tree produced by the {@code instanceof}
|
||||||
|
* labeled alternative in {@link PainlessParser#expression}.
|
||||||
|
* @param ctx the parse tree
|
||||||
|
* @return the visitor result
|
||||||
|
*/
|
||||||
|
T visitInstanceof(PainlessParser.InstanceofContext ctx);
|
||||||
/**
|
/**
|
||||||
* Visit a parse tree produced by the {@code pre}
|
* Visit a parse tree produced by the {@code pre}
|
||||||
* labeled alternative in {@link PainlessParser#unary}.
|
* labeled alternative in {@link PainlessParser#unary}.
|
||||||
|
|
|
@ -82,6 +82,7 @@ import org.elasticsearch.painless.antlr.PainlessParser.FuncrefContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.FunctionContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.FunctionContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.IfContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.IfContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.InitializerContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.InitializerContext;
|
||||||
|
import org.elasticsearch.painless.antlr.PainlessParser.InstanceofContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.LambdaContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.LambdaContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.LamtypeContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.LamtypeContext;
|
||||||
import org.elasticsearch.painless.antlr.PainlessParser.LocalFuncrefContext;
|
import org.elasticsearch.painless.antlr.PainlessParser.LocalFuncrefContext;
|
||||||
|
@ -124,6 +125,7 @@ import org.elasticsearch.painless.node.EConditional;
|
||||||
import org.elasticsearch.painless.node.EDecimal;
|
import org.elasticsearch.painless.node.EDecimal;
|
||||||
import org.elasticsearch.painless.node.EExplicit;
|
import org.elasticsearch.painless.node.EExplicit;
|
||||||
import org.elasticsearch.painless.node.EFunctionRef;
|
import org.elasticsearch.painless.node.EFunctionRef;
|
||||||
|
import org.elasticsearch.painless.node.EInstanceof;
|
||||||
import org.elasticsearch.painless.node.ELambda;
|
import org.elasticsearch.painless.node.ELambda;
|
||||||
import org.elasticsearch.painless.node.ENull;
|
import org.elasticsearch.painless.node.ENull;
|
||||||
import org.elasticsearch.painless.node.ENumeric;
|
import org.elasticsearch.painless.node.ENumeric;
|
||||||
|
@ -1107,6 +1109,13 @@ public final class Walker extends PainlessParserBaseVisitor<Object> {
|
||||||
throw location(ctx).createError(new IllegalStateException("Illegal tree structure."));
|
throw location(ctx).createError(new IllegalStateException("Illegal tree structure."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object visitInstanceof(InstanceofContext ctx) {
|
||||||
|
AExpression expr = (AExpression)visitExpression(ctx.expression());
|
||||||
|
String type = ctx.decltype().getText();
|
||||||
|
return new EInstanceof(location(ctx), expr, type);
|
||||||
|
}
|
||||||
|
|
||||||
/** Returns name of next lambda */
|
/** Returns name of next lambda */
|
||||||
private String nextLambda() {
|
private String nextLambda() {
|
||||||
return "lambda$" + syntheticCounter++;
|
return "lambda$" + syntheticCounter++;
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch under one or more contributor
|
||||||
|
* license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright
|
||||||
|
* ownership. Elasticsearch licenses this file to you under
|
||||||
|
* the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.painless.node;
|
||||||
|
|
||||||
|
import org.elasticsearch.painless.Definition;
|
||||||
|
import org.elasticsearch.painless.Globals;
|
||||||
|
import org.elasticsearch.painless.Locals;
|
||||||
|
import org.elasticsearch.painless.Location;
|
||||||
|
import org.elasticsearch.painless.MethodWriter;
|
||||||
|
|
||||||
|
import java.lang.invoke.MethodType;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents instanceof operator.
|
||||||
|
* <p>
|
||||||
|
* Unlike java's, this works for primitive types too.
|
||||||
|
*/
|
||||||
|
public class EInstanceof extends AExpression {
|
||||||
|
AExpression expression;
|
||||||
|
final String type;
|
||||||
|
Class<?> resolvedType;
|
||||||
|
Class<?> expressionType;
|
||||||
|
boolean primitiveExpression;
|
||||||
|
|
||||||
|
public EInstanceof(Location location, AExpression expression, String type) {
|
||||||
|
super(location);
|
||||||
|
this.expression = Objects.requireNonNull(expression);
|
||||||
|
this.type = Objects.requireNonNull(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void extractVariables(Set<String> variables) {
|
||||||
|
expression.extractVariables(variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void analyze(Locals locals) {
|
||||||
|
Definition.Type raw = Definition.getType(type);
|
||||||
|
// map to wrapped type for primitive types
|
||||||
|
resolvedType = MethodType.methodType(raw.clazz).wrap().returnType();
|
||||||
|
expression.analyze(locals);
|
||||||
|
actual = Definition.BOOLEAN_TYPE;
|
||||||
|
|
||||||
|
Definition.Type expressionRaw = expression.actual;
|
||||||
|
if (expressionRaw == null) {
|
||||||
|
expressionRaw = Definition.DEF_TYPE;
|
||||||
|
}
|
||||||
|
// record if the expression returns a primitive
|
||||||
|
primitiveExpression = expressionRaw.clazz.isPrimitive();
|
||||||
|
// map to wrapped type for primitive types
|
||||||
|
expressionType = MethodType.methodType(expressionRaw.clazz).wrap().returnType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
void write(MethodWriter writer, Globals globals) {
|
||||||
|
// primitive types
|
||||||
|
if (primitiveExpression) {
|
||||||
|
// run the expression anyway (who knows what it does)
|
||||||
|
expression.write(writer, globals);
|
||||||
|
// discard its result
|
||||||
|
writer.writePop(expression.actual.type.getSize());
|
||||||
|
// push our result: its a primitive so it cannot be null.
|
||||||
|
writer.push(resolvedType == Object.class || resolvedType == expressionType);
|
||||||
|
} else {
|
||||||
|
// ordinary instanceof
|
||||||
|
expression.write(writer, globals);
|
||||||
|
writer.instanceOf(org.objectweb.asm.Type.getType(resolvedType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,7 +22,7 @@
|
||||||
* <p>
|
* <p>
|
||||||
* The following are the types of nodes:
|
* The following are the types of nodes:
|
||||||
* A* (abstract) - These are the abstract nodes that are the superclasses for the other types.
|
* A* (abstract) - These are the abstract nodes that are the superclasses for the other types.
|
||||||
* I* (interface) -- Thse are marker interfaces to denote a property of the node.
|
* I* (interface) -- These are marker interfaces to denote a property of the node.
|
||||||
* S* (statement) - These are nodes that represent a statement in Painless. These are the highest level nodes.
|
* S* (statement) - These are nodes that represent a statement in Painless. These are the highest level nodes.
|
||||||
* E* (expression) - These are nodes that represent an expression in Painless. These are the middle level nodes.
|
* E* (expression) - These are nodes that represent an expression in Painless. These are the middle level nodes.
|
||||||
* L* (link) - These are nodes that represent a piece of a variable/method chain. The are the lowest level nodes.
|
* L* (link) - These are nodes that represent a piece of a variable/method chain. The are the lowest level nodes.
|
||||||
|
@ -44,8 +44,9 @@
|
||||||
* {@link org.elasticsearch.painless.node.EDecimal} - Represents a decimal constant.
|
* {@link org.elasticsearch.painless.node.EDecimal} - Represents a decimal constant.
|
||||||
* {@link org.elasticsearch.painless.node.EExplicit} - Represents an explicit cast.
|
* {@link org.elasticsearch.painless.node.EExplicit} - Represents an explicit cast.
|
||||||
* {@link org.elasticsearch.painless.node.EFunctionRef} - Represents a function reference (non-capturing).
|
* {@link org.elasticsearch.painless.node.EFunctionRef} - Represents a function reference (non-capturing).
|
||||||
|
* {@link org.elasticsearch.painless.node.EInstanceof} - Represents an instanceof check.
|
||||||
* {@link org.elasticsearch.painless.node.EListInit} - Represents a list initialization shortcut.
|
* {@link org.elasticsearch.painless.node.EListInit} - Represents a list initialization shortcut.
|
||||||
* {@link org.elasticsearch.painless.node.EMapInit} - Represents a map initializiation shortcut.
|
* {@link org.elasticsearch.painless.node.EMapInit} - Represents a map initialization shortcut.
|
||||||
* {@link org.elasticsearch.painless.node.ENull} - Represents a null constant.
|
* {@link org.elasticsearch.painless.node.ENull} - Represents a null constant.
|
||||||
* {@link org.elasticsearch.painless.node.ENumeric} - Represents a non-decimal numeric constant.
|
* {@link org.elasticsearch.painless.node.ENumeric} - Represents a non-decimal numeric constant.
|
||||||
* {@link org.elasticsearch.painless.node.EUnary} - Represents a unary math expression.
|
* {@link org.elasticsearch.painless.node.EUnary} - Represents a unary math expression.
|
||||||
|
@ -92,7 +93,7 @@
|
||||||
* All Painless trees must start with an SSource node at the root. Each node has a constructor that requires
|
* All Painless trees must start with an SSource node at the root. Each node has a constructor that requires
|
||||||
* all of its values and children be passed in at the time of instantiation. This means that Painless trees
|
* all of its values and children be passed in at the time of instantiation. This means that Painless trees
|
||||||
* are build bottom-up; however, this helps enforce tree structure to be correct and fits naturally with a
|
* are build bottom-up; however, this helps enforce tree structure to be correct and fits naturally with a
|
||||||
* standard recurvise-descent parser.
|
* standard recursive-descent parser.
|
||||||
* <p>
|
* <p>
|
||||||
* Generally, statement nodes have member data that evaluate legal control-flow during the analysis phase.
|
* Generally, statement nodes have member data that evaluate legal control-flow during the analysis phase.
|
||||||
* The typical order for statement nodes is for each node to call analyze on it's children during the analysis phase
|
* The typical order for statement nodes is for each node to call analyze on it's children during the analysis phase
|
||||||
|
|
|
@ -52,12 +52,15 @@ class Iterable -> java.lang.Iterable {
|
||||||
Spliterator spliterator()
|
Spliterator spliterator()
|
||||||
# some adaptations of groovy methods
|
# some adaptations of groovy methods
|
||||||
boolean any*(Predicate)
|
boolean any*(Predicate)
|
||||||
|
Collection asCollection*()
|
||||||
|
List asList*()
|
||||||
def each*(Consumer)
|
def each*(Consumer)
|
||||||
def eachWithIndex*(ObjIntConsumer)
|
def eachWithIndex*(ObjIntConsumer)
|
||||||
boolean every*(Predicate)
|
boolean every*(Predicate)
|
||||||
List findResults*(Function)
|
List findResults*(Function)
|
||||||
Map groupBy*(Function)
|
Map groupBy*(Function)
|
||||||
String join*(String)
|
String join*(String)
|
||||||
|
double sum*()
|
||||||
double sum*(ToDoubleFunction)
|
double sum*(ToDoubleFunction)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,18 @@ public class AugmentationTests extends ScriptTestCase {
|
||||||
exec("List l = new ArrayList(); l.add(1); l.any(x -> x == 1)"));
|
exec("List l = new ArrayList(); l.add(1); l.any(x -> x == 1)"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testIterable_AsCollection() {
|
||||||
|
assertEquals(true,
|
||||||
|
exec("List l = new ArrayList(); return l.asCollection() === l"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testIterable_AsList() {
|
||||||
|
assertEquals(true,
|
||||||
|
exec("List l = new ArrayList(); return l.asList() === l"));
|
||||||
|
assertEquals(5,
|
||||||
|
exec("Set l = new HashSet(); l.add(5); return l.asList()[0]"));
|
||||||
|
}
|
||||||
|
|
||||||
public void testIterable_Each() {
|
public void testIterable_Each() {
|
||||||
assertEquals(1,
|
assertEquals(1,
|
||||||
exec("List l = new ArrayList(); l.add(1); List l2 = new ArrayList(); l.each(l2::add); return l2.size()"));
|
exec("List l = new ArrayList(); l.add(1); List l2 = new ArrayList(); l.each(l2::add); return l2.size()"));
|
||||||
|
@ -88,6 +100,7 @@ public class AugmentationTests extends ScriptTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIterable_Sum() {
|
public void testIterable_Sum() {
|
||||||
|
assertEquals(3.0D, exec("def l = [1,2]; return l.sum()"));
|
||||||
assertEquals(5.0D,
|
assertEquals(5.0D,
|
||||||
exec("List l = new ArrayList(); l.add(1); l.add(2); l.sum(x -> x + 1)"));
|
exec("List l = new ArrayList(); l.add(1); l.add(2); l.sum(x -> x + 1)"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -439,4 +439,22 @@ public class ComparisonTests extends ScriptTestCase {
|
||||||
assertEquals(true, exec("def x = (float)6; double y = (double)2; return x >= y"));
|
assertEquals(true, exec("def x = (float)6; double y = (double)2; return x >= y"));
|
||||||
assertEquals(true, exec("def x = (double)7; double y = (double)1; return x >= y"));
|
assertEquals(true, exec("def x = (double)7; double y = (double)1; return x >= y"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testInstanceOf() {
|
||||||
|
assertEquals(true, exec("int x = 5; return x instanceof int"));
|
||||||
|
assertEquals(true, exec("def x = 5; return x instanceof int"));
|
||||||
|
assertEquals(true, exec("def x = 5; return x instanceof def"));
|
||||||
|
assertEquals(true, exec("def x = 5; return x instanceof Object"));
|
||||||
|
assertEquals(true, exec("def x = 5; return x instanceof Integer"));
|
||||||
|
assertEquals(true, exec("def x = 5; return x instanceof Number"));
|
||||||
|
assertEquals(false, exec("def x = 5; return x instanceof float"));
|
||||||
|
assertEquals(false, exec("def x = 5; return x instanceof Map"));
|
||||||
|
assertEquals(true, exec("List l = new ArrayList(); return l instanceof List"));
|
||||||
|
assertEquals(false, exec("List l = null; return l instanceof List"));
|
||||||
|
assertEquals(true, exec("List l = new ArrayList(); return l instanceof Collection"));
|
||||||
|
assertEquals(false, exec("List l = new ArrayList(); return l instanceof Map"));
|
||||||
|
assertEquals(true, exec("int[] x = new int[] { 5 }; return x instanceof int[]"));
|
||||||
|
assertEquals(false, exec("int[] x = new int[] { 5 }; return x instanceof float[]"));
|
||||||
|
assertEquals(false, exec("int[] x = new int[] { 5 }; return x instanceof int[][]"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue