1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-08-15 20:02:56 +02:00

Refactor integration tests and FQL parser: replace SkipCaseArray with CaseArray for consistency, improve variable usage in FOR loop tests, and add support for STEP keyword in the lexer.

This commit is contained in:
Tim Voronov
2025-07-29 14:43:55 -04:00
parent 4671a45951
commit 69c5aa3cab
14 changed files with 1704 additions and 1379 deletions

View File

@@ -60,6 +60,9 @@ Sort: 'SORT';
Limit: 'LIMIT';
Let: 'LET';
Collect: 'COLLECT';
Do: 'DO';
While: 'WHILE';
Step: 'STEP';
SortDirection: 'ASC' | 'DESC';
None: 'NONE';
Null: 'NULL';
@@ -81,8 +84,6 @@ Event: 'EVENT';
Like: 'LIKE';
Not: 'NOT' | '!';
In: 'IN';
Do: 'DO';
While: 'WHILE';
// Literals
Param: '@';

View File

@@ -48,7 +48,10 @@ forExpression
: For valueVariable=(Identifier | IgnoreIdentifier) (Comma counterVariable=Identifier)? In forExpressionSource
forExpressionBody*
forExpressionReturn
| For counterVariable=(Identifier | IgnoreIdentifier) Do? While expression
| For counterVariable=(Identifier | IgnoreIdentifier) Do? While expression Step forExpressionStepAssignment
forExpressionBody*
forExpressionReturn
| For counterVariable=(Identifier | IgnoreIdentifier) Do? While expression // Backwards compatibility
forExpressionBody*
forExpressionReturn
;
@@ -85,6 +88,10 @@ forExpressionReturn
| forExpression
;
forExpressionStepAssignment
: Identifier Assign expression
;
filterClause
: Filter expression
;
@@ -316,6 +323,7 @@ unsafeReservedWord
| Waitfor
| While
| Do
| Step
| In
| Like
| Not

File diff suppressed because one or more lines are too long

View File

@@ -44,31 +44,32 @@ Sort=43
Limit=44
Let=45
Collect=46
SortDirection=47
None=48
Null=49
BooleanLiteral=50
Use=51
Into=52
Keep=53
With=54
All=55
Any=56
Aggregate=57
Event=58
Like=59
Not=60
In=61
Do=62
While=63
Param=64
Identifier=65
IgnoreIdentifier=66
StringLiteral=67
IntegerLiteral=68
FloatLiteral=69
NamespaceSegment=70
UnknownIdentifier=71
Do=47
While=48
Step=49
SortDirection=50
None=51
Null=52
BooleanLiteral=53
Use=54
Into=55
Keep=56
With=57
All=58
Any=59
Aggregate=60
Event=61
Like=62
Not=63
In=64
Param=65
Identifier=66
IgnoreIdentifier=67
StringLiteral=68
IntegerLiteral=69
FloatLiteral=70
NamespaceSegment=71
UnknownIdentifier=72
':'=5
';'=6
'.'=7
@@ -108,18 +109,19 @@ UnknownIdentifier=71
'LIMIT'=44
'LET'=45
'COLLECT'=46
'NONE'=48
'NULL'=49
'USE'=51
'INTO'=52
'KEEP'=53
'WITH'=54
'ALL'=55
'ANY'=56
'AGGREGATE'=57
'EVENT'=58
'LIKE'=59
'IN'=61
'DO'=62
'WHILE'=63
'@'=64
'DO'=47
'WHILE'=48
'STEP'=49
'NONE'=51
'NULL'=52
'USE'=54
'INTO'=55
'KEEP'=56
'WITH'=57
'ALL'=58
'ANY'=59
'AGGREGATE'=60
'EVENT'=61
'LIKE'=62
'IN'=64
'@'=65

File diff suppressed because one or more lines are too long

View File

@@ -44,31 +44,32 @@ Sort=43
Limit=44
Let=45
Collect=46
SortDirection=47
None=48
Null=49
BooleanLiteral=50
Use=51
Into=52
Keep=53
With=54
All=55
Any=56
Aggregate=57
Event=58
Like=59
Not=60
In=61
Do=62
While=63
Param=64
Identifier=65
IgnoreIdentifier=66
StringLiteral=67
IntegerLiteral=68
FloatLiteral=69
NamespaceSegment=70
UnknownIdentifier=71
Do=47
While=48
Step=49
SortDirection=50
None=51
Null=52
BooleanLiteral=53
Use=54
Into=55
Keep=56
With=57
All=58
Any=59
Aggregate=60
Event=61
Like=62
Not=63
In=64
Param=65
Identifier=66
IgnoreIdentifier=67
StringLiteral=68
IntegerLiteral=69
FloatLiteral=70
NamespaceSegment=71
UnknownIdentifier=72
':'=5
';'=6
'.'=7
@@ -108,18 +109,19 @@ UnknownIdentifier=71
'LIMIT'=44
'LET'=45
'COLLECT'=46
'NONE'=48
'NULL'=49
'USE'=51
'INTO'=52
'KEEP'=53
'WITH'=54
'ALL'=55
'ANY'=56
'AGGREGATE'=57
'EVENT'=58
'LIKE'=59
'IN'=61
'DO'=62
'WHILE'=63
'@'=64
'DO'=47
'WHILE'=48
'STEP'=49
'NONE'=51
'NULL'=52
'USE'=54
'INTO'=55
'KEEP'=56
'WITH'=57
'ALL'=58
'ANY'=59
'AGGREGATE'=60
'EVENT'=61
'LIKE'=62
'IN'=64
'@'=65

View File

@@ -48,9 +48,9 @@ func fqllexerLexerInit() {
"'/'", "'%'", "'+'", "'-'", "'--'", "'++'", "", "", "", "'='", "'?'",
"'!~'", "'=~'", "'FOR'", "'RETURN'", "'WAITFOR'", "'OPTIONS'", "'TIMEOUT'",
"'DISTINCT'", "'FILTER'", "'CURRENT'", "'SORT'", "'LIMIT'", "'LET'",
"'COLLECT'", "", "'NONE'", "'NULL'", "", "'USE'", "'INTO'", "'KEEP'",
"'WITH'", "'ALL'", "'ANY'", "'AGGREGATE'", "'EVENT'", "'LIKE'", "",
"'IN'", "'DO'", "'WHILE'", "'@'",
"'COLLECT'", "'DO'", "'WHILE'", "'STEP'", "", "'NONE'", "'NULL'", "",
"'USE'", "'INTO'", "'KEEP'", "'WITH'", "'ALL'", "'ANY'", "'AGGREGATE'",
"'EVENT'", "'LIKE'", "", "'IN'", "'@'",
}
staticData.SymbolicNames = []string{
"", "MultiLineComment", "SingleLineComment", "WhiteSpaces", "LineTerminator",
@@ -59,10 +59,10 @@ func fqllexerLexerInit() {
"Gte", "Lte", "Neq", "Multi", "Div", "Mod", "Plus", "Minus", "MinusMinus",
"PlusPlus", "And", "Or", "Range", "Assign", "QuestionMark", "RegexNotMatch",
"RegexMatch", "For", "Return", "Waitfor", "Options", "Timeout", "Distinct",
"Filter", "Current", "Sort", "Limit", "Let", "Collect", "SortDirection",
"None", "Null", "BooleanLiteral", "Use", "Into", "Keep", "With", "All",
"Any", "Aggregate", "Event", "Like", "Not", "In", "Do", "While", "Param",
"Identifier", "IgnoreIdentifier", "StringLiteral", "IntegerLiteral",
"Filter", "Current", "Sort", "Limit", "Let", "Collect", "Do", "While",
"Step", "SortDirection", "None", "Null", "BooleanLiteral", "Use", "Into",
"Keep", "With", "All", "Any", "Aggregate", "Event", "Like", "Not", "In",
"Param", "Identifier", "IgnoreIdentifier", "StringLiteral", "IntegerLiteral",
"FloatLiteral", "NamespaceSegment", "UnknownIdentifier",
}
staticData.RuleNames = []string{
@@ -72,17 +72,17 @@ func fqllexerLexerInit() {
"Gte", "Lte", "Neq", "Multi", "Div", "Mod", "Plus", "Minus", "MinusMinus",
"PlusPlus", "And", "Or", "Range", "Assign", "QuestionMark", "RegexNotMatch",
"RegexMatch", "For", "Return", "Waitfor", "Options", "Timeout", "Distinct",
"Filter", "Current", "Sort", "Limit", "Let", "Collect", "SortDirection",
"None", "Null", "BooleanLiteral", "Use", "Into", "Keep", "With", "All",
"Any", "Aggregate", "Event", "Like", "Not", "In", "Do", "While", "Param",
"Identifier", "IgnoreIdentifier", "StringLiteral", "IntegerLiteral",
"Filter", "Current", "Sort", "Limit", "Let", "Collect", "Do", "While",
"Step", "SortDirection", "None", "Null", "BooleanLiteral", "Use", "Into",
"Keep", "With", "All", "Any", "Aggregate", "Event", "Like", "Not", "In",
"Param", "Identifier", "IgnoreIdentifier", "StringLiteral", "IntegerLiteral",
"FloatLiteral", "NamespaceSegment", "UnknownIdentifier", "HexDigit",
"DecimalIntegerLiteral", "ExponentPart", "Letter", "Symbols", "Underscore",
"Digit", "DQSring", "SQString", "BacktickString", "TickString", "NamespaceSeparator",
}
staticData.PredictionContextCache = antlr.NewPredictionContextCache()
staticData.serializedATN = []int32{
4, 0, 71, 613, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2,
4, 0, 72, 620, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2,
4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2,
10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15,
7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7,
@@ -97,263 +97,265 @@ func fqllexerLexerInit() {
62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67,
2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2,
73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78,
7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 1, 0, 1,
0, 1, 0, 1, 0, 5, 0, 172, 8, 0, 10, 0, 12, 0, 175, 9, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 186, 8, 1, 10, 1, 12, 1, 189,
9, 1, 1, 1, 1, 1, 1, 2, 4, 2, 194, 8, 2, 11, 2, 12, 2, 195, 1, 2, 1, 2,
1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7,
1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13,
1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1,
17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 21, 1, 21,
1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1,
26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 261, 8, 27, 1, 28,
1, 28, 1, 28, 1, 28, 3, 28, 267, 8, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1,
30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34,
1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1,
36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37,
1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1,
38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39,
1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1,
41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43,
1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1,
45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46,
1, 46, 1, 46, 1, 46, 3, 46, 371, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1,
47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49,
1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1,
49, 1, 49, 1, 49, 3, 49, 401, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51,
1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1,
53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55,
1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1,
56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58,
1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 455, 8, 59, 1, 60, 1, 60, 1,
60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63,
1, 63, 1, 64, 4, 64, 472, 8, 64, 11, 64, 12, 64, 473, 1, 64, 1, 64, 5,
64, 478, 8, 64, 10, 64, 12, 64, 481, 9, 64, 5, 64, 483, 8, 64, 10, 64,
12, 64, 486, 9, 64, 1, 64, 1, 64, 5, 64, 490, 8, 64, 10, 64, 12, 64, 493,
9, 64, 5, 64, 495, 8, 64, 10, 64, 12, 64, 498, 9, 64, 1, 65, 1, 65, 1,
66, 1, 66, 1, 66, 1, 66, 3, 66, 506, 8, 66, 1, 67, 4, 67, 509, 8, 67, 11,
67, 12, 67, 510, 1, 68, 1, 68, 1, 68, 4, 68, 516, 8, 68, 11, 68, 12, 68,
517, 1, 68, 3, 68, 521, 8, 68, 1, 68, 1, 68, 3, 68, 525, 8, 68, 3, 68,
527, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1,
72, 1, 72, 5, 72, 539, 8, 72, 10, 72, 12, 72, 542, 9, 72, 3, 72, 544, 8,
72, 1, 73, 1, 73, 3, 73, 548, 8, 73, 1, 73, 4, 73, 551, 8, 73, 11, 73,
12, 73, 552, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1,
78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 569, 8, 78, 10, 78, 12, 78,
572, 9, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 5,
79, 582, 8, 79, 10, 79, 12, 79, 585, 9, 79, 1, 79, 1, 79, 1, 80, 1, 80,
1, 80, 1, 80, 5, 80, 593, 8, 80, 10, 80, 12, 80, 596, 9, 80, 1, 80, 1,
80, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 604, 8, 81, 10, 81, 12, 81, 607,
9, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 173, 0, 83, 1, 1, 3, 2, 5,
3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25,
13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43,
22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61,
31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79,
40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97,
49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113,
57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129,
65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 0, 145,
0, 147, 0, 149, 0, 151, 0, 153, 0, 155, 0, 157, 0, 159, 0, 161, 0, 163,
0, 165, 0, 1, 0, 12, 3, 0, 10, 10, 13, 13, 8232, 8233, 4, 0, 9, 9, 11,
12, 32, 32, 160, 160, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0,
49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 2, 0, 65, 90, 97,
122, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 1, 0, 96, 96, 1, 0, 180,
180, 637, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1,
0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15,
1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0,
23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0,
0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0,
0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0,
0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1,
0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61,
1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0,
69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0,
0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0,
0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0,
0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1,
0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0,
107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0,
0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121,
1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0,
0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1,
0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 1,
167, 1, 0, 0, 0, 3, 181, 1, 0, 0, 0, 5, 193, 1, 0, 0, 0, 7, 199, 1, 0,
0, 0, 9, 203, 1, 0, 0, 0, 11, 205, 1, 0, 0, 0, 13, 207, 1, 0, 0, 0, 15,
209, 1, 0, 0, 0, 17, 211, 1, 0, 0, 0, 19, 213, 1, 0, 0, 0, 21, 215, 1,
0, 0, 0, 23, 217, 1, 0, 0, 0, 25, 219, 1, 0, 0, 0, 27, 221, 1, 0, 0, 0,
29, 223, 1, 0, 0, 0, 31, 225, 1, 0, 0, 0, 33, 227, 1, 0, 0, 0, 35, 230,
1, 0, 0, 0, 37, 233, 1, 0, 0, 0, 39, 236, 1, 0, 0, 0, 41, 239, 1, 0, 0,
0, 43, 241, 1, 0, 0, 0, 45, 243, 1, 0, 0, 0, 47, 245, 1, 0, 0, 0, 49, 247,
1, 0, 0, 0, 51, 249, 1, 0, 0, 0, 53, 252, 1, 0, 0, 0, 55, 260, 1, 0, 0,
0, 57, 266, 1, 0, 0, 0, 59, 268, 1, 0, 0, 0, 61, 271, 1, 0, 0, 0, 63, 273,
1, 0, 0, 0, 65, 275, 1, 0, 0, 0, 67, 278, 1, 0, 0, 0, 69, 281, 1, 0, 0,
0, 71, 285, 1, 0, 0, 0, 73, 292, 1, 0, 0, 0, 75, 300, 1, 0, 0, 0, 77, 308,
1, 0, 0, 0, 79, 316, 1, 0, 0, 0, 81, 325, 1, 0, 0, 0, 83, 332, 1, 0, 0,
0, 85, 340, 1, 0, 0, 0, 87, 345, 1, 0, 0, 0, 89, 351, 1, 0, 0, 0, 91, 355,
1, 0, 0, 0, 93, 370, 1, 0, 0, 0, 95, 372, 1, 0, 0, 0, 97, 377, 1, 0, 0,
0, 99, 400, 1, 0, 0, 0, 101, 402, 1, 0, 0, 0, 103, 406, 1, 0, 0, 0, 105,
411, 1, 0, 0, 0, 107, 416, 1, 0, 0, 0, 109, 421, 1, 0, 0, 0, 111, 425,
1, 0, 0, 0, 113, 429, 1, 0, 0, 0, 115, 439, 1, 0, 0, 0, 117, 445, 1, 0,
0, 0, 119, 454, 1, 0, 0, 0, 121, 456, 1, 0, 0, 0, 123, 459, 1, 0, 0, 0,
125, 462, 1, 0, 0, 0, 127, 468, 1, 0, 0, 0, 129, 471, 1, 0, 0, 0, 131,
499, 1, 0, 0, 0, 133, 505, 1, 0, 0, 0, 135, 508, 1, 0, 0, 0, 137, 526,
1, 0, 0, 0, 139, 528, 1, 0, 0, 0, 141, 531, 1, 0, 0, 0, 143, 533, 1, 0,
0, 0, 145, 543, 1, 0, 0, 0, 147, 545, 1, 0, 0, 0, 149, 554, 1, 0, 0, 0,
151, 556, 1, 0, 0, 0, 153, 558, 1, 0, 0, 0, 155, 560, 1, 0, 0, 0, 157,
562, 1, 0, 0, 0, 159, 575, 1, 0, 0, 0, 161, 588, 1, 0, 0, 0, 163, 599,
1, 0, 0, 0, 165, 610, 1, 0, 0, 0, 167, 168, 5, 47, 0, 0, 168, 169, 5, 42,
0, 0, 169, 173, 1, 0, 0, 0, 170, 172, 9, 0, 0, 0, 171, 170, 1, 0, 0, 0,
172, 175, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 174,
176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 42, 0, 0, 177, 178,
5, 47, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 6, 0, 0, 0, 180, 2, 1, 0,
0, 0, 181, 182, 5, 47, 0, 0, 182, 183, 5, 47, 0, 0, 183, 187, 1, 0, 0,
0, 184, 186, 8, 0, 0, 0, 185, 184, 1, 0, 0, 0, 186, 189, 1, 0, 0, 0, 187,
185, 1, 0, 0, 0, 187, 188, 1, 0, 0, 0, 188, 190, 1, 0, 0, 0, 189, 187,
1, 0, 0, 0, 190, 191, 6, 1, 0, 0, 191, 4, 1, 0, 0, 0, 192, 194, 7, 1, 0,
0, 193, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195,
196, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 6, 2, 0, 0, 198, 6, 1,
0, 0, 0, 199, 200, 7, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 6, 3, 0,
0, 202, 8, 1, 0, 0, 0, 203, 204, 5, 58, 0, 0, 204, 10, 1, 0, 0, 0, 205,
206, 5, 59, 0, 0, 206, 12, 1, 0, 0, 0, 207, 208, 5, 46, 0, 0, 208, 14,
1, 0, 0, 0, 209, 210, 5, 44, 0, 0, 210, 16, 1, 0, 0, 0, 211, 212, 5, 91,
0, 0, 212, 18, 1, 0, 0, 0, 213, 214, 5, 93, 0, 0, 214, 20, 1, 0, 0, 0,
215, 216, 5, 40, 0, 0, 216, 22, 1, 0, 0, 0, 217, 218, 5, 41, 0, 0, 218,
24, 1, 0, 0, 0, 219, 220, 5, 123, 0, 0, 220, 26, 1, 0, 0, 0, 221, 222,
5, 125, 0, 0, 222, 28, 1, 0, 0, 0, 223, 224, 5, 62, 0, 0, 224, 30, 1, 0,
0, 0, 225, 226, 5, 60, 0, 0, 226, 32, 1, 0, 0, 0, 227, 228, 5, 61, 0, 0,
228, 229, 5, 61, 0, 0, 229, 34, 1, 0, 0, 0, 230, 231, 5, 62, 0, 0, 231,
232, 5, 61, 0, 0, 232, 36, 1, 0, 0, 0, 233, 234, 5, 60, 0, 0, 234, 235,
5, 61, 0, 0, 235, 38, 1, 0, 0, 0, 236, 237, 5, 33, 0, 0, 237, 238, 5, 61,
0, 0, 238, 40, 1, 0, 0, 0, 239, 240, 5, 42, 0, 0, 240, 42, 1, 0, 0, 0,
241, 242, 5, 47, 0, 0, 242, 44, 1, 0, 0, 0, 243, 244, 5, 37, 0, 0, 244,
46, 1, 0, 0, 0, 245, 246, 5, 43, 0, 0, 246, 48, 1, 0, 0, 0, 247, 248, 5,
45, 0, 0, 248, 50, 1, 0, 0, 0, 249, 250, 5, 45, 0, 0, 250, 251, 5, 45,
0, 0, 251, 52, 1, 0, 0, 0, 252, 253, 5, 43, 0, 0, 253, 254, 5, 43, 0, 0,
254, 54, 1, 0, 0, 0, 255, 256, 5, 65, 0, 0, 256, 257, 5, 78, 0, 0, 257,
261, 5, 68, 0, 0, 258, 259, 5, 38, 0, 0, 259, 261, 5, 38, 0, 0, 260, 255,
1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 56, 1, 0, 0, 0, 262, 263, 5, 79,
0, 0, 263, 267, 5, 82, 0, 0, 264, 265, 5, 124, 0, 0, 265, 267, 5, 124,
0, 0, 266, 262, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 58, 1, 0, 0, 0,
268, 269, 3, 13, 6, 0, 269, 270, 3, 13, 6, 0, 270, 60, 1, 0, 0, 0, 271,
272, 5, 61, 0, 0, 272, 62, 1, 0, 0, 0, 273, 274, 5, 63, 0, 0, 274, 64,
1, 0, 0, 0, 275, 276, 5, 33, 0, 0, 276, 277, 5, 126, 0, 0, 277, 66, 1,
0, 0, 0, 278, 279, 5, 61, 0, 0, 279, 280, 5, 126, 0, 0, 280, 68, 1, 0,
0, 0, 281, 282, 5, 70, 0, 0, 282, 283, 5, 79, 0, 0, 283, 284, 5, 82, 0,
0, 284, 70, 1, 0, 0, 0, 285, 286, 5, 82, 0, 0, 286, 287, 5, 69, 0, 0, 287,
288, 5, 84, 0, 0, 288, 289, 5, 85, 0, 0, 289, 290, 5, 82, 0, 0, 290, 291,
5, 78, 0, 0, 291, 72, 1, 0, 0, 0, 292, 293, 5, 87, 0, 0, 293, 294, 5, 65,
0, 0, 294, 295, 5, 73, 0, 0, 295, 296, 5, 84, 0, 0, 296, 297, 5, 70, 0,
0, 297, 298, 5, 79, 0, 0, 298, 299, 5, 82, 0, 0, 299, 74, 1, 0, 0, 0, 300,
301, 5, 79, 0, 0, 301, 302, 5, 80, 0, 0, 302, 303, 5, 84, 0, 0, 303, 304,
5, 73, 0, 0, 304, 305, 5, 79, 0, 0, 305, 306, 5, 78, 0, 0, 306, 307, 5,
83, 0, 0, 307, 76, 1, 0, 0, 0, 308, 309, 5, 84, 0, 0, 309, 310, 5, 73,
0, 0, 310, 311, 5, 77, 0, 0, 311, 312, 5, 69, 0, 0, 312, 313, 5, 79, 0,
0, 313, 314, 5, 85, 0, 0, 314, 315, 5, 84, 0, 0, 315, 78, 1, 0, 0, 0, 316,
317, 5, 68, 0, 0, 317, 318, 5, 73, 0, 0, 318, 319, 5, 83, 0, 0, 319, 320,
5, 84, 0, 0, 320, 321, 5, 73, 0, 0, 321, 322, 5, 78, 0, 0, 322, 323, 5,
67, 0, 0, 323, 324, 5, 84, 0, 0, 324, 80, 1, 0, 0, 0, 325, 326, 5, 70,
0, 0, 326, 327, 5, 73, 0, 0, 327, 328, 5, 76, 0, 0, 328, 329, 5, 84, 0,
0, 329, 330, 5, 69, 0, 0, 330, 331, 5, 82, 0, 0, 331, 82, 1, 0, 0, 0, 332,
333, 5, 67, 0, 0, 333, 334, 5, 85, 0, 0, 334, 335, 5, 82, 0, 0, 335, 336,
5, 82, 0, 0, 336, 337, 5, 69, 0, 0, 337, 338, 5, 78, 0, 0, 338, 339, 5,
84, 0, 0, 339, 84, 1, 0, 0, 0, 340, 341, 5, 83, 0, 0, 341, 342, 5, 79,
0, 0, 342, 343, 5, 82, 0, 0, 343, 344, 5, 84, 0, 0, 344, 86, 1, 0, 0, 0,
345, 346, 5, 76, 0, 0, 346, 347, 5, 73, 0, 0, 347, 348, 5, 77, 0, 0, 348,
349, 5, 73, 0, 0, 349, 350, 5, 84, 0, 0, 350, 88, 1, 0, 0, 0, 351, 352,
5, 76, 0, 0, 352, 353, 5, 69, 0, 0, 353, 354, 5, 84, 0, 0, 354, 90, 1,
0, 0, 0, 355, 356, 5, 67, 0, 0, 356, 357, 5, 79, 0, 0, 357, 358, 5, 76,
0, 0, 358, 359, 5, 76, 0, 0, 359, 360, 5, 69, 0, 0, 360, 361, 5, 67, 0,
0, 361, 362, 5, 84, 0, 0, 362, 92, 1, 0, 0, 0, 363, 364, 5, 65, 0, 0, 364,
365, 5, 83, 0, 0, 365, 371, 5, 67, 0, 0, 366, 367, 5, 68, 0, 0, 367, 368,
5, 69, 0, 0, 368, 369, 5, 83, 0, 0, 369, 371, 5, 67, 0, 0, 370, 363, 1,
0, 0, 0, 370, 366, 1, 0, 0, 0, 371, 94, 1, 0, 0, 0, 372, 373, 5, 78, 0,
0, 373, 374, 5, 79, 0, 0, 374, 375, 5, 78, 0, 0, 375, 376, 5, 69, 0, 0,
376, 96, 1, 0, 0, 0, 377, 378, 5, 78, 0, 0, 378, 379, 5, 85, 0, 0, 379,
380, 5, 76, 0, 0, 380, 381, 5, 76, 0, 0, 381, 98, 1, 0, 0, 0, 382, 383,
5, 84, 0, 0, 383, 384, 5, 82, 0, 0, 384, 385, 5, 85, 0, 0, 385, 401, 5,
69, 0, 0, 386, 387, 5, 116, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5,
117, 0, 0, 389, 401, 5, 101, 0, 0, 390, 391, 5, 70, 0, 0, 391, 392, 5,
65, 0, 0, 392, 393, 5, 76, 0, 0, 393, 394, 5, 83, 0, 0, 394, 401, 5, 69,
0, 0, 395, 396, 5, 102, 0, 0, 396, 397, 5, 97, 0, 0, 397, 398, 5, 108,
0, 0, 398, 399, 5, 115, 0, 0, 399, 401, 5, 101, 0, 0, 400, 382, 1, 0, 0,
0, 400, 386, 1, 0, 0, 0, 400, 390, 1, 0, 0, 0, 400, 395, 1, 0, 0, 0, 401,
100, 1, 0, 0, 0, 402, 403, 5, 85, 0, 0, 403, 404, 5, 83, 0, 0, 404, 405,
5, 69, 0, 0, 405, 102, 1, 0, 0, 0, 406, 407, 5, 73, 0, 0, 407, 408, 5,
78, 0, 0, 408, 409, 5, 84, 0, 0, 409, 410, 5, 79, 0, 0, 410, 104, 1, 0,
0, 0, 411, 412, 5, 75, 0, 0, 412, 413, 5, 69, 0, 0, 413, 414, 5, 69, 0,
0, 414, 415, 5, 80, 0, 0, 415, 106, 1, 0, 0, 0, 416, 417, 5, 87, 0, 0,
417, 418, 5, 73, 0, 0, 418, 419, 5, 84, 0, 0, 419, 420, 5, 72, 0, 0, 420,
108, 1, 0, 0, 0, 421, 422, 5, 65, 0, 0, 422, 423, 5, 76, 0, 0, 423, 424,
5, 76, 0, 0, 424, 110, 1, 0, 0, 0, 425, 426, 5, 65, 0, 0, 426, 427, 5,
78, 0, 0, 427, 428, 5, 89, 0, 0, 428, 112, 1, 0, 0, 0, 429, 430, 5, 65,
0, 0, 430, 431, 5, 71, 0, 0, 431, 432, 5, 71, 0, 0, 432, 433, 5, 82, 0,
0, 433, 434, 5, 69, 0, 0, 434, 435, 5, 71, 0, 0, 435, 436, 5, 65, 0, 0,
436, 437, 5, 84, 0, 0, 437, 438, 5, 69, 0, 0, 438, 114, 1, 0, 0, 0, 439,
440, 5, 69, 0, 0, 440, 441, 5, 86, 0, 0, 441, 442, 5, 69, 0, 0, 442, 443,
5, 78, 0, 0, 443, 444, 5, 84, 0, 0, 444, 116, 1, 0, 0, 0, 445, 446, 5,
76, 0, 0, 446, 447, 5, 73, 0, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 69,
0, 0, 449, 118, 1, 0, 0, 0, 450, 451, 5, 78, 0, 0, 451, 452, 5, 79, 0,
0, 452, 455, 5, 84, 0, 0, 453, 455, 5, 33, 0, 0, 454, 450, 1, 0, 0, 0,
454, 453, 1, 0, 0, 0, 455, 120, 1, 0, 0, 0, 456, 457, 5, 73, 0, 0, 457,
458, 5, 78, 0, 0, 458, 122, 1, 0, 0, 0, 459, 460, 5, 68, 0, 0, 460, 461,
5, 79, 0, 0, 461, 124, 1, 0, 0, 0, 462, 463, 5, 87, 0, 0, 463, 464, 5,
72, 0, 0, 464, 465, 5, 73, 0, 0, 465, 466, 5, 76, 0, 0, 466, 467, 5, 69,
0, 0, 467, 126, 1, 0, 0, 0, 468, 469, 5, 64, 0, 0, 469, 128, 1, 0, 0, 0,
470, 472, 3, 149, 74, 0, 471, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473,
471, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 484, 1, 0, 0, 0, 475, 479,
3, 151, 75, 0, 476, 478, 3, 129, 64, 0, 477, 476, 1, 0, 0, 0, 478, 481,
1, 0, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 483, 1, 0,
0, 0, 481, 479, 1, 0, 0, 0, 482, 475, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0,
484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 496, 1, 0, 0, 0, 486,
484, 1, 0, 0, 0, 487, 491, 3, 155, 77, 0, 488, 490, 3, 129, 64, 0, 489,
488, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492,
1, 0, 0, 0, 492, 495, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 487, 1, 0,
0, 0, 495, 498, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0,
497, 130, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 499, 500, 3, 153, 76, 0, 500,
132, 1, 0, 0, 0, 501, 506, 3, 159, 79, 0, 502, 506, 3, 157, 78, 0, 503,
506, 3, 161, 80, 0, 504, 506, 3, 163, 81, 0, 505, 501, 1, 0, 0, 0, 505,
502, 1, 0, 0, 0, 505, 503, 1, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 134,
1, 0, 0, 0, 507, 509, 7, 2, 0, 0, 508, 507, 1, 0, 0, 0, 509, 510, 1, 0,
0, 0, 510, 508, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 136, 1, 0, 0, 0,
512, 513, 3, 145, 72, 0, 513, 515, 3, 13, 6, 0, 514, 516, 7, 2, 0, 0, 515,
7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7,
83, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10,
1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 4, 2, 196, 8, 2, 11, 2, 12, 2, 197,
1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6,
1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12,
1, 12, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1,
17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20,
1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1,
25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 263,
8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 269, 8, 28, 1, 29, 1, 29, 1,
29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33,
1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1,
35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37,
1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1,
38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39,
1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1,
41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42,
1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1,
44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46,
1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1,
48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 387,
8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1,
51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52,
1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 417, 8,
52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55,
1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1,
57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59,
1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1,
60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62,
3, 62, 471, 8, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 4, 65, 479,
8, 65, 11, 65, 12, 65, 480, 1, 65, 1, 65, 5, 65, 485, 8, 65, 10, 65, 12,
65, 488, 9, 65, 5, 65, 490, 8, 65, 10, 65, 12, 65, 493, 9, 65, 1, 65, 1,
65, 5, 65, 497, 8, 65, 10, 65, 12, 65, 500, 9, 65, 5, 65, 502, 8, 65, 10,
65, 12, 65, 505, 9, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67,
513, 8, 67, 1, 68, 4, 68, 516, 8, 68, 11, 68, 12, 68, 517, 1, 69, 1, 69,
1, 69, 4, 69, 523, 8, 69, 11, 69, 12, 69, 524, 1, 69, 3, 69, 528, 8, 69,
1, 69, 1, 69, 3, 69, 532, 8, 69, 3, 69, 534, 8, 69, 1, 70, 1, 70, 1, 70,
1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 5, 73, 546, 8, 73, 10,
73, 12, 73, 549, 9, 73, 3, 73, 551, 8, 73, 1, 74, 1, 74, 3, 74, 555, 8,
74, 1, 74, 4, 74, 558, 8, 74, 11, 74, 12, 74, 559, 1, 75, 1, 75, 1, 76,
1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1,
79, 5, 79, 576, 8, 79, 10, 79, 12, 79, 579, 9, 79, 1, 79, 1, 79, 1, 80,
1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 589, 8, 80, 10, 80, 12, 80, 592,
9, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 600, 8, 81, 10,
81, 12, 81, 603, 9, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82,
611, 8, 82, 10, 82, 12, 82, 614, 9, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1,
83, 1, 175, 0, 84, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17,
9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35,
18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53,
27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71,
36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89,
45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53,
107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61,
123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69,
139, 70, 141, 71, 143, 72, 145, 0, 147, 0, 149, 0, 151, 0, 153, 0, 155,
0, 157, 0, 159, 0, 161, 0, 163, 0, 165, 0, 167, 0, 1, 0, 12, 3, 0, 10,
10, 13, 13, 8232, 8233, 4, 0, 9, 9, 11, 12, 32, 32, 160, 160, 1, 0, 48,
57, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101,
2, 0, 43, 43, 45, 45, 2, 0, 65, 90, 97, 122, 2, 0, 34, 34, 92, 92, 2, 0,
39, 39, 92, 92, 1, 0, 96, 96, 1, 0, 180, 180, 644, 0, 1, 1, 0, 0, 0, 0,
3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0,
11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0,
0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0,
0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0,
0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1,
0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49,
1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0,
57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0,
0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0,
0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0,
0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1,
0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95,
1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0,
103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0,
0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117,
1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0,
0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1,
0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0,
139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 1, 169, 1, 0,
0, 0, 3, 183, 1, 0, 0, 0, 5, 195, 1, 0, 0, 0, 7, 201, 1, 0, 0, 0, 9, 205,
1, 0, 0, 0, 11, 207, 1, 0, 0, 0, 13, 209, 1, 0, 0, 0, 15, 211, 1, 0, 0,
0, 17, 213, 1, 0, 0, 0, 19, 215, 1, 0, 0, 0, 21, 217, 1, 0, 0, 0, 23, 219,
1, 0, 0, 0, 25, 221, 1, 0, 0, 0, 27, 223, 1, 0, 0, 0, 29, 225, 1, 0, 0,
0, 31, 227, 1, 0, 0, 0, 33, 229, 1, 0, 0, 0, 35, 232, 1, 0, 0, 0, 37, 235,
1, 0, 0, 0, 39, 238, 1, 0, 0, 0, 41, 241, 1, 0, 0, 0, 43, 243, 1, 0, 0,
0, 45, 245, 1, 0, 0, 0, 47, 247, 1, 0, 0, 0, 49, 249, 1, 0, 0, 0, 51, 251,
1, 0, 0, 0, 53, 254, 1, 0, 0, 0, 55, 262, 1, 0, 0, 0, 57, 268, 1, 0, 0,
0, 59, 270, 1, 0, 0, 0, 61, 273, 1, 0, 0, 0, 63, 275, 1, 0, 0, 0, 65, 277,
1, 0, 0, 0, 67, 280, 1, 0, 0, 0, 69, 283, 1, 0, 0, 0, 71, 287, 1, 0, 0,
0, 73, 294, 1, 0, 0, 0, 75, 302, 1, 0, 0, 0, 77, 310, 1, 0, 0, 0, 79, 318,
1, 0, 0, 0, 81, 327, 1, 0, 0, 0, 83, 334, 1, 0, 0, 0, 85, 342, 1, 0, 0,
0, 87, 347, 1, 0, 0, 0, 89, 353, 1, 0, 0, 0, 91, 357, 1, 0, 0, 0, 93, 365,
1, 0, 0, 0, 95, 368, 1, 0, 0, 0, 97, 374, 1, 0, 0, 0, 99, 386, 1, 0, 0,
0, 101, 388, 1, 0, 0, 0, 103, 393, 1, 0, 0, 0, 105, 416, 1, 0, 0, 0, 107,
418, 1, 0, 0, 0, 109, 422, 1, 0, 0, 0, 111, 427, 1, 0, 0, 0, 113, 432,
1, 0, 0, 0, 115, 437, 1, 0, 0, 0, 117, 441, 1, 0, 0, 0, 119, 445, 1, 0,
0, 0, 121, 455, 1, 0, 0, 0, 123, 461, 1, 0, 0, 0, 125, 470, 1, 0, 0, 0,
127, 472, 1, 0, 0, 0, 129, 475, 1, 0, 0, 0, 131, 478, 1, 0, 0, 0, 133,
506, 1, 0, 0, 0, 135, 512, 1, 0, 0, 0, 137, 515, 1, 0, 0, 0, 139, 533,
1, 0, 0, 0, 141, 535, 1, 0, 0, 0, 143, 538, 1, 0, 0, 0, 145, 540, 1, 0,
0, 0, 147, 550, 1, 0, 0, 0, 149, 552, 1, 0, 0, 0, 151, 561, 1, 0, 0, 0,
153, 563, 1, 0, 0, 0, 155, 565, 1, 0, 0, 0, 157, 567, 1, 0, 0, 0, 159,
569, 1, 0, 0, 0, 161, 582, 1, 0, 0, 0, 163, 595, 1, 0, 0, 0, 165, 606,
1, 0, 0, 0, 167, 617, 1, 0, 0, 0, 169, 170, 5, 47, 0, 0, 170, 171, 5, 42,
0, 0, 171, 175, 1, 0, 0, 0, 172, 174, 9, 0, 0, 0, 173, 172, 1, 0, 0, 0,
174, 177, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176,
178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 42, 0, 0, 179, 180,
5, 47, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 6, 0, 0, 0, 182, 2, 1, 0,
0, 0, 183, 184, 5, 47, 0, 0, 184, 185, 5, 47, 0, 0, 185, 189, 1, 0, 0,
0, 186, 188, 8, 0, 0, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189,
187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189,
1, 0, 0, 0, 192, 193, 6, 1, 0, 0, 193, 4, 1, 0, 0, 0, 194, 196, 7, 1, 0,
0, 195, 194, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 197,
198, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 200, 6, 2, 0, 0, 200, 6, 1,
0, 0, 0, 201, 202, 7, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 204, 6, 3, 0,
0, 204, 8, 1, 0, 0, 0, 205, 206, 5, 58, 0, 0, 206, 10, 1, 0, 0, 0, 207,
208, 5, 59, 0, 0, 208, 12, 1, 0, 0, 0, 209, 210, 5, 46, 0, 0, 210, 14,
1, 0, 0, 0, 211, 212, 5, 44, 0, 0, 212, 16, 1, 0, 0, 0, 213, 214, 5, 91,
0, 0, 214, 18, 1, 0, 0, 0, 215, 216, 5, 93, 0, 0, 216, 20, 1, 0, 0, 0,
217, 218, 5, 40, 0, 0, 218, 22, 1, 0, 0, 0, 219, 220, 5, 41, 0, 0, 220,
24, 1, 0, 0, 0, 221, 222, 5, 123, 0, 0, 222, 26, 1, 0, 0, 0, 223, 224,
5, 125, 0, 0, 224, 28, 1, 0, 0, 0, 225, 226, 5, 62, 0, 0, 226, 30, 1, 0,
0, 0, 227, 228, 5, 60, 0, 0, 228, 32, 1, 0, 0, 0, 229, 230, 5, 61, 0, 0,
230, 231, 5, 61, 0, 0, 231, 34, 1, 0, 0, 0, 232, 233, 5, 62, 0, 0, 233,
234, 5, 61, 0, 0, 234, 36, 1, 0, 0, 0, 235, 236, 5, 60, 0, 0, 236, 237,
5, 61, 0, 0, 237, 38, 1, 0, 0, 0, 238, 239, 5, 33, 0, 0, 239, 240, 5, 61,
0, 0, 240, 40, 1, 0, 0, 0, 241, 242, 5, 42, 0, 0, 242, 42, 1, 0, 0, 0,
243, 244, 5, 47, 0, 0, 244, 44, 1, 0, 0, 0, 245, 246, 5, 37, 0, 0, 246,
46, 1, 0, 0, 0, 247, 248, 5, 43, 0, 0, 248, 48, 1, 0, 0, 0, 249, 250, 5,
45, 0, 0, 250, 50, 1, 0, 0, 0, 251, 252, 5, 45, 0, 0, 252, 253, 5, 45,
0, 0, 253, 52, 1, 0, 0, 0, 254, 255, 5, 43, 0, 0, 255, 256, 5, 43, 0, 0,
256, 54, 1, 0, 0, 0, 257, 258, 5, 65, 0, 0, 258, 259, 5, 78, 0, 0, 259,
263, 5, 68, 0, 0, 260, 261, 5, 38, 0, 0, 261, 263, 5, 38, 0, 0, 262, 257,
1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 263, 56, 1, 0, 0, 0, 264, 265, 5, 79,
0, 0, 265, 269, 5, 82, 0, 0, 266, 267, 5, 124, 0, 0, 267, 269, 5, 124,
0, 0, 268, 264, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 58, 1, 0, 0, 0,
270, 271, 3, 13, 6, 0, 271, 272, 3, 13, 6, 0, 272, 60, 1, 0, 0, 0, 273,
274, 5, 61, 0, 0, 274, 62, 1, 0, 0, 0, 275, 276, 5, 63, 0, 0, 276, 64,
1, 0, 0, 0, 277, 278, 5, 33, 0, 0, 278, 279, 5, 126, 0, 0, 279, 66, 1,
0, 0, 0, 280, 281, 5, 61, 0, 0, 281, 282, 5, 126, 0, 0, 282, 68, 1, 0,
0, 0, 283, 284, 5, 70, 0, 0, 284, 285, 5, 79, 0, 0, 285, 286, 5, 82, 0,
0, 286, 70, 1, 0, 0, 0, 287, 288, 5, 82, 0, 0, 288, 289, 5, 69, 0, 0, 289,
290, 5, 84, 0, 0, 290, 291, 5, 85, 0, 0, 291, 292, 5, 82, 0, 0, 292, 293,
5, 78, 0, 0, 293, 72, 1, 0, 0, 0, 294, 295, 5, 87, 0, 0, 295, 296, 5, 65,
0, 0, 296, 297, 5, 73, 0, 0, 297, 298, 5, 84, 0, 0, 298, 299, 5, 70, 0,
0, 299, 300, 5, 79, 0, 0, 300, 301, 5, 82, 0, 0, 301, 74, 1, 0, 0, 0, 302,
303, 5, 79, 0, 0, 303, 304, 5, 80, 0, 0, 304, 305, 5, 84, 0, 0, 305, 306,
5, 73, 0, 0, 306, 307, 5, 79, 0, 0, 307, 308, 5, 78, 0, 0, 308, 309, 5,
83, 0, 0, 309, 76, 1, 0, 0, 0, 310, 311, 5, 84, 0, 0, 311, 312, 5, 73,
0, 0, 312, 313, 5, 77, 0, 0, 313, 314, 5, 69, 0, 0, 314, 315, 5, 79, 0,
0, 315, 316, 5, 85, 0, 0, 316, 317, 5, 84, 0, 0, 317, 78, 1, 0, 0, 0, 318,
319, 5, 68, 0, 0, 319, 320, 5, 73, 0, 0, 320, 321, 5, 83, 0, 0, 321, 322,
5, 84, 0, 0, 322, 323, 5, 73, 0, 0, 323, 324, 5, 78, 0, 0, 324, 325, 5,
67, 0, 0, 325, 326, 5, 84, 0, 0, 326, 80, 1, 0, 0, 0, 327, 328, 5, 70,
0, 0, 328, 329, 5, 73, 0, 0, 329, 330, 5, 76, 0, 0, 330, 331, 5, 84, 0,
0, 331, 332, 5, 69, 0, 0, 332, 333, 5, 82, 0, 0, 333, 82, 1, 0, 0, 0, 334,
335, 5, 67, 0, 0, 335, 336, 5, 85, 0, 0, 336, 337, 5, 82, 0, 0, 337, 338,
5, 82, 0, 0, 338, 339, 5, 69, 0, 0, 339, 340, 5, 78, 0, 0, 340, 341, 5,
84, 0, 0, 341, 84, 1, 0, 0, 0, 342, 343, 5, 83, 0, 0, 343, 344, 5, 79,
0, 0, 344, 345, 5, 82, 0, 0, 345, 346, 5, 84, 0, 0, 346, 86, 1, 0, 0, 0,
347, 348, 5, 76, 0, 0, 348, 349, 5, 73, 0, 0, 349, 350, 5, 77, 0, 0, 350,
351, 5, 73, 0, 0, 351, 352, 5, 84, 0, 0, 352, 88, 1, 0, 0, 0, 353, 354,
5, 76, 0, 0, 354, 355, 5, 69, 0, 0, 355, 356, 5, 84, 0, 0, 356, 90, 1,
0, 0, 0, 357, 358, 5, 67, 0, 0, 358, 359, 5, 79, 0, 0, 359, 360, 5, 76,
0, 0, 360, 361, 5, 76, 0, 0, 361, 362, 5, 69, 0, 0, 362, 363, 5, 67, 0,
0, 363, 364, 5, 84, 0, 0, 364, 92, 1, 0, 0, 0, 365, 366, 5, 68, 0, 0, 366,
367, 5, 79, 0, 0, 367, 94, 1, 0, 0, 0, 368, 369, 5, 87, 0, 0, 369, 370,
5, 72, 0, 0, 370, 371, 5, 73, 0, 0, 371, 372, 5, 76, 0, 0, 372, 373, 5,
69, 0, 0, 373, 96, 1, 0, 0, 0, 374, 375, 5, 83, 0, 0, 375, 376, 5, 84,
0, 0, 376, 377, 5, 69, 0, 0, 377, 378, 5, 80, 0, 0, 378, 98, 1, 0, 0, 0,
379, 380, 5, 65, 0, 0, 380, 381, 5, 83, 0, 0, 381, 387, 5, 67, 0, 0, 382,
383, 5, 68, 0, 0, 383, 384, 5, 69, 0, 0, 384, 385, 5, 83, 0, 0, 385, 387,
5, 67, 0, 0, 386, 379, 1, 0, 0, 0, 386, 382, 1, 0, 0, 0, 387, 100, 1, 0,
0, 0, 388, 389, 5, 78, 0, 0, 389, 390, 5, 79, 0, 0, 390, 391, 5, 78, 0,
0, 391, 392, 5, 69, 0, 0, 392, 102, 1, 0, 0, 0, 393, 394, 5, 78, 0, 0,
394, 395, 5, 85, 0, 0, 395, 396, 5, 76, 0, 0, 396, 397, 5, 76, 0, 0, 397,
104, 1, 0, 0, 0, 398, 399, 5, 84, 0, 0, 399, 400, 5, 82, 0, 0, 400, 401,
5, 85, 0, 0, 401, 417, 5, 69, 0, 0, 402, 403, 5, 116, 0, 0, 403, 404, 5,
114, 0, 0, 404, 405, 5, 117, 0, 0, 405, 417, 5, 101, 0, 0, 406, 407, 5,
70, 0, 0, 407, 408, 5, 65, 0, 0, 408, 409, 5, 76, 0, 0, 409, 410, 5, 83,
0, 0, 410, 417, 5, 69, 0, 0, 411, 412, 5, 102, 0, 0, 412, 413, 5, 97, 0,
0, 413, 414, 5, 108, 0, 0, 414, 415, 5, 115, 0, 0, 415, 417, 5, 101, 0,
0, 416, 398, 1, 0, 0, 0, 416, 402, 1, 0, 0, 0, 416, 406, 1, 0, 0, 0, 416,
411, 1, 0, 0, 0, 417, 106, 1, 0, 0, 0, 418, 419, 5, 85, 0, 0, 419, 420,
5, 83, 0, 0, 420, 421, 5, 69, 0, 0, 421, 108, 1, 0, 0, 0, 422, 423, 5,
73, 0, 0, 423, 424, 5, 78, 0, 0, 424, 425, 5, 84, 0, 0, 425, 426, 5, 79,
0, 0, 426, 110, 1, 0, 0, 0, 427, 428, 5, 75, 0, 0, 428, 429, 5, 69, 0,
0, 429, 430, 5, 69, 0, 0, 430, 431, 5, 80, 0, 0, 431, 112, 1, 0, 0, 0,
432, 433, 5, 87, 0, 0, 433, 434, 5, 73, 0, 0, 434, 435, 5, 84, 0, 0, 435,
436, 5, 72, 0, 0, 436, 114, 1, 0, 0, 0, 437, 438, 5, 65, 0, 0, 438, 439,
5, 76, 0, 0, 439, 440, 5, 76, 0, 0, 440, 116, 1, 0, 0, 0, 441, 442, 5,
65, 0, 0, 442, 443, 5, 78, 0, 0, 443, 444, 5, 89, 0, 0, 444, 118, 1, 0,
0, 0, 445, 446, 5, 65, 0, 0, 446, 447, 5, 71, 0, 0, 447, 448, 5, 71, 0,
0, 448, 449, 5, 82, 0, 0, 449, 450, 5, 69, 0, 0, 450, 451, 5, 71, 0, 0,
451, 452, 5, 65, 0, 0, 452, 453, 5, 84, 0, 0, 453, 454, 5, 69, 0, 0, 454,
120, 1, 0, 0, 0, 455, 456, 5, 69, 0, 0, 456, 457, 5, 86, 0, 0, 457, 458,
5, 69, 0, 0, 458, 459, 5, 78, 0, 0, 459, 460, 5, 84, 0, 0, 460, 122, 1,
0, 0, 0, 461, 462, 5, 76, 0, 0, 462, 463, 5, 73, 0, 0, 463, 464, 5, 75,
0, 0, 464, 465, 5, 69, 0, 0, 465, 124, 1, 0, 0, 0, 466, 467, 5, 78, 0,
0, 467, 468, 5, 79, 0, 0, 468, 471, 5, 84, 0, 0, 469, 471, 5, 33, 0, 0,
470, 466, 1, 0, 0, 0, 470, 469, 1, 0, 0, 0, 471, 126, 1, 0, 0, 0, 472,
473, 5, 73, 0, 0, 473, 474, 5, 78, 0, 0, 474, 128, 1, 0, 0, 0, 475, 476,
5, 64, 0, 0, 476, 130, 1, 0, 0, 0, 477, 479, 3, 151, 75, 0, 478, 477, 1,
0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0,
0, 481, 491, 1, 0, 0, 0, 482, 486, 3, 153, 76, 0, 483, 485, 3, 131, 65,
0, 484, 483, 1, 0, 0, 0, 485, 488, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 486,
487, 1, 0, 0, 0, 487, 490, 1, 0, 0, 0, 488, 486, 1, 0, 0, 0, 489, 482,
1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0,
0, 0, 492, 503, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 498, 3, 157, 78,
0, 495, 497, 3, 131, 65, 0, 496, 495, 1, 0, 0, 0, 497, 500, 1, 0, 0, 0,
498, 496, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 502, 1, 0, 0, 0, 500,
498, 1, 0, 0, 0, 501, 494, 1, 0, 0, 0, 502, 505, 1, 0, 0, 0, 503, 501,
1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 132, 1, 0, 0, 0, 505, 503, 1, 0,
0, 0, 506, 507, 3, 155, 77, 0, 507, 134, 1, 0, 0, 0, 508, 513, 3, 161,
80, 0, 509, 513, 3, 159, 79, 0, 510, 513, 3, 163, 81, 0, 511, 513, 3, 165,
82, 0, 512, 508, 1, 0, 0, 0, 512, 509, 1, 0, 0, 0, 512, 510, 1, 0, 0, 0,
512, 511, 1, 0, 0, 0, 513, 136, 1, 0, 0, 0, 514, 516, 7, 2, 0, 0, 515,
514, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518,
1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 521, 3, 147, 73, 0, 520, 519, 1,
0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 527, 1, 0, 0, 0, 522, 524, 3, 145,
72, 0, 523, 525, 3, 147, 73, 0, 524, 523, 1, 0, 0, 0, 524, 525, 1, 0, 0,
0, 525, 527, 1, 0, 0, 0, 526, 512, 1, 0, 0, 0, 526, 522, 1, 0, 0, 0, 527,
138, 1, 0, 0, 0, 528, 529, 3, 129, 64, 0, 529, 530, 3, 165, 82, 0, 530,
140, 1, 0, 0, 0, 531, 532, 9, 0, 0, 0, 532, 142, 1, 0, 0, 0, 533, 534,
7, 3, 0, 0, 534, 144, 1, 0, 0, 0, 535, 544, 5, 48, 0, 0, 536, 540, 7, 4,
0, 0, 537, 539, 7, 2, 0, 0, 538, 537, 1, 0, 0, 0, 539, 542, 1, 0, 0, 0,
540, 538, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 544, 1, 0, 0, 0, 542,
540, 1, 0, 0, 0, 543, 535, 1, 0, 0, 0, 543, 536, 1, 0, 0, 0, 544, 146,
1, 0, 0, 0, 545, 547, 7, 5, 0, 0, 546, 548, 7, 6, 0, 0, 547, 546, 1, 0,
0, 0, 547, 548, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 551, 7, 2, 0, 0,
550, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 550, 1, 0, 0, 0, 552,
553, 1, 0, 0, 0, 553, 148, 1, 0, 0, 0, 554, 555, 7, 7, 0, 0, 555, 150,
1, 0, 0, 0, 556, 557, 3, 153, 76, 0, 557, 152, 1, 0, 0, 0, 558, 559, 5,
95, 0, 0, 559, 154, 1, 0, 0, 0, 560, 561, 2, 48, 57, 0, 561, 156, 1, 0,
0, 0, 562, 570, 5, 34, 0, 0, 563, 564, 5, 92, 0, 0, 564, 569, 9, 0, 0,
0, 565, 566, 5, 34, 0, 0, 566, 569, 5, 34, 0, 0, 567, 569, 8, 8, 0, 0,
568, 563, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 568, 567, 1, 0, 0, 0, 569,
572, 1, 0, 0, 0, 570, 568, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 573,
1, 0, 0, 0, 572, 570, 1, 0, 0, 0, 573, 574, 5, 34, 0, 0, 574, 158, 1, 0,
0, 0, 575, 583, 5, 39, 0, 0, 576, 577, 5, 92, 0, 0, 577, 582, 9, 0, 0,
0, 578, 579, 5, 39, 0, 0, 579, 582, 5, 39, 0, 0, 580, 582, 8, 9, 0, 0,
581, 576, 1, 0, 0, 0, 581, 578, 1, 0, 0, 0, 581, 580, 1, 0, 0, 0, 582,
585, 1, 0, 0, 0, 583, 581, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 586,
1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 586, 587, 5, 39, 0, 0, 587, 160, 1, 0,
0, 0, 588, 594, 5, 96, 0, 0, 589, 590, 5, 92, 0, 0, 590, 593, 5, 96, 0,
0, 591, 593, 8, 10, 0, 0, 592, 589, 1, 0, 0, 0, 592, 591, 1, 0, 0, 0, 593,
596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 597,
1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 598, 5, 96, 0, 0, 598, 162, 1, 0,
0, 0, 599, 605, 5, 180, 0, 0, 600, 601, 5, 92, 0, 0, 601, 604, 5, 180,
0, 0, 602, 604, 8, 11, 0, 0, 603, 600, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0,
604, 607, 1, 0, 0, 0, 605, 603, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606,
608, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 609, 5, 180, 0, 0, 609, 164,
1, 0, 0, 0, 610, 611, 5, 58, 0, 0, 611, 612, 5, 58, 0, 0, 612, 166, 1,
0, 0, 0, 32, 0, 173, 187, 195, 260, 266, 370, 400, 454, 473, 479, 484,
491, 496, 505, 510, 517, 520, 524, 526, 540, 543, 547, 552, 568, 570, 581,
583, 592, 594, 603, 605, 1, 0, 1, 0,
1, 0, 0, 0, 518, 138, 1, 0, 0, 0, 519, 520, 3, 147, 73, 0, 520, 522, 3,
13, 6, 0, 521, 523, 7, 2, 0, 0, 522, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0,
0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 527, 1, 0, 0, 0, 526,
528, 3, 149, 74, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 534,
1, 0, 0, 0, 529, 531, 3, 147, 73, 0, 530, 532, 3, 149, 74, 0, 531, 530,
1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 534, 1, 0, 0, 0, 533, 519, 1, 0,
0, 0, 533, 529, 1, 0, 0, 0, 534, 140, 1, 0, 0, 0, 535, 536, 3, 131, 65,
0, 536, 537, 3, 167, 83, 0, 537, 142, 1, 0, 0, 0, 538, 539, 9, 0, 0, 0,
539, 144, 1, 0, 0, 0, 540, 541, 7, 3, 0, 0, 541, 146, 1, 0, 0, 0, 542,
551, 5, 48, 0, 0, 543, 547, 7, 4, 0, 0, 544, 546, 7, 2, 0, 0, 545, 544,
1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0,
0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 542, 1, 0, 0, 0,
550, 543, 1, 0, 0, 0, 551, 148, 1, 0, 0, 0, 552, 554, 7, 5, 0, 0, 553,
555, 7, 6, 0, 0, 554, 553, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 557,
1, 0, 0, 0, 556, 558, 7, 2, 0, 0, 557, 556, 1, 0, 0, 0, 558, 559, 1, 0,
0, 0, 559, 557, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 150, 1, 0, 0, 0,
561, 562, 7, 7, 0, 0, 562, 152, 1, 0, 0, 0, 563, 564, 3, 155, 77, 0, 564,
154, 1, 0, 0, 0, 565, 566, 5, 95, 0, 0, 566, 156, 1, 0, 0, 0, 567, 568,
2, 48, 57, 0, 568, 158, 1, 0, 0, 0, 569, 577, 5, 34, 0, 0, 570, 571, 5,
92, 0, 0, 571, 576, 9, 0, 0, 0, 572, 573, 5, 34, 0, 0, 573, 576, 5, 34,
0, 0, 574, 576, 8, 8, 0, 0, 575, 570, 1, 0, 0, 0, 575, 572, 1, 0, 0, 0,
575, 574, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 575, 1, 0, 0, 0, 577,
578, 1, 0, 0, 0, 578, 580, 1, 0, 0, 0, 579, 577, 1, 0, 0, 0, 580, 581,
5, 34, 0, 0, 581, 160, 1, 0, 0, 0, 582, 590, 5, 39, 0, 0, 583, 584, 5,
92, 0, 0, 584, 589, 9, 0, 0, 0, 585, 586, 5, 39, 0, 0, 586, 589, 5, 39,
0, 0, 587, 589, 8, 9, 0, 0, 588, 583, 1, 0, 0, 0, 588, 585, 1, 0, 0, 0,
588, 587, 1, 0, 0, 0, 589, 592, 1, 0, 0, 0, 590, 588, 1, 0, 0, 0, 590,
591, 1, 0, 0, 0, 591, 593, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 593, 594,
5, 39, 0, 0, 594, 162, 1, 0, 0, 0, 595, 601, 5, 96, 0, 0, 596, 597, 5,
92, 0, 0, 597, 600, 5, 96, 0, 0, 598, 600, 8, 10, 0, 0, 599, 596, 1, 0,
0, 0, 599, 598, 1, 0, 0, 0, 600, 603, 1, 0, 0, 0, 601, 599, 1, 0, 0, 0,
601, 602, 1, 0, 0, 0, 602, 604, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 604,
605, 5, 96, 0, 0, 605, 164, 1, 0, 0, 0, 606, 612, 5, 180, 0, 0, 607, 608,
5, 92, 0, 0, 608, 611, 5, 180, 0, 0, 609, 611, 8, 11, 0, 0, 610, 607, 1,
0, 0, 0, 610, 609, 1, 0, 0, 0, 611, 614, 1, 0, 0, 0, 612, 610, 1, 0, 0,
0, 612, 613, 1, 0, 0, 0, 613, 615, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 615,
616, 5, 180, 0, 0, 616, 166, 1, 0, 0, 0, 617, 618, 5, 58, 0, 0, 618, 619,
5, 58, 0, 0, 619, 168, 1, 0, 0, 0, 32, 0, 175, 189, 197, 262, 268, 386,
416, 470, 480, 486, 491, 498, 503, 512, 517, 524, 527, 531, 533, 547, 550,
554, 559, 575, 577, 588, 590, 599, 601, 610, 612, 1, 0, 1, 0,
}
deserializer := antlr.NewATNDeserializer(nil)
staticData.atn = deserializer.Deserialize(staticData.serializedATN)
@@ -440,29 +442,30 @@ const (
FqlLexerLimit = 44
FqlLexerLet = 45
FqlLexerCollect = 46
FqlLexerSortDirection = 47
FqlLexerNone = 48
FqlLexerNull = 49
FqlLexerBooleanLiteral = 50
FqlLexerUse = 51
FqlLexerInto = 52
FqlLexerKeep = 53
FqlLexerWith = 54
FqlLexerAll = 55
FqlLexerAny = 56
FqlLexerAggregate = 57
FqlLexerEvent = 58
FqlLexerLike = 59
FqlLexerNot = 60
FqlLexerIn = 61
FqlLexerDo = 62
FqlLexerWhile = 63
FqlLexerParam = 64
FqlLexerIdentifier = 65
FqlLexerIgnoreIdentifier = 66
FqlLexerStringLiteral = 67
FqlLexerIntegerLiteral = 68
FqlLexerFloatLiteral = 69
FqlLexerNamespaceSegment = 70
FqlLexerUnknownIdentifier = 71
FqlLexerDo = 47
FqlLexerWhile = 48
FqlLexerStep = 49
FqlLexerSortDirection = 50
FqlLexerNone = 51
FqlLexerNull = 52
FqlLexerBooleanLiteral = 53
FqlLexerUse = 54
FqlLexerInto = 55
FqlLexerKeep = 56
FqlLexerWith = 57
FqlLexerAll = 58
FqlLexerAny = 59
FqlLexerAggregate = 60
FqlLexerEvent = 61
FqlLexerLike = 62
FqlLexerNot = 63
FqlLexerIn = 64
FqlLexerParam = 65
FqlLexerIdentifier = 66
FqlLexerIgnoreIdentifier = 67
FqlLexerStringLiteral = 68
FqlLexerIntegerLiteral = 69
FqlLexerFloatLiteral = 70
FqlLexerNamespaceSegment = 71
FqlLexerUnknownIdentifier = 72
)

File diff suppressed because it is too large Load Diff

View File

@@ -110,6 +110,14 @@ func (s *BaseFqlParserListener) EnterForExpressionReturn(ctx *ForExpressionRetur
// ExitForExpressionReturn is called when production forExpressionReturn is exited.
func (s *BaseFqlParserListener) ExitForExpressionReturn(ctx *ForExpressionReturnContext) {}
// EnterForExpressionStepAssignment is called when production forExpressionStepAssignment is entered.
func (s *BaseFqlParserListener) EnterForExpressionStepAssignment(ctx *ForExpressionStepAssignmentContext) {
}
// ExitForExpressionStepAssignment is called when production forExpressionStepAssignment is exited.
func (s *BaseFqlParserListener) ExitForExpressionStepAssignment(ctx *ForExpressionStepAssignmentContext) {
}
// EnterFilterClause is called when production filterClause is entered.
func (s *BaseFqlParserListener) EnterFilterClause(ctx *FilterClauseContext) {}

View File

@@ -67,6 +67,10 @@ func (v *BaseFqlParserVisitor) VisitForExpressionReturn(ctx *ForExpressionReturn
return v.VisitChildren(ctx)
}
func (v *BaseFqlParserVisitor) VisitForExpressionStepAssignment(ctx *ForExpressionStepAssignmentContext) interface{} {
return v.VisitChildren(ctx)
}
func (v *BaseFqlParserVisitor) VisitFilterClause(ctx *FilterClauseContext) interface{} {
return v.VisitChildren(ctx)
}

View File

@@ -52,6 +52,9 @@ type FqlParserListener interface {
// EnterForExpressionReturn is called when entering the forExpressionReturn production.
EnterForExpressionReturn(c *ForExpressionReturnContext)
// EnterForExpressionStepAssignment is called when entering the forExpressionStepAssignment production.
EnterForExpressionStepAssignment(c *ForExpressionStepAssignmentContext)
// EnterFilterClause is called when entering the filterClause production.
EnterFilterClause(c *FilterClauseContext)
@@ -271,6 +274,9 @@ type FqlParserListener interface {
// ExitForExpressionReturn is called when exiting the forExpressionReturn production.
ExitForExpressionReturn(c *ForExpressionReturnContext)
// ExitForExpressionStepAssignment is called when exiting the forExpressionStepAssignment production.
ExitForExpressionStepAssignment(c *ForExpressionStepAssignmentContext)
// ExitFilterClause is called when exiting the filterClause production.
ExitFilterClause(c *FilterClauseContext)

View File

@@ -52,6 +52,9 @@ type FqlParserVisitor interface {
// Visit a parse tree produced by FqlParser#forExpressionReturn.
VisitForExpressionReturn(ctx *ForExpressionReturnContext) interface{}
// Visit a parse tree produced by FqlParser#forExpressionStepAssignment.
VisitForExpressionStepAssignment(ctx *ForExpressionStepAssignmentContext) interface{}
// Visit a parse tree produced by FqlParser#filterClause.
VisitFilterClause(ctx *FilterClauseContext) interface{}

View File

@@ -420,7 +420,8 @@ LET users = [
}
]
FOR i WHILE UNTIL(LENGTH(users))
COLLECT gender = users[i].gender, age = users[i].age INTO genders = { active: users[i].active }
LET user = users[i]
COLLECT gender = user.gender, age = user.age INTO genders = { active: user.active }
RETURN {
age,
gender,

View File

@@ -140,7 +140,7 @@ func TestForWhileDistinct(t *testing.T) {
`, []any{
map[string]any{"active": true},
}),
SkipCaseArray(`
CaseArray(`
LET users = [
{
active: true,
@@ -208,7 +208,7 @@ func TestForWhileDistinct(t *testing.T) {
`, []any{nil, 25, 45}, "Should handle null values with DISTINCT"),
// Test DISTINCT with nested FOR loops
SkipCaseArray(`
CaseArray(`
LET departments = ["IT", "Marketing", "HR"]
LET genders = ["m", "f"]