You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2020/12/31 08:17:16 UTC

[incubator-nlpcraft] branch master updated (e8f8470 -> 7456d58)

This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git.


    from e8f8470  WIP on tests.
     new 4e7b8c3  Fix for ANTLR4 space handing in QSTRINGs.
     new 7456d58  Fix for dialog flow tests.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../model/intent/impl/NCIntentSolverEngine.scala   |   4 +-
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   5 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   4 +-
 .../model/intent/impl/antlr4/NCIntentDsl.tokens    | 111 +++++------
 .../intent/impl/antlr4/NCIntentDslLexer.interp     |   5 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java | 217 +++++++++++----------
 .../intent/impl/antlr4/NCIntentDslLexer.tokens     | 111 +++++------
 .../intent/impl/antlr4/NCIntentDslParser.java      | 187 ++++++++----------
 .../nlpcraft/model/dialog/NCDialogSpec.scala       |  51 ++---
 9 files changed, 339 insertions(+), 356 deletions(-)


[incubator-nlpcraft] 02/02: Fix for dialog flow tests.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 7456d584d0039627c2c9e5eabba92ef4b353da7d
Author: Aaron Radzinski <ar...@datalingvo.com>
AuthorDate: Thu Dec 31 00:17:02 2020 -0800

    Fix for dialog flow tests.
---
 .../model/intent/impl/NCIntentSolverEngine.scala   |  4 +-
 .../nlpcraft/model/dialog/NCDialogSpec.scala       | 51 +++++++++++-----------
 2 files changed, 28 insertions(+), 27 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
index a1c832b..0da10af 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
@@ -387,8 +387,8 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         val flowRegex = intent.flowRegex
 
         // Check dialog flow first.
-        if (intent.flowRegex.isDefined && !flowRegex.get.matcher(hist.mkString(" ")).matches()) {
-            logger.info(s"Intent '$intentId' didn't match because of dialog flow $varStr:")
+        if (intent.flowRegex.isDefined && !flowRegex.get.matcher(hist.mkString(" ")).find(0)) {
+            logger.info(s"Intent '$intentId' ${r("did not")} match because of dialog flow $varStr:")
             logger.info(s"  |-- ${c("History:")} ${hist.mkString(" ")}")
             logger.info(s"  +-- ${c("Regex:")}   ${flowRegex.get.toString}")
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/dialog/NCDialogSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/dialog/NCDialogSpec.scala
index 2ed7e21..3d98c1b 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/dialog/NCDialogSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/dialog/NCDialogSpec.scala
@@ -82,39 +82,40 @@ class NCDialogSpec extends NCTestContext {
 
         cli.clearConversation()
         cli.clearDialog()
-
-        go()
     }
 
     @Test
     @throws[Exception]
-    private[dialog] def test1(): Unit = f(
-        "a2" → null,
-        "a1" → "onA1",
-        "a2" → "onA2",
-        "a1" → "onA1",
-        "a1" → "onA1",
-        "a2" -> null
-    )
+    private[dialog] def test1(): Unit =
+        f(
+            "a2" → null,
+            "a1" → "onA1",
+            "a2" → "onA2",
+            "a1" → "onA1",
+            "a1" → "onA1",
+            "a2" -> null
+        )
 
     @Test
     @throws[Exception]
-    private[dialog] def test2(): Unit = f(
-        "a3" → null,
-        "a1" → "onA1",
-        "a3" → "onA3",
-        "a1" → "onA1",
-        "a1" → "onA1",
-        "a3" -> null
-    )
+    private[dialog] def test2(): Unit =
+        f(
+            "a3" → null,
+            "a1" → "onA1",
+            "a3" → "onA3",
+            "a1" → "onA1",
+            "a1" → "onA1",
+            "a3" → "onA3"
+        )
 
     @Test
     @throws[Exception]
-    private[dialog] def test3(): Unit = f(
-        "a4" → null,
-        "a1" → "onA1",
-        "a1" → "onA1",
-        "a4" → "onA4",
-        "a4" → null
-    )
+    private[dialog] def test3(): Unit =
+        f(
+            "a4" → null,
+            "a1" → "onA1",
+            "a1" → "onA1",
+            "a4" → "onA4",
+            "a4" → "onA4"
+        )
 }


[incubator-nlpcraft] 01/02: Fix for ANTLR4 space handing in QSTRINGs.

Posted by ar...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 4e7b8c393846214c674350cfdf9bf81210bbe5ce
Author: Aaron Radzinski <ar...@datalingvo.com>
AuthorDate: Wed Dec 30 23:54:58 2020 -0800

    Fix for ANTLR4 space handing in QSTRINGs.
---
 .../model/intent/impl/antlr4/NCIntentDsl.g4        |   5 +-
 .../model/intent/impl/antlr4/NCIntentDsl.interp    |   4 +-
 .../model/intent/impl/antlr4/NCIntentDsl.tokens    | 111 +++++------
 .../intent/impl/antlr4/NCIntentDslLexer.interp     |   5 +-
 .../model/intent/impl/antlr4/NCIntentDslLexer.java | 217 +++++++++++----------
 .../intent/impl/antlr4/NCIntentDslLexer.tokens     | 111 +++++------
 .../intent/impl/antlr4/NCIntentDslParser.java      | 187 ++++++++----------
 7 files changed, 311 insertions(+), 329 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
index 9d20c04..7580c56 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
@@ -57,10 +57,11 @@ meta
     | TILDA ID LBR INT RBR
     | TILDA ID LBR qstring RBR
     ;
-qstring: SQUOTE ~'\''* SQUOTE;
+qstring: QSTRING;
 minMax: minMaxShortcut | minMaxRange;
 minMaxShortcut: PLUS | QUESTION | STAR;
 minMaxRange: LBR INT COMMA INT RBR;
+QSTRING: SQUOTE (~'\'')* SQUOTE;
 PRED_OP: '==' | '!=' | '>=' | '<=' | '>' | '<' | '@@' | '!@';
 AND: '&&';
 OR: '||';
@@ -90,7 +91,7 @@ BOOL: 'true' | 'false';
 INT: '0' | [1-9][_0-9]*;
 EXP: DOT [0-9]+;
 ID: (UNDERSCORE|[a-z]|[A-Z])+([a-z]|[A-Z]|[0-9]|COLON|MINUS|UNDERSCORE)*;
-WS : [ \r\t\u000C\n]+ -> skip ;
+WS: [ \r\t\u000C\n]+ -> skip ;
 
 ErrorCharacter
   : .
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
index cc2c536..b4de53e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
@@ -14,6 +14,7 @@ null
 'value'
 'null'
 null
+null
 '&&'
 '||'
 '|'
@@ -60,6 +61,7 @@ null
 null
 null
 null
+QSTRING
 PRED_OP
 AND
 OR
@@ -117,4 +119,4 @@ minMaxRange
 
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 46, 219, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 3, 2, 3, 2, 5, 2, 47, 10, 2, 3, 2, 5, 2, 50, 10, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 47, 212, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 3, 2, 3, 2, 5, 2, 47, 10, 2, 3, 2, 5, 2, 50, 10, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5,  [...]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
index 1fec3a7..c14c264 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
@@ -11,37 +11,38 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-PRED_OP=14
-AND=15
-OR=16
-VERT=17
-EXCL=18
-LPAREN=19
-RPAREN=20
-LCURLY=21
-RCURLY=22
-SQUOTE=23
-TILDA=24
-RIGHT=25
-LBR=26
-RBR=27
-COMMA=28
-COLON=29
-MINUS=30
-DOT=31
-UNDERSCORE=32
-EQ=33
-PLUS=34
-QUESTION=35
-STAR=36
-DOLLAR=37
-POWER=38
-BOOL=39
-INT=40
-EXP=41
-ID=42
-WS=43
-ErrorCharacter=44
+QSTRING=14
+PRED_OP=15
+AND=16
+OR=17
+VERT=18
+EXCL=19
+LPAREN=20
+RPAREN=21
+LCURLY=22
+RCURLY=23
+SQUOTE=24
+TILDA=25
+RIGHT=26
+LBR=27
+RBR=28
+COMMA=29
+COLON=30
+MINUS=31
+DOT=32
+UNDERSCORE=33
+EQ=34
+PLUS=35
+QUESTION=36
+STAR=37
+DOLLAR=38
+POWER=39
+BOOL=40
+INT=41
+EXP=42
+ID=43
+WS=44
+ErrorCharacter=45
 'intent'=1
 'ordered'=2
 'flow'=3
@@ -55,27 +56,27 @@ ErrorCharacter=44
 'ancestors'=11
 'value'=12
 'null'=13
-'&&'=15
-'||'=16
-'|'=17
-'!'=18
-'('=19
-')'=20
-'{'=21
-'}'=22
-'\''=23
-'~'=24
-'>>'=25
-'['=26
-']'=27
-','=28
-':'=29
-'-'=30
-'.'=31
-'_'=32
-'='=33
-'+'=34
-'?'=35
-'*'=36
-'$'=37
-'^'=38
+'&&'=16
+'||'=17
+'|'=18
+'!'=19
+'('=20
+')'=21
+'{'=22
+'}'=23
+'\''=24
+'~'=25
+'>>'=26
+'['=27
+']'=28
+','=29
+':'=30
+'-'=31
+'.'=32
+'_'=33
+'='=34
+'+'=35
+'?'=36
+'*'=37
+'$'=38
+'^'=39
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
index 8202aae..bd9d83c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
@@ -14,6 +14,7 @@ null
 'value'
 'null'
 null
+null
 '&&'
 '||'
 '|'
@@ -60,6 +61,7 @@ null
 null
 null
 null
+QSTRING
 PRED_OP
 AND
 OR
@@ -106,6 +108,7 @@ T__9
 T__10
 T__11
 T__12
+QSTRING
 PRED_OP
 AND
 OR
@@ -146,4 +149,4 @@ mode names:
 DEFAULT_MODE
 
 atn:
-[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 46, 295, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 47, 306, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
index 10bbb93..64cc3f6 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
@@ -18,11 +18,11 @@ public class NCIntentDslLexer extends Lexer {
 		new PredictionContextCache();
 	public static final int
 		T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, 
-		T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, OR=16, VERT=17, 
-		EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, TILDA=24, 
-		RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, UNDERSCORE=32, 
-		EQ=33, PLUS=34, QUESTION=35, STAR=36, DOLLAR=37, POWER=38, BOOL=39, INT=40, 
-		EXP=41, ID=42, WS=43, ErrorCharacter=44;
+		T__9=10, T__10=11, T__11=12, T__12=13, QSTRING=14, PRED_OP=15, AND=16, 
+		OR=17, VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, SQUOTE=24, 
+		TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, MINUS=31, DOT=32, 
+		UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, DOLLAR=38, POWER=39, 
+		BOOL=40, INT=41, EXP=42, ID=43, WS=44, ErrorCharacter=45;
 	public static String[] channelNames = {
 		"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
 	};
@@ -34,11 +34,11 @@ public class NCIntentDslLexer extends Lexer {
 	private static String[] makeRuleNames() {
 		return new String[] {
 			"T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", 
-			"T__9", "T__10", "T__11", "T__12", "PRED_OP", "AND", "OR", "VERT", "EXCL", 
-			"LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", 
-			"RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", 
-			"QUESTION", "STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", 
-			"ErrorCharacter"
+			"T__9", "T__10", "T__11", "T__12", "QSTRING", "PRED_OP", "AND", "OR", 
+			"VERT", "EXCL", "LPAREN", "RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", 
+			"RIGHT", "LBR", "RBR", "COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", 
+			"EQ", "PLUS", "QUESTION", "STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", 
+			"ID", "WS", "ErrorCharacter"
 		};
 	}
 	public static final String[] ruleNames = makeRuleNames();
@@ -47,19 +47,19 @@ public class NCIntentDslLexer extends Lexer {
 		return new String[] {
 			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
 			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
-			"'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", "'}'", 
-			"'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'", 
-			"'='", "'+'", "'?'", "'*'", "'$'", "'^'"
+			"'null'", null, null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
+			"'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", 
+			"'_'", "'='", "'+'", "'?'", "'*'", "'$'", "'^'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
 	private static String[] makeSymbolicNames() {
 		return new String[] {
 			null, null, null, null, null, null, null, null, null, null, null, null, 
-			null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
-			"LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", "COMMA", 
-			"COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", "STAR", 
-			"DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
+			null, null, "QSTRING", "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", 
+			"RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", 
+			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", 
+			"STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -121,100 +121,105 @@ public class NCIntentDslLexer extends Lexer {
 	public ATN getATN() { return _ATN; }
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2.\u0127\b\1\4\2\t"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2/\u0132\b\1\4\2\t"+
 		"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
 		"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
 		"\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+
 		"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
-		",\t,\4-\t-\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"+
-		"\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3"+
-		"\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t"+
-		"\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
-		"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\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\17\3\17\3\17\3\17\3\17\3\17"+
-		"\3\17\3\17\3\17\5\17\u00c0\n\17\3\20\3\20\3\20\3\21\3\21\3\21\3\22\3\22"+
-		"\3\23\3\23\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31"+
-		"\3\32\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\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(\5(\u00fe\n(\3)\3)\3)\7)\u0103\n)\f)\16)\u0106\13)\5)\u0108\n)\3*"+
-		"\3*\6*\u010c\n*\r*\16*\u010d\3+\3+\6+\u0112\n+\r+\16+\u0113\3+\3+\3+\3"+
-		"+\7+\u011a\n+\f+\16+\u011d\13+\3,\6,\u0120\n,\r,\16,\u0121\3,\3,\3-\3"+
-		"-\2\2.\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17"+
-		"\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\35"+
-		"9\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.\3\2\t\4\2>>@@\3\2\63;\4\2\62"+
-		";aa\3\2\62;\4\2C\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u0137\2\3\3\2\2"+
-		"\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3"+
-		"\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2"+
-		"\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2"+
-		"\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2"+
-		"\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3"+
-		"\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2"+
-		"\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2"+
-		"W\3\2\2\2\2Y\3\2\2\2\3[\3\2\2\2\5b\3\2\2\2\7j\3\2\2\2\to\3\2\2\2\13t\3"+
-		"\2\2\2\rw\3\2\2\2\17\177\3\2\2\2\21\u0088\3\2\2\2\23\u008f\3\2\2\2\25"+
-		"\u0096\3\2\2\2\27\u009d\3\2\2\2\31\u00a7\3\2\2\2\33\u00ad\3\2\2\2\35\u00bf"+
-		"\3\2\2\2\37\u00c1\3\2\2\2!\u00c4\3\2\2\2#\u00c7\3\2\2\2%\u00c9\3\2\2\2"+
-		"\'\u00cb\3\2\2\2)\u00cd\3\2\2\2+\u00cf\3\2\2\2-\u00d1\3\2\2\2/\u00d3\3"+
-		"\2\2\2\61\u00d5\3\2\2\2\63\u00d7\3\2\2\2\65\u00da\3\2\2\2\67\u00dc\3\2"+
-		"\2\29\u00de\3\2\2\2;\u00e0\3\2\2\2=\u00e2\3\2\2\2?\u00e4\3\2\2\2A\u00e6"+
-		"\3\2\2\2C\u00e8\3\2\2\2E\u00ea\3\2\2\2G\u00ec\3\2\2\2I\u00ee\3\2\2\2K"+
-		"\u00f0\3\2\2\2M\u00f2\3\2\2\2O\u00fd\3\2\2\2Q\u0107\3\2\2\2S\u0109\3\2"+
-		"\2\2U\u0111\3\2\2\2W\u011f\3\2\2\2Y\u0125\3\2\2\2[\\\7k\2\2\\]\7p\2\2"+
-		"]^\7v\2\2^_\7g\2\2_`\7p\2\2`a\7v\2\2a\4\3\2\2\2bc\7q\2\2cd\7t\2\2de\7"+
-		"f\2\2ef\7g\2\2fg\7t\2\2gh\7g\2\2hi\7f\2\2i\6\3\2\2\2jk\7h\2\2kl\7n\2\2"+
-		"lm\7q\2\2mn\7y\2\2n\b\3\2\2\2op\7v\2\2pq\7g\2\2qr\7t\2\2rs\7o\2\2s\n\3"+
-		"\2\2\2tu\7k\2\2uv\7f\2\2v\f\3\2\2\2wx\7c\2\2xy\7n\2\2yz\7k\2\2z{\7c\2"+
-		"\2{|\7u\2\2|}\7g\2\2}~\7u\2\2~\16\3\2\2\2\177\u0080\7u\2\2\u0080\u0081"+
-		"\7v\2\2\u0081\u0082\7c\2\2\u0082\u0083\7t\2\2\u0083\u0084\7v\2\2\u0084"+
-		"\u0085\7k\2\2\u0085\u0086\7f\2\2\u0086\u0087\7z\2\2\u0087\20\3\2\2\2\u0088"+
-		"\u0089\7g\2\2\u0089\u008a\7p\2\2\u008a\u008b\7f\2\2\u008b\u008c\7k\2\2"+
-		"\u008c\u008d\7f\2\2\u008d\u008e\7z\2\2\u008e\22\3\2\2\2\u008f\u0090\7"+
-		"r\2\2\u0090\u0091\7c\2\2\u0091\u0092\7t\2\2\u0092\u0093\7g\2\2\u0093\u0094"+
-		"\7p\2\2\u0094\u0095\7v\2\2\u0095\24\3\2\2\2\u0096\u0097\7i\2\2\u0097\u0098"+
-		"\7t\2\2\u0098\u0099\7q\2\2\u0099\u009a\7w\2\2\u009a\u009b\7r\2\2\u009b"+
-		"\u009c\7u\2\2\u009c\26\3\2\2\2\u009d\u009e\7c\2\2\u009e\u009f\7p\2\2\u009f"+
-		"\u00a0\7e\2\2\u00a0\u00a1\7g\2\2\u00a1\u00a2\7u\2\2\u00a2\u00a3\7v\2\2"+
-		"\u00a3\u00a4\7q\2\2\u00a4\u00a5\7t\2\2\u00a5\u00a6\7u\2\2\u00a6\30\3\2"+
-		"\2\2\u00a7\u00a8\7x\2\2\u00a8\u00a9\7c\2\2\u00a9\u00aa\7n\2\2\u00aa\u00ab"+
-		"\7w\2\2\u00ab\u00ac\7g\2\2\u00ac\32\3\2\2\2\u00ad\u00ae\7p\2\2\u00ae\u00af"+
-		"\7w\2\2\u00af\u00b0\7n\2\2\u00b0\u00b1\7n\2\2\u00b1\34\3\2\2\2\u00b2\u00b3"+
-		"\7?\2\2\u00b3\u00c0\7?\2\2\u00b4\u00b5\7#\2\2\u00b5\u00c0\7?\2\2\u00b6"+
-		"\u00b7\7@\2\2\u00b7\u00c0\7?\2\2\u00b8\u00b9\7>\2\2\u00b9\u00c0\7?\2\2"+
-		"\u00ba\u00c0\t\2\2\2\u00bb\u00bc\7B\2\2\u00bc\u00c0\7B\2\2\u00bd\u00be"+
-		"\7#\2\2\u00be\u00c0\7B\2\2\u00bf\u00b2\3\2\2\2\u00bf\u00b4\3\2\2\2\u00bf"+
-		"\u00b6\3\2\2\2\u00bf\u00b8\3\2\2\2\u00bf\u00ba\3\2\2\2\u00bf\u00bb\3\2"+
-		"\2\2\u00bf\u00bd\3\2\2\2\u00c0\36\3\2\2\2\u00c1\u00c2\7(\2\2\u00c2\u00c3"+
-		"\7(\2\2\u00c3 \3\2\2\2\u00c4\u00c5\7~\2\2\u00c5\u00c6\7~\2\2\u00c6\"\3"+
-		"\2\2\2\u00c7\u00c8\7~\2\2\u00c8$\3\2\2\2\u00c9\u00ca\7#\2\2\u00ca&\3\2"+
-		"\2\2\u00cb\u00cc\7*\2\2\u00cc(\3\2\2\2\u00cd\u00ce\7+\2\2\u00ce*\3\2\2"+
-		"\2\u00cf\u00d0\7}\2\2\u00d0,\3\2\2\2\u00d1\u00d2\7\177\2\2\u00d2.\3\2"+
-		"\2\2\u00d3\u00d4\7)\2\2\u00d4\60\3\2\2\2\u00d5\u00d6\7\u0080\2\2\u00d6"+
-		"\62\3\2\2\2\u00d7\u00d8\7@\2\2\u00d8\u00d9\7@\2\2\u00d9\64\3\2\2\2\u00da"+
-		"\u00db\7]\2\2\u00db\66\3\2\2\2\u00dc\u00dd\7_\2\2\u00dd8\3\2\2\2\u00de"+
-		"\u00df\7.\2\2\u00df:\3\2\2\2\u00e0\u00e1\7<\2\2\u00e1<\3\2\2\2\u00e2\u00e3"+
-		"\7/\2\2\u00e3>\3\2\2\2\u00e4\u00e5\7\60\2\2\u00e5@\3\2\2\2\u00e6\u00e7"+
-		"\7a\2\2\u00e7B\3\2\2\2\u00e8\u00e9\7?\2\2\u00e9D\3\2\2\2\u00ea\u00eb\7"+
-		"-\2\2\u00ebF\3\2\2\2\u00ec\u00ed\7A\2\2\u00edH\3\2\2\2\u00ee\u00ef\7,"+
-		"\2\2\u00efJ\3\2\2\2\u00f0\u00f1\7&\2\2\u00f1L\3\2\2\2\u00f2\u00f3\7`\2"+
-		"\2\u00f3N\3\2\2\2\u00f4\u00f5\7v\2\2\u00f5\u00f6\7t\2\2\u00f6\u00f7\7"+
-		"w\2\2\u00f7\u00fe\7g\2\2\u00f8\u00f9\7h\2\2\u00f9\u00fa\7c\2\2\u00fa\u00fb"+
-		"\7n\2\2\u00fb\u00fc\7u\2\2\u00fc\u00fe\7g\2\2\u00fd\u00f4\3\2\2\2\u00fd"+
-		"\u00f8\3\2\2\2\u00feP\3\2\2\2\u00ff\u0108\7\62\2\2\u0100\u0104\t\3\2\2"+
-		"\u0101\u0103\t\4\2\2\u0102\u0101\3\2\2\2\u0103\u0106\3\2\2\2\u0104\u0102"+
-		"\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0108\3\2\2\2\u0106\u0104\3\2\2\2\u0107"+
-		"\u00ff\3\2\2\2\u0107\u0100\3\2\2\2\u0108R\3\2\2\2\u0109\u010b\5? \2\u010a"+
-		"\u010c\t\5\2\2\u010b\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010b\3\2"+
-		"\2\2\u010d\u010e\3\2\2\2\u010eT\3\2\2\2\u010f\u0112\5A!\2\u0110\u0112"+
-		"\t\6\2\2\u0111\u010f\3\2\2\2\u0111\u0110\3\2\2\2\u0112\u0113\3\2\2\2\u0113"+
-		"\u0111\3\2\2\2\u0113\u0114\3\2\2\2\u0114\u011b\3\2\2\2\u0115\u011a\t\7"+
-		"\2\2\u0116\u011a\5;\36\2\u0117\u011a\5=\37\2\u0118\u011a\5A!\2\u0119\u0115"+
-		"\3\2\2\2\u0119\u0116\3\2\2\2\u0119\u0117\3\2\2\2\u0119\u0118\3\2\2\2\u011a"+
-		"\u011d\3\2\2\2\u011b\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011cV\3\2\2\2"+
-		"\u011d\u011b\3\2\2\2\u011e\u0120\t\b\2\2\u011f\u011e\3\2\2\2\u0120\u0121"+
-		"\3\2\2\2\u0121\u011f\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u0123\3\2\2\2\u0123"+
-		"\u0124\b,\2\2\u0124X\3\2\2\2\u0125\u0126\13\2\2\2\u0126Z\3\2\2\2\r\2\u00bf"+
-		"\u00fd\u0104\u0107\u010d\u0111\u0113\u0119\u011b\u0121\3\b\2\2";
+		",\t,\4-\t-\4.\t.\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3"+
+		"\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\7\3\7\3\7"+
+		"\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3"+
+		"\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3"+
+		"\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+
+		"\r\3\16\3\16\3\16\3\16\3\16\3\17\3\17\7\17\u00b7\n\17\f\17\16\17\u00ba"+
+		"\13\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+		"\3\20\3\20\5\20\u00cb\n\20\3\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23\3\24"+
+		"\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\32\3\32\3\33"+
+		"\3\33\3\33\3\34\3\34\3\35\3\35\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)\5)\u0109"+
+		"\n)\3*\3*\3*\7*\u010e\n*\f*\16*\u0111\13*\5*\u0113\n*\3+\3+\6+\u0117\n"+
+		"+\r+\16+\u0118\3,\3,\6,\u011d\n,\r,\16,\u011e\3,\3,\3,\3,\7,\u0125\n,"+
+		"\f,\16,\u0128\13,\3-\6-\u012b\n-\r-\16-\u012c\3-\3-\3.\3.\2\2/\3\3\5\4"+
+		"\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+
+		"#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+
+		"#E$G%I&K\'M(O)Q*S+U,W-Y.[/\3\2\n\3\2))\4\2>>@@\3\2\63;\4\2\62;aa\3\2\62"+
+		";\4\2C\\c|\5\2\62;C\\c|\5\2\13\f\16\17\"\"\2\u0143\2\3\3\2\2\2\2\5\3\2"+
+		"\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21"+
+		"\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2"+
+		"\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3"+
+		"\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3"+
+		"\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3"+
+		"\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2"+
+		"\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2"+
+		"Y\3\2\2\2\2[\3\2\2\2\3]\3\2\2\2\5d\3\2\2\2\7l\3\2\2\2\tq\3\2\2\2\13v\3"+
+		"\2\2\2\ry\3\2\2\2\17\u0081\3\2\2\2\21\u008a\3\2\2\2\23\u0091\3\2\2\2\25"+
+		"\u0098\3\2\2\2\27\u009f\3\2\2\2\31\u00a9\3\2\2\2\33\u00af\3\2\2\2\35\u00b4"+
+		"\3\2\2\2\37\u00ca\3\2\2\2!\u00cc\3\2\2\2#\u00cf\3\2\2\2%\u00d2\3\2\2\2"+
+		"\'\u00d4\3\2\2\2)\u00d6\3\2\2\2+\u00d8\3\2\2\2-\u00da\3\2\2\2/\u00dc\3"+
+		"\2\2\2\61\u00de\3\2\2\2\63\u00e0\3\2\2\2\65\u00e2\3\2\2\2\67\u00e5\3\2"+
+		"\2\29\u00e7\3\2\2\2;\u00e9\3\2\2\2=\u00eb\3\2\2\2?\u00ed\3\2\2\2A\u00ef"+
+		"\3\2\2\2C\u00f1\3\2\2\2E\u00f3\3\2\2\2G\u00f5\3\2\2\2I\u00f7\3\2\2\2K"+
+		"\u00f9\3\2\2\2M\u00fb\3\2\2\2O\u00fd\3\2\2\2Q\u0108\3\2\2\2S\u0112\3\2"+
+		"\2\2U\u0114\3\2\2\2W\u011c\3\2\2\2Y\u012a\3\2\2\2[\u0130\3\2\2\2]^\7k"+
+		"\2\2^_\7p\2\2_`\7v\2\2`a\7g\2\2ab\7p\2\2bc\7v\2\2c\4\3\2\2\2de\7q\2\2"+
+		"ef\7t\2\2fg\7f\2\2gh\7g\2\2hi\7t\2\2ij\7g\2\2jk\7f\2\2k\6\3\2\2\2lm\7"+
+		"h\2\2mn\7n\2\2no\7q\2\2op\7y\2\2p\b\3\2\2\2qr\7v\2\2rs\7g\2\2st\7t\2\2"+
+		"tu\7o\2\2u\n\3\2\2\2vw\7k\2\2wx\7f\2\2x\f\3\2\2\2yz\7c\2\2z{\7n\2\2{|"+
+		"\7k\2\2|}\7c\2\2}~\7u\2\2~\177\7g\2\2\177\u0080\7u\2\2\u0080\16\3\2\2"+
+		"\2\u0081\u0082\7u\2\2\u0082\u0083\7v\2\2\u0083\u0084\7c\2\2\u0084\u0085"+
+		"\7t\2\2\u0085\u0086\7v\2\2\u0086\u0087\7k\2\2\u0087\u0088\7f\2\2\u0088"+
+		"\u0089\7z\2\2\u0089\20\3\2\2\2\u008a\u008b\7g\2\2\u008b\u008c\7p\2\2\u008c"+
+		"\u008d\7f\2\2\u008d\u008e\7k\2\2\u008e\u008f\7f\2\2\u008f\u0090\7z\2\2"+
+		"\u0090\22\3\2\2\2\u0091\u0092\7r\2\2\u0092\u0093\7c\2\2\u0093\u0094\7"+
+		"t\2\2\u0094\u0095\7g\2\2\u0095\u0096\7p\2\2\u0096\u0097\7v\2\2\u0097\24"+
+		"\3\2\2\2\u0098\u0099\7i\2\2\u0099\u009a\7t\2\2\u009a\u009b\7q\2\2\u009b"+
+		"\u009c\7w\2\2\u009c\u009d\7r\2\2\u009d\u009e\7u\2\2\u009e\26\3\2\2\2\u009f"+
+		"\u00a0\7c\2\2\u00a0\u00a1\7p\2\2\u00a1\u00a2\7e\2\2\u00a2\u00a3\7g\2\2"+
+		"\u00a3\u00a4\7u\2\2\u00a4\u00a5\7v\2\2\u00a5\u00a6\7q\2\2\u00a6\u00a7"+
+		"\7t\2\2\u00a7\u00a8\7u\2\2\u00a8\30\3\2\2\2\u00a9\u00aa\7x\2\2\u00aa\u00ab"+
+		"\7c\2\2\u00ab\u00ac\7n\2\2\u00ac\u00ad\7w\2\2\u00ad\u00ae\7g\2\2\u00ae"+
+		"\32\3\2\2\2\u00af\u00b0\7p\2\2\u00b0\u00b1\7w\2\2\u00b1\u00b2\7n\2\2\u00b2"+
+		"\u00b3\7n\2\2\u00b3\34\3\2\2\2\u00b4\u00b8\5\61\31\2\u00b5\u00b7\n\2\2"+
+		"\2\u00b6\u00b5\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8\u00b9"+
+		"\3\2\2\2\u00b9\u00bb\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc\5\61\31\2"+
+		"\u00bc\36\3\2\2\2\u00bd\u00be\7?\2\2\u00be\u00cb\7?\2\2\u00bf\u00c0\7"+
+		"#\2\2\u00c0\u00cb\7?\2\2\u00c1\u00c2\7@\2\2\u00c2\u00cb\7?\2\2\u00c3\u00c4"+
+		"\7>\2\2\u00c4\u00cb\7?\2\2\u00c5\u00cb\t\3\2\2\u00c6\u00c7\7B\2\2\u00c7"+
+		"\u00cb\7B\2\2\u00c8\u00c9\7#\2\2\u00c9\u00cb\7B\2\2\u00ca\u00bd\3\2\2"+
+		"\2\u00ca\u00bf\3\2\2\2\u00ca\u00c1\3\2\2\2\u00ca\u00c3\3\2\2\2\u00ca\u00c5"+
+		"\3\2\2\2\u00ca\u00c6\3\2\2\2\u00ca\u00c8\3\2\2\2\u00cb \3\2\2\2\u00cc"+
+		"\u00cd\7(\2\2\u00cd\u00ce\7(\2\2\u00ce\"\3\2\2\2\u00cf\u00d0\7~\2\2\u00d0"+
+		"\u00d1\7~\2\2\u00d1$\3\2\2\2\u00d2\u00d3\7~\2\2\u00d3&\3\2\2\2\u00d4\u00d5"+
+		"\7#\2\2\u00d5(\3\2\2\2\u00d6\u00d7\7*\2\2\u00d7*\3\2\2\2\u00d8\u00d9\7"+
+		"+\2\2\u00d9,\3\2\2\2\u00da\u00db\7}\2\2\u00db.\3\2\2\2\u00dc\u00dd\7\177"+
+		"\2\2\u00dd\60\3\2\2\2\u00de\u00df\7)\2\2\u00df\62\3\2\2\2\u00e0\u00e1"+
+		"\7\u0080\2\2\u00e1\64\3\2\2\2\u00e2\u00e3\7@\2\2\u00e3\u00e4\7@\2\2\u00e4"+
+		"\66\3\2\2\2\u00e5\u00e6\7]\2\2\u00e68\3\2\2\2\u00e7\u00e8\7_\2\2\u00e8"+
+		":\3\2\2\2\u00e9\u00ea\7.\2\2\u00ea<\3\2\2\2\u00eb\u00ec\7<\2\2\u00ec>"+
+		"\3\2\2\2\u00ed\u00ee\7/\2\2\u00ee@\3\2\2\2\u00ef\u00f0\7\60\2\2\u00f0"+
+		"B\3\2\2\2\u00f1\u00f2\7a\2\2\u00f2D\3\2\2\2\u00f3\u00f4\7?\2\2\u00f4F"+
+		"\3\2\2\2\u00f5\u00f6\7-\2\2\u00f6H\3\2\2\2\u00f7\u00f8\7A\2\2\u00f8J\3"+
+		"\2\2\2\u00f9\u00fa\7,\2\2\u00faL\3\2\2\2\u00fb\u00fc\7&\2\2\u00fcN\3\2"+
+		"\2\2\u00fd\u00fe\7`\2\2\u00feP\3\2\2\2\u00ff\u0100\7v\2\2\u0100\u0101"+
+		"\7t\2\2\u0101\u0102\7w\2\2\u0102\u0109\7g\2\2\u0103\u0104\7h\2\2\u0104"+
+		"\u0105\7c\2\2\u0105\u0106\7n\2\2\u0106\u0107\7u\2\2\u0107\u0109\7g\2\2"+
+		"\u0108\u00ff\3\2\2\2\u0108\u0103\3\2\2\2\u0109R\3\2\2\2\u010a\u0113\7"+
+		"\62\2\2\u010b\u010f\t\4\2\2\u010c\u010e\t\5\2\2\u010d\u010c\3\2\2\2\u010e"+
+		"\u0111\3\2\2\2\u010f\u010d\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0113\3\2"+
+		"\2\2\u0111\u010f\3\2\2\2\u0112\u010a\3\2\2\2\u0112\u010b\3\2\2\2\u0113"+
+		"T\3\2\2\2\u0114\u0116\5A!\2\u0115\u0117\t\6\2\2\u0116\u0115\3\2\2\2\u0117"+
+		"\u0118\3\2\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119V\3\2\2\2"+
+		"\u011a\u011d\5C\"\2\u011b\u011d\t\7\2\2\u011c\u011a\3\2\2\2\u011c\u011b"+
+		"\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f"+
+		"\u0126\3\2\2\2\u0120\u0125\t\b\2\2\u0121\u0125\5=\37\2\u0122\u0125\5?"+
+		" \2\u0123\u0125\5C\"\2\u0124\u0120\3\2\2\2\u0124\u0121\3\2\2\2\u0124\u0122"+
+		"\3\2\2\2\u0124\u0123\3\2\2\2\u0125\u0128\3\2\2\2\u0126\u0124\3\2\2\2\u0126"+
+		"\u0127\3\2\2\2\u0127X\3\2\2\2\u0128\u0126\3\2\2\2\u0129\u012b\t\t\2\2"+
+		"\u012a\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012a\3\2\2\2\u012c\u012d"+
+		"\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\b-\2\2\u012fZ\3\2\2\2\u0130\u0131"+
+		"\13\2\2\2\u0131\\\3\2\2\2\16\2\u00b8\u00ca\u0108\u010f\u0112\u0118\u011c"+
+		"\u011e\u0124\u0126\u012c\3\b\2\2";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
index 1fec3a7..c14c264 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
@@ -11,37 +11,38 @@ T__9=10
 T__10=11
 T__11=12
 T__12=13
-PRED_OP=14
-AND=15
-OR=16
-VERT=17
-EXCL=18
-LPAREN=19
-RPAREN=20
-LCURLY=21
-RCURLY=22
-SQUOTE=23
-TILDA=24
-RIGHT=25
-LBR=26
-RBR=27
-COMMA=28
-COLON=29
-MINUS=30
-DOT=31
-UNDERSCORE=32
-EQ=33
-PLUS=34
-QUESTION=35
-STAR=36
-DOLLAR=37
-POWER=38
-BOOL=39
-INT=40
-EXP=41
-ID=42
-WS=43
-ErrorCharacter=44
+QSTRING=14
+PRED_OP=15
+AND=16
+OR=17
+VERT=18
+EXCL=19
+LPAREN=20
+RPAREN=21
+LCURLY=22
+RCURLY=23
+SQUOTE=24
+TILDA=25
+RIGHT=26
+LBR=27
+RBR=28
+COMMA=29
+COLON=30
+MINUS=31
+DOT=32
+UNDERSCORE=33
+EQ=34
+PLUS=35
+QUESTION=36
+STAR=37
+DOLLAR=38
+POWER=39
+BOOL=40
+INT=41
+EXP=42
+ID=43
+WS=44
+ErrorCharacter=45
 'intent'=1
 'ordered'=2
 'flow'=3
@@ -55,27 +56,27 @@ ErrorCharacter=44
 'ancestors'=11
 'value'=12
 'null'=13
-'&&'=15
-'||'=16
-'|'=17
-'!'=18
-'('=19
-')'=20
-'{'=21
-'}'=22
-'\''=23
-'~'=24
-'>>'=25
-'['=26
-']'=27
-','=28
-':'=29
-'-'=30
-'.'=31
-'_'=32
-'='=33
-'+'=34
-'?'=35
-'*'=36
-'$'=37
-'^'=38
+'&&'=16
+'||'=17
+'|'=18
+'!'=19
+'('=20
+')'=21
+'{'=22
+'}'=23
+'\''=24
+'~'=25
+'>>'=26
+'['=27
+']'=28
+','=29
+':'=30
+'-'=31
+'.'=32
+'_'=33
+'='=34
+'+'=35
+'?'=36
+'*'=37
+'$'=38
+'^'=39
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
index e34b4f8..dc599fe 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
@@ -18,11 +18,11 @@ public class NCIntentDslParser extends Parser {
 		new PredictionContextCache();
 	public static final int
 		T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, 
-		T__9=10, T__10=11, T__11=12, T__12=13, PRED_OP=14, AND=15, OR=16, VERT=17, 
-		EXCL=18, LPAREN=19, RPAREN=20, LCURLY=21, RCURLY=22, SQUOTE=23, TILDA=24, 
-		RIGHT=25, LBR=26, RBR=27, COMMA=28, COLON=29, MINUS=30, DOT=31, UNDERSCORE=32, 
-		EQ=33, PLUS=34, QUESTION=35, STAR=36, DOLLAR=37, POWER=38, BOOL=39, INT=40, 
-		EXP=41, ID=42, WS=43, ErrorCharacter=44;
+		T__9=10, T__10=11, T__11=12, T__12=13, QSTRING=14, PRED_OP=15, AND=16, 
+		OR=17, VERT=18, EXCL=19, LPAREN=20, RPAREN=21, LCURLY=22, RCURLY=23, SQUOTE=24, 
+		TILDA=25, RIGHT=26, LBR=27, RBR=28, COMMA=29, COLON=30, MINUS=31, DOT=32, 
+		UNDERSCORE=33, EQ=34, PLUS=35, QUESTION=36, STAR=37, DOLLAR=38, POWER=39, 
+		BOOL=40, INT=41, EXP=42, ID=43, WS=44, ErrorCharacter=45;
 	public static final int
 		RULE_intent = 0, RULE_intentId = 1, RULE_orderedDecl = 2, RULE_flowDecl = 3, 
 		RULE_terms = 4, RULE_termEq = 5, RULE_term = 6, RULE_termId = 7, RULE_item = 8, 
@@ -42,19 +42,19 @@ public class NCIntentDslParser extends Parser {
 		return new String[] {
 			null, "'intent'", "'ordered'", "'flow'", "'term'", "'id'", "'aliases'", 
 			"'startidx'", "'endidx'", "'parent'", "'groups'", "'ancestors'", "'value'", 
-			"'null'", null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", "'}'", 
-			"'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", "'_'", 
-			"'='", "'+'", "'?'", "'*'", "'$'", "'^'"
+			"'null'", null, null, "'&&'", "'||'", "'|'", "'!'", "'('", "')'", "'{'", 
+			"'}'", "'''", "'~'", "'>>'", "'['", "']'", "','", "':'", "'-'", "'.'", 
+			"'_'", "'='", "'+'", "'?'", "'*'", "'$'", "'^'"
 		};
 	}
 	private static final String[] _LITERAL_NAMES = makeLiteralNames();
 	private static String[] makeSymbolicNames() {
 		return new String[] {
 			null, null, null, null, null, null, null, null, null, null, null, null, 
-			null, null, "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", "RPAREN", 
-			"LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", "COMMA", 
-			"COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", "STAR", 
-			"DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
+			null, null, "QSTRING", "PRED_OP", "AND", "OR", "VERT", "EXCL", "LPAREN", 
+			"RPAREN", "LCURLY", "RCURLY", "SQUOTE", "TILDA", "RIGHT", "LBR", "RBR", 
+			"COMMA", "COLON", "MINUS", "DOT", "UNDERSCORE", "EQ", "PLUS", "QUESTION", 
+			"STAR", "DOLLAR", "POWER", "BOOL", "INT", "EXP", "ID", "WS", "ErrorCharacter"
 		};
 	}
 	private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
@@ -1063,7 +1063,7 @@ public class NCIntentDslParser extends Parser {
 				match(BOOL);
 				}
 				break;
-			case SQUOTE:
+			case QSTRING:
 				enterOuterAlt(_localctx, 4);
 				{
 				setState(159);
@@ -1116,7 +1116,7 @@ public class NCIntentDslParser extends Parser {
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case T__12:
-			case SQUOTE:
+			case QSTRING:
 			case MINUS:
 			case BOOL:
 			case INT:
@@ -1314,10 +1314,7 @@ public class NCIntentDslParser extends Parser {
 	}
 
 	public static class QstringContext extends ParserRuleContext {
-		public List<TerminalNode> SQUOTE() { return getTokens(NCIntentDslParser.SQUOTE); }
-		public TerminalNode SQUOTE(int i) {
-			return getToken(NCIntentDslParser.SQUOTE, i);
-		}
+		public TerminalNode QSTRING() { return getToken(NCIntentDslParser.QSTRING, 0); }
 		public QstringContext(ParserRuleContext parent, int invokingState) {
 			super(parent, invokingState);
 		}
@@ -1335,36 +1332,11 @@ public class NCIntentDslParser extends Parser {
 	public final QstringContext qstring() throws RecognitionException {
 		QstringContext _localctx = new QstringContext(_ctx, getState());
 		enterRule(_localctx, 34, RULE_qstring);
-		int _la;
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
 			setState(195);
-			match(SQUOTE);
-			setState(199);
-			_errHandler.sync(this);
-			_la = _input.LA(1);
-			while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__1) | (1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << PRED_OP) | (1L << AND) | (1L << OR) | (1L << VERT) | (1L << EXCL) | (1L << LPAREN) | (1L << RPAREN) | (1L << LCURLY) | (1L << RCURLY) | (1L << TILDA) | (1L << RIGHT) | (1L << LBR) | (1L << RBR) | (1L << COMMA) | (1L << COLON) | (1L << M [...]
-				{
-				{
-				setState(196);
-				_la = _input.LA(1);
-				if ( _la <= 0 || (_la==SQUOTE) ) {
-				_errHandler.recoverInline(this);
-				}
-				else {
-					if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
-					_errHandler.reportMatch(this);
-					consume();
-				}
-				}
-				}
-				setState(201);
-				_errHandler.sync(this);
-				_la = _input.LA(1);
-			}
-			setState(202);
-			match(SQUOTE);
+			match(QSTRING);
 			}
 		}
 		catch (RecognitionException re) {
@@ -1403,7 +1375,7 @@ public class NCIntentDslParser extends Parser {
 		MinMaxContext _localctx = new MinMaxContext(_ctx, getState());
 		enterRule(_localctx, 36, RULE_minMax);
 		try {
-			setState(206);
+			setState(199);
 			_errHandler.sync(this);
 			switch (_input.LA(1)) {
 			case PLUS:
@@ -1411,14 +1383,14 @@ public class NCIntentDslParser extends Parser {
 			case STAR:
 				enterOuterAlt(_localctx, 1);
 				{
-				setState(204);
+				setState(197);
 				minMaxShortcut();
 				}
 				break;
 			case LBR:
 				enterOuterAlt(_localctx, 2);
 				{
-				setState(205);
+				setState(198);
 				minMaxRange();
 				}
 				break;
@@ -1462,7 +1434,7 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(208);
+			setState(201);
 			_la = _input.LA(1);
 			if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << QUESTION) | (1L << STAR))) != 0)) ) {
 			_errHandler.recoverInline(this);
@@ -1513,15 +1485,15 @@ public class NCIntentDslParser extends Parser {
 		try {
 			enterOuterAlt(_localctx, 1);
 			{
-			setState(210);
+			setState(203);
 			match(LBR);
-			setState(211);
+			setState(204);
 			match(INT);
-			setState(212);
+			setState(205);
 			match(COMMA);
-			setState(213);
+			setState(206);
 			match(INT);
-			setState(214);
+			setState(207);
 			match(RBR);
 			}
 		}
@@ -1579,7 +1551,7 @@ public class NCIntentDslParser extends Parser {
 	}
 
 	public static final String _serializedATN =
-		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3.\u00db\4\2\t\2\4"+
+		"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3/\u00d4\4\2\t\2\4"+
 		"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
 		"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
 		"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\3\2\3\2\5\2/\n\2\3\2\5\2\62\n"+
@@ -1593,61 +1565,58 @@ public class NCIntentDslParser extends Parser {
 		"\3\17\5\17\u009f\n\17\3\17\3\17\5\17\u00a3\n\17\3\20\3\20\3\20\3\20\3"+
 		"\20\5\20\u00aa\n\20\3\21\3\21\3\21\3\21\3\21\3\21\7\21\u00b2\n\21\f\21"+
 		"\16\21\u00b5\13\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3"+
-		"\22\3\22\3\22\5\22\u00c4\n\22\3\23\3\23\7\23\u00c8\n\23\f\23\16\23\u00cb"+
-		"\13\23\3\23\3\23\3\24\3\24\5\24\u00d1\n\24\3\25\3\25\3\26\3\26\3\26\3"+
-		"\26\3\26\3\26\3\26\2\6\n\22\30 \27\2\4\6\b\n\f\16\20\22\24\26\30\32\34"+
-		"\36 \"$&(*\2\6\4\2\32\32##\3\2\21\22\3\2\31\31\3\2$&\2\u00e3\2,\3\2\2"+
-		"\2\4\66\3\2\2\2\6:\3\2\2\2\b>\3\2\2\2\nB\3\2\2\2\fL\3\2\2\2\16N\3\2\2"+
-		"\2\20Y\3\2\2\2\22e\3\2\2\2\24z\3\2\2\2\26}\3\2\2\2\30\u008a\3\2\2\2\32"+
-		"\u0094\3\2\2\2\34\u00a2\3\2\2\2\36\u00a9\3\2\2\2 \u00ab\3\2\2\2\"\u00c3"+
-		"\3\2\2\2$\u00c5\3\2\2\2&\u00d0\3\2\2\2(\u00d2\3\2\2\2*\u00d4\3\2\2\2,"+
-		".\5\4\3\2-/\5\6\4\2.-\3\2\2\2./\3\2\2\2/\61\3\2\2\2\60\62\5\b\5\2\61\60"+
-		"\3\2\2\2\61\62\3\2\2\2\62\63\3\2\2\2\63\64\5\n\6\2\64\65\7\2\2\3\65\3"+
-		"\3\2\2\2\66\67\7\3\2\2\678\7#\2\289\7,\2\29\5\3\2\2\2:;\7\4\2\2;<\7#\2"+
-		"\2<=\7)\2\2=\7\3\2\2\2>?\7\5\2\2?@\7#\2\2@A\5$\23\2A\t\3\2\2\2BC\b\6\1"+
-		"\2CD\5\16\b\2DI\3\2\2\2EF\f\3\2\2FH\5\16\b\2GE\3\2\2\2HK\3\2\2\2IG\3\2"+
-		"\2\2IJ\3\2\2\2J\13\3\2\2\2KI\3\2\2\2LM\t\2\2\2M\r\3\2\2\2NP\7\6\2\2OQ"+
-		"\5\20\t\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2RS\5\f\7\2ST\7\27\2\2TU\5\22\n"+
-		"\2UW\7\30\2\2VX\5&\24\2WV\3\2\2\2WX\3\2\2\2X\17\3\2\2\2YZ\7\25\2\2Z[\7"+
-		",\2\2[\\\7\26\2\2\\\21\3\2\2\2]^\b\n\1\2^f\5\24\13\2_`\7\25\2\2`a\5\22"+
-		"\n\2ab\7\26\2\2bf\3\2\2\2cd\7\24\2\2df\5\22\n\3e]\3\2\2\2e_\3\2\2\2ec"+
-		"\3\2\2\2fl\3\2\2\2gh\f\4\2\2hi\t\3\2\2ik\5\22\n\5jg\3\2\2\2kn\3\2\2\2"+
-		"lj\3\2\2\2lm\3\2\2\2m\23\3\2\2\2nl\3\2\2\2op\5\26\f\2pq\7\20\2\2qr\5\36"+
-		"\20\2r{\3\2\2\2st\7,\2\2tu\7\25\2\2uv\5\26\f\2vw\7\26\2\2wx\7\20\2\2x"+
-		"y\5\36\20\2y{\3\2\2\2zo\3\2\2\2zs\3\2\2\2{\25\3\2\2\2|~\5\30\r\2}|\3\2"+
-		"\2\2}~\3\2\2\2~\u0088\3\2\2\2\177\u0089\7\7\2\2\u0080\u0089\7\b\2\2\u0081"+
-		"\u0089\7\t\2\2\u0082\u0089\7\n\2\2\u0083\u0089\7\13\2\2\u0084\u0089\7"+
-		"\f\2\2\u0085\u0089\7\r\2\2\u0086\u0089\7\16\2\2\u0087\u0089\5\"\22\2\u0088"+
-		"\177\3\2\2\2\u0088\u0080\3\2\2\2\u0088\u0081\3\2\2\2\u0088\u0082\3\2\2"+
-		"\2\u0088\u0083\3\2\2\2\u0088\u0084\3\2\2\2\u0088\u0085\3\2\2\2\u0088\u0086"+
-		"\3\2\2\2\u0088\u0087\3\2\2\2\u0089\27\3\2\2\2\u008a\u008b\b\r\1\2\u008b"+
-		"\u008c\5\32\16\2\u008c\u0091\3\2\2\2\u008d\u008e\f\3\2\2\u008e\u0090\5"+
-		"\32\16\2\u008f\u008d\3\2\2\2\u0090\u0093\3\2\2\2\u0091\u008f\3\2\2\2\u0091"+
-		"\u0092\3\2\2\2\u0092\31\3\2\2\2\u0093\u0091\3\2\2\2\u0094\u0095\7,\2\2"+
-		"\u0095\u0096\7!\2\2\u0096\33\3\2\2\2\u0097\u00a3\7\17\2\2\u0098\u009a"+
-		"\7 \2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009e\3\2\2\2\u009b"+
-		"\u009f\7*\2\2\u009c\u009d\7*\2\2\u009d\u009f\7+\2\2\u009e\u009b\3\2\2"+
-		"\2\u009e\u009c\3\2\2\2\u009f\u00a3\3\2\2\2\u00a0\u00a3\7)\2\2\u00a1\u00a3"+
-		"\5$\23\2\u00a2\u0097\3\2\2\2\u00a2\u0099\3\2\2\2\u00a2\u00a0\3\2\2\2\u00a2"+
-		"\u00a1\3\2\2\2\u00a3\35\3\2\2\2\u00a4\u00aa\5\34\17\2\u00a5\u00a6\7\25"+
-		"\2\2\u00a6\u00a7\5 \21\2\u00a7\u00a8\7\26\2\2\u00a8\u00aa\3\2\2\2\u00a9"+
-		"\u00a4\3\2\2\2\u00a9\u00a5\3\2\2\2\u00aa\37\3\2\2\2\u00ab\u00ac\b\21\1"+
-		"\2\u00ac\u00ad\5\34\17\2\u00ad\u00b3\3\2\2\2\u00ae\u00af\f\3\2\2\u00af"+
-		"\u00b0\7\36\2\2\u00b0\u00b2\5\34\17\2\u00b1\u00ae\3\2\2\2\u00b2\u00b5"+
-		"\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4!\3\2\2\2\u00b5"+
-		"\u00b3\3\2\2\2\u00b6\u00b7\7\32\2\2\u00b7\u00c4\7,\2\2\u00b8\u00b9\7\32"+
-		"\2\2\u00b9\u00ba\7,\2\2\u00ba\u00bb\7\34\2\2\u00bb\u00bc\7*\2\2\u00bc"+
-		"\u00c4\7\35\2\2\u00bd\u00be\7\32\2\2\u00be\u00bf\7,\2\2\u00bf\u00c0\7"+
-		"\34\2\2\u00c0\u00c1\5$\23\2\u00c1\u00c2\7\35\2\2\u00c2\u00c4\3\2\2\2\u00c3"+
-		"\u00b6\3\2\2\2\u00c3\u00b8\3\2\2\2\u00c3\u00bd\3\2\2\2\u00c4#\3\2\2\2"+
-		"\u00c5\u00c9\7\31\2\2\u00c6\u00c8\n\4\2\2\u00c7\u00c6\3\2\2\2\u00c8\u00cb"+
-		"\3\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cc\3\2\2\2\u00cb"+
-		"\u00c9\3\2\2\2\u00cc\u00cd\7\31\2\2\u00cd%\3\2\2\2\u00ce\u00d1\5(\25\2"+
-		"\u00cf\u00d1\5*\26\2\u00d0\u00ce\3\2\2\2\u00d0\u00cf\3\2\2\2\u00d1\'\3"+
-		"\2\2\2\u00d2\u00d3\t\5\2\2\u00d3)\3\2\2\2\u00d4\u00d5\7\34\2\2\u00d5\u00d6"+
-		"\7*\2\2\u00d6\u00d7\7\36\2\2\u00d7\u00d8\7*\2\2\u00d8\u00d9\7\35\2\2\u00d9"+
-		"+\3\2\2\2\25.\61IPWelz}\u0088\u0091\u0099\u009e\u00a2\u00a9\u00b3\u00c3"+
-		"\u00c9\u00d0";
+		"\22\3\22\3\22\5\22\u00c4\n\22\3\23\3\23\3\24\3\24\5\24\u00ca\n\24\3\25"+
+		"\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\2\6\n\22\30 \27\2\4\6\b\n\f\16"+
+		"\20\22\24\26\30\32\34\36 \"$&(*\2\5\4\2\33\33$$\3\2\22\23\3\2%\'\2\u00db"+
+		"\2,\3\2\2\2\4\66\3\2\2\2\6:\3\2\2\2\b>\3\2\2\2\nB\3\2\2\2\fL\3\2\2\2\16"+
+		"N\3\2\2\2\20Y\3\2\2\2\22e\3\2\2\2\24z\3\2\2\2\26}\3\2\2\2\30\u008a\3\2"+
+		"\2\2\32\u0094\3\2\2\2\34\u00a2\3\2\2\2\36\u00a9\3\2\2\2 \u00ab\3\2\2\2"+
+		"\"\u00c3\3\2\2\2$\u00c5\3\2\2\2&\u00c9\3\2\2\2(\u00cb\3\2\2\2*\u00cd\3"+
+		"\2\2\2,.\5\4\3\2-/\5\6\4\2.-\3\2\2\2./\3\2\2\2/\61\3\2\2\2\60\62\5\b\5"+
+		"\2\61\60\3\2\2\2\61\62\3\2\2\2\62\63\3\2\2\2\63\64\5\n\6\2\64\65\7\2\2"+
+		"\3\65\3\3\2\2\2\66\67\7\3\2\2\678\7$\2\289\7-\2\29\5\3\2\2\2:;\7\4\2\2"+
+		";<\7$\2\2<=\7*\2\2=\7\3\2\2\2>?\7\5\2\2?@\7$\2\2@A\5$\23\2A\t\3\2\2\2"+
+		"BC\b\6\1\2CD\5\16\b\2DI\3\2\2\2EF\f\3\2\2FH\5\16\b\2GE\3\2\2\2HK\3\2\2"+
+		"\2IG\3\2\2\2IJ\3\2\2\2J\13\3\2\2\2KI\3\2\2\2LM\t\2\2\2M\r\3\2\2\2NP\7"+
+		"\6\2\2OQ\5\20\t\2PO\3\2\2\2PQ\3\2\2\2QR\3\2\2\2RS\5\f\7\2ST\7\30\2\2T"+
+		"U\5\22\n\2UW\7\31\2\2VX\5&\24\2WV\3\2\2\2WX\3\2\2\2X\17\3\2\2\2YZ\7\26"+
+		"\2\2Z[\7-\2\2[\\\7\27\2\2\\\21\3\2\2\2]^\b\n\1\2^f\5\24\13\2_`\7\26\2"+
+		"\2`a\5\22\n\2ab\7\27\2\2bf\3\2\2\2cd\7\25\2\2df\5\22\n\3e]\3\2\2\2e_\3"+
+		"\2\2\2ec\3\2\2\2fl\3\2\2\2gh\f\4\2\2hi\t\3\2\2ik\5\22\n\5jg\3\2\2\2kn"+
+		"\3\2\2\2lj\3\2\2\2lm\3\2\2\2m\23\3\2\2\2nl\3\2\2\2op\5\26\f\2pq\7\21\2"+
+		"\2qr\5\36\20\2r{\3\2\2\2st\7-\2\2tu\7\26\2\2uv\5\26\f\2vw\7\27\2\2wx\7"+
+		"\21\2\2xy\5\36\20\2y{\3\2\2\2zo\3\2\2\2zs\3\2\2\2{\25\3\2\2\2|~\5\30\r"+
+		"\2}|\3\2\2\2}~\3\2\2\2~\u0088\3\2\2\2\177\u0089\7\7\2\2\u0080\u0089\7"+
+		"\b\2\2\u0081\u0089\7\t\2\2\u0082\u0089\7\n\2\2\u0083\u0089\7\13\2\2\u0084"+
+		"\u0089\7\f\2\2\u0085\u0089\7\r\2\2\u0086\u0089\7\16\2\2\u0087\u0089\5"+
+		"\"\22\2\u0088\177\3\2\2\2\u0088\u0080\3\2\2\2\u0088\u0081\3\2\2\2\u0088"+
+		"\u0082\3\2\2\2\u0088\u0083\3\2\2\2\u0088\u0084\3\2\2\2\u0088\u0085\3\2"+
+		"\2\2\u0088\u0086\3\2\2\2\u0088\u0087\3\2\2\2\u0089\27\3\2\2\2\u008a\u008b"+
+		"\b\r\1\2\u008b\u008c\5\32\16\2\u008c\u0091\3\2\2\2\u008d\u008e\f\3\2\2"+
+		"\u008e\u0090\5\32\16\2\u008f\u008d\3\2\2\2\u0090\u0093\3\2\2\2\u0091\u008f"+
+		"\3\2\2\2\u0091\u0092\3\2\2\2\u0092\31\3\2\2\2\u0093\u0091\3\2\2\2\u0094"+
+		"\u0095\7-\2\2\u0095\u0096\7\"\2\2\u0096\33\3\2\2\2\u0097\u00a3\7\17\2"+
+		"\2\u0098\u009a\7!\2\2\u0099\u0098\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009e"+
+		"\3\2\2\2\u009b\u009f\7+\2\2\u009c\u009d\7+\2\2\u009d\u009f\7,\2\2\u009e"+
+		"\u009b\3\2\2\2\u009e\u009c\3\2\2\2\u009f\u00a3\3\2\2\2\u00a0\u00a3\7*"+
+		"\2\2\u00a1\u00a3\5$\23\2\u00a2\u0097\3\2\2\2\u00a2\u0099\3\2\2\2\u00a2"+
+		"\u00a0\3\2\2\2\u00a2\u00a1\3\2\2\2\u00a3\35\3\2\2\2\u00a4\u00aa\5\34\17"+
+		"\2\u00a5\u00a6\7\26\2\2\u00a6\u00a7\5 \21\2\u00a7\u00a8\7\27\2\2\u00a8"+
+		"\u00aa\3\2\2\2\u00a9\u00a4\3\2\2\2\u00a9\u00a5\3\2\2\2\u00aa\37\3\2\2"+
+		"\2\u00ab\u00ac\b\21\1\2\u00ac\u00ad\5\34\17\2\u00ad\u00b3\3\2\2\2\u00ae"+
+		"\u00af\f\3\2\2\u00af\u00b0\7\37\2\2\u00b0\u00b2\5\34\17\2\u00b1\u00ae"+
+		"\3\2\2\2\u00b2\u00b5\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4"+
+		"!\3\2\2\2\u00b5\u00b3\3\2\2\2\u00b6\u00b7\7\33\2\2\u00b7\u00c4\7-\2\2"+
+		"\u00b8\u00b9\7\33\2\2\u00b9\u00ba\7-\2\2\u00ba\u00bb\7\35\2\2\u00bb\u00bc"+
+		"\7+\2\2\u00bc\u00c4\7\36\2\2\u00bd\u00be\7\33\2\2\u00be\u00bf\7-\2\2\u00bf"+
+		"\u00c0\7\35\2\2\u00c0\u00c1\5$\23\2\u00c1\u00c2\7\36\2\2\u00c2\u00c4\3"+
+		"\2\2\2\u00c3\u00b6\3\2\2\2\u00c3\u00b8\3\2\2\2\u00c3\u00bd\3\2\2\2\u00c4"+
+		"#\3\2\2\2\u00c5\u00c6\7\20\2\2\u00c6%\3\2\2\2\u00c7\u00ca\5(\25\2\u00c8"+
+		"\u00ca\5*\26\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2\2\2\u00ca\'\3\2\2\2"+
+		"\u00cb\u00cc\t\4\2\2\u00cc)\3\2\2\2\u00cd\u00ce\7\35\2\2\u00ce\u00cf\7"+
+		"+\2\2\u00cf\u00d0\7\37\2\2\u00d0\u00d1\7+\2\2\u00d1\u00d2\7\36\2\2\u00d2"+
+		"+\3\2\2\2\24.\61IPWelz}\u0088\u0091\u0099\u009e\u00a2\u00a9\u00b3\u00c3"+
+		"\u00c9";
 	public static final ATN _ATN =
 		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
 	static {