From 05dfb28dccef1972b265098ceb834d6154d75f63 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Fri, 8 Mar 2024 15:47:29 +0100 Subject: [PATCH] [ES|QL] use lexer from elasticsearch (#178257) ## Summary Up till now, we had to define our own lexer rules for our client-side ES|QL validation. This was because we were using an unofficial ANTLR package (before the official ANTLR had typescript support). Now that we are using the official ANTLR library (as of https://github.com/elastic/kibana/pull/177211), we no longer have to encode case insensitivity into the lexer rules themselves because the [`caseInsensitive` option](https://github.com/antlr/antlr4/pull/3399) is now available to us. This means we can adopt the very [same definitions](https://github.com/elastic/elasticsearch/blob/343b1ae1ba74fbf2e75c29adddb2790312dd680b/x-pack/plugin/esql/src/main/antlr/EsqlBaseLexer.g4) that Elasticsearch uses as long as we set `caseInsensitive` (Elasticsearch handles case insensitivity at runtime). ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../kbn-monaco/src/esql/antlr/esql_lexer.g4 | 651 ++++++-------- .../src/esql/antlr/esql_lexer.interp | 106 +-- .../src/esql/antlr/esql_lexer.tokens | 39 + .../kbn-monaco/src/esql/antlr/esql_lexer.ts | 841 +++++++++--------- .../src/esql/antlr/esql_parser.interp | 78 +- .../src/esql/antlr/esql_parser.tokens | 39 + .../kbn-monaco/src/esql/antlr/esql_parser.ts | 69 +- .../lib/ast/validation/validation.test.ts | 52 +- 8 files changed, 904 insertions(+), 971 deletions(-) diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 index 76f846284b439..1259f97d96651 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.g4 @@ -1,436 +1,357 @@ /* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one or more contributor + * license agreements. Licensed under the Elastic License 2.0; you may not use this file except in + * compliance with the Elastic License 2.0. */ - + lexer grammar esql_lexer; -options { } - -DISSECT : D I S S E C T -> pushMode(EXPRESSION_MODE); -DROP : D R O P -> pushMode(PROJECT_MODE); -ENRICH : E N R I C H -> pushMode(ENRICH_MODE); -EVAL : E V A L -> pushMode(EXPRESSION_MODE); -EXPLAIN : E X P L A I N -> pushMode(EXPLAIN_MODE); -FROM : F R O M -> pushMode(FROM_MODE); -GROK : G R O K -> pushMode(EXPRESSION_MODE); -INLINESTATS : I N L I N E S T A T S -> pushMode(EXPRESSION_MODE); -KEEP : K E E P -> pushMode(PROJECT_MODE); -LIMIT : L I M I T -> pushMode(EXPRESSION_MODE); -MV_EXPAND : M V UNDERSCORE E X P A N D -> pushMode(MVEXPAND_MODE); -RENAME : R E N A M E -> pushMode(RENAME_MODE); -ROW : R O W -> pushMode(EXPRESSION_MODE); -SHOW : S H O W -> pushMode(SHOW_MODE); -SORT : S O R T -> pushMode(EXPRESSION_MODE); -STATS : S T A T S -> pushMode(EXPRESSION_MODE); -WHERE : W H E R E -> pushMode(EXPRESSION_MODE); -UNKNOWN_CMD : ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); - -LINE_COMMENT - : '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN) - ; - -MULTILINE_COMMENT - : '/*' (MULTILINE_COMMENT|.)*? '*/' -> channel(HIDDEN) - ; - -WS - : [ \r\n\t]+ -> channel(HIDDEN) - ; + +options { + caseInsensitive = true; +} + +DISSECT: 'dissect' -> pushMode(EXPRESSION_MODE); +DROP: 'drop' -> pushMode(PROJECT_MODE); +ENRICH: 'enrich' -> pushMode(ENRICH_MODE); +EVAL: 'eval' -> pushMode(EXPRESSION_MODE); +EXPLAIN: 'explain' -> pushMode(EXPLAIN_MODE); +FROM: 'from' -> pushMode(FROM_MODE); +GROK: 'grok' -> pushMode(EXPRESSION_MODE); +INLINESTATS: 'inlinestats' -> pushMode(EXPRESSION_MODE); +KEEP: 'keep' -> pushMode(PROJECT_MODE); +LIMIT: 'limit' -> pushMode(EXPRESSION_MODE); +MV_EXPAND: 'mv_expand' -> pushMode(MVEXPAND_MODE); +RENAME: 'rename' -> pushMode(RENAME_MODE); +ROW: 'row' -> pushMode(EXPRESSION_MODE); +SHOW: 'show' -> pushMode(SHOW_MODE); +SORT: 'sort' -> pushMode(EXPRESSION_MODE); +STATS: 'stats' -> pushMode(EXPRESSION_MODE); +WHERE: 'where' -> pushMode(EXPRESSION_MODE); +UNKNOWN_CMD: ~[ \r\n\t[\]/]+ -> pushMode(EXPRESSION_MODE); + +LINE_COMMENT: '//' ~[\r\n]* '\r'? '\n'? -> channel(HIDDEN); + +MULTILINE_COMMENT: + '/*' (MULTILINE_COMMENT | .)*? '*/' -> channel(HIDDEN); + +WS: [ \r\n\t]+ -> channel(HIDDEN); // // Explain +// +// +// +// +// +// +// // mode EXPLAIN_MODE; -EXPLAIN_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE); -EXPLAIN_PIPE : PIPE -> type(PIPE), popMode; -EXPLAIN_WS : WS -> channel(HIDDEN); -EXPLAIN_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN); -EXPLAIN_MULTILINE_COMMENT : MULTILINE_COMMENT -> channel(HIDDEN); +EXPLAIN_OPENING_BRACKET: + OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(DEFAULT_MODE); +EXPLAIN_PIPE: PIPE -> type(PIPE), popMode; +EXPLAIN_WS: WS -> channel(HIDDEN); +EXPLAIN_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); +EXPLAIN_MULTILINE_COMMENT: + MULTILINE_COMMENT -> channel(HIDDEN); // // Expression - used by most command +// +// +// +// +// +// +// // mode EXPRESSION_MODE; -PIPE : '|' -> popMode; - -fragment DIGIT - : [0-9] - ; - -fragment LETTER - : [A-Za-z] - ; - -fragment ESCAPE_SEQUENCE - : '\\' [tnr"\\] - ; - -fragment UNESCAPED_CHARS - : ~[\r\n"\\] - ; - -fragment EXPONENT - : [Ee] [+-]? DIGIT+ - ; - -fragment ASPERAND - : '@' - ; - -fragment BACKQUOTE - : '`' - ; - -fragment BACKQUOTE_BLOCK - : ~'`' - | '``' - ; - -fragment UNDERSCORE - : '_' - ; - -fragment UNQUOTED_ID_BODY - : (LETTER | DIGIT | UNDERSCORE) - ; - -STRING - : '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"' - | '"""' (~[\r\n])*? '"""' '"'? '"'? - ; - -INTEGER_LITERAL - : DIGIT+ - ; - -DECIMAL_LITERAL - : DIGIT+ DOT DIGIT* - | DOT DIGIT+ - | DIGIT+ (DOT DIGIT*)? EXPONENT - | DOT DIGIT+ EXPONENT - ; - -BY : B Y; - -AND : A N D; -ASC : A S C; -ASSIGN : '='; -COMMA : ','; -DESC : D E S C; -DOT : '.'; -FALSE : F A L S E; -FIRST : F I R S T; -LAST : L A S T; -LP : '('; -IN: I N; -IS: I S; -LIKE: L I K E; -NOT : N O T; -NULL : N U L L; -NULLS : N U L L S; -OR : O R; +PIPE: '|' -> popMode; + +fragment DIGIT: [0-9]; + +fragment LETTER: [A-Za-z]; + +fragment ESCAPE_SEQUENCE: '\\' [tnr"\\]; + +fragment UNESCAPED_CHARS: ~[\r\n"\\]; + +fragment EXPONENT: [Ee] [+-]? DIGIT+; + +fragment ASPERAND: '@'; + +fragment BACKQUOTE: '`'; + +fragment BACKQUOTE_BLOCK: ~'`' | '``'; + +fragment UNDERSCORE: '_'; + +fragment UNQUOTED_ID_BODY: (LETTER | DIGIT | UNDERSCORE); + +STRING: + '"' (ESCAPE_SEQUENCE | UNESCAPED_CHARS)* '"' + | '"""' (~[\r\n])*? '"""' '"'? '"'?; + +INTEGER_LITERAL: DIGIT+; + +DECIMAL_LITERAL: + DIGIT+ DOT DIGIT* + | DOT DIGIT+ + | DIGIT+ (DOT DIGIT*)? EXPONENT + | DOT DIGIT+ EXPONENT; + +BY: 'by'; + +AND: 'and'; +ASC: 'asc'; +ASSIGN: '='; +COMMA: ','; +DESC: 'desc'; +DOT: '.'; +FALSE: 'false'; +FIRST: 'first'; +LAST: 'last'; +LP: '('; +IN: 'in'; +IS: 'is'; +LIKE: 'like'; +NOT: 'not'; +NULL: 'null'; +NULLS: 'nulls'; +OR: 'or'; PARAM: '?'; -RLIKE: R L I K E; -RP : ')'; -TRUE : T R U E; - -EQ : '=='; -CIEQ : '=~'; -NEQ : '!='; -LT : '<'; -LTE : '<='; -GT : '>'; -GTE : '>='; - -PLUS : '+'; -MINUS : '-'; -ASTERISK : '*'; -SLASH : '/'; -PERCENT : '%'; - -// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one -// way is to start in an explain command which then shifts us to expression -// mode. Thus, the two popModes on CLOSING_BRACKET. The other way could as -// the start of a multivalued field constant. To line up with the double pop -// the explain mode needs, we double push when we see that. -OPENING_BRACKET : '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE); -CLOSING_BRACKET : ']' -> popMode, popMode; - -UNQUOTED_IDENTIFIER - : LETTER UNQUOTED_ID_BODY* - // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in the future - // also, single `_` and `@` characters are not valid identifiers - | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+ - ; - -fragment QUOTED_ID - : BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE - ; - -QUOTED_IDENTIFIER - : QUOTED_ID - ; - -EXPR_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; - -EXPR_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; - -EXPR_WS - : WS -> channel(HIDDEN) - ; +RLIKE: 'rlike'; +RP: ')'; +TRUE: 'true'; + +EQ: '=='; +CIEQ: '=~'; +NEQ: '!='; +LT: '<'; +LTE: '<='; +GT: '>'; +GTE: '>='; + +PLUS: '+'; +MINUS: '-'; +ASTERISK: '*'; +SLASH: '/'; +PERCENT: '%'; + +// Brackets are funny. We can happen upon a CLOSING_BRACKET in two ways - one way is to start in an +// explain command which then shifts us to expression mode. Thus, the two popModes on +// CLOSING_BRACKET. The other way could as the start of a multivalued field constant. To line up +// with the double pop the explain mode needs, we double push when we see that. +OPENING_BRACKET: + '[' -> pushMode(EXPRESSION_MODE), pushMode(EXPRESSION_MODE); +CLOSING_BRACKET: ']' -> popMode, popMode; + +UNQUOTED_IDENTIFIER: + LETTER UNQUOTED_ID_BODY* + // only allow @ at beginning of identifier to keep the option to allow @ as infix operator in + // the future also, single `_` and `@` characters are not valid identifiers + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY+; + +fragment QUOTED_ID: BACKQUOTE BACKQUOTE_BLOCK+ BACKQUOTE; + +QUOTED_IDENTIFIER: QUOTED_ID; + +EXPR_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); + +EXPR_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); + +EXPR_WS: WS -> channel(HIDDEN); // // FROM command +// +// +// +// +// +// +// // mode FROM_MODE; -FROM_PIPE : PIPE -> type(PIPE), popMode; -FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET); -FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET); -FROM_COMMA : COMMA -> type(COMMA); -FROM_ASSIGN : ASSIGN -> type(ASSIGN); - -METADATA: M E T A D A T A; - -fragment FROM_UNQUOTED_IDENTIFIER_PART - : ~[=`|,[\]/ \t\r\n] - | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment - ; - -FROM_UNQUOTED_IDENTIFIER - : FROM_UNQUOTED_IDENTIFIER_PART+ - ; - -FROM_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) - ; - -FROM_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; - -FROM_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; - -FROM_WS - : WS -> channel(HIDDEN) - ; +FROM_PIPE: PIPE -> type(PIPE), popMode; +FROM_OPENING_BRACKET: OPENING_BRACKET -> type(OPENING_BRACKET); +FROM_CLOSING_BRACKET: CLOSING_BRACKET -> type(CLOSING_BRACKET); +FROM_COMMA: COMMA -> type(COMMA); +FROM_ASSIGN: ASSIGN -> type(ASSIGN); + +METADATA: 'metadata'; + +fragment FROM_UNQUOTED_IDENTIFIER_PART: + ~[=`|,[\]/ \t\r\n] + | '/' ~[*/]; // allow single / but not followed by another / or * which would start a comment + +FROM_UNQUOTED_IDENTIFIER: FROM_UNQUOTED_IDENTIFIER_PART+; + +FROM_QUOTED_IDENTIFIER: + QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); + +FROM_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); + +FROM_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); + +FROM_WS: WS -> channel(HIDDEN); // // DROP, KEEP +// +// +// +// +// +// +// // mode PROJECT_MODE; -PROJECT_PIPE : PIPE -> type(PIPE), popMode; +PROJECT_PIPE: PIPE -> type(PIPE), popMode; PROJECT_DOT: DOT -> type(DOT); -PROJECT_COMMA : COMMA -> type(COMMA); +PROJECT_COMMA: COMMA -> type(COMMA); -fragment UNQUOTED_ID_BODY_WITH_PATTERN - : (LETTER | DIGIT | UNDERSCORE | ASTERISK) - ; +fragment UNQUOTED_ID_BODY_WITH_PATTERN: ( + LETTER + | DIGIT + | UNDERSCORE + | ASTERISK + ); -fragment UNQUOTED_ID_PATTERN - : (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN* - | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+ - ; +fragment UNQUOTED_ID_PATTERN: (LETTER | ASTERISK) UNQUOTED_ID_BODY_WITH_PATTERN* + | (UNDERSCORE | ASPERAND) UNQUOTED_ID_BODY_WITH_PATTERN+; -ID_PATTERN - : (UNQUOTED_ID_PATTERN | QUOTED_ID)+ - ; +ID_PATTERN: (UNQUOTED_ID_PATTERN | QUOTED_ID)+; -PROJECT_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; +PROJECT_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -PROJECT_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; +PROJECT_MULTILINE_COMMENT: + MULTILINE_COMMENT -> channel(HIDDEN); -PROJECT_WS - : WS -> channel(HIDDEN) - ; +PROJECT_WS: WS -> channel(HIDDEN); // // | RENAME a.b AS x, c AS y +// +// +// +// +// +// +// // mode RENAME_MODE; -RENAME_PIPE : PIPE -> type(PIPE), popMode; -RENAME_ASSIGN : ASSIGN -> type(ASSIGN); -RENAME_COMMA : COMMA -> type(COMMA); +RENAME_PIPE: PIPE -> type(PIPE), popMode; +RENAME_ASSIGN: ASSIGN -> type(ASSIGN); +RENAME_COMMA: COMMA -> type(COMMA); RENAME_DOT: DOT -> type(DOT); -AS : A S; +AS: 'as'; -RENAME_ID_PATTERN - : ID_PATTERN -> type(ID_PATTERN) - ; +RENAME_ID_PATTERN: ID_PATTERN -> type(ID_PATTERN); -RENAME_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; +RENAME_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -RENAME_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; +RENAME_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); -RENAME_WS - : WS -> channel(HIDDEN) - ; +RENAME_WS: WS -> channel(HIDDEN); // | ENRICH ON key WITH fields mode ENRICH_MODE; -ENRICH_PIPE : PIPE -> type(PIPE), popMode; -ENRICH_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE); - -ON : O N -> pushMode(ENRICH_FIELD_MODE); -WITH : W I T H -> pushMode(ENRICH_FIELD_MODE); - -// similar to that of an index -// see https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params -fragment ENRICH_POLICY_NAME_BODY - : ~[\\/?"<>| ,#\t\r\n:] - ; -ENRICH_POLICY_NAME - // allow prefix for the policy to specify its resolution - : (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+ - ; - -ENRICH_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) - ; - -ENRICH_MODE_UNQUOTED_VALUE - : ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME) - ; - -ENRICH_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; - -ENRICH_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; - -ENRICH_WS - : WS -> channel(HIDDEN) - ; +ENRICH_PIPE: PIPE -> type(PIPE), popMode; +ENRICH_OPENING_BRACKET: + OPENING_BRACKET -> type(OPENING_BRACKET), pushMode(SETTING_MODE); + +ON: 'on' -> pushMode(ENRICH_FIELD_MODE); +WITH: 'with' -> pushMode(ENRICH_FIELD_MODE); + +// similar to that of an index see +// https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html#indices-create-api-path-params +fragment ENRICH_POLICY_NAME_BODY: ~[\\/?"<>| ,#\t\r\n:]; + +ENRICH_POLICY_NAME: (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+; +// allow prefix for the policy to specify its resolution + +ENRICH_QUOTED_IDENTIFIER: + QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); + +ENRICH_MODE_UNQUOTED_VALUE: + ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME); + +ENRICH_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); + +ENRICH_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); + +ENRICH_WS: WS -> channel(HIDDEN); // submode for Enrich to allow different lexing between policy identifier (loose) and field identifiers mode ENRICH_FIELD_MODE; -ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode; -ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN); -ENRICH_FIELD_COMMA : COMMA -> type(COMMA); +ENRICH_FIELD_PIPE: PIPE -> type(PIPE), popMode, popMode; +ENRICH_FIELD_ASSIGN: ASSIGN -> type(ASSIGN); +ENRICH_FIELD_COMMA: COMMA -> type(COMMA); ENRICH_FIELD_DOT: DOT -> type(DOT); -ENRICH_FIELD_WITH : WITH -> type(WITH) ; +ENRICH_FIELD_WITH: WITH -> type(WITH); -ENRICH_FIELD_ID_PATTERN - : ID_PATTERN -> type(ID_PATTERN) - ; +ENRICH_FIELD_ID_PATTERN: ID_PATTERN -> type(ID_PATTERN); -ENRICH_FIELD_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) - ; +ENRICH_FIELD_QUOTED_IDENTIFIER: + QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); -ENRICH_FIELD_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; +ENRICH_FIELD_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -ENRICH_FIELD_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; +ENRICH_FIELD_MULTILINE_COMMENT: + MULTILINE_COMMENT -> channel(HIDDEN); -ENRICH_FIELD_WS - : WS -> channel(HIDDEN) - ; +ENRICH_FIELD_WS: WS -> channel(HIDDEN); mode MVEXPAND_MODE; -MVEXPAND_PIPE : PIPE -> type(PIPE), popMode; +MVEXPAND_PIPE: PIPE -> type(PIPE), popMode; MVEXPAND_DOT: DOT -> type(DOT); -MVEXPAND_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) - ; - -MVEXPAND_UNQUOTED_IDENTIFIER - : UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER) - ; +MVEXPAND_QUOTED_IDENTIFIER: + QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER); +MVEXPAND_UNQUOTED_IDENTIFIER: + UNQUOTED_IDENTIFIER -> type(UNQUOTED_IDENTIFIER); -MVEXPAND_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; +MVEXPAND_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -MVEXPAND_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; +MVEXPAND_MULTILINE_COMMENT: + MULTILINE_COMMENT -> channel(HIDDEN); -MVEXPAND_WS - : WS -> channel(HIDDEN) - ; +MVEXPAND_WS: WS -> channel(HIDDEN); // // SHOW INFO +// +// +// +// +// +// +// // mode SHOW_MODE; -SHOW_PIPE : PIPE -> type(PIPE), popMode; +SHOW_PIPE: PIPE -> type(PIPE), popMode; -INFO : I N F O; -FUNCTIONS : F U N C T I O N S; +INFO: 'info'; +FUNCTIONS: 'functions'; -SHOW_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; +SHOW_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); -SHOW_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; +SHOW_MULTILINE_COMMENT: MULTILINE_COMMENT -> channel(HIDDEN); -SHOW_WS - : WS -> channel(HIDDEN) - ; +SHOW_WS: WS -> channel(HIDDEN); mode SETTING_MODE; -SETTING_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode; -COLON : ':'; -SETTING - : (ASPERAND | DIGIT| DOT | LETTER | UNDERSCORE)+ - ; -SETTING_LINE_COMMENT - : LINE_COMMENT -> channel(HIDDEN) - ; -SETTTING_MULTILINE_COMMENT - : MULTILINE_COMMENT -> channel(HIDDEN) - ; -SETTING_WS - : WS -> channel(HIDDEN) - ; - -fragment A : [aA]; // match either an 'a' or 'A' -fragment B : [bB]; -fragment C : [cC]; -fragment D : [dD]; -fragment E : [eE]; -fragment F : [fF]; -fragment G : [gG]; -fragment H : [hH]; -fragment I : [iI]; -fragment J : [jJ]; -fragment K : [kK]; -fragment L : [lL]; -fragment M : [mM]; -fragment N : [nN]; -fragment O : [oO]; -fragment P : [pP]; -fragment Q : [qQ]; -fragment R : [rR]; -fragment S : [sS]; -fragment T : [tT]; -fragment U : [uU]; -fragment V : [vV]; -fragment W : [wW]; -fragment X : [xX]; -fragment Y : [yY]; -fragment Z : [zZ]; \ No newline at end of file +SETTING_CLOSING_BRACKET: + CLOSING_BRACKET -> type(CLOSING_BRACKET), popMode; + +COLON: ':'; + +SETTING: (ASPERAND | DIGIT | DOT | LETTER | UNDERSCORE)+; + +SETTING_LINE_COMMENT: LINE_COMMENT -> channel(HIDDEN); + +SETTTING_MULTILINE_COMMENT: + MULTILINE_COMMENT -> channel(HIDDEN); + +SETTING_WS: WS -> channel(HIDDEN); \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp index 65cd96a218a88..fd39ca68a50f8 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.interp @@ -1,22 +1,22 @@ token literal names: null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null +'dissect' +'drop' +'enrich' +'eval' +'explain' +'from' +'grok' +'inlinestats' +'keep' +'limit' +'mv_expand' +'rename' +'row' +'show' +'sort' +'stats' +'where' null null null @@ -28,28 +28,28 @@ null null null null -null -null -null +'by' +'and' +'asc' '=' ',' -null +'desc' '.' -null -null -null +'false' +'first' +'last' '(' -null -null -null -null -null -null -null +'in' +'is' +'like' +'not' +'null' +'nulls' +'or' '?' -null +'rlike' ')' -null +'true' '==' '=~' '!=' @@ -69,6 +69,7 @@ null null null null +'metadata' null null null @@ -77,9 +78,12 @@ null null null null +'as' null null null +'on' +'with' null null null @@ -90,12 +94,8 @@ null null null null -null -null -null -null -null -null +'info' +'functions' null null null @@ -365,32 +365,6 @@ SETTING SETTING_LINE_COMMENT SETTTING_MULTILINE_COMMENT SETTING_WS -A -B -C -D -E -F -G -H -I -J -K -L -M -N -O -P -Q -R -S -T -U -V -W -X -Y -Z channel names: DEFAULT_TOKEN_CHANNEL @@ -410,4 +384,4 @@ SHOW_MODE SETTING_MODE atn: -[4, 0, 104, 1251, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 4, 17, 512, 8, 17, 11, 17, 12, 17, 513, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 522, 8, 18, 10, 18, 12, 18, 525, 9, 18, 1, 18, 3, 18, 528, 8, 18, 1, 18, 3, 18, 531, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 540, 8, 19, 10, 19, 12, 19, 543, 9, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 551, 8, 20, 11, 20, 12, 20, 552, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 594, 8, 31, 1, 31, 4, 31, 597, 8, 31, 11, 31, 12, 31, 598, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 608, 8, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 3, 36, 615, 8, 36, 1, 37, 1, 37, 1, 37, 5, 37, 620, 8, 37, 10, 37, 12, 37, 623, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 631, 8, 37, 10, 37, 12, 37, 634, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 641, 8, 37, 1, 37, 3, 37, 644, 8, 37, 3, 37, 646, 8, 37, 1, 38, 4, 38, 649, 8, 38, 11, 38, 12, 38, 650, 1, 39, 4, 39, 654, 8, 39, 11, 39, 12, 39, 655, 1, 39, 1, 39, 5, 39, 660, 8, 39, 10, 39, 12, 39, 663, 9, 39, 1, 39, 1, 39, 4, 39, 667, 8, 39, 11, 39, 12, 39, 668, 1, 39, 4, 39, 672, 8, 39, 11, 39, 12, 39, 673, 1, 39, 1, 39, 5, 39, 678, 8, 39, 10, 39, 12, 39, 681, 9, 39, 3, 39, 683, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 4, 39, 689, 8, 39, 11, 39, 12, 39, 690, 1, 39, 1, 39, 3, 39, 695, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 5, 76, 823, 8, 76, 10, 76, 12, 76, 826, 9, 76, 1, 76, 1, 76, 3, 76, 830, 8, 76, 1, 76, 4, 76, 833, 8, 76, 11, 76, 12, 76, 834, 3, 76, 837, 8, 76, 1, 77, 1, 77, 4, 77, 841, 8, 77, 11, 77, 12, 77, 842, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 894, 8, 88, 1, 89, 4, 89, 897, 8, 89, 11, 89, 12, 89, 898, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 934, 8, 97, 1, 98, 1, 98, 3, 98, 938, 8, 98, 1, 98, 5, 98, 941, 8, 98, 10, 98, 12, 98, 944, 9, 98, 1, 98, 1, 98, 3, 98, 948, 8, 98, 1, 98, 4, 98, 951, 8, 98, 11, 98, 12, 98, 952, 3, 98, 955, 8, 98, 1, 99, 1, 99, 4, 99, 959, 8, 99, 11, 99, 12, 99, 960, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 4, 117, 1036, 8, 117, 11, 117, 12, 117, 1037, 1, 117, 1, 117, 3, 117, 1042, 8, 117, 1, 117, 4, 117, 1045, 8, 117, 11, 117, 12, 117, 1046, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 4, 148, 1184, 8, 148, 11, 148, 12, 148, 1185, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 166, 1, 166, 1, 167, 1, 167, 1, 168, 1, 168, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 2, 541, 632, 0, 178, 11, 1, 13, 2, 15, 3, 17, 4, 19, 5, 21, 6, 23, 7, 25, 8, 27, 9, 29, 10, 31, 11, 33, 12, 35, 13, 37, 14, 39, 15, 41, 16, 43, 17, 45, 18, 47, 19, 49, 20, 51, 21, 53, 0, 55, 0, 57, 22, 59, 23, 61, 24, 63, 25, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 0, 167, 66, 169, 67, 171, 68, 173, 69, 175, 0, 177, 0, 179, 0, 181, 0, 183, 0, 185, 70, 187, 0, 189, 71, 191, 0, 193, 72, 195, 73, 197, 74, 199, 0, 201, 0, 203, 0, 205, 0, 207, 0, 209, 75, 211, 76, 213, 77, 215, 78, 217, 0, 219, 0, 221, 0, 223, 0, 225, 79, 227, 0, 229, 80, 231, 81, 233, 82, 235, 0, 237, 0, 239, 83, 241, 84, 243, 0, 245, 85, 247, 0, 249, 0, 251, 86, 253, 87, 255, 88, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 89, 273, 90, 275, 91, 277, 0, 279, 0, 281, 0, 283, 0, 285, 92, 287, 93, 289, 94, 291, 0, 293, 95, 295, 96, 297, 97, 299, 98, 301, 99, 303, 0, 305, 100, 307, 101, 309, 102, 311, 103, 313, 104, 315, 0, 317, 0, 319, 0, 321, 0, 323, 0, 325, 0, 327, 0, 329, 0, 331, 0, 333, 0, 335, 0, 337, 0, 339, 0, 341, 0, 343, 0, 345, 0, 347, 0, 349, 0, 351, 0, 353, 0, 355, 0, 357, 0, 359, 0, 361, 0, 363, 0, 365, 0, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 38, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 5, 0, 34, 34, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 1253, 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, 1, 53, 1, 0, 0, 0, 1, 55, 1, 0, 0, 0, 1, 57, 1, 0, 0, 0, 1, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 2, 63, 1, 0, 0, 0, 2, 85, 1, 0, 0, 0, 2, 87, 1, 0, 0, 0, 2, 89, 1, 0, 0, 0, 2, 91, 1, 0, 0, 0, 2, 93, 1, 0, 0, 0, 2, 95, 1, 0, 0, 0, 2, 97, 1, 0, 0, 0, 2, 99, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 2, 103, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 2, 111, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 2, 117, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 2, 129, 1, 0, 0, 0, 2, 131, 1, 0, 0, 0, 2, 133, 1, 0, 0, 0, 2, 135, 1, 0, 0, 0, 2, 137, 1, 0, 0, 0, 2, 139, 1, 0, 0, 0, 2, 141, 1, 0, 0, 0, 2, 143, 1, 0, 0, 0, 2, 145, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 2, 149, 1, 0, 0, 0, 2, 151, 1, 0, 0, 0, 2, 153, 1, 0, 0, 0, 2, 155, 1, 0, 0, 0, 2, 157, 1, 0, 0, 0, 2, 159, 1, 0, 0, 0, 2, 161, 1, 0, 0, 0, 2, 163, 1, 0, 0, 0, 2, 167, 1, 0, 0, 0, 2, 169, 1, 0, 0, 0, 2, 171, 1, 0, 0, 0, 2, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 3, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 3, 181, 1, 0, 0, 0, 3, 183, 1, 0, 0, 0, 3, 185, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 4, 201, 1, 0, 0, 0, 4, 203, 1, 0, 0, 0, 4, 209, 1, 0, 0, 0, 4, 211, 1, 0, 0, 0, 4, 213, 1, 0, 0, 0, 4, 215, 1, 0, 0, 0, 5, 217, 1, 0, 0, 0, 5, 219, 1, 0, 0, 0, 5, 221, 1, 0, 0, 0, 5, 223, 1, 0, 0, 0, 5, 225, 1, 0, 0, 0, 5, 227, 1, 0, 0, 0, 5, 229, 1, 0, 0, 0, 5, 231, 1, 0, 0, 0, 5, 233, 1, 0, 0, 0, 6, 235, 1, 0, 0, 0, 6, 237, 1, 0, 0, 0, 6, 239, 1, 0, 0, 0, 6, 241, 1, 0, 0, 0, 6, 245, 1, 0, 0, 0, 6, 247, 1, 0, 0, 0, 6, 249, 1, 0, 0, 0, 6, 251, 1, 0, 0, 0, 6, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 7, 257, 1, 0, 0, 0, 7, 259, 1, 0, 0, 0, 7, 261, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 7, 265, 1, 0, 0, 0, 7, 267, 1, 0, 0, 0, 7, 269, 1, 0, 0, 0, 7, 271, 1, 0, 0, 0, 7, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 8, 277, 1, 0, 0, 0, 8, 279, 1, 0, 0, 0, 8, 281, 1, 0, 0, 0, 8, 283, 1, 0, 0, 0, 8, 285, 1, 0, 0, 0, 8, 287, 1, 0, 0, 0, 8, 289, 1, 0, 0, 0, 9, 291, 1, 0, 0, 0, 9, 293, 1, 0, 0, 0, 9, 295, 1, 0, 0, 0, 9, 297, 1, 0, 0, 0, 9, 299, 1, 0, 0, 0, 9, 301, 1, 0, 0, 0, 10, 303, 1, 0, 0, 0, 10, 305, 1, 0, 0, 0, 10, 307, 1, 0, 0, 0, 10, 309, 1, 0, 0, 0, 10, 311, 1, 0, 0, 0, 10, 313, 1, 0, 0, 0, 11, 367, 1, 0, 0, 0, 13, 377, 1, 0, 0, 0, 15, 384, 1, 0, 0, 0, 17, 393, 1, 0, 0, 0, 19, 400, 1, 0, 0, 0, 21, 410, 1, 0, 0, 0, 23, 417, 1, 0, 0, 0, 25, 424, 1, 0, 0, 0, 27, 438, 1, 0, 0, 0, 29, 445, 1, 0, 0, 0, 31, 453, 1, 0, 0, 0, 33, 465, 1, 0, 0, 0, 35, 474, 1, 0, 0, 0, 37, 480, 1, 0, 0, 0, 39, 487, 1, 0, 0, 0, 41, 494, 1, 0, 0, 0, 43, 502, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 517, 1, 0, 0, 0, 49, 534, 1, 0, 0, 0, 51, 550, 1, 0, 0, 0, 53, 556, 1, 0, 0, 0, 55, 561, 1, 0, 0, 0, 57, 566, 1, 0, 0, 0, 59, 570, 1, 0, 0, 0, 61, 574, 1, 0, 0, 0, 63, 578, 1, 0, 0, 0, 65, 582, 1, 0, 0, 0, 67, 584, 1, 0, 0, 0, 69, 586, 1, 0, 0, 0, 71, 589, 1, 0, 0, 0, 73, 591, 1, 0, 0, 0, 75, 600, 1, 0, 0, 0, 77, 602, 1, 0, 0, 0, 79, 607, 1, 0, 0, 0, 81, 609, 1, 0, 0, 0, 83, 614, 1, 0, 0, 0, 85, 645, 1, 0, 0, 0, 87, 648, 1, 0, 0, 0, 89, 694, 1, 0, 0, 0, 91, 696, 1, 0, 0, 0, 93, 699, 1, 0, 0, 0, 95, 703, 1, 0, 0, 0, 97, 707, 1, 0, 0, 0, 99, 709, 1, 0, 0, 0, 101, 711, 1, 0, 0, 0, 103, 716, 1, 0, 0, 0, 105, 718, 1, 0, 0, 0, 107, 724, 1, 0, 0, 0, 109, 730, 1, 0, 0, 0, 111, 735, 1, 0, 0, 0, 113, 737, 1, 0, 0, 0, 115, 740, 1, 0, 0, 0, 117, 743, 1, 0, 0, 0, 119, 748, 1, 0, 0, 0, 121, 752, 1, 0, 0, 0, 123, 757, 1, 0, 0, 0, 125, 763, 1, 0, 0, 0, 127, 766, 1, 0, 0, 0, 129, 768, 1, 0, 0, 0, 131, 774, 1, 0, 0, 0, 133, 776, 1, 0, 0, 0, 135, 781, 1, 0, 0, 0, 137, 784, 1, 0, 0, 0, 139, 787, 1, 0, 0, 0, 141, 790, 1, 0, 0, 0, 143, 792, 1, 0, 0, 0, 145, 795, 1, 0, 0, 0, 147, 797, 1, 0, 0, 0, 149, 800, 1, 0, 0, 0, 151, 802, 1, 0, 0, 0, 153, 804, 1, 0, 0, 0, 155, 806, 1, 0, 0, 0, 157, 808, 1, 0, 0, 0, 159, 810, 1, 0, 0, 0, 161, 815, 1, 0, 0, 0, 163, 836, 1, 0, 0, 0, 165, 838, 1, 0, 0, 0, 167, 846, 1, 0, 0, 0, 169, 848, 1, 0, 0, 0, 171, 852, 1, 0, 0, 0, 173, 856, 1, 0, 0, 0, 175, 860, 1, 0, 0, 0, 177, 865, 1, 0, 0, 0, 179, 869, 1, 0, 0, 0, 181, 873, 1, 0, 0, 0, 183, 877, 1, 0, 0, 0, 185, 881, 1, 0, 0, 0, 187, 893, 1, 0, 0, 0, 189, 896, 1, 0, 0, 0, 191, 900, 1, 0, 0, 0, 193, 904, 1, 0, 0, 0, 195, 908, 1, 0, 0, 0, 197, 912, 1, 0, 0, 0, 199, 916, 1, 0, 0, 0, 201, 921, 1, 0, 0, 0, 203, 925, 1, 0, 0, 0, 205, 933, 1, 0, 0, 0, 207, 954, 1, 0, 0, 0, 209, 958, 1, 0, 0, 0, 211, 962, 1, 0, 0, 0, 213, 966, 1, 0, 0, 0, 215, 970, 1, 0, 0, 0, 217, 974, 1, 0, 0, 0, 219, 979, 1, 0, 0, 0, 221, 983, 1, 0, 0, 0, 223, 987, 1, 0, 0, 0, 225, 991, 1, 0, 0, 0, 227, 994, 1, 0, 0, 0, 229, 998, 1, 0, 0, 0, 231, 1002, 1, 0, 0, 0, 233, 1006, 1, 0, 0, 0, 235, 1010, 1, 0, 0, 0, 237, 1015, 1, 0, 0, 0, 239, 1020, 1, 0, 0, 0, 241, 1025, 1, 0, 0, 0, 243, 1032, 1, 0, 0, 0, 245, 1041, 1, 0, 0, 0, 247, 1048, 1, 0, 0, 0, 249, 1052, 1, 0, 0, 0, 251, 1056, 1, 0, 0, 0, 253, 1060, 1, 0, 0, 0, 255, 1064, 1, 0, 0, 0, 257, 1068, 1, 0, 0, 0, 259, 1074, 1, 0, 0, 0, 261, 1078, 1, 0, 0, 0, 263, 1082, 1, 0, 0, 0, 265, 1086, 1, 0, 0, 0, 267, 1090, 1, 0, 0, 0, 269, 1094, 1, 0, 0, 0, 271, 1098, 1, 0, 0, 0, 273, 1102, 1, 0, 0, 0, 275, 1106, 1, 0, 0, 0, 277, 1110, 1, 0, 0, 0, 279, 1115, 1, 0, 0, 0, 281, 1119, 1, 0, 0, 0, 283, 1123, 1, 0, 0, 0, 285, 1127, 1, 0, 0, 0, 287, 1131, 1, 0, 0, 0, 289, 1135, 1, 0, 0, 0, 291, 1139, 1, 0, 0, 0, 293, 1144, 1, 0, 0, 0, 295, 1149, 1, 0, 0, 0, 297, 1159, 1, 0, 0, 0, 299, 1163, 1, 0, 0, 0, 301, 1167, 1, 0, 0, 0, 303, 1171, 1, 0, 0, 0, 305, 1176, 1, 0, 0, 0, 307, 1183, 1, 0, 0, 0, 309, 1187, 1, 0, 0, 0, 311, 1191, 1, 0, 0, 0, 313, 1195, 1, 0, 0, 0, 315, 1199, 1, 0, 0, 0, 317, 1201, 1, 0, 0, 0, 319, 1203, 1, 0, 0, 0, 321, 1205, 1, 0, 0, 0, 323, 1207, 1, 0, 0, 0, 325, 1209, 1, 0, 0, 0, 327, 1211, 1, 0, 0, 0, 329, 1213, 1, 0, 0, 0, 331, 1215, 1, 0, 0, 0, 333, 1217, 1, 0, 0, 0, 335, 1219, 1, 0, 0, 0, 337, 1221, 1, 0, 0, 0, 339, 1223, 1, 0, 0, 0, 341, 1225, 1, 0, 0, 0, 343, 1227, 1, 0, 0, 0, 345, 1229, 1, 0, 0, 0, 347, 1231, 1, 0, 0, 0, 349, 1233, 1, 0, 0, 0, 351, 1235, 1, 0, 0, 0, 353, 1237, 1, 0, 0, 0, 355, 1239, 1, 0, 0, 0, 357, 1241, 1, 0, 0, 0, 359, 1243, 1, 0, 0, 0, 361, 1245, 1, 0, 0, 0, 363, 1247, 1, 0, 0, 0, 365, 1249, 1, 0, 0, 0, 367, 368, 3, 321, 155, 0, 368, 369, 3, 331, 160, 0, 369, 370, 3, 351, 170, 0, 370, 371, 3, 351, 170, 0, 371, 372, 3, 323, 156, 0, 372, 373, 3, 319, 154, 0, 373, 374, 3, 353, 171, 0, 374, 375, 1, 0, 0, 0, 375, 376, 6, 0, 0, 0, 376, 12, 1, 0, 0, 0, 377, 378, 3, 321, 155, 0, 378, 379, 3, 349, 169, 0, 379, 380, 3, 343, 166, 0, 380, 381, 3, 345, 167, 0, 381, 382, 1, 0, 0, 0, 382, 383, 6, 1, 1, 0, 383, 14, 1, 0, 0, 0, 384, 385, 3, 323, 156, 0, 385, 386, 3, 341, 165, 0, 386, 387, 3, 349, 169, 0, 387, 388, 3, 331, 160, 0, 388, 389, 3, 319, 154, 0, 389, 390, 3, 329, 159, 0, 390, 391, 1, 0, 0, 0, 391, 392, 6, 2, 2, 0, 392, 16, 1, 0, 0, 0, 393, 394, 3, 323, 156, 0, 394, 395, 3, 357, 173, 0, 395, 396, 3, 315, 152, 0, 396, 397, 3, 337, 163, 0, 397, 398, 1, 0, 0, 0, 398, 399, 6, 3, 0, 0, 399, 18, 1, 0, 0, 0, 400, 401, 3, 323, 156, 0, 401, 402, 3, 361, 175, 0, 402, 403, 3, 345, 167, 0, 403, 404, 3, 337, 163, 0, 404, 405, 3, 315, 152, 0, 405, 406, 3, 331, 160, 0, 406, 407, 3, 341, 165, 0, 407, 408, 1, 0, 0, 0, 408, 409, 6, 4, 3, 0, 409, 20, 1, 0, 0, 0, 410, 411, 3, 325, 157, 0, 411, 412, 3, 349, 169, 0, 412, 413, 3, 343, 166, 0, 413, 414, 3, 339, 164, 0, 414, 415, 1, 0, 0, 0, 415, 416, 6, 5, 4, 0, 416, 22, 1, 0, 0, 0, 417, 418, 3, 327, 158, 0, 418, 419, 3, 349, 169, 0, 419, 420, 3, 343, 166, 0, 420, 421, 3, 335, 162, 0, 421, 422, 1, 0, 0, 0, 422, 423, 6, 6, 0, 0, 423, 24, 1, 0, 0, 0, 424, 425, 3, 331, 160, 0, 425, 426, 3, 341, 165, 0, 426, 427, 3, 337, 163, 0, 427, 428, 3, 331, 160, 0, 428, 429, 3, 341, 165, 0, 429, 430, 3, 323, 156, 0, 430, 431, 3, 351, 170, 0, 431, 432, 3, 353, 171, 0, 432, 433, 3, 315, 152, 0, 433, 434, 3, 353, 171, 0, 434, 435, 3, 351, 170, 0, 435, 436, 1, 0, 0, 0, 436, 437, 6, 7, 0, 0, 437, 26, 1, 0, 0, 0, 438, 439, 3, 335, 162, 0, 439, 440, 3, 323, 156, 0, 440, 441, 3, 323, 156, 0, 441, 442, 3, 345, 167, 0, 442, 443, 1, 0, 0, 0, 443, 444, 6, 8, 1, 0, 444, 28, 1, 0, 0, 0, 445, 446, 3, 337, 163, 0, 446, 447, 3, 331, 160, 0, 447, 448, 3, 339, 164, 0, 448, 449, 3, 331, 160, 0, 449, 450, 3, 353, 171, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 9, 0, 0, 452, 30, 1, 0, 0, 0, 453, 454, 3, 339, 164, 0, 454, 455, 3, 357, 173, 0, 455, 456, 3, 81, 35, 0, 456, 457, 3, 323, 156, 0, 457, 458, 3, 361, 175, 0, 458, 459, 3, 345, 167, 0, 459, 460, 3, 315, 152, 0, 460, 461, 3, 341, 165, 0, 461, 462, 3, 321, 155, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 10, 5, 0, 464, 32, 1, 0, 0, 0, 465, 466, 3, 349, 169, 0, 466, 467, 3, 323, 156, 0, 467, 468, 3, 341, 165, 0, 468, 469, 3, 315, 152, 0, 469, 470, 3, 339, 164, 0, 470, 471, 3, 323, 156, 0, 471, 472, 1, 0, 0, 0, 472, 473, 6, 11, 6, 0, 473, 34, 1, 0, 0, 0, 474, 475, 3, 349, 169, 0, 475, 476, 3, 343, 166, 0, 476, 477, 3, 359, 174, 0, 477, 478, 1, 0, 0, 0, 478, 479, 6, 12, 0, 0, 479, 36, 1, 0, 0, 0, 480, 481, 3, 351, 170, 0, 481, 482, 3, 329, 159, 0, 482, 483, 3, 343, 166, 0, 483, 484, 3, 359, 174, 0, 484, 485, 1, 0, 0, 0, 485, 486, 6, 13, 7, 0, 486, 38, 1, 0, 0, 0, 487, 488, 3, 351, 170, 0, 488, 489, 3, 343, 166, 0, 489, 490, 3, 349, 169, 0, 490, 491, 3, 353, 171, 0, 491, 492, 1, 0, 0, 0, 492, 493, 6, 14, 0, 0, 493, 40, 1, 0, 0, 0, 494, 495, 3, 351, 170, 0, 495, 496, 3, 353, 171, 0, 496, 497, 3, 315, 152, 0, 497, 498, 3, 353, 171, 0, 498, 499, 3, 351, 170, 0, 499, 500, 1, 0, 0, 0, 500, 501, 6, 15, 0, 0, 501, 42, 1, 0, 0, 0, 502, 503, 3, 359, 174, 0, 503, 504, 3, 329, 159, 0, 504, 505, 3, 323, 156, 0, 505, 506, 3, 349, 169, 0, 506, 507, 3, 323, 156, 0, 507, 508, 1, 0, 0, 0, 508, 509, 6, 16, 0, 0, 509, 44, 1, 0, 0, 0, 510, 512, 8, 0, 0, 0, 511, 510, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 516, 6, 17, 0, 0, 516, 46, 1, 0, 0, 0, 517, 518, 5, 47, 0, 0, 518, 519, 5, 47, 0, 0, 519, 523, 1, 0, 0, 0, 520, 522, 8, 1, 0, 0, 521, 520, 1, 0, 0, 0, 522, 525, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 526, 528, 5, 13, 0, 0, 527, 526, 1, 0, 0, 0, 527, 528, 1, 0, 0, 0, 528, 530, 1, 0, 0, 0, 529, 531, 5, 10, 0, 0, 530, 529, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 533, 6, 18, 8, 0, 533, 48, 1, 0, 0, 0, 534, 535, 5, 47, 0, 0, 535, 536, 5, 42, 0, 0, 536, 541, 1, 0, 0, 0, 537, 540, 3, 49, 19, 0, 538, 540, 9, 0, 0, 0, 539, 537, 1, 0, 0, 0, 539, 538, 1, 0, 0, 0, 540, 543, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 541, 1, 0, 0, 0, 544, 545, 5, 42, 0, 0, 545, 546, 5, 47, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 6, 19, 8, 0, 548, 50, 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, 554, 1, 0, 0, 0, 554, 555, 6, 20, 8, 0, 555, 52, 1, 0, 0, 0, 556, 557, 3, 159, 74, 0, 557, 558, 1, 0, 0, 0, 558, 559, 6, 21, 9, 0, 559, 560, 6, 21, 10, 0, 560, 54, 1, 0, 0, 0, 561, 562, 3, 63, 26, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 22, 11, 0, 564, 565, 6, 22, 12, 0, 565, 56, 1, 0, 0, 0, 566, 567, 3, 51, 20, 0, 567, 568, 1, 0, 0, 0, 568, 569, 6, 23, 8, 0, 569, 58, 1, 0, 0, 0, 570, 571, 3, 47, 18, 0, 571, 572, 1, 0, 0, 0, 572, 573, 6, 24, 8, 0, 573, 60, 1, 0, 0, 0, 574, 575, 3, 49, 19, 0, 575, 576, 1, 0, 0, 0, 576, 577, 6, 25, 8, 0, 577, 62, 1, 0, 0, 0, 578, 579, 5, 124, 0, 0, 579, 580, 1, 0, 0, 0, 580, 581, 6, 26, 12, 0, 581, 64, 1, 0, 0, 0, 582, 583, 7, 3, 0, 0, 583, 66, 1, 0, 0, 0, 584, 585, 7, 4, 0, 0, 585, 68, 1, 0, 0, 0, 586, 587, 5, 92, 0, 0, 587, 588, 7, 5, 0, 0, 588, 70, 1, 0, 0, 0, 589, 590, 8, 6, 0, 0, 590, 72, 1, 0, 0, 0, 591, 593, 7, 7, 0, 0, 592, 594, 7, 8, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 1, 0, 0, 0, 595, 597, 3, 65, 27, 0, 596, 595, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 74, 1, 0, 0, 0, 600, 601, 5, 64, 0, 0, 601, 76, 1, 0, 0, 0, 602, 603, 5, 96, 0, 0, 603, 78, 1, 0, 0, 0, 604, 608, 8, 9, 0, 0, 605, 606, 5, 96, 0, 0, 606, 608, 5, 96, 0, 0, 607, 604, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 608, 80, 1, 0, 0, 0, 609, 610, 5, 95, 0, 0, 610, 82, 1, 0, 0, 0, 611, 615, 3, 67, 28, 0, 612, 615, 3, 65, 27, 0, 613, 615, 3, 81, 35, 0, 614, 611, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 614, 613, 1, 0, 0, 0, 615, 84, 1, 0, 0, 0, 616, 621, 5, 34, 0, 0, 617, 620, 3, 69, 29, 0, 618, 620, 3, 71, 30, 0, 619, 617, 1, 0, 0, 0, 619, 618, 1, 0, 0, 0, 620, 623, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 624, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 624, 646, 5, 34, 0, 0, 625, 626, 5, 34, 0, 0, 626, 627, 5, 34, 0, 0, 627, 628, 5, 34, 0, 0, 628, 632, 1, 0, 0, 0, 629, 631, 8, 1, 0, 0, 630, 629, 1, 0, 0, 0, 631, 634, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 632, 630, 1, 0, 0, 0, 633, 635, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 635, 636, 5, 34, 0, 0, 636, 637, 5, 34, 0, 0, 637, 638, 5, 34, 0, 0, 638, 640, 1, 0, 0, 0, 639, 641, 5, 34, 0, 0, 640, 639, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 643, 1, 0, 0, 0, 642, 644, 5, 34, 0, 0, 643, 642, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 646, 1, 0, 0, 0, 645, 616, 1, 0, 0, 0, 645, 625, 1, 0, 0, 0, 646, 86, 1, 0, 0, 0, 647, 649, 3, 65, 27, 0, 648, 647, 1, 0, 0, 0, 649, 650, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 88, 1, 0, 0, 0, 652, 654, 3, 65, 27, 0, 653, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 661, 3, 103, 46, 0, 658, 660, 3, 65, 27, 0, 659, 658, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 695, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 666, 3, 103, 46, 0, 665, 667, 3, 65, 27, 0, 666, 665, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 695, 1, 0, 0, 0, 670, 672, 3, 65, 27, 0, 671, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 671, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 682, 1, 0, 0, 0, 675, 679, 3, 103, 46, 0, 676, 678, 3, 65, 27, 0, 677, 676, 1, 0, 0, 0, 678, 681, 1, 0, 0, 0, 679, 677, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 683, 1, 0, 0, 0, 681, 679, 1, 0, 0, 0, 682, 675, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 685, 3, 73, 31, 0, 685, 695, 1, 0, 0, 0, 686, 688, 3, 103, 46, 0, 687, 689, 3, 65, 27, 0, 688, 687, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 688, 1, 0, 0, 0, 690, 691, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 693, 3, 73, 31, 0, 693, 695, 1, 0, 0, 0, 694, 653, 1, 0, 0, 0, 694, 664, 1, 0, 0, 0, 694, 671, 1, 0, 0, 0, 694, 686, 1, 0, 0, 0, 695, 90, 1, 0, 0, 0, 696, 697, 3, 317, 153, 0, 697, 698, 3, 363, 176, 0, 698, 92, 1, 0, 0, 0, 699, 700, 3, 315, 152, 0, 700, 701, 3, 341, 165, 0, 701, 702, 3, 321, 155, 0, 702, 94, 1, 0, 0, 0, 703, 704, 3, 315, 152, 0, 704, 705, 3, 351, 170, 0, 705, 706, 3, 319, 154, 0, 706, 96, 1, 0, 0, 0, 707, 708, 5, 61, 0, 0, 708, 98, 1, 0, 0, 0, 709, 710, 5, 44, 0, 0, 710, 100, 1, 0, 0, 0, 711, 712, 3, 321, 155, 0, 712, 713, 3, 323, 156, 0, 713, 714, 3, 351, 170, 0, 714, 715, 3, 319, 154, 0, 715, 102, 1, 0, 0, 0, 716, 717, 5, 46, 0, 0, 717, 104, 1, 0, 0, 0, 718, 719, 3, 325, 157, 0, 719, 720, 3, 315, 152, 0, 720, 721, 3, 337, 163, 0, 721, 722, 3, 351, 170, 0, 722, 723, 3, 323, 156, 0, 723, 106, 1, 0, 0, 0, 724, 725, 3, 325, 157, 0, 725, 726, 3, 331, 160, 0, 726, 727, 3, 349, 169, 0, 727, 728, 3, 351, 170, 0, 728, 729, 3, 353, 171, 0, 729, 108, 1, 0, 0, 0, 730, 731, 3, 337, 163, 0, 731, 732, 3, 315, 152, 0, 732, 733, 3, 351, 170, 0, 733, 734, 3, 353, 171, 0, 734, 110, 1, 0, 0, 0, 735, 736, 5, 40, 0, 0, 736, 112, 1, 0, 0, 0, 737, 738, 3, 331, 160, 0, 738, 739, 3, 341, 165, 0, 739, 114, 1, 0, 0, 0, 740, 741, 3, 331, 160, 0, 741, 742, 3, 351, 170, 0, 742, 116, 1, 0, 0, 0, 743, 744, 3, 337, 163, 0, 744, 745, 3, 331, 160, 0, 745, 746, 3, 335, 162, 0, 746, 747, 3, 323, 156, 0, 747, 118, 1, 0, 0, 0, 748, 749, 3, 341, 165, 0, 749, 750, 3, 343, 166, 0, 750, 751, 3, 353, 171, 0, 751, 120, 1, 0, 0, 0, 752, 753, 3, 341, 165, 0, 753, 754, 3, 355, 172, 0, 754, 755, 3, 337, 163, 0, 755, 756, 3, 337, 163, 0, 756, 122, 1, 0, 0, 0, 757, 758, 3, 341, 165, 0, 758, 759, 3, 355, 172, 0, 759, 760, 3, 337, 163, 0, 760, 761, 3, 337, 163, 0, 761, 762, 3, 351, 170, 0, 762, 124, 1, 0, 0, 0, 763, 764, 3, 343, 166, 0, 764, 765, 3, 349, 169, 0, 765, 126, 1, 0, 0, 0, 766, 767, 5, 63, 0, 0, 767, 128, 1, 0, 0, 0, 768, 769, 3, 349, 169, 0, 769, 770, 3, 337, 163, 0, 770, 771, 3, 331, 160, 0, 771, 772, 3, 335, 162, 0, 772, 773, 3, 323, 156, 0, 773, 130, 1, 0, 0, 0, 774, 775, 5, 41, 0, 0, 775, 132, 1, 0, 0, 0, 776, 777, 3, 353, 171, 0, 777, 778, 3, 349, 169, 0, 778, 779, 3, 355, 172, 0, 779, 780, 3, 323, 156, 0, 780, 134, 1, 0, 0, 0, 781, 782, 5, 61, 0, 0, 782, 783, 5, 61, 0, 0, 783, 136, 1, 0, 0, 0, 784, 785, 5, 61, 0, 0, 785, 786, 5, 126, 0, 0, 786, 138, 1, 0, 0, 0, 787, 788, 5, 33, 0, 0, 788, 789, 5, 61, 0, 0, 789, 140, 1, 0, 0, 0, 790, 791, 5, 60, 0, 0, 791, 142, 1, 0, 0, 0, 792, 793, 5, 60, 0, 0, 793, 794, 5, 61, 0, 0, 794, 144, 1, 0, 0, 0, 795, 796, 5, 62, 0, 0, 796, 146, 1, 0, 0, 0, 797, 798, 5, 62, 0, 0, 798, 799, 5, 61, 0, 0, 799, 148, 1, 0, 0, 0, 800, 801, 5, 43, 0, 0, 801, 150, 1, 0, 0, 0, 802, 803, 5, 45, 0, 0, 803, 152, 1, 0, 0, 0, 804, 805, 5, 42, 0, 0, 805, 154, 1, 0, 0, 0, 806, 807, 5, 47, 0, 0, 807, 156, 1, 0, 0, 0, 808, 809, 5, 37, 0, 0, 809, 158, 1, 0, 0, 0, 810, 811, 5, 91, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 6, 74, 0, 0, 813, 814, 6, 74, 0, 0, 814, 160, 1, 0, 0, 0, 815, 816, 5, 93, 0, 0, 816, 817, 1, 0, 0, 0, 817, 818, 6, 75, 12, 0, 818, 819, 6, 75, 12, 0, 819, 162, 1, 0, 0, 0, 820, 824, 3, 67, 28, 0, 821, 823, 3, 83, 36, 0, 822, 821, 1, 0, 0, 0, 823, 826, 1, 0, 0, 0, 824, 822, 1, 0, 0, 0, 824, 825, 1, 0, 0, 0, 825, 837, 1, 0, 0, 0, 826, 824, 1, 0, 0, 0, 827, 830, 3, 81, 35, 0, 828, 830, 3, 75, 32, 0, 829, 827, 1, 0, 0, 0, 829, 828, 1, 0, 0, 0, 830, 832, 1, 0, 0, 0, 831, 833, 3, 83, 36, 0, 832, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 1, 0, 0, 0, 836, 820, 1, 0, 0, 0, 836, 829, 1, 0, 0, 0, 837, 164, 1, 0, 0, 0, 838, 840, 3, 77, 33, 0, 839, 841, 3, 79, 34, 0, 840, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 845, 3, 77, 33, 0, 845, 166, 1, 0, 0, 0, 846, 847, 3, 165, 77, 0, 847, 168, 1, 0, 0, 0, 848, 849, 3, 47, 18, 0, 849, 850, 1, 0, 0, 0, 850, 851, 6, 79, 8, 0, 851, 170, 1, 0, 0, 0, 852, 853, 3, 49, 19, 0, 853, 854, 1, 0, 0, 0, 854, 855, 6, 80, 8, 0, 855, 172, 1, 0, 0, 0, 856, 857, 3, 51, 20, 0, 857, 858, 1, 0, 0, 0, 858, 859, 6, 81, 8, 0, 859, 174, 1, 0, 0, 0, 860, 861, 3, 63, 26, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 82, 11, 0, 863, 864, 6, 82, 12, 0, 864, 176, 1, 0, 0, 0, 865, 866, 3, 159, 74, 0, 866, 867, 1, 0, 0, 0, 867, 868, 6, 83, 9, 0, 868, 178, 1, 0, 0, 0, 869, 870, 3, 161, 75, 0, 870, 871, 1, 0, 0, 0, 871, 872, 6, 84, 13, 0, 872, 180, 1, 0, 0, 0, 873, 874, 3, 99, 44, 0, 874, 875, 1, 0, 0, 0, 875, 876, 6, 85, 14, 0, 876, 182, 1, 0, 0, 0, 877, 878, 3, 97, 43, 0, 878, 879, 1, 0, 0, 0, 879, 880, 6, 86, 15, 0, 880, 184, 1, 0, 0, 0, 881, 882, 3, 339, 164, 0, 882, 883, 3, 323, 156, 0, 883, 884, 3, 353, 171, 0, 884, 885, 3, 315, 152, 0, 885, 886, 3, 321, 155, 0, 886, 887, 3, 315, 152, 0, 887, 888, 3, 353, 171, 0, 888, 889, 3, 315, 152, 0, 889, 186, 1, 0, 0, 0, 890, 894, 8, 10, 0, 0, 891, 892, 5, 47, 0, 0, 892, 894, 8, 11, 0, 0, 893, 890, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 188, 1, 0, 0, 0, 895, 897, 3, 187, 88, 0, 896, 895, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 190, 1, 0, 0, 0, 900, 901, 3, 167, 78, 0, 901, 902, 1, 0, 0, 0, 902, 903, 6, 90, 16, 0, 903, 192, 1, 0, 0, 0, 904, 905, 3, 47, 18, 0, 905, 906, 1, 0, 0, 0, 906, 907, 6, 91, 8, 0, 907, 194, 1, 0, 0, 0, 908, 909, 3, 49, 19, 0, 909, 910, 1, 0, 0, 0, 910, 911, 6, 92, 8, 0, 911, 196, 1, 0, 0, 0, 912, 913, 3, 51, 20, 0, 913, 914, 1, 0, 0, 0, 914, 915, 6, 93, 8, 0, 915, 198, 1, 0, 0, 0, 916, 917, 3, 63, 26, 0, 917, 918, 1, 0, 0, 0, 918, 919, 6, 94, 11, 0, 919, 920, 6, 94, 12, 0, 920, 200, 1, 0, 0, 0, 921, 922, 3, 103, 46, 0, 922, 923, 1, 0, 0, 0, 923, 924, 6, 95, 17, 0, 924, 202, 1, 0, 0, 0, 925, 926, 3, 99, 44, 0, 926, 927, 1, 0, 0, 0, 927, 928, 6, 96, 14, 0, 928, 204, 1, 0, 0, 0, 929, 934, 3, 67, 28, 0, 930, 934, 3, 65, 27, 0, 931, 934, 3, 81, 35, 0, 932, 934, 3, 153, 71, 0, 933, 929, 1, 0, 0, 0, 933, 930, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 933, 932, 1, 0, 0, 0, 934, 206, 1, 0, 0, 0, 935, 938, 3, 67, 28, 0, 936, 938, 3, 153, 71, 0, 937, 935, 1, 0, 0, 0, 937, 936, 1, 0, 0, 0, 938, 942, 1, 0, 0, 0, 939, 941, 3, 205, 97, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 955, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 948, 3, 81, 35, 0, 946, 948, 3, 75, 32, 0, 947, 945, 1, 0, 0, 0, 947, 946, 1, 0, 0, 0, 948, 950, 1, 0, 0, 0, 949, 951, 3, 205, 97, 0, 950, 949, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 955, 1, 0, 0, 0, 954, 937, 1, 0, 0, 0, 954, 947, 1, 0, 0, 0, 955, 208, 1, 0, 0, 0, 956, 959, 3, 207, 98, 0, 957, 959, 3, 165, 77, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 958, 1, 0, 0, 0, 960, 961, 1, 0, 0, 0, 961, 210, 1, 0, 0, 0, 962, 963, 3, 47, 18, 0, 963, 964, 1, 0, 0, 0, 964, 965, 6, 100, 8, 0, 965, 212, 1, 0, 0, 0, 966, 967, 3, 49, 19, 0, 967, 968, 1, 0, 0, 0, 968, 969, 6, 101, 8, 0, 969, 214, 1, 0, 0, 0, 970, 971, 3, 51, 20, 0, 971, 972, 1, 0, 0, 0, 972, 973, 6, 102, 8, 0, 973, 216, 1, 0, 0, 0, 974, 975, 3, 63, 26, 0, 975, 976, 1, 0, 0, 0, 976, 977, 6, 103, 11, 0, 977, 978, 6, 103, 12, 0, 978, 218, 1, 0, 0, 0, 979, 980, 3, 97, 43, 0, 980, 981, 1, 0, 0, 0, 981, 982, 6, 104, 15, 0, 982, 220, 1, 0, 0, 0, 983, 984, 3, 99, 44, 0, 984, 985, 1, 0, 0, 0, 985, 986, 6, 105, 14, 0, 986, 222, 1, 0, 0, 0, 987, 988, 3, 103, 46, 0, 988, 989, 1, 0, 0, 0, 989, 990, 6, 106, 17, 0, 990, 224, 1, 0, 0, 0, 991, 992, 3, 315, 152, 0, 992, 993, 3, 351, 170, 0, 993, 226, 1, 0, 0, 0, 994, 995, 3, 209, 99, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 108, 18, 0, 997, 228, 1, 0, 0, 0, 998, 999, 3, 47, 18, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 6, 109, 8, 0, 1001, 230, 1, 0, 0, 0, 1002, 1003, 3, 49, 19, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 110, 8, 0, 1005, 232, 1, 0, 0, 0, 1006, 1007, 3, 51, 20, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 111, 8, 0, 1009, 234, 1, 0, 0, 0, 1010, 1011, 3, 63, 26, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 6, 112, 11, 0, 1013, 1014, 6, 112, 12, 0, 1014, 236, 1, 0, 0, 0, 1015, 1016, 3, 159, 74, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 113, 9, 0, 1018, 1019, 6, 113, 19, 0, 1019, 238, 1, 0, 0, 0, 1020, 1021, 3, 343, 166, 0, 1021, 1022, 3, 341, 165, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 6, 114, 20, 0, 1024, 240, 1, 0, 0, 0, 1025, 1026, 3, 359, 174, 0, 1026, 1027, 3, 331, 160, 0, 1027, 1028, 3, 353, 171, 0, 1028, 1029, 3, 329, 159, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1031, 6, 115, 20, 0, 1031, 242, 1, 0, 0, 0, 1032, 1033, 8, 12, 0, 0, 1033, 244, 1, 0, 0, 0, 1034, 1036, 3, 243, 116, 0, 1035, 1034, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1040, 3, 305, 147, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1035, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1045, 3, 243, 116, 0, 1044, 1043, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 246, 1, 0, 0, 0, 1048, 1049, 3, 167, 78, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1051, 6, 118, 16, 0, 1051, 248, 1, 0, 0, 0, 1052, 1053, 3, 245, 117, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 119, 21, 0, 1055, 250, 1, 0, 0, 0, 1056, 1057, 3, 47, 18, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 120, 8, 0, 1059, 252, 1, 0, 0, 0, 1060, 1061, 3, 49, 19, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 121, 8, 0, 1063, 254, 1, 0, 0, 0, 1064, 1065, 3, 51, 20, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 122, 8, 0, 1067, 256, 1, 0, 0, 0, 1068, 1069, 3, 63, 26, 0, 1069, 1070, 1, 0, 0, 0, 1070, 1071, 6, 123, 11, 0, 1071, 1072, 6, 123, 12, 0, 1072, 1073, 6, 123, 12, 0, 1073, 258, 1, 0, 0, 0, 1074, 1075, 3, 97, 43, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1077, 6, 124, 15, 0, 1077, 260, 1, 0, 0, 0, 1078, 1079, 3, 99, 44, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 6, 125, 14, 0, 1081, 262, 1, 0, 0, 0, 1082, 1083, 3, 103, 46, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 6, 126, 17, 0, 1085, 264, 1, 0, 0, 0, 1086, 1087, 3, 241, 115, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1089, 6, 127, 22, 0, 1089, 266, 1, 0, 0, 0, 1090, 1091, 3, 209, 99, 0, 1091, 1092, 1, 0, 0, 0, 1092, 1093, 6, 128, 18, 0, 1093, 268, 1, 0, 0, 0, 1094, 1095, 3, 167, 78, 0, 1095, 1096, 1, 0, 0, 0, 1096, 1097, 6, 129, 16, 0, 1097, 270, 1, 0, 0, 0, 1098, 1099, 3, 47, 18, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 6, 130, 8, 0, 1101, 272, 1, 0, 0, 0, 1102, 1103, 3, 49, 19, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1105, 6, 131, 8, 0, 1105, 274, 1, 0, 0, 0, 1106, 1107, 3, 51, 20, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 132, 8, 0, 1109, 276, 1, 0, 0, 0, 1110, 1111, 3, 63, 26, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1113, 6, 133, 11, 0, 1113, 1114, 6, 133, 12, 0, 1114, 278, 1, 0, 0, 0, 1115, 1116, 3, 103, 46, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 134, 17, 0, 1118, 280, 1, 0, 0, 0, 1119, 1120, 3, 167, 78, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 135, 16, 0, 1122, 282, 1, 0, 0, 0, 1123, 1124, 3, 163, 76, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 6, 136, 23, 0, 1126, 284, 1, 0, 0, 0, 1127, 1128, 3, 47, 18, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 6, 137, 8, 0, 1130, 286, 1, 0, 0, 0, 1131, 1132, 3, 49, 19, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 6, 138, 8, 0, 1134, 288, 1, 0, 0, 0, 1135, 1136, 3, 51, 20, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 139, 8, 0, 1138, 290, 1, 0, 0, 0, 1139, 1140, 3, 63, 26, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 6, 140, 11, 0, 1142, 1143, 6, 140, 12, 0, 1143, 292, 1, 0, 0, 0, 1144, 1145, 3, 331, 160, 0, 1145, 1146, 3, 341, 165, 0, 1146, 1147, 3, 325, 157, 0, 1147, 1148, 3, 343, 166, 0, 1148, 294, 1, 0, 0, 0, 1149, 1150, 3, 325, 157, 0, 1150, 1151, 3, 355, 172, 0, 1151, 1152, 3, 341, 165, 0, 1152, 1153, 3, 319, 154, 0, 1153, 1154, 3, 353, 171, 0, 1154, 1155, 3, 331, 160, 0, 1155, 1156, 3, 343, 166, 0, 1156, 1157, 3, 341, 165, 0, 1157, 1158, 3, 351, 170, 0, 1158, 296, 1, 0, 0, 0, 1159, 1160, 3, 47, 18, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 6, 143, 8, 0, 1162, 298, 1, 0, 0, 0, 1163, 1164, 3, 49, 19, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1166, 6, 144, 8, 0, 1166, 300, 1, 0, 0, 0, 1167, 1168, 3, 51, 20, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 6, 145, 8, 0, 1170, 302, 1, 0, 0, 0, 1171, 1172, 3, 161, 75, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 6, 146, 13, 0, 1174, 1175, 6, 146, 12, 0, 1175, 304, 1, 0, 0, 0, 1176, 1177, 5, 58, 0, 0, 1177, 306, 1, 0, 0, 0, 1178, 1184, 3, 75, 32, 0, 1179, 1184, 3, 65, 27, 0, 1180, 1184, 3, 103, 46, 0, 1181, 1184, 3, 67, 28, 0, 1182, 1184, 3, 81, 35, 0, 1183, 1178, 1, 0, 0, 0, 1183, 1179, 1, 0, 0, 0, 1183, 1180, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1183, 1182, 1, 0, 0, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 308, 1, 0, 0, 0, 1187, 1188, 3, 47, 18, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 6, 149, 8, 0, 1190, 310, 1, 0, 0, 0, 1191, 1192, 3, 49, 19, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1194, 6, 150, 8, 0, 1194, 312, 1, 0, 0, 0, 1195, 1196, 3, 51, 20, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 6, 151, 8, 0, 1198, 314, 1, 0, 0, 0, 1199, 1200, 7, 13, 0, 0, 1200, 316, 1, 0, 0, 0, 1201, 1202, 7, 14, 0, 0, 1202, 318, 1, 0, 0, 0, 1203, 1204, 7, 15, 0, 0, 1204, 320, 1, 0, 0, 0, 1205, 1206, 7, 16, 0, 0, 1206, 322, 1, 0, 0, 0, 1207, 1208, 7, 7, 0, 0, 1208, 324, 1, 0, 0, 0, 1209, 1210, 7, 17, 0, 0, 1210, 326, 1, 0, 0, 0, 1211, 1212, 7, 18, 0, 0, 1212, 328, 1, 0, 0, 0, 1213, 1214, 7, 19, 0, 0, 1214, 330, 1, 0, 0, 0, 1215, 1216, 7, 20, 0, 0, 1216, 332, 1, 0, 0, 0, 1217, 1218, 7, 21, 0, 0, 1218, 334, 1, 0, 0, 0, 1219, 1220, 7, 22, 0, 0, 1220, 336, 1, 0, 0, 0, 1221, 1222, 7, 23, 0, 0, 1222, 338, 1, 0, 0, 0, 1223, 1224, 7, 24, 0, 0, 1224, 340, 1, 0, 0, 0, 1225, 1226, 7, 25, 0, 0, 1226, 342, 1, 0, 0, 0, 1227, 1228, 7, 26, 0, 0, 1228, 344, 1, 0, 0, 0, 1229, 1230, 7, 27, 0, 0, 1230, 346, 1, 0, 0, 0, 1231, 1232, 7, 28, 0, 0, 1232, 348, 1, 0, 0, 0, 1233, 1234, 7, 29, 0, 0, 1234, 350, 1, 0, 0, 0, 1235, 1236, 7, 30, 0, 0, 1236, 352, 1, 0, 0, 0, 1237, 1238, 7, 31, 0, 0, 1238, 354, 1, 0, 0, 0, 1239, 1240, 7, 32, 0, 0, 1240, 356, 1, 0, 0, 0, 1241, 1242, 7, 33, 0, 0, 1242, 358, 1, 0, 0, 0, 1243, 1244, 7, 34, 0, 0, 1244, 360, 1, 0, 0, 0, 1245, 1246, 7, 35, 0, 0, 1246, 362, 1, 0, 0, 0, 1247, 1248, 7, 36, 0, 0, 1248, 364, 1, 0, 0, 0, 1249, 1250, 7, 37, 0, 0, 1250, 366, 1, 0, 0, 0, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 513, 523, 527, 530, 539, 541, 552, 593, 598, 607, 614, 619, 621, 632, 640, 643, 645, 650, 655, 661, 668, 673, 679, 682, 690, 694, 824, 829, 834, 836, 842, 893, 898, 933, 937, 942, 947, 952, 954, 958, 960, 1037, 1041, 1046, 1183, 1185, 24, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 63, 0, 5, 0, 0, 7, 25, 0, 4, 0, 0, 7, 64, 0, 7, 33, 0, 7, 32, 0, 7, 66, 0, 7, 35, 0, 7, 75, 0, 5, 10, 0, 5, 7, 0, 7, 85, 0, 7, 84, 0, 7, 65, 0] \ No newline at end of file +[4, 0, 104, 1147, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 4, 17, 460, 8, 17, 11, 17, 12, 17, 461, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 470, 8, 18, 10, 18, 12, 18, 473, 9, 18, 1, 18, 3, 18, 476, 8, 18, 1, 18, 3, 18, 479, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 488, 8, 19, 10, 19, 12, 19, 491, 9, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 499, 8, 20, 11, 20, 12, 20, 500, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 542, 8, 31, 1, 31, 4, 31, 545, 8, 31, 11, 31, 12, 31, 546, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 556, 8, 34, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 3, 36, 563, 8, 36, 1, 37, 1, 37, 1, 37, 5, 37, 568, 8, 37, 10, 37, 12, 37, 571, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 579, 8, 37, 10, 37, 12, 37, 582, 9, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 589, 8, 37, 1, 37, 3, 37, 592, 8, 37, 3, 37, 594, 8, 37, 1, 38, 4, 38, 597, 8, 38, 11, 38, 12, 38, 598, 1, 39, 4, 39, 602, 8, 39, 11, 39, 12, 39, 603, 1, 39, 1, 39, 5, 39, 608, 8, 39, 10, 39, 12, 39, 611, 9, 39, 1, 39, 1, 39, 4, 39, 615, 8, 39, 11, 39, 12, 39, 616, 1, 39, 4, 39, 620, 8, 39, 11, 39, 12, 39, 621, 1, 39, 1, 39, 5, 39, 626, 8, 39, 10, 39, 12, 39, 629, 9, 39, 3, 39, 631, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 4, 39, 637, 8, 39, 11, 39, 12, 39, 638, 1, 39, 1, 39, 3, 39, 643, 8, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 5, 76, 771, 8, 76, 10, 76, 12, 76, 774, 9, 76, 1, 76, 1, 76, 3, 76, 778, 8, 76, 1, 76, 4, 76, 781, 8, 76, 11, 76, 12, 76, 782, 3, 76, 785, 8, 76, 1, 77, 1, 77, 4, 77, 789, 8, 77, 11, 77, 12, 77, 790, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 3, 88, 842, 8, 88, 1, 89, 4, 89, 845, 8, 89, 11, 89, 12, 89, 846, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 882, 8, 97, 1, 98, 1, 98, 3, 98, 886, 8, 98, 1, 98, 5, 98, 889, 8, 98, 10, 98, 12, 98, 892, 9, 98, 1, 98, 1, 98, 3, 98, 896, 8, 98, 1, 98, 4, 98, 899, 8, 98, 11, 98, 12, 98, 900, 3, 98, 903, 8, 98, 1, 99, 1, 99, 4, 99, 907, 8, 99, 11, 99, 12, 99, 908, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 4, 117, 984, 8, 117, 11, 117, 12, 117, 985, 1, 117, 1, 117, 3, 117, 990, 8, 117, 1, 117, 4, 117, 993, 8, 117, 11, 117, 12, 117, 994, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 4, 148, 1132, 8, 148, 11, 148, 12, 148, 1133, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 2, 489, 580, 0, 152, 11, 1, 13, 2, 15, 3, 17, 4, 19, 5, 21, 6, 23, 7, 25, 8, 27, 9, 29, 10, 31, 11, 33, 12, 35, 13, 37, 14, 39, 15, 41, 16, 43, 17, 45, 18, 47, 19, 49, 20, 51, 21, 53, 0, 55, 0, 57, 22, 59, 23, 61, 24, 63, 25, 65, 0, 67, 0, 69, 0, 71, 0, 73, 0, 75, 0, 77, 0, 79, 0, 81, 0, 83, 0, 85, 26, 87, 27, 89, 28, 91, 29, 93, 30, 95, 31, 97, 32, 99, 33, 101, 34, 103, 35, 105, 36, 107, 37, 109, 38, 111, 39, 113, 40, 115, 41, 117, 42, 119, 43, 121, 44, 123, 45, 125, 46, 127, 47, 129, 48, 131, 49, 133, 50, 135, 51, 137, 52, 139, 53, 141, 54, 143, 55, 145, 56, 147, 57, 149, 58, 151, 59, 153, 60, 155, 61, 157, 62, 159, 63, 161, 64, 163, 65, 165, 0, 167, 66, 169, 67, 171, 68, 173, 69, 175, 0, 177, 0, 179, 0, 181, 0, 183, 0, 185, 70, 187, 0, 189, 71, 191, 0, 193, 72, 195, 73, 197, 74, 199, 0, 201, 0, 203, 0, 205, 0, 207, 0, 209, 75, 211, 76, 213, 77, 215, 78, 217, 0, 219, 0, 221, 0, 223, 0, 225, 79, 227, 0, 229, 80, 231, 81, 233, 82, 235, 0, 237, 0, 239, 83, 241, 84, 243, 0, 245, 85, 247, 0, 249, 0, 251, 86, 253, 87, 255, 88, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 89, 273, 90, 275, 91, 277, 0, 279, 0, 281, 0, 283, 0, 285, 92, 287, 93, 289, 94, 291, 0, 293, 95, 295, 96, 297, 97, 299, 98, 301, 99, 303, 0, 305, 100, 307, 101, 309, 102, 311, 103, 313, 104, 11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 2, 0, 85, 85, 117, 117, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1175, 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, 1, 53, 1, 0, 0, 0, 1, 55, 1, 0, 0, 0, 1, 57, 1, 0, 0, 0, 1, 59, 1, 0, 0, 0, 1, 61, 1, 0, 0, 0, 2, 63, 1, 0, 0, 0, 2, 85, 1, 0, 0, 0, 2, 87, 1, 0, 0, 0, 2, 89, 1, 0, 0, 0, 2, 91, 1, 0, 0, 0, 2, 93, 1, 0, 0, 0, 2, 95, 1, 0, 0, 0, 2, 97, 1, 0, 0, 0, 2, 99, 1, 0, 0, 0, 2, 101, 1, 0, 0, 0, 2, 103, 1, 0, 0, 0, 2, 105, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 2, 111, 1, 0, 0, 0, 2, 113, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 2, 117, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 2, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 2, 125, 1, 0, 0, 0, 2, 127, 1, 0, 0, 0, 2, 129, 1, 0, 0, 0, 2, 131, 1, 0, 0, 0, 2, 133, 1, 0, 0, 0, 2, 135, 1, 0, 0, 0, 2, 137, 1, 0, 0, 0, 2, 139, 1, 0, 0, 0, 2, 141, 1, 0, 0, 0, 2, 143, 1, 0, 0, 0, 2, 145, 1, 0, 0, 0, 2, 147, 1, 0, 0, 0, 2, 149, 1, 0, 0, 0, 2, 151, 1, 0, 0, 0, 2, 153, 1, 0, 0, 0, 2, 155, 1, 0, 0, 0, 2, 157, 1, 0, 0, 0, 2, 159, 1, 0, 0, 0, 2, 161, 1, 0, 0, 0, 2, 163, 1, 0, 0, 0, 2, 167, 1, 0, 0, 0, 2, 169, 1, 0, 0, 0, 2, 171, 1, 0, 0, 0, 2, 173, 1, 0, 0, 0, 3, 175, 1, 0, 0, 0, 3, 177, 1, 0, 0, 0, 3, 179, 1, 0, 0, 0, 3, 181, 1, 0, 0, 0, 3, 183, 1, 0, 0, 0, 3, 185, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 3, 191, 1, 0, 0, 0, 3, 193, 1, 0, 0, 0, 3, 195, 1, 0, 0, 0, 3, 197, 1, 0, 0, 0, 4, 199, 1, 0, 0, 0, 4, 201, 1, 0, 0, 0, 4, 203, 1, 0, 0, 0, 4, 209, 1, 0, 0, 0, 4, 211, 1, 0, 0, 0, 4, 213, 1, 0, 0, 0, 4, 215, 1, 0, 0, 0, 5, 217, 1, 0, 0, 0, 5, 219, 1, 0, 0, 0, 5, 221, 1, 0, 0, 0, 5, 223, 1, 0, 0, 0, 5, 225, 1, 0, 0, 0, 5, 227, 1, 0, 0, 0, 5, 229, 1, 0, 0, 0, 5, 231, 1, 0, 0, 0, 5, 233, 1, 0, 0, 0, 6, 235, 1, 0, 0, 0, 6, 237, 1, 0, 0, 0, 6, 239, 1, 0, 0, 0, 6, 241, 1, 0, 0, 0, 6, 245, 1, 0, 0, 0, 6, 247, 1, 0, 0, 0, 6, 249, 1, 0, 0, 0, 6, 251, 1, 0, 0, 0, 6, 253, 1, 0, 0, 0, 6, 255, 1, 0, 0, 0, 7, 257, 1, 0, 0, 0, 7, 259, 1, 0, 0, 0, 7, 261, 1, 0, 0, 0, 7, 263, 1, 0, 0, 0, 7, 265, 1, 0, 0, 0, 7, 267, 1, 0, 0, 0, 7, 269, 1, 0, 0, 0, 7, 271, 1, 0, 0, 0, 7, 273, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 8, 277, 1, 0, 0, 0, 8, 279, 1, 0, 0, 0, 8, 281, 1, 0, 0, 0, 8, 283, 1, 0, 0, 0, 8, 285, 1, 0, 0, 0, 8, 287, 1, 0, 0, 0, 8, 289, 1, 0, 0, 0, 9, 291, 1, 0, 0, 0, 9, 293, 1, 0, 0, 0, 9, 295, 1, 0, 0, 0, 9, 297, 1, 0, 0, 0, 9, 299, 1, 0, 0, 0, 9, 301, 1, 0, 0, 0, 10, 303, 1, 0, 0, 0, 10, 305, 1, 0, 0, 0, 10, 307, 1, 0, 0, 0, 10, 309, 1, 0, 0, 0, 10, 311, 1, 0, 0, 0, 10, 313, 1, 0, 0, 0, 11, 315, 1, 0, 0, 0, 13, 325, 1, 0, 0, 0, 15, 332, 1, 0, 0, 0, 17, 341, 1, 0, 0, 0, 19, 348, 1, 0, 0, 0, 21, 358, 1, 0, 0, 0, 23, 365, 1, 0, 0, 0, 25, 372, 1, 0, 0, 0, 27, 386, 1, 0, 0, 0, 29, 393, 1, 0, 0, 0, 31, 401, 1, 0, 0, 0, 33, 413, 1, 0, 0, 0, 35, 422, 1, 0, 0, 0, 37, 428, 1, 0, 0, 0, 39, 435, 1, 0, 0, 0, 41, 442, 1, 0, 0, 0, 43, 450, 1, 0, 0, 0, 45, 459, 1, 0, 0, 0, 47, 465, 1, 0, 0, 0, 49, 482, 1, 0, 0, 0, 51, 498, 1, 0, 0, 0, 53, 504, 1, 0, 0, 0, 55, 509, 1, 0, 0, 0, 57, 514, 1, 0, 0, 0, 59, 518, 1, 0, 0, 0, 61, 522, 1, 0, 0, 0, 63, 526, 1, 0, 0, 0, 65, 530, 1, 0, 0, 0, 67, 532, 1, 0, 0, 0, 69, 534, 1, 0, 0, 0, 71, 537, 1, 0, 0, 0, 73, 539, 1, 0, 0, 0, 75, 548, 1, 0, 0, 0, 77, 550, 1, 0, 0, 0, 79, 555, 1, 0, 0, 0, 81, 557, 1, 0, 0, 0, 83, 562, 1, 0, 0, 0, 85, 593, 1, 0, 0, 0, 87, 596, 1, 0, 0, 0, 89, 642, 1, 0, 0, 0, 91, 644, 1, 0, 0, 0, 93, 647, 1, 0, 0, 0, 95, 651, 1, 0, 0, 0, 97, 655, 1, 0, 0, 0, 99, 657, 1, 0, 0, 0, 101, 659, 1, 0, 0, 0, 103, 664, 1, 0, 0, 0, 105, 666, 1, 0, 0, 0, 107, 672, 1, 0, 0, 0, 109, 678, 1, 0, 0, 0, 111, 683, 1, 0, 0, 0, 113, 685, 1, 0, 0, 0, 115, 688, 1, 0, 0, 0, 117, 691, 1, 0, 0, 0, 119, 696, 1, 0, 0, 0, 121, 700, 1, 0, 0, 0, 123, 705, 1, 0, 0, 0, 125, 711, 1, 0, 0, 0, 127, 714, 1, 0, 0, 0, 129, 716, 1, 0, 0, 0, 131, 722, 1, 0, 0, 0, 133, 724, 1, 0, 0, 0, 135, 729, 1, 0, 0, 0, 137, 732, 1, 0, 0, 0, 139, 735, 1, 0, 0, 0, 141, 738, 1, 0, 0, 0, 143, 740, 1, 0, 0, 0, 145, 743, 1, 0, 0, 0, 147, 745, 1, 0, 0, 0, 149, 748, 1, 0, 0, 0, 151, 750, 1, 0, 0, 0, 153, 752, 1, 0, 0, 0, 155, 754, 1, 0, 0, 0, 157, 756, 1, 0, 0, 0, 159, 758, 1, 0, 0, 0, 161, 763, 1, 0, 0, 0, 163, 784, 1, 0, 0, 0, 165, 786, 1, 0, 0, 0, 167, 794, 1, 0, 0, 0, 169, 796, 1, 0, 0, 0, 171, 800, 1, 0, 0, 0, 173, 804, 1, 0, 0, 0, 175, 808, 1, 0, 0, 0, 177, 813, 1, 0, 0, 0, 179, 817, 1, 0, 0, 0, 181, 821, 1, 0, 0, 0, 183, 825, 1, 0, 0, 0, 185, 829, 1, 0, 0, 0, 187, 841, 1, 0, 0, 0, 189, 844, 1, 0, 0, 0, 191, 848, 1, 0, 0, 0, 193, 852, 1, 0, 0, 0, 195, 856, 1, 0, 0, 0, 197, 860, 1, 0, 0, 0, 199, 864, 1, 0, 0, 0, 201, 869, 1, 0, 0, 0, 203, 873, 1, 0, 0, 0, 205, 881, 1, 0, 0, 0, 207, 902, 1, 0, 0, 0, 209, 906, 1, 0, 0, 0, 211, 910, 1, 0, 0, 0, 213, 914, 1, 0, 0, 0, 215, 918, 1, 0, 0, 0, 217, 922, 1, 0, 0, 0, 219, 927, 1, 0, 0, 0, 221, 931, 1, 0, 0, 0, 223, 935, 1, 0, 0, 0, 225, 939, 1, 0, 0, 0, 227, 942, 1, 0, 0, 0, 229, 946, 1, 0, 0, 0, 231, 950, 1, 0, 0, 0, 233, 954, 1, 0, 0, 0, 235, 958, 1, 0, 0, 0, 237, 963, 1, 0, 0, 0, 239, 968, 1, 0, 0, 0, 241, 973, 1, 0, 0, 0, 243, 980, 1, 0, 0, 0, 245, 989, 1, 0, 0, 0, 247, 996, 1, 0, 0, 0, 249, 1000, 1, 0, 0, 0, 251, 1004, 1, 0, 0, 0, 253, 1008, 1, 0, 0, 0, 255, 1012, 1, 0, 0, 0, 257, 1016, 1, 0, 0, 0, 259, 1022, 1, 0, 0, 0, 261, 1026, 1, 0, 0, 0, 263, 1030, 1, 0, 0, 0, 265, 1034, 1, 0, 0, 0, 267, 1038, 1, 0, 0, 0, 269, 1042, 1, 0, 0, 0, 271, 1046, 1, 0, 0, 0, 273, 1050, 1, 0, 0, 0, 275, 1054, 1, 0, 0, 0, 277, 1058, 1, 0, 0, 0, 279, 1063, 1, 0, 0, 0, 281, 1067, 1, 0, 0, 0, 283, 1071, 1, 0, 0, 0, 285, 1075, 1, 0, 0, 0, 287, 1079, 1, 0, 0, 0, 289, 1083, 1, 0, 0, 0, 291, 1087, 1, 0, 0, 0, 293, 1092, 1, 0, 0, 0, 295, 1097, 1, 0, 0, 0, 297, 1107, 1, 0, 0, 0, 299, 1111, 1, 0, 0, 0, 301, 1115, 1, 0, 0, 0, 303, 1119, 1, 0, 0, 0, 305, 1124, 1, 0, 0, 0, 307, 1131, 1, 0, 0, 0, 309, 1135, 1, 0, 0, 0, 311, 1139, 1, 0, 0, 0, 313, 1143, 1, 0, 0, 0, 315, 316, 7, 0, 0, 0, 316, 317, 7, 1, 0, 0, 317, 318, 7, 2, 0, 0, 318, 319, 7, 2, 0, 0, 319, 320, 7, 3, 0, 0, 320, 321, 7, 4, 0, 0, 321, 322, 7, 5, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 6, 0, 0, 0, 324, 12, 1, 0, 0, 0, 325, 326, 7, 0, 0, 0, 326, 327, 7, 6, 0, 0, 327, 328, 7, 7, 0, 0, 328, 329, 7, 8, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 6, 1, 1, 0, 331, 14, 1, 0, 0, 0, 332, 333, 7, 3, 0, 0, 333, 334, 7, 9, 0, 0, 334, 335, 7, 6, 0, 0, 335, 336, 7, 1, 0, 0, 336, 337, 7, 4, 0, 0, 337, 338, 7, 10, 0, 0, 338, 339, 1, 0, 0, 0, 339, 340, 6, 2, 2, 0, 340, 16, 1, 0, 0, 0, 341, 342, 7, 3, 0, 0, 342, 343, 7, 11, 0, 0, 343, 344, 7, 12, 0, 0, 344, 345, 7, 13, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 6, 3, 0, 0, 347, 18, 1, 0, 0, 0, 348, 349, 7, 3, 0, 0, 349, 350, 7, 14, 0, 0, 350, 351, 7, 8, 0, 0, 351, 352, 7, 13, 0, 0, 352, 353, 7, 12, 0, 0, 353, 354, 7, 1, 0, 0, 354, 355, 7, 9, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 6, 4, 3, 0, 357, 20, 1, 0, 0, 0, 358, 359, 7, 15, 0, 0, 359, 360, 7, 6, 0, 0, 360, 361, 7, 7, 0, 0, 361, 362, 7, 16, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 6, 5, 4, 0, 364, 22, 1, 0, 0, 0, 365, 366, 7, 17, 0, 0, 366, 367, 7, 6, 0, 0, 367, 368, 7, 7, 0, 0, 368, 369, 7, 18, 0, 0, 369, 370, 1, 0, 0, 0, 370, 371, 6, 6, 0, 0, 371, 24, 1, 0, 0, 0, 372, 373, 7, 1, 0, 0, 373, 374, 7, 9, 0, 0, 374, 375, 7, 13, 0, 0, 375, 376, 7, 1, 0, 0, 376, 377, 7, 9, 0, 0, 377, 378, 7, 3, 0, 0, 378, 379, 7, 2, 0, 0, 379, 380, 7, 5, 0, 0, 380, 381, 7, 12, 0, 0, 381, 382, 7, 5, 0, 0, 382, 383, 7, 2, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 6, 7, 0, 0, 385, 26, 1, 0, 0, 0, 386, 387, 7, 18, 0, 0, 387, 388, 7, 3, 0, 0, 388, 389, 7, 3, 0, 0, 389, 390, 7, 8, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 6, 8, 1, 0, 392, 28, 1, 0, 0, 0, 393, 394, 7, 13, 0, 0, 394, 395, 7, 1, 0, 0, 395, 396, 7, 16, 0, 0, 396, 397, 7, 1, 0, 0, 397, 398, 7, 5, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 6, 9, 0, 0, 400, 30, 1, 0, 0, 0, 401, 402, 7, 16, 0, 0, 402, 403, 7, 11, 0, 0, 403, 404, 5, 95, 0, 0, 404, 405, 7, 3, 0, 0, 405, 406, 7, 14, 0, 0, 406, 407, 7, 8, 0, 0, 407, 408, 7, 12, 0, 0, 408, 409, 7, 9, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 6, 10, 5, 0, 412, 32, 1, 0, 0, 0, 413, 414, 7, 6, 0, 0, 414, 415, 7, 3, 0, 0, 415, 416, 7, 9, 0, 0, 416, 417, 7, 12, 0, 0, 417, 418, 7, 16, 0, 0, 418, 419, 7, 3, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 6, 11, 6, 0, 421, 34, 1, 0, 0, 0, 422, 423, 7, 6, 0, 0, 423, 424, 7, 7, 0, 0, 424, 425, 7, 19, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 6, 12, 0, 0, 427, 36, 1, 0, 0, 0, 428, 429, 7, 2, 0, 0, 429, 430, 7, 10, 0, 0, 430, 431, 7, 7, 0, 0, 431, 432, 7, 19, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 6, 13, 7, 0, 434, 38, 1, 0, 0, 0, 435, 436, 7, 2, 0, 0, 436, 437, 7, 7, 0, 0, 437, 438, 7, 6, 0, 0, 438, 439, 7, 5, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 6, 14, 0, 0, 441, 40, 1, 0, 0, 0, 442, 443, 7, 2, 0, 0, 443, 444, 7, 5, 0, 0, 444, 445, 7, 12, 0, 0, 445, 446, 7, 5, 0, 0, 446, 447, 7, 2, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 6, 15, 0, 0, 449, 42, 1, 0, 0, 0, 450, 451, 7, 19, 0, 0, 451, 452, 7, 10, 0, 0, 452, 453, 7, 3, 0, 0, 453, 454, 7, 6, 0, 0, 454, 455, 7, 3, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 6, 16, 0, 0, 457, 44, 1, 0, 0, 0, 458, 460, 8, 20, 0, 0, 459, 458, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 6, 17, 0, 0, 464, 46, 1, 0, 0, 0, 465, 466, 5, 47, 0, 0, 466, 467, 5, 47, 0, 0, 467, 471, 1, 0, 0, 0, 468, 470, 8, 21, 0, 0, 469, 468, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 475, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 476, 5, 13, 0, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 478, 1, 0, 0, 0, 477, 479, 5, 10, 0, 0, 478, 477, 1, 0, 0, 0, 478, 479, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 6, 18, 8, 0, 481, 48, 1, 0, 0, 0, 482, 483, 5, 47, 0, 0, 483, 484, 5, 42, 0, 0, 484, 489, 1, 0, 0, 0, 485, 488, 3, 49, 19, 0, 486, 488, 9, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 493, 5, 42, 0, 0, 493, 494, 5, 47, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 6, 19, 8, 0, 496, 50, 1, 0, 0, 0, 497, 499, 7, 22, 0, 0, 498, 497, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 6, 20, 8, 0, 503, 52, 1, 0, 0, 0, 504, 505, 3, 159, 74, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 21, 9, 0, 507, 508, 6, 21, 10, 0, 508, 54, 1, 0, 0, 0, 509, 510, 3, 63, 26, 0, 510, 511, 1, 0, 0, 0, 511, 512, 6, 22, 11, 0, 512, 513, 6, 22, 12, 0, 513, 56, 1, 0, 0, 0, 514, 515, 3, 51, 20, 0, 515, 516, 1, 0, 0, 0, 516, 517, 6, 23, 8, 0, 517, 58, 1, 0, 0, 0, 518, 519, 3, 47, 18, 0, 519, 520, 1, 0, 0, 0, 520, 521, 6, 24, 8, 0, 521, 60, 1, 0, 0, 0, 522, 523, 3, 49, 19, 0, 523, 524, 1, 0, 0, 0, 524, 525, 6, 25, 8, 0, 525, 62, 1, 0, 0, 0, 526, 527, 5, 124, 0, 0, 527, 528, 1, 0, 0, 0, 528, 529, 6, 26, 12, 0, 529, 64, 1, 0, 0, 0, 530, 531, 7, 23, 0, 0, 531, 66, 1, 0, 0, 0, 532, 533, 7, 24, 0, 0, 533, 68, 1, 0, 0, 0, 534, 535, 5, 92, 0, 0, 535, 536, 7, 25, 0, 0, 536, 70, 1, 0, 0, 0, 537, 538, 8, 26, 0, 0, 538, 72, 1, 0, 0, 0, 539, 541, 7, 3, 0, 0, 540, 542, 7, 27, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 65, 27, 0, 544, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 74, 1, 0, 0, 0, 548, 549, 5, 64, 0, 0, 549, 76, 1, 0, 0, 0, 550, 551, 5, 96, 0, 0, 551, 78, 1, 0, 0, 0, 552, 556, 8, 28, 0, 0, 553, 554, 5, 96, 0, 0, 554, 556, 5, 96, 0, 0, 555, 552, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 80, 1, 0, 0, 0, 557, 558, 5, 95, 0, 0, 558, 82, 1, 0, 0, 0, 559, 563, 3, 67, 28, 0, 560, 563, 3, 65, 27, 0, 561, 563, 3, 81, 35, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 84, 1, 0, 0, 0, 564, 569, 5, 34, 0, 0, 565, 568, 3, 69, 29, 0, 566, 568, 3, 71, 30, 0, 567, 565, 1, 0, 0, 0, 567, 566, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 567, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 572, 1, 0, 0, 0, 571, 569, 1, 0, 0, 0, 572, 594, 5, 34, 0, 0, 573, 574, 5, 34, 0, 0, 574, 575, 5, 34, 0, 0, 575, 576, 5, 34, 0, 0, 576, 580, 1, 0, 0, 0, 577, 579, 8, 21, 0, 0, 578, 577, 1, 0, 0, 0, 579, 582, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 583, 1, 0, 0, 0, 582, 580, 1, 0, 0, 0, 583, 584, 5, 34, 0, 0, 584, 585, 5, 34, 0, 0, 585, 586, 5, 34, 0, 0, 586, 588, 1, 0, 0, 0, 587, 589, 5, 34, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 591, 1, 0, 0, 0, 590, 592, 5, 34, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 564, 1, 0, 0, 0, 593, 573, 1, 0, 0, 0, 594, 86, 1, 0, 0, 0, 595, 597, 3, 65, 27, 0, 596, 595, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 88, 1, 0, 0, 0, 600, 602, 3, 65, 27, 0, 601, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 609, 3, 103, 46, 0, 606, 608, 3, 65, 27, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 643, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 614, 3, 103, 46, 0, 613, 615, 3, 65, 27, 0, 614, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 643, 1, 0, 0, 0, 618, 620, 3, 65, 27, 0, 619, 618, 1, 0, 0, 0, 620, 621, 1, 0, 0, 0, 621, 619, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 630, 1, 0, 0, 0, 623, 627, 3, 103, 46, 0, 624, 626, 3, 65, 27, 0, 625, 624, 1, 0, 0, 0, 626, 629, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 631, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 630, 623, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 3, 73, 31, 0, 633, 643, 1, 0, 0, 0, 634, 636, 3, 103, 46, 0, 635, 637, 3, 65, 27, 0, 636, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 636, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 3, 73, 31, 0, 641, 643, 1, 0, 0, 0, 642, 601, 1, 0, 0, 0, 642, 612, 1, 0, 0, 0, 642, 619, 1, 0, 0, 0, 642, 634, 1, 0, 0, 0, 643, 90, 1, 0, 0, 0, 644, 645, 7, 29, 0, 0, 645, 646, 7, 30, 0, 0, 646, 92, 1, 0, 0, 0, 647, 648, 7, 12, 0, 0, 648, 649, 7, 9, 0, 0, 649, 650, 7, 0, 0, 0, 650, 94, 1, 0, 0, 0, 651, 652, 7, 12, 0, 0, 652, 653, 7, 2, 0, 0, 653, 654, 7, 4, 0, 0, 654, 96, 1, 0, 0, 0, 655, 656, 5, 61, 0, 0, 656, 98, 1, 0, 0, 0, 657, 658, 5, 44, 0, 0, 658, 100, 1, 0, 0, 0, 659, 660, 7, 0, 0, 0, 660, 661, 7, 3, 0, 0, 661, 662, 7, 2, 0, 0, 662, 663, 7, 4, 0, 0, 663, 102, 1, 0, 0, 0, 664, 665, 5, 46, 0, 0, 665, 104, 1, 0, 0, 0, 666, 667, 7, 15, 0, 0, 667, 668, 7, 12, 0, 0, 668, 669, 7, 13, 0, 0, 669, 670, 7, 2, 0, 0, 670, 671, 7, 3, 0, 0, 671, 106, 1, 0, 0, 0, 672, 673, 7, 15, 0, 0, 673, 674, 7, 1, 0, 0, 674, 675, 7, 6, 0, 0, 675, 676, 7, 2, 0, 0, 676, 677, 7, 5, 0, 0, 677, 108, 1, 0, 0, 0, 678, 679, 7, 13, 0, 0, 679, 680, 7, 12, 0, 0, 680, 681, 7, 2, 0, 0, 681, 682, 7, 5, 0, 0, 682, 110, 1, 0, 0, 0, 683, 684, 5, 40, 0, 0, 684, 112, 1, 0, 0, 0, 685, 686, 7, 1, 0, 0, 686, 687, 7, 9, 0, 0, 687, 114, 1, 0, 0, 0, 688, 689, 7, 1, 0, 0, 689, 690, 7, 2, 0, 0, 690, 116, 1, 0, 0, 0, 691, 692, 7, 13, 0, 0, 692, 693, 7, 1, 0, 0, 693, 694, 7, 18, 0, 0, 694, 695, 7, 3, 0, 0, 695, 118, 1, 0, 0, 0, 696, 697, 7, 9, 0, 0, 697, 698, 7, 7, 0, 0, 698, 699, 7, 5, 0, 0, 699, 120, 1, 0, 0, 0, 700, 701, 7, 9, 0, 0, 701, 702, 7, 31, 0, 0, 702, 703, 7, 13, 0, 0, 703, 704, 7, 13, 0, 0, 704, 122, 1, 0, 0, 0, 705, 706, 7, 9, 0, 0, 706, 707, 7, 31, 0, 0, 707, 708, 7, 13, 0, 0, 708, 709, 7, 13, 0, 0, 709, 710, 7, 2, 0, 0, 710, 124, 1, 0, 0, 0, 711, 712, 7, 7, 0, 0, 712, 713, 7, 6, 0, 0, 713, 126, 1, 0, 0, 0, 714, 715, 5, 63, 0, 0, 715, 128, 1, 0, 0, 0, 716, 717, 7, 6, 0, 0, 717, 718, 7, 13, 0, 0, 718, 719, 7, 1, 0, 0, 719, 720, 7, 18, 0, 0, 720, 721, 7, 3, 0, 0, 721, 130, 1, 0, 0, 0, 722, 723, 5, 41, 0, 0, 723, 132, 1, 0, 0, 0, 724, 725, 7, 5, 0, 0, 725, 726, 7, 6, 0, 0, 726, 727, 7, 31, 0, 0, 727, 728, 7, 3, 0, 0, 728, 134, 1, 0, 0, 0, 729, 730, 5, 61, 0, 0, 730, 731, 5, 61, 0, 0, 731, 136, 1, 0, 0, 0, 732, 733, 5, 61, 0, 0, 733, 734, 5, 126, 0, 0, 734, 138, 1, 0, 0, 0, 735, 736, 5, 33, 0, 0, 736, 737, 5, 61, 0, 0, 737, 140, 1, 0, 0, 0, 738, 739, 5, 60, 0, 0, 739, 142, 1, 0, 0, 0, 740, 741, 5, 60, 0, 0, 741, 742, 5, 61, 0, 0, 742, 144, 1, 0, 0, 0, 743, 744, 5, 62, 0, 0, 744, 146, 1, 0, 0, 0, 745, 746, 5, 62, 0, 0, 746, 747, 5, 61, 0, 0, 747, 148, 1, 0, 0, 0, 748, 749, 5, 43, 0, 0, 749, 150, 1, 0, 0, 0, 750, 751, 5, 45, 0, 0, 751, 152, 1, 0, 0, 0, 752, 753, 5, 42, 0, 0, 753, 154, 1, 0, 0, 0, 754, 755, 5, 47, 0, 0, 755, 156, 1, 0, 0, 0, 756, 757, 5, 37, 0, 0, 757, 158, 1, 0, 0, 0, 758, 759, 5, 91, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 6, 74, 0, 0, 761, 762, 6, 74, 0, 0, 762, 160, 1, 0, 0, 0, 763, 764, 5, 93, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 6, 75, 12, 0, 766, 767, 6, 75, 12, 0, 767, 162, 1, 0, 0, 0, 768, 772, 3, 67, 28, 0, 769, 771, 3, 83, 36, 0, 770, 769, 1, 0, 0, 0, 771, 774, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 785, 1, 0, 0, 0, 774, 772, 1, 0, 0, 0, 775, 778, 3, 81, 35, 0, 776, 778, 3, 75, 32, 0, 777, 775, 1, 0, 0, 0, 777, 776, 1, 0, 0, 0, 778, 780, 1, 0, 0, 0, 779, 781, 3, 83, 36, 0, 780, 779, 1, 0, 0, 0, 781, 782, 1, 0, 0, 0, 782, 780, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 768, 1, 0, 0, 0, 784, 777, 1, 0, 0, 0, 785, 164, 1, 0, 0, 0, 786, 788, 3, 77, 33, 0, 787, 789, 3, 79, 34, 0, 788, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 788, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 3, 77, 33, 0, 793, 166, 1, 0, 0, 0, 794, 795, 3, 165, 77, 0, 795, 168, 1, 0, 0, 0, 796, 797, 3, 47, 18, 0, 797, 798, 1, 0, 0, 0, 798, 799, 6, 79, 8, 0, 799, 170, 1, 0, 0, 0, 800, 801, 3, 49, 19, 0, 801, 802, 1, 0, 0, 0, 802, 803, 6, 80, 8, 0, 803, 172, 1, 0, 0, 0, 804, 805, 3, 51, 20, 0, 805, 806, 1, 0, 0, 0, 806, 807, 6, 81, 8, 0, 807, 174, 1, 0, 0, 0, 808, 809, 3, 63, 26, 0, 809, 810, 1, 0, 0, 0, 810, 811, 6, 82, 11, 0, 811, 812, 6, 82, 12, 0, 812, 176, 1, 0, 0, 0, 813, 814, 3, 159, 74, 0, 814, 815, 1, 0, 0, 0, 815, 816, 6, 83, 9, 0, 816, 178, 1, 0, 0, 0, 817, 818, 3, 161, 75, 0, 818, 819, 1, 0, 0, 0, 819, 820, 6, 84, 13, 0, 820, 180, 1, 0, 0, 0, 821, 822, 3, 99, 44, 0, 822, 823, 1, 0, 0, 0, 823, 824, 6, 85, 14, 0, 824, 182, 1, 0, 0, 0, 825, 826, 3, 97, 43, 0, 826, 827, 1, 0, 0, 0, 827, 828, 6, 86, 15, 0, 828, 184, 1, 0, 0, 0, 829, 830, 7, 16, 0, 0, 830, 831, 7, 3, 0, 0, 831, 832, 7, 5, 0, 0, 832, 833, 7, 12, 0, 0, 833, 834, 7, 0, 0, 0, 834, 835, 7, 12, 0, 0, 835, 836, 7, 5, 0, 0, 836, 837, 7, 12, 0, 0, 837, 186, 1, 0, 0, 0, 838, 842, 8, 32, 0, 0, 839, 840, 5, 47, 0, 0, 840, 842, 8, 33, 0, 0, 841, 838, 1, 0, 0, 0, 841, 839, 1, 0, 0, 0, 842, 188, 1, 0, 0, 0, 843, 845, 3, 187, 88, 0, 844, 843, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 844, 1, 0, 0, 0, 846, 847, 1, 0, 0, 0, 847, 190, 1, 0, 0, 0, 848, 849, 3, 167, 78, 0, 849, 850, 1, 0, 0, 0, 850, 851, 6, 90, 16, 0, 851, 192, 1, 0, 0, 0, 852, 853, 3, 47, 18, 0, 853, 854, 1, 0, 0, 0, 854, 855, 6, 91, 8, 0, 855, 194, 1, 0, 0, 0, 856, 857, 3, 49, 19, 0, 857, 858, 1, 0, 0, 0, 858, 859, 6, 92, 8, 0, 859, 196, 1, 0, 0, 0, 860, 861, 3, 51, 20, 0, 861, 862, 1, 0, 0, 0, 862, 863, 6, 93, 8, 0, 863, 198, 1, 0, 0, 0, 864, 865, 3, 63, 26, 0, 865, 866, 1, 0, 0, 0, 866, 867, 6, 94, 11, 0, 867, 868, 6, 94, 12, 0, 868, 200, 1, 0, 0, 0, 869, 870, 3, 103, 46, 0, 870, 871, 1, 0, 0, 0, 871, 872, 6, 95, 17, 0, 872, 202, 1, 0, 0, 0, 873, 874, 3, 99, 44, 0, 874, 875, 1, 0, 0, 0, 875, 876, 6, 96, 14, 0, 876, 204, 1, 0, 0, 0, 877, 882, 3, 67, 28, 0, 878, 882, 3, 65, 27, 0, 879, 882, 3, 81, 35, 0, 880, 882, 3, 153, 71, 0, 881, 877, 1, 0, 0, 0, 881, 878, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 880, 1, 0, 0, 0, 882, 206, 1, 0, 0, 0, 883, 886, 3, 67, 28, 0, 884, 886, 3, 153, 71, 0, 885, 883, 1, 0, 0, 0, 885, 884, 1, 0, 0, 0, 886, 890, 1, 0, 0, 0, 887, 889, 3, 205, 97, 0, 888, 887, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 903, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 893, 896, 3, 81, 35, 0, 894, 896, 3, 75, 32, 0, 895, 893, 1, 0, 0, 0, 895, 894, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 205, 97, 0, 898, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 885, 1, 0, 0, 0, 902, 895, 1, 0, 0, 0, 903, 208, 1, 0, 0, 0, 904, 907, 3, 207, 98, 0, 905, 907, 3, 165, 77, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 210, 1, 0, 0, 0, 910, 911, 3, 47, 18, 0, 911, 912, 1, 0, 0, 0, 912, 913, 6, 100, 8, 0, 913, 212, 1, 0, 0, 0, 914, 915, 3, 49, 19, 0, 915, 916, 1, 0, 0, 0, 916, 917, 6, 101, 8, 0, 917, 214, 1, 0, 0, 0, 918, 919, 3, 51, 20, 0, 919, 920, 1, 0, 0, 0, 920, 921, 6, 102, 8, 0, 921, 216, 1, 0, 0, 0, 922, 923, 3, 63, 26, 0, 923, 924, 1, 0, 0, 0, 924, 925, 6, 103, 11, 0, 925, 926, 6, 103, 12, 0, 926, 218, 1, 0, 0, 0, 927, 928, 3, 97, 43, 0, 928, 929, 1, 0, 0, 0, 929, 930, 6, 104, 15, 0, 930, 220, 1, 0, 0, 0, 931, 932, 3, 99, 44, 0, 932, 933, 1, 0, 0, 0, 933, 934, 6, 105, 14, 0, 934, 222, 1, 0, 0, 0, 935, 936, 3, 103, 46, 0, 936, 937, 1, 0, 0, 0, 937, 938, 6, 106, 17, 0, 938, 224, 1, 0, 0, 0, 939, 940, 7, 12, 0, 0, 940, 941, 7, 2, 0, 0, 941, 226, 1, 0, 0, 0, 942, 943, 3, 209, 99, 0, 943, 944, 1, 0, 0, 0, 944, 945, 6, 108, 18, 0, 945, 228, 1, 0, 0, 0, 946, 947, 3, 47, 18, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 109, 8, 0, 949, 230, 1, 0, 0, 0, 950, 951, 3, 49, 19, 0, 951, 952, 1, 0, 0, 0, 952, 953, 6, 110, 8, 0, 953, 232, 1, 0, 0, 0, 954, 955, 3, 51, 20, 0, 955, 956, 1, 0, 0, 0, 956, 957, 6, 111, 8, 0, 957, 234, 1, 0, 0, 0, 958, 959, 3, 63, 26, 0, 959, 960, 1, 0, 0, 0, 960, 961, 6, 112, 11, 0, 961, 962, 6, 112, 12, 0, 962, 236, 1, 0, 0, 0, 963, 964, 3, 159, 74, 0, 964, 965, 1, 0, 0, 0, 965, 966, 6, 113, 9, 0, 966, 967, 6, 113, 19, 0, 967, 238, 1, 0, 0, 0, 968, 969, 7, 7, 0, 0, 969, 970, 7, 9, 0, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 114, 20, 0, 972, 240, 1, 0, 0, 0, 973, 974, 7, 19, 0, 0, 974, 975, 7, 1, 0, 0, 975, 976, 7, 5, 0, 0, 976, 977, 7, 10, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 6, 115, 20, 0, 979, 242, 1, 0, 0, 0, 980, 981, 8, 34, 0, 0, 981, 244, 1, 0, 0, 0, 982, 984, 3, 243, 116, 0, 983, 982, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 3, 305, 147, 0, 988, 990, 1, 0, 0, 0, 989, 983, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 993, 3, 243, 116, 0, 992, 991, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 992, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 246, 1, 0, 0, 0, 996, 997, 3, 167, 78, 0, 997, 998, 1, 0, 0, 0, 998, 999, 6, 118, 16, 0, 999, 248, 1, 0, 0, 0, 1000, 1001, 3, 245, 117, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1003, 6, 119, 21, 0, 1003, 250, 1, 0, 0, 0, 1004, 1005, 3, 47, 18, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 6, 120, 8, 0, 1007, 252, 1, 0, 0, 0, 1008, 1009, 3, 49, 19, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 6, 121, 8, 0, 1011, 254, 1, 0, 0, 0, 1012, 1013, 3, 51, 20, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 6, 122, 8, 0, 1015, 256, 1, 0, 0, 0, 1016, 1017, 3, 63, 26, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 6, 123, 11, 0, 1019, 1020, 6, 123, 12, 0, 1020, 1021, 6, 123, 12, 0, 1021, 258, 1, 0, 0, 0, 1022, 1023, 3, 97, 43, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 6, 124, 15, 0, 1025, 260, 1, 0, 0, 0, 1026, 1027, 3, 99, 44, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 6, 125, 14, 0, 1029, 262, 1, 0, 0, 0, 1030, 1031, 3, 103, 46, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 6, 126, 17, 0, 1033, 264, 1, 0, 0, 0, 1034, 1035, 3, 241, 115, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 6, 127, 22, 0, 1037, 266, 1, 0, 0, 0, 1038, 1039, 3, 209, 99, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1041, 6, 128, 18, 0, 1041, 268, 1, 0, 0, 0, 1042, 1043, 3, 167, 78, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 6, 129, 16, 0, 1045, 270, 1, 0, 0, 0, 1046, 1047, 3, 47, 18, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1049, 6, 130, 8, 0, 1049, 272, 1, 0, 0, 0, 1050, 1051, 3, 49, 19, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1053, 6, 131, 8, 0, 1053, 274, 1, 0, 0, 0, 1054, 1055, 3, 51, 20, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 6, 132, 8, 0, 1057, 276, 1, 0, 0, 0, 1058, 1059, 3, 63, 26, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1061, 6, 133, 11, 0, 1061, 1062, 6, 133, 12, 0, 1062, 278, 1, 0, 0, 0, 1063, 1064, 3, 103, 46, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 6, 134, 17, 0, 1066, 280, 1, 0, 0, 0, 1067, 1068, 3, 167, 78, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1070, 6, 135, 16, 0, 1070, 282, 1, 0, 0, 0, 1071, 1072, 3, 163, 76, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 6, 136, 23, 0, 1074, 284, 1, 0, 0, 0, 1075, 1076, 3, 47, 18, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1078, 6, 137, 8, 0, 1078, 286, 1, 0, 0, 0, 1079, 1080, 3, 49, 19, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 6, 138, 8, 0, 1082, 288, 1, 0, 0, 0, 1083, 1084, 3, 51, 20, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1086, 6, 139, 8, 0, 1086, 290, 1, 0, 0, 0, 1087, 1088, 3, 63, 26, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 6, 140, 11, 0, 1090, 1091, 6, 140, 12, 0, 1091, 292, 1, 0, 0, 0, 1092, 1093, 7, 1, 0, 0, 1093, 1094, 7, 9, 0, 0, 1094, 1095, 7, 15, 0, 0, 1095, 1096, 7, 7, 0, 0, 1096, 294, 1, 0, 0, 0, 1097, 1098, 7, 15, 0, 0, 1098, 1099, 7, 31, 0, 0, 1099, 1100, 7, 9, 0, 0, 1100, 1101, 7, 4, 0, 0, 1101, 1102, 7, 5, 0, 0, 1102, 1103, 7, 1, 0, 0, 1103, 1104, 7, 7, 0, 0, 1104, 1105, 7, 9, 0, 0, 1105, 1106, 7, 2, 0, 0, 1106, 296, 1, 0, 0, 0, 1107, 1108, 3, 47, 18, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 6, 143, 8, 0, 1110, 298, 1, 0, 0, 0, 1111, 1112, 3, 49, 19, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 144, 8, 0, 1114, 300, 1, 0, 0, 0, 1115, 1116, 3, 51, 20, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 6, 145, 8, 0, 1118, 302, 1, 0, 0, 0, 1119, 1120, 3, 161, 75, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1122, 6, 146, 13, 0, 1122, 1123, 6, 146, 12, 0, 1123, 304, 1, 0, 0, 0, 1124, 1125, 5, 58, 0, 0, 1125, 306, 1, 0, 0, 0, 1126, 1132, 3, 75, 32, 0, 1127, 1132, 3, 65, 27, 0, 1128, 1132, 3, 103, 46, 0, 1129, 1132, 3, 67, 28, 0, 1130, 1132, 3, 81, 35, 0, 1131, 1126, 1, 0, 0, 0, 1131, 1127, 1, 0, 0, 0, 1131, 1128, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 308, 1, 0, 0, 0, 1135, 1136, 3, 47, 18, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 6, 149, 8, 0, 1138, 310, 1, 0, 0, 0, 1139, 1140, 3, 49, 19, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 6, 150, 8, 0, 1142, 312, 1, 0, 0, 0, 1143, 1144, 3, 51, 20, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 6, 151, 8, 0, 1146, 314, 1, 0, 0, 0, 57, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 461, 471, 475, 478, 487, 489, 500, 541, 546, 555, 562, 567, 569, 580, 588, 591, 593, 598, 603, 609, 616, 621, 627, 630, 638, 642, 772, 777, 782, 784, 790, 841, 846, 881, 885, 890, 895, 900, 902, 906, 908, 985, 989, 994, 1131, 1133, 24, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 5, 0, 5, 9, 0, 0, 1, 0, 7, 63, 0, 5, 0, 0, 7, 25, 0, 4, 0, 0, 7, 64, 0, 7, 33, 0, 7, 32, 0, 7, 66, 0, 7, 35, 0, 7, 75, 0, 5, 10, 0, 5, 7, 0, 7, 85, 0, 7, 84, 0, 7, 65, 0] \ No newline at end of file diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens index 57099c6b4681a..4bf3584737d1d 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.tokens @@ -102,13 +102,46 @@ SETTING=101 SETTING_LINE_COMMENT=102 SETTTING_MULTILINE_COMMENT=103 SETTING_WS=104 +'dissect'=1 +'drop'=2 +'enrich'=3 +'eval'=4 +'explain'=5 +'from'=6 +'grok'=7 +'inlinestats'=8 +'keep'=9 +'limit'=10 +'mv_expand'=11 +'rename'=12 +'row'=13 +'show'=14 +'sort'=15 +'stats'=16 +'where'=17 '|'=25 +'by'=29 +'and'=30 +'asc'=31 '='=32 ','=33 +'desc'=34 '.'=35 +'false'=36 +'first'=37 +'last'=38 '('=39 +'in'=40 +'is'=41 +'like'=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 '?'=47 +'rlike'=48 ')'=49 +'true'=50 '=='=51 '=~'=52 '!='=53 @@ -122,4 +155,10 @@ SETTING_WS=104 '/'=61 '%'=62 ']'=64 +'metadata'=70 +'as'=79 +'on'=83 +'with'=84 +'info'=95 +'functions'=96 ':'=100 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts index f123cf25d7421..937865a6c23cf 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_lexer.ts @@ -130,57 +130,58 @@ export default class esql_lexer extends Lexer { public static readonly SETTING_MODE = 10; public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; - public static readonly literalNames: (string | null)[] = [ null, null, + public static readonly literalNames: (string | null)[] = [ null, "'dissect'", + "'drop'", "'enrich'", + "'eval'", "'explain'", + "'from'", "'grok'", + "'inlinestats'", + "'keep'", "'limit'", + "'mv_expand'", + "'rename'", + "'row'", "'show'", + "'sort'", "'stats'", + "'where'", null, null, null, null, null, null, null, + "'|'", null, null, null, + "'by'", "'and'", + "'asc'", "'='", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, "']'", null, null, null, null, + null, "'metadata'", null, null, null, null, null, null, null, null, + "'as'", null, null, null, - null, "'|'", + "'on'", "'with'", null, null, null, null, null, null, - "'='", "','", - null, "'.'", null, null, - null, "'('", null, null, + "'info'", "'functions'", null, null, - null, null, - null, "'?'", - null, "')'", - null, "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - "']'", null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - "':'" ]; + null, "':'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", @@ -292,9 +293,7 @@ export default class esql_lexer extends Lexer { "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", "SHOW_PIPE", "INFO", "FUNCTIONS", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", "SETTING_CLOSING_BRACKET", "COLON", - "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", "SETTING_WS", - "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", - "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "SETTING", "SETTING_LINE_COMMENT", "SETTTING_MULTILINE_COMMENT", "SETTING_WS", ]; @@ -315,7 +314,7 @@ export default class esql_lexer extends Lexer { public get modeNames(): string[] { return esql_lexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,104,1251,6,-1,6, + public static readonly _serializedATN: number[] = [4,0,104,1147,6,-1,6, -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2, 2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11, 7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7, @@ -338,409 +337,369 @@ export default class esql_lexer extends Lexer { 128,2,129,7,129,2,130,7,130,2,131,7,131,2,132,7,132,2,133,7,133,2,134,7, 134,2,135,7,135,2,136,7,136,2,137,7,137,2,138,7,138,2,139,7,139,2,140,7, 140,2,141,7,141,2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146,7, - 146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,2,152,7, - 152,2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,2,158,7, - 158,2,159,7,159,2,160,7,160,2,161,7,161,2,162,7,162,2,163,7,163,2,164,7, - 164,2,165,7,165,2,166,7,166,2,167,7,167,2,168,7,168,2,169,7,169,2,170,7, - 170,2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174,2,175,7,175,2,176,7, - 176,2,177,7,177,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13, - 1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1, - 15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17, - 4,17,512,8,17,11,17,12,17,513,1,17,1,17,1,18,1,18,1,18,1,18,5,18,522,8, - 18,10,18,12,18,525,9,18,1,18,3,18,528,8,18,1,18,3,18,531,8,18,1,18,1,18, - 1,19,1,19,1,19,1,19,1,19,5,19,540,8,19,10,19,12,19,543,9,19,1,19,1,19,1, - 19,1,19,1,19,1,20,4,20,551,8,20,11,20,12,20,552,1,20,1,20,1,21,1,21,1,21, - 1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1, - 24,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29, - 1,29,1,30,1,30,1,31,1,31,3,31,594,8,31,1,31,4,31,597,8,31,11,31,12,31,598, - 1,32,1,32,1,33,1,33,1,34,1,34,1,34,3,34,608,8,34,1,35,1,35,1,36,1,36,1, - 36,3,36,615,8,36,1,37,1,37,1,37,5,37,620,8,37,10,37,12,37,623,9,37,1,37, - 1,37,1,37,1,37,1,37,1,37,5,37,631,8,37,10,37,12,37,634,9,37,1,37,1,37,1, - 37,1,37,1,37,3,37,641,8,37,1,37,3,37,644,8,37,3,37,646,8,37,1,38,4,38,649, - 8,38,11,38,12,38,650,1,39,4,39,654,8,39,11,39,12,39,655,1,39,1,39,5,39, - 660,8,39,10,39,12,39,663,9,39,1,39,1,39,4,39,667,8,39,11,39,12,39,668,1, - 39,4,39,672,8,39,11,39,12,39,673,1,39,1,39,5,39,678,8,39,10,39,12,39,681, - 9,39,3,39,683,8,39,1,39,1,39,1,39,1,39,4,39,689,8,39,11,39,12,39,690,1, - 39,1,39,3,39,695,8,39,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42, - 1,42,1,43,1,43,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,1, - 47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49, - 1,50,1,50,1,51,1,51,1,51,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,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57, - 1,57,1,57,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,61,1,61,1, - 61,1,61,1,61,1,62,1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,66, - 1,66,1,66,1,67,1,67,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1, - 72,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,1,76, - 5,76,823,8,76,10,76,12,76,826,9,76,1,76,1,76,3,76,830,8,76,1,76,4,76,833, - 8,76,11,76,12,76,834,3,76,837,8,76,1,77,1,77,4,77,841,8,77,11,77,12,77, - 842,1,77,1,77,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1, - 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,84,1,84,1,84, - 1,84,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1, - 87,1,87,1,87,1,87,1,88,1,88,1,88,3,88,894,8,88,1,89,4,89,897,8,89,11,89, - 12,89,898,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1, - 93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96, - 1,96,1,96,1,97,1,97,1,97,1,97,3,97,934,8,97,1,98,1,98,3,98,938,8,98,1,98, - 5,98,941,8,98,10,98,12,98,944,9,98,1,98,1,98,3,98,948,8,98,1,98,4,98,951, - 8,98,11,98,12,98,952,3,98,955,8,98,1,99,1,99,4,99,959,8,99,11,99,12,99, - 960,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1, - 102,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1, - 105,1,105,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,108,1,108,1,108,1, - 108,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1, - 111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,114,1, - 114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1, - 116,1,117,4,117,1036,8,117,11,117,12,117,1037,1,117,1,117,3,117,1042,8, - 117,1,117,4,117,1045,8,117,11,117,12,117,1046,1,118,1,118,1,118,1,118,1, - 119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1, - 122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1, - 124,1,124,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126,1,127,1,127,1, - 127,1,127,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,130,1,130,1, - 130,1,130,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1, - 133,1,133,1,133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1, - 136,1,136,1,136,1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1, - 139,1,139,1,139,1,140,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1, - 141,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,142,1,143,1, - 143,1,143,1,143,1,144,1,144,1,144,1,144,1,145,1,145,1,145,1,145,1,146,1, - 146,1,146,1,146,1,146,1,147,1,147,1,148,1,148,1,148,1,148,1,148,4,148,1184, - 8,148,11,148,12,148,1185,1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150, - 1,151,1,151,1,151,1,151,1,152,1,152,1,153,1,153,1,154,1,154,1,155,1,155, - 1,156,1,156,1,157,1,157,1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161, - 1,162,1,162,1,163,1,163,1,164,1,164,1,165,1,165,1,166,1,166,1,167,1,167, - 1,168,1,168,1,169,1,169,1,170,1,170,1,171,1,171,1,172,1,172,1,173,1,173, - 1,174,1,174,1,175,1,175,1,176,1,176,1,177,1,177,2,541,632,0,178,11,1,13, - 2,15,3,17,4,19,5,21,6,23,7,25,8,27,9,29,10,31,11,33,12,35,13,37,14,39,15, - 41,16,43,17,45,18,47,19,49,20,51,21,53,0,55,0,57,22,59,23,61,24,63,25,65, - 0,67,0,69,0,71,0,73,0,75,0,77,0,79,0,81,0,83,0,85,26,87,27,89,28,91,29, - 93,30,95,31,97,32,99,33,101,34,103,35,105,36,107,37,109,38,111,39,113,40, - 115,41,117,42,119,43,121,44,123,45,125,46,127,47,129,48,131,49,133,50,135, - 51,137,52,139,53,141,54,143,55,145,56,147,57,149,58,151,59,153,60,155,61, - 157,62,159,63,161,64,163,65,165,0,167,66,169,67,171,68,173,69,175,0,177, - 0,179,0,181,0,183,0,185,70,187,0,189,71,191,0,193,72,195,73,197,74,199, - 0,201,0,203,0,205,0,207,0,209,75,211,76,213,77,215,78,217,0,219,0,221,0, - 223,0,225,79,227,0,229,80,231,81,233,82,235,0,237,0,239,83,241,84,243,0, - 245,85,247,0,249,0,251,86,253,87,255,88,257,0,259,0,261,0,263,0,265,0,267, - 0,269,0,271,89,273,90,275,91,277,0,279,0,281,0,283,0,285,92,287,93,289, - 94,291,0,293,95,295,96,297,97,299,98,301,99,303,0,305,100,307,101,309,102, - 311,103,313,104,315,0,317,0,319,0,321,0,323,0,325,0,327,0,329,0,331,0,333, - 0,335,0,337,0,339,0,341,0,343,0,345,0,347,0,349,0,351,0,353,0,355,0,357, - 0,359,0,361,0,363,0,365,0,11,0,1,2,3,4,5,6,7,8,9,10,38,6,0,9,10,13,13,32, - 32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1,0,48,57,2,0, - 65,90,97,122,5,0,34,34,92,92,110,110,114,114,116,116,4,0,10,10,13,13,34, - 34,92,92,2,0,69,69,101,101,2,0,43,43,45,45,1,0,96,96,10,0,9,10,13,13,32, - 32,44,44,47,47,61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47,11,0,9,10, - 13,13,32,32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124,2,0,65,65, - 97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100,100,2,0,70,70,102,102, - 2,0,71,71,103,103,2,0,72,72,104,104,2,0,73,73,105,105,2,0,74,74,106,106, - 2,0,75,75,107,107,2,0,76,76,108,108,2,0,77,77,109,109,2,0,78,78,110,110, - 2,0,79,79,111,111,2,0,80,80,112,112,2,0,81,81,113,113,2,0,82,82,114,114, - 2,0,83,83,115,115,2,0,84,84,116,116,2,0,85,85,117,117,2,0,86,86,118,118, - 2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121,2,0,90,90,122,122, - 1253,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,1,53,1,0, - 0,0,1,55,1,0,0,0,1,57,1,0,0,0,1,59,1,0,0,0,1,61,1,0,0,0,2,63,1,0,0,0,2, - 85,1,0,0,0,2,87,1,0,0,0,2,89,1,0,0,0,2,91,1,0,0,0,2,93,1,0,0,0,2,95,1,0, - 0,0,2,97,1,0,0,0,2,99,1,0,0,0,2,101,1,0,0,0,2,103,1,0,0,0,2,105,1,0,0,0, - 2,107,1,0,0,0,2,109,1,0,0,0,2,111,1,0,0,0,2,113,1,0,0,0,2,115,1,0,0,0,2, - 117,1,0,0,0,2,119,1,0,0,0,2,121,1,0,0,0,2,123,1,0,0,0,2,125,1,0,0,0,2,127, - 1,0,0,0,2,129,1,0,0,0,2,131,1,0,0,0,2,133,1,0,0,0,2,135,1,0,0,0,2,137,1, - 0,0,0,2,139,1,0,0,0,2,141,1,0,0,0,2,143,1,0,0,0,2,145,1,0,0,0,2,147,1,0, - 0,0,2,149,1,0,0,0,2,151,1,0,0,0,2,153,1,0,0,0,2,155,1,0,0,0,2,157,1,0,0, - 0,2,159,1,0,0,0,2,161,1,0,0,0,2,163,1,0,0,0,2,167,1,0,0,0,2,169,1,0,0,0, - 2,171,1,0,0,0,2,173,1,0,0,0,3,175,1,0,0,0,3,177,1,0,0,0,3,179,1,0,0,0,3, - 181,1,0,0,0,3,183,1,0,0,0,3,185,1,0,0,0,3,189,1,0,0,0,3,191,1,0,0,0,3,193, - 1,0,0,0,3,195,1,0,0,0,3,197,1,0,0,0,4,199,1,0,0,0,4,201,1,0,0,0,4,203,1, - 0,0,0,4,209,1,0,0,0,4,211,1,0,0,0,4,213,1,0,0,0,4,215,1,0,0,0,5,217,1,0, - 0,0,5,219,1,0,0,0,5,221,1,0,0,0,5,223,1,0,0,0,5,225,1,0,0,0,5,227,1,0,0, - 0,5,229,1,0,0,0,5,231,1,0,0,0,5,233,1,0,0,0,6,235,1,0,0,0,6,237,1,0,0,0, - 6,239,1,0,0,0,6,241,1,0,0,0,6,245,1,0,0,0,6,247,1,0,0,0,6,249,1,0,0,0,6, - 251,1,0,0,0,6,253,1,0,0,0,6,255,1,0,0,0,7,257,1,0,0,0,7,259,1,0,0,0,7,261, - 1,0,0,0,7,263,1,0,0,0,7,265,1,0,0,0,7,267,1,0,0,0,7,269,1,0,0,0,7,271,1, - 0,0,0,7,273,1,0,0,0,7,275,1,0,0,0,8,277,1,0,0,0,8,279,1,0,0,0,8,281,1,0, - 0,0,8,283,1,0,0,0,8,285,1,0,0,0,8,287,1,0,0,0,8,289,1,0,0,0,9,291,1,0,0, - 0,9,293,1,0,0,0,9,295,1,0,0,0,9,297,1,0,0,0,9,299,1,0,0,0,9,301,1,0,0,0, - 10,303,1,0,0,0,10,305,1,0,0,0,10,307,1,0,0,0,10,309,1,0,0,0,10,311,1,0, - 0,0,10,313,1,0,0,0,11,367,1,0,0,0,13,377,1,0,0,0,15,384,1,0,0,0,17,393, - 1,0,0,0,19,400,1,0,0,0,21,410,1,0,0,0,23,417,1,0,0,0,25,424,1,0,0,0,27, - 438,1,0,0,0,29,445,1,0,0,0,31,453,1,0,0,0,33,465,1,0,0,0,35,474,1,0,0,0, - 37,480,1,0,0,0,39,487,1,0,0,0,41,494,1,0,0,0,43,502,1,0,0,0,45,511,1,0, - 0,0,47,517,1,0,0,0,49,534,1,0,0,0,51,550,1,0,0,0,53,556,1,0,0,0,55,561, - 1,0,0,0,57,566,1,0,0,0,59,570,1,0,0,0,61,574,1,0,0,0,63,578,1,0,0,0,65, - 582,1,0,0,0,67,584,1,0,0,0,69,586,1,0,0,0,71,589,1,0,0,0,73,591,1,0,0,0, - 75,600,1,0,0,0,77,602,1,0,0,0,79,607,1,0,0,0,81,609,1,0,0,0,83,614,1,0, - 0,0,85,645,1,0,0,0,87,648,1,0,0,0,89,694,1,0,0,0,91,696,1,0,0,0,93,699, - 1,0,0,0,95,703,1,0,0,0,97,707,1,0,0,0,99,709,1,0,0,0,101,711,1,0,0,0,103, - 716,1,0,0,0,105,718,1,0,0,0,107,724,1,0,0,0,109,730,1,0,0,0,111,735,1,0, - 0,0,113,737,1,0,0,0,115,740,1,0,0,0,117,743,1,0,0,0,119,748,1,0,0,0,121, - 752,1,0,0,0,123,757,1,0,0,0,125,763,1,0,0,0,127,766,1,0,0,0,129,768,1,0, - 0,0,131,774,1,0,0,0,133,776,1,0,0,0,135,781,1,0,0,0,137,784,1,0,0,0,139, - 787,1,0,0,0,141,790,1,0,0,0,143,792,1,0,0,0,145,795,1,0,0,0,147,797,1,0, - 0,0,149,800,1,0,0,0,151,802,1,0,0,0,153,804,1,0,0,0,155,806,1,0,0,0,157, - 808,1,0,0,0,159,810,1,0,0,0,161,815,1,0,0,0,163,836,1,0,0,0,165,838,1,0, - 0,0,167,846,1,0,0,0,169,848,1,0,0,0,171,852,1,0,0,0,173,856,1,0,0,0,175, - 860,1,0,0,0,177,865,1,0,0,0,179,869,1,0,0,0,181,873,1,0,0,0,183,877,1,0, - 0,0,185,881,1,0,0,0,187,893,1,0,0,0,189,896,1,0,0,0,191,900,1,0,0,0,193, - 904,1,0,0,0,195,908,1,0,0,0,197,912,1,0,0,0,199,916,1,0,0,0,201,921,1,0, - 0,0,203,925,1,0,0,0,205,933,1,0,0,0,207,954,1,0,0,0,209,958,1,0,0,0,211, - 962,1,0,0,0,213,966,1,0,0,0,215,970,1,0,0,0,217,974,1,0,0,0,219,979,1,0, - 0,0,221,983,1,0,0,0,223,987,1,0,0,0,225,991,1,0,0,0,227,994,1,0,0,0,229, - 998,1,0,0,0,231,1002,1,0,0,0,233,1006,1,0,0,0,235,1010,1,0,0,0,237,1015, - 1,0,0,0,239,1020,1,0,0,0,241,1025,1,0,0,0,243,1032,1,0,0,0,245,1041,1,0, - 0,0,247,1048,1,0,0,0,249,1052,1,0,0,0,251,1056,1,0,0,0,253,1060,1,0,0,0, - 255,1064,1,0,0,0,257,1068,1,0,0,0,259,1074,1,0,0,0,261,1078,1,0,0,0,263, - 1082,1,0,0,0,265,1086,1,0,0,0,267,1090,1,0,0,0,269,1094,1,0,0,0,271,1098, - 1,0,0,0,273,1102,1,0,0,0,275,1106,1,0,0,0,277,1110,1,0,0,0,279,1115,1,0, - 0,0,281,1119,1,0,0,0,283,1123,1,0,0,0,285,1127,1,0,0,0,287,1131,1,0,0,0, - 289,1135,1,0,0,0,291,1139,1,0,0,0,293,1144,1,0,0,0,295,1149,1,0,0,0,297, - 1159,1,0,0,0,299,1163,1,0,0,0,301,1167,1,0,0,0,303,1171,1,0,0,0,305,1176, - 1,0,0,0,307,1183,1,0,0,0,309,1187,1,0,0,0,311,1191,1,0,0,0,313,1195,1,0, - 0,0,315,1199,1,0,0,0,317,1201,1,0,0,0,319,1203,1,0,0,0,321,1205,1,0,0,0, - 323,1207,1,0,0,0,325,1209,1,0,0,0,327,1211,1,0,0,0,329,1213,1,0,0,0,331, - 1215,1,0,0,0,333,1217,1,0,0,0,335,1219,1,0,0,0,337,1221,1,0,0,0,339,1223, - 1,0,0,0,341,1225,1,0,0,0,343,1227,1,0,0,0,345,1229,1,0,0,0,347,1231,1,0, - 0,0,349,1233,1,0,0,0,351,1235,1,0,0,0,353,1237,1,0,0,0,355,1239,1,0,0,0, - 357,1241,1,0,0,0,359,1243,1,0,0,0,361,1245,1,0,0,0,363,1247,1,0,0,0,365, - 1249,1,0,0,0,367,368,3,321,155,0,368,369,3,331,160,0,369,370,3,351,170, - 0,370,371,3,351,170,0,371,372,3,323,156,0,372,373,3,319,154,0,373,374,3, - 353,171,0,374,375,1,0,0,0,375,376,6,0,0,0,376,12,1,0,0,0,377,378,3,321, - 155,0,378,379,3,349,169,0,379,380,3,343,166,0,380,381,3,345,167,0,381,382, - 1,0,0,0,382,383,6,1,1,0,383,14,1,0,0,0,384,385,3,323,156,0,385,386,3,341, - 165,0,386,387,3,349,169,0,387,388,3,331,160,0,388,389,3,319,154,0,389,390, - 3,329,159,0,390,391,1,0,0,0,391,392,6,2,2,0,392,16,1,0,0,0,393,394,3,323, - 156,0,394,395,3,357,173,0,395,396,3,315,152,0,396,397,3,337,163,0,397,398, - 1,0,0,0,398,399,6,3,0,0,399,18,1,0,0,0,400,401,3,323,156,0,401,402,3,361, - 175,0,402,403,3,345,167,0,403,404,3,337,163,0,404,405,3,315,152,0,405,406, - 3,331,160,0,406,407,3,341,165,0,407,408,1,0,0,0,408,409,6,4,3,0,409,20, - 1,0,0,0,410,411,3,325,157,0,411,412,3,349,169,0,412,413,3,343,166,0,413, - 414,3,339,164,0,414,415,1,0,0,0,415,416,6,5,4,0,416,22,1,0,0,0,417,418, - 3,327,158,0,418,419,3,349,169,0,419,420,3,343,166,0,420,421,3,335,162,0, - 421,422,1,0,0,0,422,423,6,6,0,0,423,24,1,0,0,0,424,425,3,331,160,0,425, - 426,3,341,165,0,426,427,3,337,163,0,427,428,3,331,160,0,428,429,3,341,165, - 0,429,430,3,323,156,0,430,431,3,351,170,0,431,432,3,353,171,0,432,433,3, - 315,152,0,433,434,3,353,171,0,434,435,3,351,170,0,435,436,1,0,0,0,436,437, - 6,7,0,0,437,26,1,0,0,0,438,439,3,335,162,0,439,440,3,323,156,0,440,441, - 3,323,156,0,441,442,3,345,167,0,442,443,1,0,0,0,443,444,6,8,1,0,444,28, - 1,0,0,0,445,446,3,337,163,0,446,447,3,331,160,0,447,448,3,339,164,0,448, - 449,3,331,160,0,449,450,3,353,171,0,450,451,1,0,0,0,451,452,6,9,0,0,452, - 30,1,0,0,0,453,454,3,339,164,0,454,455,3,357,173,0,455,456,3,81,35,0,456, - 457,3,323,156,0,457,458,3,361,175,0,458,459,3,345,167,0,459,460,3,315,152, - 0,460,461,3,341,165,0,461,462,3,321,155,0,462,463,1,0,0,0,463,464,6,10, - 5,0,464,32,1,0,0,0,465,466,3,349,169,0,466,467,3,323,156,0,467,468,3,341, - 165,0,468,469,3,315,152,0,469,470,3,339,164,0,470,471,3,323,156,0,471,472, - 1,0,0,0,472,473,6,11,6,0,473,34,1,0,0,0,474,475,3,349,169,0,475,476,3,343, - 166,0,476,477,3,359,174,0,477,478,1,0,0,0,478,479,6,12,0,0,479,36,1,0,0, - 0,480,481,3,351,170,0,481,482,3,329,159,0,482,483,3,343,166,0,483,484,3, - 359,174,0,484,485,1,0,0,0,485,486,6,13,7,0,486,38,1,0,0,0,487,488,3,351, - 170,0,488,489,3,343,166,0,489,490,3,349,169,0,490,491,3,353,171,0,491,492, - 1,0,0,0,492,493,6,14,0,0,493,40,1,0,0,0,494,495,3,351,170,0,495,496,3,353, - 171,0,496,497,3,315,152,0,497,498,3,353,171,0,498,499,3,351,170,0,499,500, - 1,0,0,0,500,501,6,15,0,0,501,42,1,0,0,0,502,503,3,359,174,0,503,504,3,329, - 159,0,504,505,3,323,156,0,505,506,3,349,169,0,506,507,3,323,156,0,507,508, - 1,0,0,0,508,509,6,16,0,0,509,44,1,0,0,0,510,512,8,0,0,0,511,510,1,0,0,0, - 512,513,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0,514,515,1,0,0,0,515,516, - 6,17,0,0,516,46,1,0,0,0,517,518,5,47,0,0,518,519,5,47,0,0,519,523,1,0,0, - 0,520,522,8,1,0,0,521,520,1,0,0,0,522,525,1,0,0,0,523,521,1,0,0,0,523,524, - 1,0,0,0,524,527,1,0,0,0,525,523,1,0,0,0,526,528,5,13,0,0,527,526,1,0,0, - 0,527,528,1,0,0,0,528,530,1,0,0,0,529,531,5,10,0,0,530,529,1,0,0,0,530, - 531,1,0,0,0,531,532,1,0,0,0,532,533,6,18,8,0,533,48,1,0,0,0,534,535,5,47, - 0,0,535,536,5,42,0,0,536,541,1,0,0,0,537,540,3,49,19,0,538,540,9,0,0,0, - 539,537,1,0,0,0,539,538,1,0,0,0,540,543,1,0,0,0,541,542,1,0,0,0,541,539, - 1,0,0,0,542,544,1,0,0,0,543,541,1,0,0,0,544,545,5,42,0,0,545,546,5,47,0, - 0,546,547,1,0,0,0,547,548,6,19,8,0,548,50,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,554,1,0,0,0, - 554,555,6,20,8,0,555,52,1,0,0,0,556,557,3,159,74,0,557,558,1,0,0,0,558, - 559,6,21,9,0,559,560,6,21,10,0,560,54,1,0,0,0,561,562,3,63,26,0,562,563, - 1,0,0,0,563,564,6,22,11,0,564,565,6,22,12,0,565,56,1,0,0,0,566,567,3,51, - 20,0,567,568,1,0,0,0,568,569,6,23,8,0,569,58,1,0,0,0,570,571,3,47,18,0, - 571,572,1,0,0,0,572,573,6,24,8,0,573,60,1,0,0,0,574,575,3,49,19,0,575,576, - 1,0,0,0,576,577,6,25,8,0,577,62,1,0,0,0,578,579,5,124,0,0,579,580,1,0,0, - 0,580,581,6,26,12,0,581,64,1,0,0,0,582,583,7,3,0,0,583,66,1,0,0,0,584,585, - 7,4,0,0,585,68,1,0,0,0,586,587,5,92,0,0,587,588,7,5,0,0,588,70,1,0,0,0, - 589,590,8,6,0,0,590,72,1,0,0,0,591,593,7,7,0,0,592,594,7,8,0,0,593,592, - 1,0,0,0,593,594,1,0,0,0,594,596,1,0,0,0,595,597,3,65,27,0,596,595,1,0,0, - 0,597,598,1,0,0,0,598,596,1,0,0,0,598,599,1,0,0,0,599,74,1,0,0,0,600,601, - 5,64,0,0,601,76,1,0,0,0,602,603,5,96,0,0,603,78,1,0,0,0,604,608,8,9,0,0, - 605,606,5,96,0,0,606,608,5,96,0,0,607,604,1,0,0,0,607,605,1,0,0,0,608,80, - 1,0,0,0,609,610,5,95,0,0,610,82,1,0,0,0,611,615,3,67,28,0,612,615,3,65, - 27,0,613,615,3,81,35,0,614,611,1,0,0,0,614,612,1,0,0,0,614,613,1,0,0,0, - 615,84,1,0,0,0,616,621,5,34,0,0,617,620,3,69,29,0,618,620,3,71,30,0,619, - 617,1,0,0,0,619,618,1,0,0,0,620,623,1,0,0,0,621,619,1,0,0,0,621,622,1,0, - 0,0,622,624,1,0,0,0,623,621,1,0,0,0,624,646,5,34,0,0,625,626,5,34,0,0,626, - 627,5,34,0,0,627,628,5,34,0,0,628,632,1,0,0,0,629,631,8,1,0,0,630,629,1, - 0,0,0,631,634,1,0,0,0,632,633,1,0,0,0,632,630,1,0,0,0,633,635,1,0,0,0,634, - 632,1,0,0,0,635,636,5,34,0,0,636,637,5,34,0,0,637,638,5,34,0,0,638,640, - 1,0,0,0,639,641,5,34,0,0,640,639,1,0,0,0,640,641,1,0,0,0,641,643,1,0,0, - 0,642,644,5,34,0,0,643,642,1,0,0,0,643,644,1,0,0,0,644,646,1,0,0,0,645, - 616,1,0,0,0,645,625,1,0,0,0,646,86,1,0,0,0,647,649,3,65,27,0,648,647,1, - 0,0,0,649,650,1,0,0,0,650,648,1,0,0,0,650,651,1,0,0,0,651,88,1,0,0,0,652, - 654,3,65,27,0,653,652,1,0,0,0,654,655,1,0,0,0,655,653,1,0,0,0,655,656,1, - 0,0,0,656,657,1,0,0,0,657,661,3,103,46,0,658,660,3,65,27,0,659,658,1,0, - 0,0,660,663,1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,695,1,0,0,0,663, - 661,1,0,0,0,664,666,3,103,46,0,665,667,3,65,27,0,666,665,1,0,0,0,667,668, - 1,0,0,0,668,666,1,0,0,0,668,669,1,0,0,0,669,695,1,0,0,0,670,672,3,65,27, - 0,671,670,1,0,0,0,672,673,1,0,0,0,673,671,1,0,0,0,673,674,1,0,0,0,674,682, - 1,0,0,0,675,679,3,103,46,0,676,678,3,65,27,0,677,676,1,0,0,0,678,681,1, - 0,0,0,679,677,1,0,0,0,679,680,1,0,0,0,680,683,1,0,0,0,681,679,1,0,0,0,682, - 675,1,0,0,0,682,683,1,0,0,0,683,684,1,0,0,0,684,685,3,73,31,0,685,695,1, - 0,0,0,686,688,3,103,46,0,687,689,3,65,27,0,688,687,1,0,0,0,689,690,1,0, - 0,0,690,688,1,0,0,0,690,691,1,0,0,0,691,692,1,0,0,0,692,693,3,73,31,0,693, - 695,1,0,0,0,694,653,1,0,0,0,694,664,1,0,0,0,694,671,1,0,0,0,694,686,1,0, - 0,0,695,90,1,0,0,0,696,697,3,317,153,0,697,698,3,363,176,0,698,92,1,0,0, - 0,699,700,3,315,152,0,700,701,3,341,165,0,701,702,3,321,155,0,702,94,1, - 0,0,0,703,704,3,315,152,0,704,705,3,351,170,0,705,706,3,319,154,0,706,96, - 1,0,0,0,707,708,5,61,0,0,708,98,1,0,0,0,709,710,5,44,0,0,710,100,1,0,0, - 0,711,712,3,321,155,0,712,713,3,323,156,0,713,714,3,351,170,0,714,715,3, - 319,154,0,715,102,1,0,0,0,716,717,5,46,0,0,717,104,1,0,0,0,718,719,3,325, - 157,0,719,720,3,315,152,0,720,721,3,337,163,0,721,722,3,351,170,0,722,723, - 3,323,156,0,723,106,1,0,0,0,724,725,3,325,157,0,725,726,3,331,160,0,726, - 727,3,349,169,0,727,728,3,351,170,0,728,729,3,353,171,0,729,108,1,0,0,0, - 730,731,3,337,163,0,731,732,3,315,152,0,732,733,3,351,170,0,733,734,3,353, - 171,0,734,110,1,0,0,0,735,736,5,40,0,0,736,112,1,0,0,0,737,738,3,331,160, - 0,738,739,3,341,165,0,739,114,1,0,0,0,740,741,3,331,160,0,741,742,3,351, - 170,0,742,116,1,0,0,0,743,744,3,337,163,0,744,745,3,331,160,0,745,746,3, - 335,162,0,746,747,3,323,156,0,747,118,1,0,0,0,748,749,3,341,165,0,749,750, - 3,343,166,0,750,751,3,353,171,0,751,120,1,0,0,0,752,753,3,341,165,0,753, - 754,3,355,172,0,754,755,3,337,163,0,755,756,3,337,163,0,756,122,1,0,0,0, - 757,758,3,341,165,0,758,759,3,355,172,0,759,760,3,337,163,0,760,761,3,337, - 163,0,761,762,3,351,170,0,762,124,1,0,0,0,763,764,3,343,166,0,764,765,3, - 349,169,0,765,126,1,0,0,0,766,767,5,63,0,0,767,128,1,0,0,0,768,769,3,349, - 169,0,769,770,3,337,163,0,770,771,3,331,160,0,771,772,3,335,162,0,772,773, - 3,323,156,0,773,130,1,0,0,0,774,775,5,41,0,0,775,132,1,0,0,0,776,777,3, - 353,171,0,777,778,3,349,169,0,778,779,3,355,172,0,779,780,3,323,156,0,780, - 134,1,0,0,0,781,782,5,61,0,0,782,783,5,61,0,0,783,136,1,0,0,0,784,785,5, - 61,0,0,785,786,5,126,0,0,786,138,1,0,0,0,787,788,5,33,0,0,788,789,5,61, - 0,0,789,140,1,0,0,0,790,791,5,60,0,0,791,142,1,0,0,0,792,793,5,60,0,0,793, - 794,5,61,0,0,794,144,1,0,0,0,795,796,5,62,0,0,796,146,1,0,0,0,797,798,5, - 62,0,0,798,799,5,61,0,0,799,148,1,0,0,0,800,801,5,43,0,0,801,150,1,0,0, - 0,802,803,5,45,0,0,803,152,1,0,0,0,804,805,5,42,0,0,805,154,1,0,0,0,806, - 807,5,47,0,0,807,156,1,0,0,0,808,809,5,37,0,0,809,158,1,0,0,0,810,811,5, - 91,0,0,811,812,1,0,0,0,812,813,6,74,0,0,813,814,6,74,0,0,814,160,1,0,0, - 0,815,816,5,93,0,0,816,817,1,0,0,0,817,818,6,75,12,0,818,819,6,75,12,0, - 819,162,1,0,0,0,820,824,3,67,28,0,821,823,3,83,36,0,822,821,1,0,0,0,823, - 826,1,0,0,0,824,822,1,0,0,0,824,825,1,0,0,0,825,837,1,0,0,0,826,824,1,0, - 0,0,827,830,3,81,35,0,828,830,3,75,32,0,829,827,1,0,0,0,829,828,1,0,0,0, - 830,832,1,0,0,0,831,833,3,83,36,0,832,831,1,0,0,0,833,834,1,0,0,0,834,832, - 1,0,0,0,834,835,1,0,0,0,835,837,1,0,0,0,836,820,1,0,0,0,836,829,1,0,0,0, - 837,164,1,0,0,0,838,840,3,77,33,0,839,841,3,79,34,0,840,839,1,0,0,0,841, - 842,1,0,0,0,842,840,1,0,0,0,842,843,1,0,0,0,843,844,1,0,0,0,844,845,3,77, - 33,0,845,166,1,0,0,0,846,847,3,165,77,0,847,168,1,0,0,0,848,849,3,47,18, - 0,849,850,1,0,0,0,850,851,6,79,8,0,851,170,1,0,0,0,852,853,3,49,19,0,853, - 854,1,0,0,0,854,855,6,80,8,0,855,172,1,0,0,0,856,857,3,51,20,0,857,858, - 1,0,0,0,858,859,6,81,8,0,859,174,1,0,0,0,860,861,3,63,26,0,861,862,1,0, - 0,0,862,863,6,82,11,0,863,864,6,82,12,0,864,176,1,0,0,0,865,866,3,159,74, - 0,866,867,1,0,0,0,867,868,6,83,9,0,868,178,1,0,0,0,869,870,3,161,75,0,870, - 871,1,0,0,0,871,872,6,84,13,0,872,180,1,0,0,0,873,874,3,99,44,0,874,875, - 1,0,0,0,875,876,6,85,14,0,876,182,1,0,0,0,877,878,3,97,43,0,878,879,1,0, - 0,0,879,880,6,86,15,0,880,184,1,0,0,0,881,882,3,339,164,0,882,883,3,323, - 156,0,883,884,3,353,171,0,884,885,3,315,152,0,885,886,3,321,155,0,886,887, - 3,315,152,0,887,888,3,353,171,0,888,889,3,315,152,0,889,186,1,0,0,0,890, - 894,8,10,0,0,891,892,5,47,0,0,892,894,8,11,0,0,893,890,1,0,0,0,893,891, - 1,0,0,0,894,188,1,0,0,0,895,897,3,187,88,0,896,895,1,0,0,0,897,898,1,0, - 0,0,898,896,1,0,0,0,898,899,1,0,0,0,899,190,1,0,0,0,900,901,3,167,78,0, - 901,902,1,0,0,0,902,903,6,90,16,0,903,192,1,0,0,0,904,905,3,47,18,0,905, - 906,1,0,0,0,906,907,6,91,8,0,907,194,1,0,0,0,908,909,3,49,19,0,909,910, - 1,0,0,0,910,911,6,92,8,0,911,196,1,0,0,0,912,913,3,51,20,0,913,914,1,0, - 0,0,914,915,6,93,8,0,915,198,1,0,0,0,916,917,3,63,26,0,917,918,1,0,0,0, - 918,919,6,94,11,0,919,920,6,94,12,0,920,200,1,0,0,0,921,922,3,103,46,0, - 922,923,1,0,0,0,923,924,6,95,17,0,924,202,1,0,0,0,925,926,3,99,44,0,926, - 927,1,0,0,0,927,928,6,96,14,0,928,204,1,0,0,0,929,934,3,67,28,0,930,934, - 3,65,27,0,931,934,3,81,35,0,932,934,3,153,71,0,933,929,1,0,0,0,933,930, - 1,0,0,0,933,931,1,0,0,0,933,932,1,0,0,0,934,206,1,0,0,0,935,938,3,67,28, - 0,936,938,3,153,71,0,937,935,1,0,0,0,937,936,1,0,0,0,938,942,1,0,0,0,939, - 941,3,205,97,0,940,939,1,0,0,0,941,944,1,0,0,0,942,940,1,0,0,0,942,943, - 1,0,0,0,943,955,1,0,0,0,944,942,1,0,0,0,945,948,3,81,35,0,946,948,3,75, - 32,0,947,945,1,0,0,0,947,946,1,0,0,0,948,950,1,0,0,0,949,951,3,205,97,0, - 950,949,1,0,0,0,951,952,1,0,0,0,952,950,1,0,0,0,952,953,1,0,0,0,953,955, - 1,0,0,0,954,937,1,0,0,0,954,947,1,0,0,0,955,208,1,0,0,0,956,959,3,207,98, - 0,957,959,3,165,77,0,958,956,1,0,0,0,958,957,1,0,0,0,959,960,1,0,0,0,960, - 958,1,0,0,0,960,961,1,0,0,0,961,210,1,0,0,0,962,963,3,47,18,0,963,964,1, - 0,0,0,964,965,6,100,8,0,965,212,1,0,0,0,966,967,3,49,19,0,967,968,1,0,0, - 0,968,969,6,101,8,0,969,214,1,0,0,0,970,971,3,51,20,0,971,972,1,0,0,0,972, - 973,6,102,8,0,973,216,1,0,0,0,974,975,3,63,26,0,975,976,1,0,0,0,976,977, - 6,103,11,0,977,978,6,103,12,0,978,218,1,0,0,0,979,980,3,97,43,0,980,981, - 1,0,0,0,981,982,6,104,15,0,982,220,1,0,0,0,983,984,3,99,44,0,984,985,1, - 0,0,0,985,986,6,105,14,0,986,222,1,0,0,0,987,988,3,103,46,0,988,989,1,0, - 0,0,989,990,6,106,17,0,990,224,1,0,0,0,991,992,3,315,152,0,992,993,3,351, - 170,0,993,226,1,0,0,0,994,995,3,209,99,0,995,996,1,0,0,0,996,997,6,108, - 18,0,997,228,1,0,0,0,998,999,3,47,18,0,999,1000,1,0,0,0,1000,1001,6,109, - 8,0,1001,230,1,0,0,0,1002,1003,3,49,19,0,1003,1004,1,0,0,0,1004,1005,6, - 110,8,0,1005,232,1,0,0,0,1006,1007,3,51,20,0,1007,1008,1,0,0,0,1008,1009, - 6,111,8,0,1009,234,1,0,0,0,1010,1011,3,63,26,0,1011,1012,1,0,0,0,1012,1013, - 6,112,11,0,1013,1014,6,112,12,0,1014,236,1,0,0,0,1015,1016,3,159,74,0,1016, - 1017,1,0,0,0,1017,1018,6,113,9,0,1018,1019,6,113,19,0,1019,238,1,0,0,0, - 1020,1021,3,343,166,0,1021,1022,3,341,165,0,1022,1023,1,0,0,0,1023,1024, - 6,114,20,0,1024,240,1,0,0,0,1025,1026,3,359,174,0,1026,1027,3,331,160,0, - 1027,1028,3,353,171,0,1028,1029,3,329,159,0,1029,1030,1,0,0,0,1030,1031, - 6,115,20,0,1031,242,1,0,0,0,1032,1033,8,12,0,0,1033,244,1,0,0,0,1034,1036, - 3,243,116,0,1035,1034,1,0,0,0,1036,1037,1,0,0,0,1037,1035,1,0,0,0,1037, - 1038,1,0,0,0,1038,1039,1,0,0,0,1039,1040,3,305,147,0,1040,1042,1,0,0,0, - 1041,1035,1,0,0,0,1041,1042,1,0,0,0,1042,1044,1,0,0,0,1043,1045,3,243,116, - 0,1044,1043,1,0,0,0,1045,1046,1,0,0,0,1046,1044,1,0,0,0,1046,1047,1,0,0, - 0,1047,246,1,0,0,0,1048,1049,3,167,78,0,1049,1050,1,0,0,0,1050,1051,6,118, - 16,0,1051,248,1,0,0,0,1052,1053,3,245,117,0,1053,1054,1,0,0,0,1054,1055, - 6,119,21,0,1055,250,1,0,0,0,1056,1057,3,47,18,0,1057,1058,1,0,0,0,1058, - 1059,6,120,8,0,1059,252,1,0,0,0,1060,1061,3,49,19,0,1061,1062,1,0,0,0,1062, - 1063,6,121,8,0,1063,254,1,0,0,0,1064,1065,3,51,20,0,1065,1066,1,0,0,0,1066, - 1067,6,122,8,0,1067,256,1,0,0,0,1068,1069,3,63,26,0,1069,1070,1,0,0,0,1070, - 1071,6,123,11,0,1071,1072,6,123,12,0,1072,1073,6,123,12,0,1073,258,1,0, - 0,0,1074,1075,3,97,43,0,1075,1076,1,0,0,0,1076,1077,6,124,15,0,1077,260, - 1,0,0,0,1078,1079,3,99,44,0,1079,1080,1,0,0,0,1080,1081,6,125,14,0,1081, - 262,1,0,0,0,1082,1083,3,103,46,0,1083,1084,1,0,0,0,1084,1085,6,126,17,0, - 1085,264,1,0,0,0,1086,1087,3,241,115,0,1087,1088,1,0,0,0,1088,1089,6,127, - 22,0,1089,266,1,0,0,0,1090,1091,3,209,99,0,1091,1092,1,0,0,0,1092,1093, - 6,128,18,0,1093,268,1,0,0,0,1094,1095,3,167,78,0,1095,1096,1,0,0,0,1096, - 1097,6,129,16,0,1097,270,1,0,0,0,1098,1099,3,47,18,0,1099,1100,1,0,0,0, - 1100,1101,6,130,8,0,1101,272,1,0,0,0,1102,1103,3,49,19,0,1103,1104,1,0, - 0,0,1104,1105,6,131,8,0,1105,274,1,0,0,0,1106,1107,3,51,20,0,1107,1108, - 1,0,0,0,1108,1109,6,132,8,0,1109,276,1,0,0,0,1110,1111,3,63,26,0,1111,1112, - 1,0,0,0,1112,1113,6,133,11,0,1113,1114,6,133,12,0,1114,278,1,0,0,0,1115, - 1116,3,103,46,0,1116,1117,1,0,0,0,1117,1118,6,134,17,0,1118,280,1,0,0,0, - 1119,1120,3,167,78,0,1120,1121,1,0,0,0,1121,1122,6,135,16,0,1122,282,1, - 0,0,0,1123,1124,3,163,76,0,1124,1125,1,0,0,0,1125,1126,6,136,23,0,1126, - 284,1,0,0,0,1127,1128,3,47,18,0,1128,1129,1,0,0,0,1129,1130,6,137,8,0,1130, - 286,1,0,0,0,1131,1132,3,49,19,0,1132,1133,1,0,0,0,1133,1134,6,138,8,0,1134, - 288,1,0,0,0,1135,1136,3,51,20,0,1136,1137,1,0,0,0,1137,1138,6,139,8,0,1138, - 290,1,0,0,0,1139,1140,3,63,26,0,1140,1141,1,0,0,0,1141,1142,6,140,11,0, - 1142,1143,6,140,12,0,1143,292,1,0,0,0,1144,1145,3,331,160,0,1145,1146,3, - 341,165,0,1146,1147,3,325,157,0,1147,1148,3,343,166,0,1148,294,1,0,0,0, - 1149,1150,3,325,157,0,1150,1151,3,355,172,0,1151,1152,3,341,165,0,1152, - 1153,3,319,154,0,1153,1154,3,353,171,0,1154,1155,3,331,160,0,1155,1156, - 3,343,166,0,1156,1157,3,341,165,0,1157,1158,3,351,170,0,1158,296,1,0,0, - 0,1159,1160,3,47,18,0,1160,1161,1,0,0,0,1161,1162,6,143,8,0,1162,298,1, - 0,0,0,1163,1164,3,49,19,0,1164,1165,1,0,0,0,1165,1166,6,144,8,0,1166,300, - 1,0,0,0,1167,1168,3,51,20,0,1168,1169,1,0,0,0,1169,1170,6,145,8,0,1170, - 302,1,0,0,0,1171,1172,3,161,75,0,1172,1173,1,0,0,0,1173,1174,6,146,13,0, - 1174,1175,6,146,12,0,1175,304,1,0,0,0,1176,1177,5,58,0,0,1177,306,1,0,0, - 0,1178,1184,3,75,32,0,1179,1184,3,65,27,0,1180,1184,3,103,46,0,1181,1184, - 3,67,28,0,1182,1184,3,81,35,0,1183,1178,1,0,0,0,1183,1179,1,0,0,0,1183, - 1180,1,0,0,0,1183,1181,1,0,0,0,1183,1182,1,0,0,0,1184,1185,1,0,0,0,1185, - 1183,1,0,0,0,1185,1186,1,0,0,0,1186,308,1,0,0,0,1187,1188,3,47,18,0,1188, - 1189,1,0,0,0,1189,1190,6,149,8,0,1190,310,1,0,0,0,1191,1192,3,49,19,0,1192, - 1193,1,0,0,0,1193,1194,6,150,8,0,1194,312,1,0,0,0,1195,1196,3,51,20,0,1196, - 1197,1,0,0,0,1197,1198,6,151,8,0,1198,314,1,0,0,0,1199,1200,7,13,0,0,1200, - 316,1,0,0,0,1201,1202,7,14,0,0,1202,318,1,0,0,0,1203,1204,7,15,0,0,1204, - 320,1,0,0,0,1205,1206,7,16,0,0,1206,322,1,0,0,0,1207,1208,7,7,0,0,1208, - 324,1,0,0,0,1209,1210,7,17,0,0,1210,326,1,0,0,0,1211,1212,7,18,0,0,1212, - 328,1,0,0,0,1213,1214,7,19,0,0,1214,330,1,0,0,0,1215,1216,7,20,0,0,1216, - 332,1,0,0,0,1217,1218,7,21,0,0,1218,334,1,0,0,0,1219,1220,7,22,0,0,1220, - 336,1,0,0,0,1221,1222,7,23,0,0,1222,338,1,0,0,0,1223,1224,7,24,0,0,1224, - 340,1,0,0,0,1225,1226,7,25,0,0,1226,342,1,0,0,0,1227,1228,7,26,0,0,1228, - 344,1,0,0,0,1229,1230,7,27,0,0,1230,346,1,0,0,0,1231,1232,7,28,0,0,1232, - 348,1,0,0,0,1233,1234,7,29,0,0,1234,350,1,0,0,0,1235,1236,7,30,0,0,1236, - 352,1,0,0,0,1237,1238,7,31,0,0,1238,354,1,0,0,0,1239,1240,7,32,0,0,1240, - 356,1,0,0,0,1241,1242,7,33,0,0,1242,358,1,0,0,0,1243,1244,7,34,0,0,1244, - 360,1,0,0,0,1245,1246,7,35,0,0,1246,362,1,0,0,0,1247,1248,7,36,0,0,1248, - 364,1,0,0,0,1249,1250,7,37,0,0,1250,366,1,0,0,0,57,0,1,2,3,4,5,6,7,8,9, - 10,513,523,527,530,539,541,552,593,598,607,614,619,621,632,640,643,645, - 650,655,661,668,673,679,682,690,694,824,829,834,836,842,893,898,933,937, - 942,947,952,954,958,960,1037,1041,1046,1183,1185,24,5,2,0,5,4,0,5,6,0,5, - 1,0,5,3,0,5,8,0,5,5,0,5,9,0,0,1,0,7,63,0,5,0,0,7,25,0,4,0,0,7,64,0,7,33, - 0,7,32,0,7,66,0,7,35,0,7,75,0,5,10,0,5,7,0,7,85,0,7,84,0,7,65,0]; + 146,2,147,7,147,2,148,7,148,2,149,7,149,2,150,7,150,2,151,7,151,1,0,1,0, + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2, + 1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4, + 1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6, + 1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8, + 1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, + 11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13, + 1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1, + 15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,4,17,460,8,17,11,17,12, + 17,461,1,17,1,17,1,18,1,18,1,18,1,18,5,18,470,8,18,10,18,12,18,473,9,18, + 1,18,3,18,476,8,18,1,18,3,18,479,8,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19, + 5,19,488,8,19,10,19,12,19,491,9,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,499, + 8,20,11,20,12,20,500,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1, + 26,1,26,1,26,1,26,1,27,1,27,1,28,1,28,1,29,1,29,1,29,1,30,1,30,1,31,1,31, + 3,31,542,8,31,1,31,4,31,545,8,31,11,31,12,31,546,1,32,1,32,1,33,1,33,1, + 34,1,34,1,34,3,34,556,8,34,1,35,1,35,1,36,1,36,1,36,3,36,563,8,36,1,37, + 1,37,1,37,5,37,568,8,37,10,37,12,37,571,9,37,1,37,1,37,1,37,1,37,1,37,1, + 37,5,37,579,8,37,10,37,12,37,582,9,37,1,37,1,37,1,37,1,37,1,37,3,37,589, + 8,37,1,37,3,37,592,8,37,3,37,594,8,37,1,38,4,38,597,8,38,11,38,12,38,598, + 1,39,4,39,602,8,39,11,39,12,39,603,1,39,1,39,5,39,608,8,39,10,39,12,39, + 611,9,39,1,39,1,39,4,39,615,8,39,11,39,12,39,616,1,39,4,39,620,8,39,11, + 39,12,39,621,1,39,1,39,5,39,626,8,39,10,39,12,39,629,9,39,3,39,631,8,39, + 1,39,1,39,1,39,1,39,4,39,637,8,39,11,39,12,39,638,1,39,1,39,3,39,643,8, + 39,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,43,1,43,1,44, + 1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1, + 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,51,1,51, + 1,51,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,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1,58, + 1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1, + 62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,67,1,67, + 1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1,72,1,73,1,73,1,74,1, + 74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,1,76,5,76,771,8,76,10,76, + 12,76,774,9,76,1,76,1,76,3,76,778,8,76,1,76,4,76,781,8,76,11,76,12,76,782, + 3,76,785,8,76,1,77,1,77,4,77,789,8,77,11,77,12,77,790,1,77,1,77,1,78,1, + 78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82, + 1,82,1,82,1,82,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1, + 85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,88, + 1,88,1,88,3,88,842,8,88,1,89,4,89,845,8,89,11,89,12,89,846,1,90,1,90,1, + 90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94, + 1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,97,1,97,1, + 97,1,97,3,97,882,8,97,1,98,1,98,3,98,886,8,98,1,98,5,98,889,8,98,10,98, + 12,98,892,9,98,1,98,1,98,3,98,896,8,98,1,98,4,98,899,8,98,11,98,12,98,900, + 3,98,903,8,98,1,99,1,99,4,99,907,8,99,11,99,12,99,908,1,100,1,100,1,100, + 1,100,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,103,1,103,1,103, + 1,103,1,103,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,106,1,106, + 1,106,1,106,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,109,1,109,1,109, + 1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112, + 1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114, + 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,117,4,117,984,8, + 117,11,117,12,117,985,1,117,1,117,3,117,990,8,117,1,117,4,117,993,8,117, + 11,117,12,117,994,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,120, + 1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,123, + 1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,125,1,125,1,125, + 1,125,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,128,1,128,1,128, + 1,128,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,131,1,131,1,131, + 1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,134,1,134, + 1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137, + 1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,140,1,140, + 1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142, + 1,142,1,142,1,142,1,142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144, + 1,144,1,144,1,145,1,145,1,145,1,145,1,146,1,146,1,146,1,146,1,146,1,147, + 1,147,1,148,1,148,1,148,1,148,1,148,4,148,1132,8,148,11,148,12,148,1133, + 1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151, + 2,489,580,0,152,11,1,13,2,15,3,17,4,19,5,21,6,23,7,25,8,27,9,29,10,31,11, + 33,12,35,13,37,14,39,15,41,16,43,17,45,18,47,19,49,20,51,21,53,0,55,0,57, + 22,59,23,61,24,63,25,65,0,67,0,69,0,71,0,73,0,75,0,77,0,79,0,81,0,83,0, + 85,26,87,27,89,28,91,29,93,30,95,31,97,32,99,33,101,34,103,35,105,36,107, + 37,109,38,111,39,113,40,115,41,117,42,119,43,121,44,123,45,125,46,127,47, + 129,48,131,49,133,50,135,51,137,52,139,53,141,54,143,55,145,56,147,57,149, + 58,151,59,153,60,155,61,157,62,159,63,161,64,163,65,165,0,167,66,169,67, + 171,68,173,69,175,0,177,0,179,0,181,0,183,0,185,70,187,0,189,71,191,0,193, + 72,195,73,197,74,199,0,201,0,203,0,205,0,207,0,209,75,211,76,213,77,215, + 78,217,0,219,0,221,0,223,0,225,79,227,0,229,80,231,81,233,82,235,0,237, + 0,239,83,241,84,243,0,245,85,247,0,249,0,251,86,253,87,255,88,257,0,259, + 0,261,0,263,0,265,0,267,0,269,0,271,89,273,90,275,91,277,0,279,0,281,0, + 283,0,285,92,287,93,289,94,291,0,293,95,295,96,297,97,299,98,301,99,303, + 0,305,100,307,101,309,102,311,103,313,104,11,0,1,2,3,4,5,6,7,8,9,10,35, + 2,0,68,68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69,101,101, + 2,0,67,67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111,111,2, + 0,80,80,112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118,118,2, + 0,65,65,97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102,2,0, + 77,77,109,109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,87,87,119,119,6,0, + 9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32, + 1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114, + 114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66, + 66,98,98,2,0,89,89,121,121,2,0,85,85,117,117,10,0,9,10,13,13,32,32,44,44, + 47,47,61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47,11,0,9,10,13,13,32, + 32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124,1175,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,1,53,1,0,0,0,1,55,1,0,0,0, + 1,57,1,0,0,0,1,59,1,0,0,0,1,61,1,0,0,0,2,63,1,0,0,0,2,85,1,0,0,0,2,87,1, + 0,0,0,2,89,1,0,0,0,2,91,1,0,0,0,2,93,1,0,0,0,2,95,1,0,0,0,2,97,1,0,0,0, + 2,99,1,0,0,0,2,101,1,0,0,0,2,103,1,0,0,0,2,105,1,0,0,0,2,107,1,0,0,0,2, + 109,1,0,0,0,2,111,1,0,0,0,2,113,1,0,0,0,2,115,1,0,0,0,2,117,1,0,0,0,2,119, + 1,0,0,0,2,121,1,0,0,0,2,123,1,0,0,0,2,125,1,0,0,0,2,127,1,0,0,0,2,129,1, + 0,0,0,2,131,1,0,0,0,2,133,1,0,0,0,2,135,1,0,0,0,2,137,1,0,0,0,2,139,1,0, + 0,0,2,141,1,0,0,0,2,143,1,0,0,0,2,145,1,0,0,0,2,147,1,0,0,0,2,149,1,0,0, + 0,2,151,1,0,0,0,2,153,1,0,0,0,2,155,1,0,0,0,2,157,1,0,0,0,2,159,1,0,0,0, + 2,161,1,0,0,0,2,163,1,0,0,0,2,167,1,0,0,0,2,169,1,0,0,0,2,171,1,0,0,0,2, + 173,1,0,0,0,3,175,1,0,0,0,3,177,1,0,0,0,3,179,1,0,0,0,3,181,1,0,0,0,3,183, + 1,0,0,0,3,185,1,0,0,0,3,189,1,0,0,0,3,191,1,0,0,0,3,193,1,0,0,0,3,195,1, + 0,0,0,3,197,1,0,0,0,4,199,1,0,0,0,4,201,1,0,0,0,4,203,1,0,0,0,4,209,1,0, + 0,0,4,211,1,0,0,0,4,213,1,0,0,0,4,215,1,0,0,0,5,217,1,0,0,0,5,219,1,0,0, + 0,5,221,1,0,0,0,5,223,1,0,0,0,5,225,1,0,0,0,5,227,1,0,0,0,5,229,1,0,0,0, + 5,231,1,0,0,0,5,233,1,0,0,0,6,235,1,0,0,0,6,237,1,0,0,0,6,239,1,0,0,0,6, + 241,1,0,0,0,6,245,1,0,0,0,6,247,1,0,0,0,6,249,1,0,0,0,6,251,1,0,0,0,6,253, + 1,0,0,0,6,255,1,0,0,0,7,257,1,0,0,0,7,259,1,0,0,0,7,261,1,0,0,0,7,263,1, + 0,0,0,7,265,1,0,0,0,7,267,1,0,0,0,7,269,1,0,0,0,7,271,1,0,0,0,7,273,1,0, + 0,0,7,275,1,0,0,0,8,277,1,0,0,0,8,279,1,0,0,0,8,281,1,0,0,0,8,283,1,0,0, + 0,8,285,1,0,0,0,8,287,1,0,0,0,8,289,1,0,0,0,9,291,1,0,0,0,9,293,1,0,0,0, + 9,295,1,0,0,0,9,297,1,0,0,0,9,299,1,0,0,0,9,301,1,0,0,0,10,303,1,0,0,0, + 10,305,1,0,0,0,10,307,1,0,0,0,10,309,1,0,0,0,10,311,1,0,0,0,10,313,1,0, + 0,0,11,315,1,0,0,0,13,325,1,0,0,0,15,332,1,0,0,0,17,341,1,0,0,0,19,348, + 1,0,0,0,21,358,1,0,0,0,23,365,1,0,0,0,25,372,1,0,0,0,27,386,1,0,0,0,29, + 393,1,0,0,0,31,401,1,0,0,0,33,413,1,0,0,0,35,422,1,0,0,0,37,428,1,0,0,0, + 39,435,1,0,0,0,41,442,1,0,0,0,43,450,1,0,0,0,45,459,1,0,0,0,47,465,1,0, + 0,0,49,482,1,0,0,0,51,498,1,0,0,0,53,504,1,0,0,0,55,509,1,0,0,0,57,514, + 1,0,0,0,59,518,1,0,0,0,61,522,1,0,0,0,63,526,1,0,0,0,65,530,1,0,0,0,67, + 532,1,0,0,0,69,534,1,0,0,0,71,537,1,0,0,0,73,539,1,0,0,0,75,548,1,0,0,0, + 77,550,1,0,0,0,79,555,1,0,0,0,81,557,1,0,0,0,83,562,1,0,0,0,85,593,1,0, + 0,0,87,596,1,0,0,0,89,642,1,0,0,0,91,644,1,0,0,0,93,647,1,0,0,0,95,651, + 1,0,0,0,97,655,1,0,0,0,99,657,1,0,0,0,101,659,1,0,0,0,103,664,1,0,0,0,105, + 666,1,0,0,0,107,672,1,0,0,0,109,678,1,0,0,0,111,683,1,0,0,0,113,685,1,0, + 0,0,115,688,1,0,0,0,117,691,1,0,0,0,119,696,1,0,0,0,121,700,1,0,0,0,123, + 705,1,0,0,0,125,711,1,0,0,0,127,714,1,0,0,0,129,716,1,0,0,0,131,722,1,0, + 0,0,133,724,1,0,0,0,135,729,1,0,0,0,137,732,1,0,0,0,139,735,1,0,0,0,141, + 738,1,0,0,0,143,740,1,0,0,0,145,743,1,0,0,0,147,745,1,0,0,0,149,748,1,0, + 0,0,151,750,1,0,0,0,153,752,1,0,0,0,155,754,1,0,0,0,157,756,1,0,0,0,159, + 758,1,0,0,0,161,763,1,0,0,0,163,784,1,0,0,0,165,786,1,0,0,0,167,794,1,0, + 0,0,169,796,1,0,0,0,171,800,1,0,0,0,173,804,1,0,0,0,175,808,1,0,0,0,177, + 813,1,0,0,0,179,817,1,0,0,0,181,821,1,0,0,0,183,825,1,0,0,0,185,829,1,0, + 0,0,187,841,1,0,0,0,189,844,1,0,0,0,191,848,1,0,0,0,193,852,1,0,0,0,195, + 856,1,0,0,0,197,860,1,0,0,0,199,864,1,0,0,0,201,869,1,0,0,0,203,873,1,0, + 0,0,205,881,1,0,0,0,207,902,1,0,0,0,209,906,1,0,0,0,211,910,1,0,0,0,213, + 914,1,0,0,0,215,918,1,0,0,0,217,922,1,0,0,0,219,927,1,0,0,0,221,931,1,0, + 0,0,223,935,1,0,0,0,225,939,1,0,0,0,227,942,1,0,0,0,229,946,1,0,0,0,231, + 950,1,0,0,0,233,954,1,0,0,0,235,958,1,0,0,0,237,963,1,0,0,0,239,968,1,0, + 0,0,241,973,1,0,0,0,243,980,1,0,0,0,245,989,1,0,0,0,247,996,1,0,0,0,249, + 1000,1,0,0,0,251,1004,1,0,0,0,253,1008,1,0,0,0,255,1012,1,0,0,0,257,1016, + 1,0,0,0,259,1022,1,0,0,0,261,1026,1,0,0,0,263,1030,1,0,0,0,265,1034,1,0, + 0,0,267,1038,1,0,0,0,269,1042,1,0,0,0,271,1046,1,0,0,0,273,1050,1,0,0,0, + 275,1054,1,0,0,0,277,1058,1,0,0,0,279,1063,1,0,0,0,281,1067,1,0,0,0,283, + 1071,1,0,0,0,285,1075,1,0,0,0,287,1079,1,0,0,0,289,1083,1,0,0,0,291,1087, + 1,0,0,0,293,1092,1,0,0,0,295,1097,1,0,0,0,297,1107,1,0,0,0,299,1111,1,0, + 0,0,301,1115,1,0,0,0,303,1119,1,0,0,0,305,1124,1,0,0,0,307,1131,1,0,0,0, + 309,1135,1,0,0,0,311,1139,1,0,0,0,313,1143,1,0,0,0,315,316,7,0,0,0,316, + 317,7,1,0,0,317,318,7,2,0,0,318,319,7,2,0,0,319,320,7,3,0,0,320,321,7,4, + 0,0,321,322,7,5,0,0,322,323,1,0,0,0,323,324,6,0,0,0,324,12,1,0,0,0,325, + 326,7,0,0,0,326,327,7,6,0,0,327,328,7,7,0,0,328,329,7,8,0,0,329,330,1,0, + 0,0,330,331,6,1,1,0,331,14,1,0,0,0,332,333,7,3,0,0,333,334,7,9,0,0,334, + 335,7,6,0,0,335,336,7,1,0,0,336,337,7,4,0,0,337,338,7,10,0,0,338,339,1, + 0,0,0,339,340,6,2,2,0,340,16,1,0,0,0,341,342,7,3,0,0,342,343,7,11,0,0,343, + 344,7,12,0,0,344,345,7,13,0,0,345,346,1,0,0,0,346,347,6,3,0,0,347,18,1, + 0,0,0,348,349,7,3,0,0,349,350,7,14,0,0,350,351,7,8,0,0,351,352,7,13,0,0, + 352,353,7,12,0,0,353,354,7,1,0,0,354,355,7,9,0,0,355,356,1,0,0,0,356,357, + 6,4,3,0,357,20,1,0,0,0,358,359,7,15,0,0,359,360,7,6,0,0,360,361,7,7,0,0, + 361,362,7,16,0,0,362,363,1,0,0,0,363,364,6,5,4,0,364,22,1,0,0,0,365,366, + 7,17,0,0,366,367,7,6,0,0,367,368,7,7,0,0,368,369,7,18,0,0,369,370,1,0,0, + 0,370,371,6,6,0,0,371,24,1,0,0,0,372,373,7,1,0,0,373,374,7,9,0,0,374,375, + 7,13,0,0,375,376,7,1,0,0,376,377,7,9,0,0,377,378,7,3,0,0,378,379,7,2,0, + 0,379,380,7,5,0,0,380,381,7,12,0,0,381,382,7,5,0,0,382,383,7,2,0,0,383, + 384,1,0,0,0,384,385,6,7,0,0,385,26,1,0,0,0,386,387,7,18,0,0,387,388,7,3, + 0,0,388,389,7,3,0,0,389,390,7,8,0,0,390,391,1,0,0,0,391,392,6,8,1,0,392, + 28,1,0,0,0,393,394,7,13,0,0,394,395,7,1,0,0,395,396,7,16,0,0,396,397,7, + 1,0,0,397,398,7,5,0,0,398,399,1,0,0,0,399,400,6,9,0,0,400,30,1,0,0,0,401, + 402,7,16,0,0,402,403,7,11,0,0,403,404,5,95,0,0,404,405,7,3,0,0,405,406, + 7,14,0,0,406,407,7,8,0,0,407,408,7,12,0,0,408,409,7,9,0,0,409,410,7,0,0, + 0,410,411,1,0,0,0,411,412,6,10,5,0,412,32,1,0,0,0,413,414,7,6,0,0,414,415, + 7,3,0,0,415,416,7,9,0,0,416,417,7,12,0,0,417,418,7,16,0,0,418,419,7,3,0, + 0,419,420,1,0,0,0,420,421,6,11,6,0,421,34,1,0,0,0,422,423,7,6,0,0,423,424, + 7,7,0,0,424,425,7,19,0,0,425,426,1,0,0,0,426,427,6,12,0,0,427,36,1,0,0, + 0,428,429,7,2,0,0,429,430,7,10,0,0,430,431,7,7,0,0,431,432,7,19,0,0,432, + 433,1,0,0,0,433,434,6,13,7,0,434,38,1,0,0,0,435,436,7,2,0,0,436,437,7,7, + 0,0,437,438,7,6,0,0,438,439,7,5,0,0,439,440,1,0,0,0,440,441,6,14,0,0,441, + 40,1,0,0,0,442,443,7,2,0,0,443,444,7,5,0,0,444,445,7,12,0,0,445,446,7,5, + 0,0,446,447,7,2,0,0,447,448,1,0,0,0,448,449,6,15,0,0,449,42,1,0,0,0,450, + 451,7,19,0,0,451,452,7,10,0,0,452,453,7,3,0,0,453,454,7,6,0,0,454,455,7, + 3,0,0,455,456,1,0,0,0,456,457,6,16,0,0,457,44,1,0,0,0,458,460,8,20,0,0, + 459,458,1,0,0,0,460,461,1,0,0,0,461,459,1,0,0,0,461,462,1,0,0,0,462,463, + 1,0,0,0,463,464,6,17,0,0,464,46,1,0,0,0,465,466,5,47,0,0,466,467,5,47,0, + 0,467,471,1,0,0,0,468,470,8,21,0,0,469,468,1,0,0,0,470,473,1,0,0,0,471, + 469,1,0,0,0,471,472,1,0,0,0,472,475,1,0,0,0,473,471,1,0,0,0,474,476,5,13, + 0,0,475,474,1,0,0,0,475,476,1,0,0,0,476,478,1,0,0,0,477,479,5,10,0,0,478, + 477,1,0,0,0,478,479,1,0,0,0,479,480,1,0,0,0,480,481,6,18,8,0,481,48,1,0, + 0,0,482,483,5,47,0,0,483,484,5,42,0,0,484,489,1,0,0,0,485,488,3,49,19,0, + 486,488,9,0,0,0,487,485,1,0,0,0,487,486,1,0,0,0,488,491,1,0,0,0,489,490, + 1,0,0,0,489,487,1,0,0,0,490,492,1,0,0,0,491,489,1,0,0,0,492,493,5,42,0, + 0,493,494,5,47,0,0,494,495,1,0,0,0,495,496,6,19,8,0,496,50,1,0,0,0,497, + 499,7,22,0,0,498,497,1,0,0,0,499,500,1,0,0,0,500,498,1,0,0,0,500,501,1, + 0,0,0,501,502,1,0,0,0,502,503,6,20,8,0,503,52,1,0,0,0,504,505,3,159,74, + 0,505,506,1,0,0,0,506,507,6,21,9,0,507,508,6,21,10,0,508,54,1,0,0,0,509, + 510,3,63,26,0,510,511,1,0,0,0,511,512,6,22,11,0,512,513,6,22,12,0,513,56, + 1,0,0,0,514,515,3,51,20,0,515,516,1,0,0,0,516,517,6,23,8,0,517,58,1,0,0, + 0,518,519,3,47,18,0,519,520,1,0,0,0,520,521,6,24,8,0,521,60,1,0,0,0,522, + 523,3,49,19,0,523,524,1,0,0,0,524,525,6,25,8,0,525,62,1,0,0,0,526,527,5, + 124,0,0,527,528,1,0,0,0,528,529,6,26,12,0,529,64,1,0,0,0,530,531,7,23,0, + 0,531,66,1,0,0,0,532,533,7,24,0,0,533,68,1,0,0,0,534,535,5,92,0,0,535,536, + 7,25,0,0,536,70,1,0,0,0,537,538,8,26,0,0,538,72,1,0,0,0,539,541,7,3,0,0, + 540,542,7,27,0,0,541,540,1,0,0,0,541,542,1,0,0,0,542,544,1,0,0,0,543,545, + 3,65,27,0,544,543,1,0,0,0,545,546,1,0,0,0,546,544,1,0,0,0,546,547,1,0,0, + 0,547,74,1,0,0,0,548,549,5,64,0,0,549,76,1,0,0,0,550,551,5,96,0,0,551,78, + 1,0,0,0,552,556,8,28,0,0,553,554,5,96,0,0,554,556,5,96,0,0,555,552,1,0, + 0,0,555,553,1,0,0,0,556,80,1,0,0,0,557,558,5,95,0,0,558,82,1,0,0,0,559, + 563,3,67,28,0,560,563,3,65,27,0,561,563,3,81,35,0,562,559,1,0,0,0,562,560, + 1,0,0,0,562,561,1,0,0,0,563,84,1,0,0,0,564,569,5,34,0,0,565,568,3,69,29, + 0,566,568,3,71,30,0,567,565,1,0,0,0,567,566,1,0,0,0,568,571,1,0,0,0,569, + 567,1,0,0,0,569,570,1,0,0,0,570,572,1,0,0,0,571,569,1,0,0,0,572,594,5,34, + 0,0,573,574,5,34,0,0,574,575,5,34,0,0,575,576,5,34,0,0,576,580,1,0,0,0, + 577,579,8,21,0,0,578,577,1,0,0,0,579,582,1,0,0,0,580,581,1,0,0,0,580,578, + 1,0,0,0,581,583,1,0,0,0,582,580,1,0,0,0,583,584,5,34,0,0,584,585,5,34,0, + 0,585,586,5,34,0,0,586,588,1,0,0,0,587,589,5,34,0,0,588,587,1,0,0,0,588, + 589,1,0,0,0,589,591,1,0,0,0,590,592,5,34,0,0,591,590,1,0,0,0,591,592,1, + 0,0,0,592,594,1,0,0,0,593,564,1,0,0,0,593,573,1,0,0,0,594,86,1,0,0,0,595, + 597,3,65,27,0,596,595,1,0,0,0,597,598,1,0,0,0,598,596,1,0,0,0,598,599,1, + 0,0,0,599,88,1,0,0,0,600,602,3,65,27,0,601,600,1,0,0,0,602,603,1,0,0,0, + 603,601,1,0,0,0,603,604,1,0,0,0,604,605,1,0,0,0,605,609,3,103,46,0,606, + 608,3,65,27,0,607,606,1,0,0,0,608,611,1,0,0,0,609,607,1,0,0,0,609,610,1, + 0,0,0,610,643,1,0,0,0,611,609,1,0,0,0,612,614,3,103,46,0,613,615,3,65,27, + 0,614,613,1,0,0,0,615,616,1,0,0,0,616,614,1,0,0,0,616,617,1,0,0,0,617,643, + 1,0,0,0,618,620,3,65,27,0,619,618,1,0,0,0,620,621,1,0,0,0,621,619,1,0,0, + 0,621,622,1,0,0,0,622,630,1,0,0,0,623,627,3,103,46,0,624,626,3,65,27,0, + 625,624,1,0,0,0,626,629,1,0,0,0,627,625,1,0,0,0,627,628,1,0,0,0,628,631, + 1,0,0,0,629,627,1,0,0,0,630,623,1,0,0,0,630,631,1,0,0,0,631,632,1,0,0,0, + 632,633,3,73,31,0,633,643,1,0,0,0,634,636,3,103,46,0,635,637,3,65,27,0, + 636,635,1,0,0,0,637,638,1,0,0,0,638,636,1,0,0,0,638,639,1,0,0,0,639,640, + 1,0,0,0,640,641,3,73,31,0,641,643,1,0,0,0,642,601,1,0,0,0,642,612,1,0,0, + 0,642,619,1,0,0,0,642,634,1,0,0,0,643,90,1,0,0,0,644,645,7,29,0,0,645,646, + 7,30,0,0,646,92,1,0,0,0,647,648,7,12,0,0,648,649,7,9,0,0,649,650,7,0,0, + 0,650,94,1,0,0,0,651,652,7,12,0,0,652,653,7,2,0,0,653,654,7,4,0,0,654,96, + 1,0,0,0,655,656,5,61,0,0,656,98,1,0,0,0,657,658,5,44,0,0,658,100,1,0,0, + 0,659,660,7,0,0,0,660,661,7,3,0,0,661,662,7,2,0,0,662,663,7,4,0,0,663,102, + 1,0,0,0,664,665,5,46,0,0,665,104,1,0,0,0,666,667,7,15,0,0,667,668,7,12, + 0,0,668,669,7,13,0,0,669,670,7,2,0,0,670,671,7,3,0,0,671,106,1,0,0,0,672, + 673,7,15,0,0,673,674,7,1,0,0,674,675,7,6,0,0,675,676,7,2,0,0,676,677,7, + 5,0,0,677,108,1,0,0,0,678,679,7,13,0,0,679,680,7,12,0,0,680,681,7,2,0,0, + 681,682,7,5,0,0,682,110,1,0,0,0,683,684,5,40,0,0,684,112,1,0,0,0,685,686, + 7,1,0,0,686,687,7,9,0,0,687,114,1,0,0,0,688,689,7,1,0,0,689,690,7,2,0,0, + 690,116,1,0,0,0,691,692,7,13,0,0,692,693,7,1,0,0,693,694,7,18,0,0,694,695, + 7,3,0,0,695,118,1,0,0,0,696,697,7,9,0,0,697,698,7,7,0,0,698,699,7,5,0,0, + 699,120,1,0,0,0,700,701,7,9,0,0,701,702,7,31,0,0,702,703,7,13,0,0,703,704, + 7,13,0,0,704,122,1,0,0,0,705,706,7,9,0,0,706,707,7,31,0,0,707,708,7,13, + 0,0,708,709,7,13,0,0,709,710,7,2,0,0,710,124,1,0,0,0,711,712,7,7,0,0,712, + 713,7,6,0,0,713,126,1,0,0,0,714,715,5,63,0,0,715,128,1,0,0,0,716,717,7, + 6,0,0,717,718,7,13,0,0,718,719,7,1,0,0,719,720,7,18,0,0,720,721,7,3,0,0, + 721,130,1,0,0,0,722,723,5,41,0,0,723,132,1,0,0,0,724,725,7,5,0,0,725,726, + 7,6,0,0,726,727,7,31,0,0,727,728,7,3,0,0,728,134,1,0,0,0,729,730,5,61,0, + 0,730,731,5,61,0,0,731,136,1,0,0,0,732,733,5,61,0,0,733,734,5,126,0,0,734, + 138,1,0,0,0,735,736,5,33,0,0,736,737,5,61,0,0,737,140,1,0,0,0,738,739,5, + 60,0,0,739,142,1,0,0,0,740,741,5,60,0,0,741,742,5,61,0,0,742,144,1,0,0, + 0,743,744,5,62,0,0,744,146,1,0,0,0,745,746,5,62,0,0,746,747,5,61,0,0,747, + 148,1,0,0,0,748,749,5,43,0,0,749,150,1,0,0,0,750,751,5,45,0,0,751,152,1, + 0,0,0,752,753,5,42,0,0,753,154,1,0,0,0,754,755,5,47,0,0,755,156,1,0,0,0, + 756,757,5,37,0,0,757,158,1,0,0,0,758,759,5,91,0,0,759,760,1,0,0,0,760,761, + 6,74,0,0,761,762,6,74,0,0,762,160,1,0,0,0,763,764,5,93,0,0,764,765,1,0, + 0,0,765,766,6,75,12,0,766,767,6,75,12,0,767,162,1,0,0,0,768,772,3,67,28, + 0,769,771,3,83,36,0,770,769,1,0,0,0,771,774,1,0,0,0,772,770,1,0,0,0,772, + 773,1,0,0,0,773,785,1,0,0,0,774,772,1,0,0,0,775,778,3,81,35,0,776,778,3, + 75,32,0,777,775,1,0,0,0,777,776,1,0,0,0,778,780,1,0,0,0,779,781,3,83,36, + 0,780,779,1,0,0,0,781,782,1,0,0,0,782,780,1,0,0,0,782,783,1,0,0,0,783,785, + 1,0,0,0,784,768,1,0,0,0,784,777,1,0,0,0,785,164,1,0,0,0,786,788,3,77,33, + 0,787,789,3,79,34,0,788,787,1,0,0,0,789,790,1,0,0,0,790,788,1,0,0,0,790, + 791,1,0,0,0,791,792,1,0,0,0,792,793,3,77,33,0,793,166,1,0,0,0,794,795,3, + 165,77,0,795,168,1,0,0,0,796,797,3,47,18,0,797,798,1,0,0,0,798,799,6,79, + 8,0,799,170,1,0,0,0,800,801,3,49,19,0,801,802,1,0,0,0,802,803,6,80,8,0, + 803,172,1,0,0,0,804,805,3,51,20,0,805,806,1,0,0,0,806,807,6,81,8,0,807, + 174,1,0,0,0,808,809,3,63,26,0,809,810,1,0,0,0,810,811,6,82,11,0,811,812, + 6,82,12,0,812,176,1,0,0,0,813,814,3,159,74,0,814,815,1,0,0,0,815,816,6, + 83,9,0,816,178,1,0,0,0,817,818,3,161,75,0,818,819,1,0,0,0,819,820,6,84, + 13,0,820,180,1,0,0,0,821,822,3,99,44,0,822,823,1,0,0,0,823,824,6,85,14, + 0,824,182,1,0,0,0,825,826,3,97,43,0,826,827,1,0,0,0,827,828,6,86,15,0,828, + 184,1,0,0,0,829,830,7,16,0,0,830,831,7,3,0,0,831,832,7,5,0,0,832,833,7, + 12,0,0,833,834,7,0,0,0,834,835,7,12,0,0,835,836,7,5,0,0,836,837,7,12,0, + 0,837,186,1,0,0,0,838,842,8,32,0,0,839,840,5,47,0,0,840,842,8,33,0,0,841, + 838,1,0,0,0,841,839,1,0,0,0,842,188,1,0,0,0,843,845,3,187,88,0,844,843, + 1,0,0,0,845,846,1,0,0,0,846,844,1,0,0,0,846,847,1,0,0,0,847,190,1,0,0,0, + 848,849,3,167,78,0,849,850,1,0,0,0,850,851,6,90,16,0,851,192,1,0,0,0,852, + 853,3,47,18,0,853,854,1,0,0,0,854,855,6,91,8,0,855,194,1,0,0,0,856,857, + 3,49,19,0,857,858,1,0,0,0,858,859,6,92,8,0,859,196,1,0,0,0,860,861,3,51, + 20,0,861,862,1,0,0,0,862,863,6,93,8,0,863,198,1,0,0,0,864,865,3,63,26,0, + 865,866,1,0,0,0,866,867,6,94,11,0,867,868,6,94,12,0,868,200,1,0,0,0,869, + 870,3,103,46,0,870,871,1,0,0,0,871,872,6,95,17,0,872,202,1,0,0,0,873,874, + 3,99,44,0,874,875,1,0,0,0,875,876,6,96,14,0,876,204,1,0,0,0,877,882,3,67, + 28,0,878,882,3,65,27,0,879,882,3,81,35,0,880,882,3,153,71,0,881,877,1,0, + 0,0,881,878,1,0,0,0,881,879,1,0,0,0,881,880,1,0,0,0,882,206,1,0,0,0,883, + 886,3,67,28,0,884,886,3,153,71,0,885,883,1,0,0,0,885,884,1,0,0,0,886,890, + 1,0,0,0,887,889,3,205,97,0,888,887,1,0,0,0,889,892,1,0,0,0,890,888,1,0, + 0,0,890,891,1,0,0,0,891,903,1,0,0,0,892,890,1,0,0,0,893,896,3,81,35,0,894, + 896,3,75,32,0,895,893,1,0,0,0,895,894,1,0,0,0,896,898,1,0,0,0,897,899,3, + 205,97,0,898,897,1,0,0,0,899,900,1,0,0,0,900,898,1,0,0,0,900,901,1,0,0, + 0,901,903,1,0,0,0,902,885,1,0,0,0,902,895,1,0,0,0,903,208,1,0,0,0,904,907, + 3,207,98,0,905,907,3,165,77,0,906,904,1,0,0,0,906,905,1,0,0,0,907,908,1, + 0,0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,210,1,0,0,0,910,911,3,47,18,0, + 911,912,1,0,0,0,912,913,6,100,8,0,913,212,1,0,0,0,914,915,3,49,19,0,915, + 916,1,0,0,0,916,917,6,101,8,0,917,214,1,0,0,0,918,919,3,51,20,0,919,920, + 1,0,0,0,920,921,6,102,8,0,921,216,1,0,0,0,922,923,3,63,26,0,923,924,1,0, + 0,0,924,925,6,103,11,0,925,926,6,103,12,0,926,218,1,0,0,0,927,928,3,97, + 43,0,928,929,1,0,0,0,929,930,6,104,15,0,930,220,1,0,0,0,931,932,3,99,44, + 0,932,933,1,0,0,0,933,934,6,105,14,0,934,222,1,0,0,0,935,936,3,103,46,0, + 936,937,1,0,0,0,937,938,6,106,17,0,938,224,1,0,0,0,939,940,7,12,0,0,940, + 941,7,2,0,0,941,226,1,0,0,0,942,943,3,209,99,0,943,944,1,0,0,0,944,945, + 6,108,18,0,945,228,1,0,0,0,946,947,3,47,18,0,947,948,1,0,0,0,948,949,6, + 109,8,0,949,230,1,0,0,0,950,951,3,49,19,0,951,952,1,0,0,0,952,953,6,110, + 8,0,953,232,1,0,0,0,954,955,3,51,20,0,955,956,1,0,0,0,956,957,6,111,8,0, + 957,234,1,0,0,0,958,959,3,63,26,0,959,960,1,0,0,0,960,961,6,112,11,0,961, + 962,6,112,12,0,962,236,1,0,0,0,963,964,3,159,74,0,964,965,1,0,0,0,965,966, + 6,113,9,0,966,967,6,113,19,0,967,238,1,0,0,0,968,969,7,7,0,0,969,970,7, + 9,0,0,970,971,1,0,0,0,971,972,6,114,20,0,972,240,1,0,0,0,973,974,7,19,0, + 0,974,975,7,1,0,0,975,976,7,5,0,0,976,977,7,10,0,0,977,978,1,0,0,0,978, + 979,6,115,20,0,979,242,1,0,0,0,980,981,8,34,0,0,981,244,1,0,0,0,982,984, + 3,243,116,0,983,982,1,0,0,0,984,985,1,0,0,0,985,983,1,0,0,0,985,986,1,0, + 0,0,986,987,1,0,0,0,987,988,3,305,147,0,988,990,1,0,0,0,989,983,1,0,0,0, + 989,990,1,0,0,0,990,992,1,0,0,0,991,993,3,243,116,0,992,991,1,0,0,0,993, + 994,1,0,0,0,994,992,1,0,0,0,994,995,1,0,0,0,995,246,1,0,0,0,996,997,3,167, + 78,0,997,998,1,0,0,0,998,999,6,118,16,0,999,248,1,0,0,0,1000,1001,3,245, + 117,0,1001,1002,1,0,0,0,1002,1003,6,119,21,0,1003,250,1,0,0,0,1004,1005, + 3,47,18,0,1005,1006,1,0,0,0,1006,1007,6,120,8,0,1007,252,1,0,0,0,1008,1009, + 3,49,19,0,1009,1010,1,0,0,0,1010,1011,6,121,8,0,1011,254,1,0,0,0,1012,1013, + 3,51,20,0,1013,1014,1,0,0,0,1014,1015,6,122,8,0,1015,256,1,0,0,0,1016,1017, + 3,63,26,0,1017,1018,1,0,0,0,1018,1019,6,123,11,0,1019,1020,6,123,12,0,1020, + 1021,6,123,12,0,1021,258,1,0,0,0,1022,1023,3,97,43,0,1023,1024,1,0,0,0, + 1024,1025,6,124,15,0,1025,260,1,0,0,0,1026,1027,3,99,44,0,1027,1028,1,0, + 0,0,1028,1029,6,125,14,0,1029,262,1,0,0,0,1030,1031,3,103,46,0,1031,1032, + 1,0,0,0,1032,1033,6,126,17,0,1033,264,1,0,0,0,1034,1035,3,241,115,0,1035, + 1036,1,0,0,0,1036,1037,6,127,22,0,1037,266,1,0,0,0,1038,1039,3,209,99,0, + 1039,1040,1,0,0,0,1040,1041,6,128,18,0,1041,268,1,0,0,0,1042,1043,3,167, + 78,0,1043,1044,1,0,0,0,1044,1045,6,129,16,0,1045,270,1,0,0,0,1046,1047, + 3,47,18,0,1047,1048,1,0,0,0,1048,1049,6,130,8,0,1049,272,1,0,0,0,1050,1051, + 3,49,19,0,1051,1052,1,0,0,0,1052,1053,6,131,8,0,1053,274,1,0,0,0,1054,1055, + 3,51,20,0,1055,1056,1,0,0,0,1056,1057,6,132,8,0,1057,276,1,0,0,0,1058,1059, + 3,63,26,0,1059,1060,1,0,0,0,1060,1061,6,133,11,0,1061,1062,6,133,12,0,1062, + 278,1,0,0,0,1063,1064,3,103,46,0,1064,1065,1,0,0,0,1065,1066,6,134,17,0, + 1066,280,1,0,0,0,1067,1068,3,167,78,0,1068,1069,1,0,0,0,1069,1070,6,135, + 16,0,1070,282,1,0,0,0,1071,1072,3,163,76,0,1072,1073,1,0,0,0,1073,1074, + 6,136,23,0,1074,284,1,0,0,0,1075,1076,3,47,18,0,1076,1077,1,0,0,0,1077, + 1078,6,137,8,0,1078,286,1,0,0,0,1079,1080,3,49,19,0,1080,1081,1,0,0,0,1081, + 1082,6,138,8,0,1082,288,1,0,0,0,1083,1084,3,51,20,0,1084,1085,1,0,0,0,1085, + 1086,6,139,8,0,1086,290,1,0,0,0,1087,1088,3,63,26,0,1088,1089,1,0,0,0,1089, + 1090,6,140,11,0,1090,1091,6,140,12,0,1091,292,1,0,0,0,1092,1093,7,1,0,0, + 1093,1094,7,9,0,0,1094,1095,7,15,0,0,1095,1096,7,7,0,0,1096,294,1,0,0,0, + 1097,1098,7,15,0,0,1098,1099,7,31,0,0,1099,1100,7,9,0,0,1100,1101,7,4,0, + 0,1101,1102,7,5,0,0,1102,1103,7,1,0,0,1103,1104,7,7,0,0,1104,1105,7,9,0, + 0,1105,1106,7,2,0,0,1106,296,1,0,0,0,1107,1108,3,47,18,0,1108,1109,1,0, + 0,0,1109,1110,6,143,8,0,1110,298,1,0,0,0,1111,1112,3,49,19,0,1112,1113, + 1,0,0,0,1113,1114,6,144,8,0,1114,300,1,0,0,0,1115,1116,3,51,20,0,1116,1117, + 1,0,0,0,1117,1118,6,145,8,0,1118,302,1,0,0,0,1119,1120,3,161,75,0,1120, + 1121,1,0,0,0,1121,1122,6,146,13,0,1122,1123,6,146,12,0,1123,304,1,0,0,0, + 1124,1125,5,58,0,0,1125,306,1,0,0,0,1126,1132,3,75,32,0,1127,1132,3,65, + 27,0,1128,1132,3,103,46,0,1129,1132,3,67,28,0,1130,1132,3,81,35,0,1131, + 1126,1,0,0,0,1131,1127,1,0,0,0,1131,1128,1,0,0,0,1131,1129,1,0,0,0,1131, + 1130,1,0,0,0,1132,1133,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134, + 308,1,0,0,0,1135,1136,3,47,18,0,1136,1137,1,0,0,0,1137,1138,6,149,8,0,1138, + 310,1,0,0,0,1139,1140,3,49,19,0,1140,1141,1,0,0,0,1141,1142,6,150,8,0,1142, + 312,1,0,0,0,1143,1144,3,51,20,0,1144,1145,1,0,0,0,1145,1146,6,151,8,0,1146, + 314,1,0,0,0,57,0,1,2,3,4,5,6,7,8,9,10,461,471,475,478,487,489,500,541,546, + 555,562,567,569,580,588,591,593,598,603,609,616,621,627,630,638,642,772, + 777,782,784,790,841,846,881,885,890,895,900,902,906,908,985,989,994,1131, + 1133,24,5,2,0,5,4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,5,0,5,9,0,0,1,0,7,63,0,5, + 0,0,7,25,0,4,0,0,7,64,0,7,33,0,7,32,0,7,66,0,7,35,0,7,75,0,5,10,0,5,7,0, + 7,85,0,7,84,0,7,65,0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp index 7c249fbc6e1ff..32e2022ab0849 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.interp +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.interp @@ -1,22 +1,22 @@ token literal names: null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null +'dissect' +'drop' +'enrich' +'eval' +'explain' +'from' +'grok' +'inlinestats' +'keep' +'limit' +'mv_expand' +'rename' +'row' +'show' +'sort' +'stats' +'where' null null null @@ -28,28 +28,28 @@ null null null null -null -null -null +'by' +'and' +'asc' '=' ',' -null +'desc' '.' -null -null -null +'false' +'first' +'last' '(' -null -null -null -null -null -null -null +'in' +'is' +'like' +'not' +'null' +'nulls' +'or' '?' -null +'rlike' ')' -null +'true' '==' '=~' '!=' @@ -69,6 +69,7 @@ null null null null +'metadata' null null null @@ -77,9 +78,12 @@ null null null null +'as' null null null +'on' +'with' null null null @@ -90,12 +94,8 @@ null null null null -null -null -null -null -null -null +'info' +'functions' null null null diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens index ce879aba138b0..fc827c0dfcf8b 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.tokens @@ -103,13 +103,46 @@ SETTING_LINE_COMMENT=102 SETTTING_MULTILINE_COMMENT=103 SETTING_WS=104 UNQUOTED_ID_PATTERN=105 +'dissect'=1 +'drop'=2 +'enrich'=3 +'eval'=4 +'explain'=5 +'from'=6 +'grok'=7 +'inlinestats'=8 +'keep'=9 +'limit'=10 +'mv_expand'=11 +'rename'=12 +'row'=13 +'show'=14 +'sort'=15 +'stats'=16 +'where'=17 '|'=25 +'by'=29 +'and'=30 +'asc'=31 '='=32 ','=33 +'desc'=34 '.'=35 +'false'=36 +'first'=37 +'last'=38 '('=39 +'in'=40 +'is'=41 +'like'=42 +'not'=43 +'null'=44 +'nulls'=45 +'or'=46 '?'=47 +'rlike'=48 ')'=49 +'true'=50 '=='=51 '=~'=52 '!='=53 @@ -123,4 +156,10 @@ UNQUOTED_ID_PATTERN=105 '/'=61 '%'=62 ']'=64 +'metadata'=70 +'as'=79 +'on'=83 +'with'=84 +'info'=95 +'functions'=96 ':'=100 diff --git a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts index 95a5e0a9bc860..954f16ec3d8df 100644 --- a/packages/kbn-monaco/src/esql/antlr/esql_parser.ts +++ b/packages/kbn-monaco/src/esql/antlr/esql_parser.ts @@ -175,57 +175,58 @@ export default class esql_parser extends Parser { public static readonly RULE_showCommand = 48; public static readonly RULE_enrichCommand = 49; public static readonly RULE_enrichWithClause = 50; - public static readonly literalNames: (string | null)[] = [ null, null, + public static readonly literalNames: (string | null)[] = [ null, "'dissect'", + "'drop'", "'enrich'", + "'eval'", "'explain'", + "'from'", "'grok'", + "'inlinestats'", + "'keep'", "'limit'", + "'mv_expand'", + "'rename'", + "'row'", "'show'", + "'sort'", "'stats'", + "'where'", null, null, null, null, null, null, null, + "'|'", null, null, null, + "'by'", "'and'", + "'asc'", "'='", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, "']'", null, null, null, null, + null, "'metadata'", null, null, null, null, null, null, null, null, + "'as'", null, null, null, - null, "'|'", + "'on'", "'with'", null, null, null, null, null, null, - "'='", "','", - null, "'.'", null, null, - null, "'('", null, null, + "'info'", "'functions'", null, null, - null, null, - null, "'?'", - null, "')'", - null, "'=='", - "'=~'", "'!='", - "'<'", "'<='", - "'>'", "'>='", - "'+'", "'-'", - "'*'", "'/'", - "'%'", null, - "']'", null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - "':'" ]; + null, "':'" ]; public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", diff --git a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts index 81ed6dc339a8c..d27dbcdb6c582 100644 --- a/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts +++ b/packages/kbn-monaco/src/esql/lib/ast/validation/validation.test.ts @@ -350,14 +350,14 @@ describe('validation logic', () => { ['eval', 'stats', 'rename', 'limit', 'keep', 'drop', 'mv_expand', 'dissect', 'grok'].map( (command) => testErrorsAndWarnings(command, [ - `SyntaxError: mismatched input '${command}' expecting {EXPLAIN, FROM, ROW, SHOW}`, + `SyntaxError: mismatched input '${command}' expecting {'explain', 'from', 'row', 'show'}`, ]) ); }); describe('from', () => { testErrorsAndWarnings('f', [ - "SyntaxError: mismatched input 'f' expecting {EXPLAIN, FROM, ROW, SHOW}", + "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'row', 'show'}", ]); testErrorsAndWarnings(`from `, [ "SyntaxError: missing {QUOTED_IDENTIFIER, FROM_UNQUOTED_IDENTIFIER} at ''", @@ -445,7 +445,7 @@ describe('validation logic', () => { describe('row', () => { testErrorsAndWarnings('row', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('row missing_column', ['Unknown column [missing_column]']); testErrorsAndWarnings('row fn()', ['Unknown function [fn]']); @@ -474,7 +474,7 @@ describe('validation logic', () => { "SyntaxError: mismatched input '' expecting '('", ]); testErrorsAndWarnings('row var = 1 in (', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Error: [in] function expects exactly 2 arguments, got 1.', ]); testErrorsAndWarnings('row var = 1 not in ', [ @@ -717,16 +717,16 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from index | keep `any#Char$Field`', []); testErrorsAndWarnings('from index | project ', [ - "SyntaxError: mismatched input 'project' expecting {DISSECT, DROP, ENRICH, EVAL, GROK, INLINESTATS, KEEP, LIMIT, MV_EXPAND, RENAME, SORT, STATS, WHERE}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | project stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {DISSECT, DROP, ENRICH, EVAL, GROK, INLINESTATS, KEEP, LIMIT, MV_EXPAND, RENAME, SORT, STATS, WHERE}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | PROJECT stringField, numberField, dateField', [ - "SyntaxError: mismatched input 'PROJECT' expecting {DISSECT, DROP, ENRICH, EVAL, GROK, INLINESTATS, KEEP, LIMIT, MV_EXPAND, RENAME, SORT, STATS, WHERE}", + "SyntaxError: mismatched input 'PROJECT' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | project missingField, numberField, dateField', [ - "SyntaxError: mismatched input 'project' expecting {DISSECT, DROP, ENRICH, EVAL, GROK, INLINESTATS, KEEP, LIMIT, MV_EXPAND, RENAME, SORT, STATS, WHERE}", + "SyntaxError: mismatched input 'project' expecting {'dissect', 'drop', 'enrich', 'eval', 'grok', 'inlinestats', 'keep', 'limit', 'mv_expand', 'rename', 'sort', 'stats', 'where'}", ]); testErrorsAndWarnings('from index | keep s*', []); testErrorsAndWarnings('from index | keep *Field', []); @@ -823,10 +823,10 @@ describe('validation logic', () => { "SyntaxError: mismatched input '' expecting ID_PATTERN", ]); testErrorsAndWarnings('from a_index | rename stringField', [ - "SyntaxError: mismatched input '' expecting AS", + "SyntaxError: mismatched input '' expecting 'as'", ]); testErrorsAndWarnings('from a_index | rename a', [ - "SyntaxError: mismatched input '' expecting AS", + "SyntaxError: mismatched input '' expecting 'as'", 'Unknown column [a]', ]); testErrorsAndWarnings('from a_index | rename stringField as', [ @@ -869,7 +869,7 @@ describe('validation logic', () => { describe('dissect', () => { testErrorsAndWarnings('from a_index | dissect', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | dissect stringField', [ "SyntaxError: missing STRING at ''", @@ -894,7 +894,7 @@ describe('validation logic', () => { "SyntaxError: mismatched input '' expecting '='", ]); testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, NULL, '?', TRUE, '+', '-', OPENING_BRACKET}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', 'null', '?', 'true', '+', '-', OPENING_BRACKET}", 'Invalid option for DISSECT: [option]', ]); testErrorsAndWarnings('from a_index | dissect stringField "%{firstWord}" option = 1', [ @@ -920,7 +920,7 @@ describe('validation logic', () => { describe('grok', () => { testErrorsAndWarnings('from a_index | grok', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | grok stringField', [ "SyntaxError: missing STRING at ''", @@ -993,7 +993,7 @@ describe('validation logic', () => { } for (const wrongOp of ['*', '/', '%']) { testErrorsAndWarnings(`from a_index | where ${wrongOp}+ numberField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, ]); } @@ -1159,7 +1159,7 @@ describe('validation logic', () => { describe('eval', () => { testErrorsAndWarnings('from a_index | eval ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval stringField ', []); testErrorsAndWarnings('from a_index | eval b = stringField', []); @@ -1172,7 +1172,7 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval a=b', ['Unknown column [b]']); testErrorsAndWarnings('from a_index | eval a=b, ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Unknown column [b]', ]); testErrorsAndWarnings('from a_index | eval a=round', ['Unknown column [round]']); @@ -1181,7 +1181,7 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | eval a=round(numberField) ', []); testErrorsAndWarnings('from a_index | eval a=round(numberField), ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(numberField) ', []); testErrorsAndWarnings('from a_index | eval a=round(numberField) + round(stringField) ', [ @@ -1241,7 +1241,7 @@ describe('validation logic', () => { for (const wrongOp of ['*', '/', '%']) { testErrorsAndWarnings(`from a_index | eval ${wrongOp}+ numberField`, [ - `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, + `SyntaxError: extraneous input '${wrongOp}' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}`, ]); } @@ -1592,11 +1592,11 @@ describe('validation logic', () => { [] ); testErrorsAndWarnings('from a_index | eval not', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", 'Error: [not] function expects exactly one argument, got 0.', ]); testErrorsAndWarnings('from a_index | eval in', [ - "SyntaxError: mismatched input 'in' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input 'in' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | eval stringField in stringField', [ @@ -1665,16 +1665,16 @@ describe('validation logic', () => { ]); testErrorsAndWarnings('from a_index | stats by stringField', []); testErrorsAndWarnings('from a_index | stats by ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | stats numberField ', [ 'Expected an aggregate function or group but got [numberField] of type [FieldAttribute]', ]); testErrorsAndWarnings('from a_index | stats numberField=', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | stats numberField=5 by ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | stats avg(numberField) by wrongField', [ 'Unknown column [wrongField]', @@ -2074,19 +2074,19 @@ describe('validation logic', () => { describe('sort', () => { testErrorsAndWarnings('from a_index | sort ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | sort "field" ', []); testErrorsAndWarnings('from a_index | sort wrongField ', ['Unknown column [wrongField]']); testErrorsAndWarnings('from a_index | sort numberField, ', [ - "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, FALSE, '(', NOT, NULL, '?', TRUE, '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", + "SyntaxError: mismatched input '' expecting {STRING, INTEGER_LITERAL, DECIMAL_LITERAL, 'false', '(', 'not', 'null', '?', 'true', '+', '-', OPENING_BRACKET, UNQUOTED_IDENTIFIER, QUOTED_IDENTIFIER}", ]); testErrorsAndWarnings('from a_index | sort numberField, stringField', []); for (const dir of ['desc', 'asc']) { testErrorsAndWarnings(`from a_index | sort "field" ${dir} `, []); testErrorsAndWarnings(`from a_index | sort numberField ${dir} `, []); testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls `, [ - "SyntaxError: missing {FIRST, LAST} at ''", + "SyntaxError: missing {'first', 'last'} at ''", ]); for (const nullDir of ['first', 'last']) { testErrorsAndWarnings(`from a_index | sort numberField ${dir} nulls ${nullDir}`, []);