diff --git a/core/astParser.js b/core/astParser.js deleted file mode 100644 index 878a02c..0000000 --- a/core/astParser.js +++ /dev/null @@ -1,1531 +0,0 @@ -/* - * Generated by PEG.js 0.10.0. - * - * http://pegjs.org/ - */ -(function(root, factory) { - if (typeof define === "function" && define.amd) { - define([], factory); - } else if (typeof module === "object" && module.exports) { - module.exports = factory(); - } -})(this, function() { - "use strict"; - - function peg$subclass(child, parent) { - function ctor() { this.constructor = child; } - ctor.prototype = parent.prototype; - child.prototype = new ctor(); - } - - function peg$SyntaxError(message, expected, found, location) { - this.message = message; - this.expected = expected; - this.found = found; - this.location = location; - this.name = "SyntaxError"; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, peg$SyntaxError); - } - } - - peg$subclass(peg$SyntaxError, Error); - - peg$SyntaxError.buildMessage = function(expected, found) { - var DESCRIBE_EXPECTATION_FNS = { - literal: function(expectation) { - return "\"" + literalEscape(expectation.text) + "\""; - }, - - "class": function(expectation) { - var escapedParts = "", - i; - - for (i = 0; i < expectation.parts.length; i++) { - escapedParts += expectation.parts[i] instanceof Array - ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) - : classEscape(expectation.parts[i]); - } - - return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; - }, - - any: function(expectation) { - return "any character"; - }, - - end: function(expectation) { - return "end of input"; - }, - - other: function(expectation) { - return expectation.description; - } - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function literalEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } - - function classEscape(s) { - return s - .replace(/\\/g, '\\\\') - .replace(/\]/g, '\\]') - .replace(/\^/g, '\\^') - .replace(/-/g, '\\-') - .replace(/\0/g, '\\0') - .replace(/\t/g, '\\t') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) - .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); - } - - function describeExpectation(expectation) { - return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); - } - - function describeExpected(expected) { - var descriptions = new Array(expected.length), - i, j; - - for (i = 0; i < expected.length; i++) { - descriptions[i] = describeExpectation(expected[i]); - } - - descriptions.sort(); - - if (descriptions.length > 0) { - for (i = 1, j = 1; i < descriptions.length; i++) { - if (descriptions[i - 1] !== descriptions[i]) { - descriptions[j] = descriptions[i]; - j++; - } - } - descriptions.length = j; - } - - switch (descriptions.length) { - case 1: - return descriptions[0]; - - case 2: - return descriptions[0] + " or " + descriptions[1]; - - default: - return descriptions.slice(0, -1).join(", ") - + ", or " - + descriptions[descriptions.length - 1]; - } - } - - function describeFound(found) { - return found ? "\"" + literalEscape(found) + "\"" : "end of input"; - } - - return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; - }; - - function peg$parse(input, options) { - options = options !== void 0 ? options : {}; - - var peg$FAILED = {}, - - peg$startRuleIndices = { start: 0 }, - peg$startRuleIndex = 0, - - peg$consts = [ - function(ast) { - return { - ast : ast, - param : params - } - }, - function(ast) { - return { - ast : ast - } - }, - function() { params = []; return true; }, - function(head, tail) { - var cur = head; - for (var i = 0; i < tail.length; i++) { - cur._next = tail[i][3]; - cur = cur._next - } - return head; - }, - "(", - peg$literalExpectation("(", false), - ")", - peg$literalExpectation(")", false), - function(s) { - return s[2]; - }, - function(d, c, f, w, g, o, l) { - return { - type : 'select', - distinct : d, - columns : c, - from : f, - where : w, - groupby : g, - orderby : o, - limit : l - } - }, - function() { - return '*'; - }, - function(head, tail) { - return createList(head, tail); - }, - function(e, alias) { - return { - expr : e, - as : alias - }; - }, - function(i) { return i; }, - function(l) { return l; }, - function(head, tail) { - tail.unshift(head); - return tail; - }, - function(t) { return t; }, - function(op, t, expr) { - t.join = op; - t.on = expr; - return t; - /* - return { - db : t.db, - table : t.table, - as : t.as, - join : op, - on : expr - } - */ - }, - function(t, alias) { - if (t.type == 'var') { - t.as = alias; - return t; - } else { - return { - db : t.db, - table : t.table, - as : alias - } - } - }, - function() { return 'LEFT JOIN'; }, - function() { return 'INNER JOIN'; }, - function(dt, tail) { - var obj = { - db : '', - table : dt - } - if (tail) { - obj.db = dt; - obj.table = tail[3]; - } - return obj; - }, - function(v) { - v.db = ''; - v.table = v.name; - return v; - }, - function(e) { return e; }, - function(e, d) { - var obj = { - expr : e, - type : 'ASC' - } - if (d == 'DESC') { - obj.type = 'DESC'; - } - return obj; - }, - function(i1, tail) { - var res = [i1]; - if (tail == '') { - res.unshift({ - type : 'number', - value : 0 - }); - } else { - res.push(tail[2]); - } - return res; - }, - function(t, l, w) { - return { - type : 'update', - db : t.db, - table : t.table, - set : l, - where : w - } - }, - "=", - peg$literalExpectation("=", false), - function(c, v) { - return { - column: c, - value : v - } - }, - function(ri, t, c, v) { - return { - type : ri, - db : t.db, - table : t.table, - columns : c, - values : v - } - }, - function() { return 'insert'; }, - function() { return 'replace' }, - function(l) { - return l; - }, - function(head, tail) { - var el = { - type : 'expr_list' - } - var l = createExprList(head, tail, el); - - el.value = l; - return el; - }, - function() { - return { - type : 'expr_list', - value : [] - } - }, - function(head, tail) { - return createBinaryExprChain(head, tail); - }, - "!", - peg$literalExpectation("!", false), - function(expr) { - return createUnaryExpr('NOT', expr); - }, - function(left, rh) { - if (rh == '') { - return left; - } else { - var res = null; - if (rh.type == 'arithmetic') { - res = createBinaryExprChain(left, rh.tail); - } else { - res = createBinaryExpr(rh.op, left, rh.right); - } - return res; - } - }, - function(l) { - return { - type : 'arithmetic', - tail : l - } - }, - ">=", - peg$literalExpectation(">=", false), - ">", - peg$literalExpectation(">", false), - "<=", - peg$literalExpectation("<=", false), - "<>", - peg$literalExpectation("<>", false), - "<", - peg$literalExpectation("<", false), - "!=", - peg$literalExpectation("!=", false), - function(op, right) { - return { - op : op, - right : right - } - }, - function(op, begin, end) { - return { - op : op, - right : { - type : 'expr_list', - value : [begin, end] - } - } - }, - function(nk) { return nk[0] + ' ' + nk[2]; }, - function(op, right) { - return { - op : op, - right : right - } - }, - function(op, l) { - return { - op : op, - right : l - } - }, - function(op, e) { - return { - op : op, - right : e - } - }, - "+", - peg$literalExpectation("+", false), - "-", - peg$literalExpectation("-", false), - function(head, tail) { - return createBinaryExprChain(head, tail) - }, - "*", - peg$literalExpectation("*", false), - "/", - peg$literalExpectation("/", false), - "%", - peg$literalExpectation("%", false), - function(e) { - e.paren = true; - return e; - }, - function(tbl, col) { - return { - type : 'column_ref', - table : tbl, - column : col - }; - }, - function(col) { - return { - type : 'column_ref', - table : '', - column: col - }; - }, - function(name) { return reservedMap[name.toUpperCase()] === true; }, - function(name) { - return name; - }, - "`", - peg$literalExpectation("`", false), - /^[^`]/, - peg$classExpectation(["`"], true, false), - function(chars) { - return chars.join(''); - }, - function(start, parts) { return start + parts.join(''); }, - /^[A-Za-z_]/, - peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false), - /^[A-Za-z0-9_]/, - peg$classExpectation([["A", "Z"], ["a", "z"], ["0", "9"], "_"], false, false), - /^[A-Za-z0-9_:]/, - peg$classExpectation([["A", "Z"], ["a", "z"], ["0", "9"], "_", ":"], false, false), - ":", - peg$literalExpectation(":", false), - function(l) { - var p = { - type : 'param', - value: l[1] - } - //var key = 'L' + line + 'C' + column; - //debug(key); - //params[key] = p; - params.push(p); - return p; - }, - function(name, e) { - return { - type : 'aggr_func', - name : name, - args : { - expr : e - } - } - }, - function(name, arg) { - return { - type : 'aggr_func', - name : name, - args : arg - } - }, - function(e) { - return { - expr : e - } - }, - function(d, c) { - return { - distinct : d, - expr : c - } - }, - function() { - return { - type : 'star', - value : '*' - } - }, - function(name, l) { - return { - type : 'function', - name : name, - args : l - } - }, - function(head, tail) { - return createList(head, tail); - }, - function() { - return { - type : 'null', - value : null - }; - }, - function() { - return { - type : 'bool', - value : true - }; - }, - function() { - return { - type : 'bool', - value : false - }; - }, - "\"", - peg$literalExpectation("\"", false), - "'", - peg$literalExpectation("'", false), - function(ca) { - return { - type : 'string', - value : ca[1].join('') - } - }, - /^[^'\\\0-\x1F\x7F]/, - peg$classExpectation(["'", "\\", ["\0", "\x1F"], "\x7F"], true, false), - /^[^"\\\0-\x1F\x7F]/, - peg$classExpectation(["\"", "\\", ["\0", "\x1F"], "\x7F"], true, false), - "\\'", - peg$literalExpectation("\\'", false), - function() { return "'"; }, - "\\\"", - peg$literalExpectation("\\\"", false), - function() { return '"'; }, - "\\\\", - peg$literalExpectation("\\\\", false), - function() { return "\\"; }, - "\\/", - peg$literalExpectation("\\/", false), - function() { return "/"; }, - "\\b", - peg$literalExpectation("\\b", false), - function() { return "\b"; }, - "\\f", - peg$literalExpectation("\\f", false), - function() { return "\f"; }, - "\\n", - peg$literalExpectation("\\n", false), - function() { return "\n"; }, - "\\r", - peg$literalExpectation("\\r", false), - function() { return "\r"; }, - "\\t", - peg$literalExpectation("\\t", false), - function() { return "\t"; }, - "\\u", - peg$literalExpectation("\\u", false), - function(h1, h2, h3, h4) { - return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); - }, - /^[\n\r]/, - peg$classExpectation(["\n", "\r"], false, false), - function(n) { - return { - type : 'number', - value : n - } - }, - function(int_, frac, exp) { return parseFloat(int_ + frac + exp); }, - function(int_, frac) { return parseFloat(int_ + frac); }, - function(int_, exp) { return parseFloat(int_ + exp); }, - function(int_) { return parseFloat(int_); }, - function(digit19, digits) { return digit19 + digits; }, - function(op, digit19, digits) { return "-" + digit19 + digits; }, - function(op, digit) { return "-" + digit; }, - ".", - peg$literalExpectation(".", false), - function(digits) { return "." + digits; }, - function(e, digits) { return e + digits; }, - function(digits) { return digits.join(""); }, - /^[0-9]/, - peg$classExpectation([["0", "9"]], false, false), - /^[1-9]/, - peg$classExpectation([["1", "9"]], false, false), - /^[0-9a-fA-F]/, - peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false), - /^[eE]/, - peg$classExpectation(["e", "E"], false, false), - /^[+\-]/, - peg$classExpectation(["+", "-"], false, false), - function(e, sign) { return e + sign; }, - "null", - peg$literalExpectation("NULL", true), - "true", - peg$literalExpectation("TRUE", true), - "false", - peg$literalExpectation("FALSE", true), - "show", - peg$literalExpectation("SHOW", true), - "drop", - peg$literalExpectation("DROP", true), - "select", - peg$literalExpectation("SELECT", true), - "update", - peg$literalExpectation("UPDATE", true), - "create", - peg$literalExpectation("CREATE", true), - "delete", - peg$literalExpectation("DELETE", true), - "insert", - peg$literalExpectation("INSERT", true), - "replace", - peg$literalExpectation("REPLACE", true), - "explain", - peg$literalExpectation("EXPLAIN", true), - "into", - peg$literalExpectation("INTO", true), - "from", - peg$literalExpectation("FROM", true), - "set", - peg$literalExpectation("SET", true), - "as", - peg$literalExpectation("AS", true), - "table", - peg$literalExpectation("TABLE", true), - "on", - peg$literalExpectation("ON", true), - "left", - peg$literalExpectation("LEFT", true), - "inner", - peg$literalExpectation("INNER", true), - "join", - peg$literalExpectation("JOIN", true), - "union", - peg$literalExpectation("UNION", true), - "values", - peg$literalExpectation("VALUES", true), - "exists", - peg$literalExpectation("EXISTS", true), - "where", - peg$literalExpectation("WHERE", true), - "group", - peg$literalExpectation("GROUP", true), - "by", - peg$literalExpectation("BY", true), - "order", - peg$literalExpectation("ORDER", true), - "having", - peg$literalExpectation("HAVING", true), - "limit", - peg$literalExpectation("LIMIT", true), - "asc", - peg$literalExpectation("ASC", true), - function() { return 'ASC'; }, - "desc", - peg$literalExpectation("DESC", true), - function() { return 'DESC'; }, - "all", - peg$literalExpectation("ALL", true), - function() { return 'ALL'; }, - "distinct", - peg$literalExpectation("DISTINCT", true), - function() { return 'DISTINCT';}, - "between", - peg$literalExpectation("BETWEEN", true), - function() { return 'BETWEEN'; }, - "in", - peg$literalExpectation("IN", true), - function() { return 'IN'; }, - "is", - peg$literalExpectation("IS", true), - function() { return 'IS'; }, - "like", - peg$literalExpectation("LIKE", true), - function() { return 'LIKE'; }, - "contains", - peg$literalExpectation("CONTAINS", true), - function() { return 'CONTAINS';}, - "not", - peg$literalExpectation("NOT", true), - function() { return 'NOT'; }, - "and", - peg$literalExpectation("AND", true), - function() { return 'AND'; }, - "or", - peg$literalExpectation("OR", true), - function() { return 'OR'; }, - "count", - peg$literalExpectation("COUNT", true), - function() { return 'COUNT'; }, - "max", - peg$literalExpectation("MAX", true), - function() { return 'MAX'; }, - "min", - peg$literalExpectation("MIN", true), - function() { return 'MIN'; }, - "sum", - peg$literalExpectation("SUM", true), - function() { return 'SUM'; }, - "avg", - peg$literalExpectation("AVG", true), - function() { return 'AVG'; }, - ",", - peg$literalExpectation(",", false), - "[", - peg$literalExpectation("[", false), - "]", - peg$literalExpectation("]", false), - peg$anyExpectation(), - /^[ \t\n\r]/, - peg$classExpectation([" ", "\t", "\n", "\r"], false, false), - function(s) { - return { - stmt : s, - vars: varList - } - }, - function() { varList = []; return true; }, - function(va, e) { - return { - type : 'assign', - left : va, - right: e - } - }, - function(e) { - return { - type : 'return', - expr: e - } - }, - function(lt, op, rt, expr) { - return { - type : 'join', - ltable : lt, - rtable : rt, - op : op, - on : expr - } - }, - function(name, l) { - //compatible with original func_call - return { - type : 'function', - name : name, - args : { - type : 'expr_list', - value : l - } - } - }, - function(l) { - return { - type : 'array', - value : l - } - }, - function(name, m) { - //push for analysis - varList.push(name); - return { - type : 'var', - name : name, - members : m - } - }, - function(l) { - var s = []; - for (var i = 0; i < l.length; i++) { - s.push(l[i][1]); - } - return s; - }, - "$", - peg$literalExpectation("$", false), - "return", - peg$literalExpectation("return", true), - ":=", - peg$literalExpectation(":=", false) - ], - - peg$bytecode = [ - peg$decode("%%<;!=/##&'!&/F#;\xB1/=$;\".) &;9.# &;($8#: #! )(#'#(\"'#&'#./ &%;\xB6/' 8!:!!! )"), - peg$decode("9:\" -\"\"&!"), - peg$decode("%;#/\x83#$%;\xB1/>#;\x90/5$;\xB1/,$;#/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\x90/5$;\xB1/,$;#/#$+$)($'#(#'#(\"'#&'#&/)$8\":#\"\"! )(\"'#&'#"), - peg$decode(";$.i &%%2$\"\"6$7%/M#;\xB1/D$;#/;$;\xB1/2$2&\"\"6&7'/#$+%)(%'#($'#(#'#(\"'#&'#/' 8!:(!! )"), - peg$decode("%;\x80/\xCA#;\xB1/\xC1$;\x9C.\" &\"/\xB3$;\xB1/\xAA$;%/\xA1$;\xB1/\x98$;(.\" &\"/\x8A$;\xB1/\x81$;0.\" &\"/s$;\xB1/j$;1.\" &\"/\\$;\xB1/S$;4.\" &\"/E$;\xB1/<$;8.\" &\"/.$8/:)/',*(&$\" )(/'#(.'#(-'#(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\x9B.B &%;\xAC/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#/& 8!:*! ).\x8D &%;&/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;&/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;&/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;R/@#;\xB1/7$;'.\" &\"/)$8#:,#\"\" )(#'#(\"'#&'#"), - peg$decode("%;\x8A.\" &\"/:#;\xB1/1$;Y/($8#:-#! )(#'#(\"'#&'#"), - peg$decode("%;\x88/:#;\xB1/1$;)/($8#:.#! )(#'#(\"'#&'#"), - peg$decode("%;,/9#$;*0#*;*&/)$8\":/\"\"! )(\"'#&'#"), - peg$decode("%;\xB1/C#;\xAB/:$;\xB1/1$;,/($8$:0$! )($'#(#'#(\"'#&'#.; &%;\xB1/1#;+/($8\":0\"! )(\"'#&'#"), - peg$decode("%;-/S#;\xB1/J$;,/A$;\xB1/8$;/.\" &\"/*$8%:1%#$\" )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;./W#;\xB1/N$;\x8A.\" &\"/@$;\xB1/7$;Y.\" &\"/)$8%:2%\"$ )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\x8D/9#;\xB1/0$;\x8F/'$8#:3# )(#'#(\"'#&'#.R &%%;\x8E/,#;\xB1/#$+\")(\"'#&'#.\" &\"/0#;\x8F/'$8\":4\" )(\"'#&'#"), - peg$decode("%;Y/\\#%;\xB1/>#;\xAA/5$;\xB1/,$;\\/#$+$)($'#(#'#(\"'#&'#.\" &\"/)$8\":5\"\"! )(\"'#&'#./ &%;\xC3/' 8!:6!! )"), - peg$decode("%;\x8C/:#;\xB1/1$;C/($8#:7#! )(#'#(\"'#&'#"), - peg$decode("%;\x93/:#;\xB1/1$;C/($8#:7#! )(#'#(\"'#&'#"), - peg$decode("%;\x94/L#;\xB1/C$;\x95/:$;\xB1/1$;2/($8%:.%! )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;W/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;W/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;W/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;\x97/1#;C/($8\":7\"! )(\"'#&'#"), - peg$decode("%;\x96/L#;\xB1/C$;\x95/:$;\xB1/1$;5/($8%:.%! )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;6/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;6/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;6/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;C/F#;\xB1/=$;\x9A.# &;\x99.\" &\"/)$8#:8#\"\" )(#'#(\"'#&'#"), - peg$decode(";q.# &;`"), - peg$decode("%;\x98/n#;\xB1/e$;7/\\$;\xB1/S$%;\xAB/5#;\xB1/,$;7/#$+#)(#'#(\"'#&'#.\" &\"/)$8%:9%\"\" )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\x81/r#;\xB1/i$;./`$;\xB1/W$;\x89/N$;\xB1/E$;:/<$;\xB1/3$;0/*$8)::)#&\" )()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;;/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;;/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;;/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;[/S#;\xB1/J$2;\"\"6;7;$;\xB1/2$;R/)$8%:=%\"$ )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;=/\x97#;\xB1/\x8E$;\x87/\x85$;\xB1/|$;./s$;\xB1/j$;\xAD/a$;\xB1/X$;X/O$;\xB1/F$;\xAE/=$;\xB1/4$;>/+$8-:>-$,($ )(-'#(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\x84/& 8!:?! ).. &%;\x85/& 8!:@! )"), - peg$decode("%;\x91/:#;\xB1/1$;?/($8#:.#! )(#'#(\"'#&'#"), - peg$decode("%;@/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;@/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;@/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;\xAD/L#;\xB1/C$;A/:$;\xB1/1$;\xAE/($8%:A%!\")(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;C/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;C/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;C/#$+$)($'#(#'#(\"'#&'#&/)$8\":B\"\"! )(\"'#&'#"), - peg$decode(";A.- &9:C -\"\"&!"), - peg$decode("%;D/\x83#$%;\xB1/>#;\xA4/5$;\xB1/,$;D/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xA4/5$;\xB1/,$;D/#$+$)($'#(#'#(\"'#&'#&/)$8\":D\"\"! )(\"'#&'#"), - peg$decode("%;E/\x83#$%;\xB1/>#;\xA3/5$;\xB1/,$;E/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xA3/5$;\xB1/,$;E/#$+$)($'#(#'#(\"'#&'#&/)$8\":D\"\"! )(\"'#&'#"), - peg$decode("%;\xA2.N &%2E\"\"6E7F/>#%<2;\"\"6;7<=.##&&!&'#/#$+\")(\"'#&'#/:#;\xB1/1$;E/($8#:G#! )(#'#(\"'#&'#.# &;F"), - peg$decode("%;R/@#;\xB1/7$;G.\" &\"/)$8#:H#\"\" )(#'#(\"'#&'#"), - peg$decode(";H.; &;P.5 &;K./ &;J.) &;O.# &;Q"), - peg$decode("%$%;\xB1/>#;I/5$;\xB1/,$;R/#$+$)($'#(#'#(\"'#&'#/K#0H*%;\xB1/>#;I/5$;\xB1/,$;R/#$+$)($'#(#'#(\"'#&'#&&/' 8!:I!! )"), - peg$decode("2J\"\"6J7K.e &2L\"\"6L7M.Y &2N\"\"6N7O.M &2P\"\"6P7Q.A &2R\"\"6R7S.5 &2;\"\"6;7<.) &2T\"\"6T7U"), - peg$decode("%;\x9F/;#;\xB1/2$;R/)$8#:V#\"\" )(#'#(\"'#&'#"), - peg$decode("%;\x9D/`#;\xB1/W$;R/N$;\xB1/E$;\xA3/<$;\xB1/3$;R/*$8':W'#&$ )(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%%;\xA2/5#;\xB1/,$;\xA0/#$+#)(#'#(\"'#&'#/' 8!:X!! ).# &;\xA0"), - peg$decode("%%;\xA2/5#;\xB1/,$;\x9E/#$+#)(#'#(\"'#&'#/' 8!:X!! ).# &;\x9E"), - peg$decode("%%;\xA2/5#;\xB1/,$;\xA1/#$+#)(#'#(\"'#&'#/' 8!:X!! ).# &;\xA1"), - peg$decode("%;L/;#;\xB1/2$;F/)$8#:Y#\"\" )(#'#(\"'#&'#"), - peg$decode("%;M/_#;\xB1/V$;\xAD/M$;\xB1/D$;A/;$;\xB1/2$;\xAE/)$8':Z'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#.E &%;M/;#;\xB1/2$;\xC3/)$8#:[#\"\" )(#'#(\"'#&'#"), - peg$decode("%;N/_#;\xB1/V$;\xAD/M$;\xB1/D$;A/;$;\xB1/2$;\xAE/)$8':Z'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#.E &%;N/;#;\xB1/2$;\xC3/)$8#:[#\"\" )(#'#(\"'#&'#"), - peg$decode("%;T/\x83#$%;\xB1/>#;S/5$;\xB1/,$;T/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;S/5$;\xB1/,$;T/#$+$)($'#(#'#(\"'#&'#&/)$8\":D\"\"! )(\"'#&'#"), - peg$decode("2\\\"\"6\\7].) &2^\"\"6^7_"), - peg$decode("%;V/\x83#$%;\xB1/>#;U/5$;\xB1/,$;V/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;U/5$;\xB1/,$;V/#$+$)($'#(#'#(\"'#&'#&/)$8\":`\"\"! )(\"'#&'#"), - peg$decode("2a\"\"6a7b.5 &2c\"\"6c7d.) &2e\"\"6e7f"), - peg$decode(";h.t &;a.n &;g.h &;W.b &;`.\\ &%;\xAD/L#;\xB1/C$;C/:$;\xB1/1$;\xAE/($8%:g%!\")(%'#($'#(#'#(\"'#&'#.# &;\xC3"), - peg$decode("%;Y/M#;\xB1/D$;\xAA/;$;\xB1/2$;Z/)$8%:h%\"$ )(%'#($'#(#'#(\"'#&'#./ &%;Z/' 8!:i!! )"), - peg$decode("%;Z/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;Z/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;Z/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;\\/<#9:j ! -\"\"&!/($8\":k\"!!)(\"'#&'#"), - peg$decode("%;[/<#9:j ! -\"\"&!/($8\":k\"!!)(\"'#&'#.i &%2l\"\"6l7m/Y#$4n\"\"5!7o/,#0)*4n\"\"5!7o&&/7$2l\"\"6l7m/($8#:p#!!)(#'#(\"'#&'#"), - peg$decode("%;]/9#$;_0#*;_&/)$8\":q\"\"! )(\"'#&'#"), - peg$decode("%;]/9#$;^0#*;^&/)$8\":q\"\"! )(\"'#&'#"), - peg$decode("4r\"\"5!7s"), - peg$decode("4t\"\"5!7u"), - peg$decode("4v\"\"5!7w"), - peg$decode("%%2x\"\"6x7y/,#;\\/#$+\")(\"'#&'#/' 8!:z!! )"), - peg$decode(";d.# &;b"), - peg$decode("%;c/_#;\xB1/V$;\xAD/M$;\xB1/D$;R/;$;\xB1/2$;\xAE/)$8':{'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode(";\xA8./ &;\xA6.) &;\xA7.# &;\xA9"), - peg$decode("%;\xA5/_#;\xB1/V$;\xAD/M$;\xB1/D$;e/;$;\xB1/2$;\xAE/)$8':|'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;f/' 8!:}!! ).J &%;\x9C.\" &\"/;#;\xB1/2$;W/)$8#:~#\"\" )(#'#(\"'#&'#"), - peg$decode("%2a\"\"6a7b/& 8!:\x7F! )"), - peg$decode("%;Y/_#;\xB1/V$;\xAD/M$;\xB1/D$;B/;$;\xB1/2$;\xAE/)$8':\x80'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode(";l./ &;q.) &;k.# &;j"), - peg$decode("%;h/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;h/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;h/#$+$)($'#(#'#(\"'#&'#&/)$8\":\x81\"\"! )(\"'#&'#"), - peg$decode("%;{/& 8!:\x82! )"), - peg$decode("%;|/& 8!:\x83! ).. &%;}/& 8!:\x84! )"), - peg$decode("%%2\x85\"\"6\x857\x86/B#$;n0#*;n&/2$2\x85\"\"6\x857\x86/#$+#)(#'#(\"'#&'#.R &%2\x87\"\"6\x877\x88/B#$;m0#*;m&/2$2\x87\"\"6\x877\x88/#$+#)(#'#(\"'#&'#/' 8!:\x89!! )"), - peg$decode("4\x8A\"\"5!7\x8B.# &;o"), - peg$decode("4\x8C\"\"5!7\x8D.# &;o"), - peg$decode("%2\x8E\"\"6\x8E7\x8F/& 8!:\x90! ).\u0117 &%2\x91\"\"6\x917\x92/& 8!:\x93! ).\u0100 &%2\x94\"\"6\x947\x95/& 8!:\x96! ).\xE9 &%2\x97\"\"6\x977\x98/& 8!:\x99! ).\xD2 &%2\x9A\"\"6\x9A7\x9B/& 8!:\x9C! ).\xBB &%2\x9D\"\"6\x9D7\x9E/& 8!:\x9F! ).\xA4 &%2\xA0\"\"6\xA07\xA1/& 8!:\xA2! ).\x8D &%2\xA3\"\"6\xA37\xA4/& 8!:\xA5! ).v &%2\xA6\"\"6\xA67\xA7/& 8!:\xA8! )._ &%2\xA9\"\"6\xA97\xAA/O#;y/F$;y/=$;y/4$;y/+$8%:\xAB%$#\"! )(%'#($'#(#'#(\"'#&'#"), - peg$decode("4\xAC\"\"5!7\xAD"), - peg$decode("%;r/' 8!:\xAE!! )"), - peg$decode("%;s/E#;t/<$;u/3$;\xB1/*$8$:\xAF$##\"!)($'#(#'#(\"'#&'#.\x8B &%;s/;#;t/2$;\xB1/)$8#:\xB0#\"\"!)(#'#(\"'#&'#.c &%;s/;#;u/2$;\xB1/)$8#:\xB1#\"\"!)(#'#(\"'#&'#.; &%;s/1#;\xB1/($8\":\xB2\"!!)(\"'#&'#"), - peg$decode("%;x/2#;v/)$8\":\xB3\"\"! )(\"'#&'#.\x8F &;w.\x89 &%2^\"\"6^7_.) &2\\\"\"6\\7]/<#;x/3$;v/*$8#:\xB4##\"! )(#'#(\"'#&'#.N &%2^\"\"6^7_.) &2\\\"\"6\\7]/2#;w/)$8\":\xB5\"\"! )(\"'#&'#"), - peg$decode("%2\xB6\"\"6\xB67\xB7/1#;v/($8\":\xB8\"! )(\"'#&'#"), - peg$decode("%;z/2#;v/)$8\":\xB9\"\"! )(\"'#&'#"), - peg$decode("%$;w/#*;w&&/' 8!:\xBA!! )"), - peg$decode("4\xBB\"\"5!7\xBC"), - peg$decode("4\xBD\"\"5!7\xBE"), - peg$decode("4\xBF\"\"5!7\xC0"), - peg$decode("%4\xC1\"\"5!7\xC2/=#4\xC3\"\"5!7\xC4.\" &\"/)$8\":\xC5\"\"! )(\"'#&'#"), - peg$decode("%3\xC6\"\"5$7\xC7/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xC8\"\"5$7\xC9/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xCA\"\"5%7\xCB/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xCC\"\"5$7\xCD/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xCE\"\"5$7\xCF/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xD0\"\"5&7\xD1/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xD2\"\"5&7\xD3/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xD4\"\"5&7\xD5/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xD6\"\"5&7\xD7/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xD8\"\"5&7\xD9/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xDA\"\"5'7\xDB/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xDC\"\"5'7\xDD/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xDE\"\"5$7\xDF/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xE0\"\"5$7\xE1/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xE2\"\"5#7\xE3/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xE4\"\"5\"7\xE5/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xE6\"\"5%7\xE7/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xE8\"\"5\"7\xE9/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xEA\"\"5$7\xEB/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xEC\"\"5%7\xED/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xEE\"\"5$7\xEF/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xF0\"\"5%7\xF1/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xF2\"\"5&7\xF3/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xF4\"\"5&7\xF5/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xF6\"\"5%7\xF7/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xF8\"\"5%7\xF9/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xFA\"\"5\"7\xFB/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xFC\"\"5%7\xFD/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\xFE\"\"5&7\xFF/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\u0100\"\"5%7\u0101/8#%<;]=.##&&!&'#/#$+\")(\"'#&'#"), - peg$decode("%3\u0102\"\"5#7\u0103/<#%<;]=.##&&!&'#/'$8\":\u0104\" )(\"'#&'#"), - peg$decode("%3\u0105\"\"5$7\u0106/<#%<;]=.##&&!&'#/'$8\":\u0107\" )(\"'#&'#"), - peg$decode("%3\u0108\"\"5#7\u0109/<#%<;]=.##&&!&'#/'$8\":\u010A\" )(\"'#&'#"), - peg$decode("%3\u010B\"\"5(7\u010C/<#%<;]=.##&&!&'#/'$8\":\u010D\" )(\"'#&'#"), - peg$decode("%3\u010E\"\"5'7\u010F/<#%<;]=.##&&!&'#/'$8\":\u0110\" )(\"'#&'#"), - peg$decode("%3\u0111\"\"5\"7\u0112/<#%<;]=.##&&!&'#/'$8\":\u0113\" )(\"'#&'#"), - peg$decode("%3\u0114\"\"5\"7\u0115/<#%<;]=.##&&!&'#/'$8\":\u0116\" )(\"'#&'#"), - peg$decode("%3\u0117\"\"5$7\u0118/<#%<;]=.##&&!&'#/'$8\":\u0119\" )(\"'#&'#"), - peg$decode("%3\u011A\"\"5(7\u011B/<#%<;]=.##&&!&'#/'$8\":\u011C\" )(\"'#&'#"), - peg$decode("%3\u011D\"\"5#7\u011E/<#%<;]=.##&&!&'#/'$8\":\u011F\" )(\"'#&'#"), - peg$decode("%3\u0120\"\"5#7\u0121/<#%<;]=.##&&!&'#/'$8\":\u0122\" )(\"'#&'#"), - peg$decode("%3\u0123\"\"5\"7\u0124/<#%<;]=.##&&!&'#/'$8\":\u0125\" )(\"'#&'#"), - peg$decode("%3\u0126\"\"5%7\u0127/<#%<;]=.##&&!&'#/'$8\":\u0128\" )(\"'#&'#"), - peg$decode("%3\u0129\"\"5#7\u012A/<#%<;]=.##&&!&'#/'$8\":\u012B\" )(\"'#&'#"), - peg$decode("%3\u012C\"\"5#7\u012D/<#%<;]=.##&&!&'#/'$8\":\u012E\" )(\"'#&'#"), - peg$decode("%3\u012F\"\"5#7\u0130/<#%<;]=.##&&!&'#/'$8\":\u0131\" )(\"'#&'#"), - peg$decode("%3\u0132\"\"5#7\u0133/<#%<;]=.##&&!&'#/'$8\":\u0134\" )(\"'#&'#"), - peg$decode("2\xB6\"\"6\xB67\xB7"), - peg$decode("2\u0135\"\"6\u01357\u0136"), - peg$decode("2a\"\"6a7b"), - peg$decode("2$\"\"6$7%"), - peg$decode("2&\"\"6&7'"), - peg$decode("2\u0137\"\"6\u01377\u0138"), - peg$decode("2\u0139\"\"6\u01397\u013A"), - peg$decode("$;\xB30#*;\xB3&"), - peg$decode("1\"\"5!7\u013B"), - peg$decode("4\u013C\"\"5!7\u013D"), - peg$decode(";\xB5.< &$4\xAC\"\"5!7\xAD/,#0)*4\xAC\"\"5!7\xAD&&"), - peg$decode("%<1\"\"5!7\u013B=.##&&!&'#"), - peg$decode("$;\xB70#*;\xB7&"), - peg$decode("%%<;\xB8=/##&'!&/@#;\xB1/7$;\xB9.# &;\xBA/($8#:\u013E#! )(#'#(\"'#&'#"), - peg$decode("9:\u013F -\"\"&!"), - peg$decode("%;\xC3/M#;\xB1/D$;\xC7/;$;\xB1/2$;\xBB/)$8%:\u0140%\"$ )(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\xC6/:#;\xB1/1$;\xBB/($8#:\u0141#! )(#'#(\"'#&'#"), - peg$decode(";#./ &;\xBE.) &;\xBC.# &;\xC2"), - peg$decode("%;\xBD/\x83#$%;\xB1/>#;S/5$;\xB1/,$;\xBD/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;S/5$;\xB1/,$;\xBD/#$+$)($'#(#'#(\"'#&'#&/)$8\":D\"\"! )(\"'#&'#"), - peg$decode("%;\xBF/\x83#$%;\xB1/>#;U/5$;\xB1/,$;\xBF/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;U/5$;\xB1/,$;\xBF/#$+$)($'#(#'#(\"'#&'#&/)$8\":D\"\"! )(\"'#&'#"), - peg$decode("%;\xC3/a#;\xB1/X$;-/O$;\xB1/F$;\xC3/=$;\xB1/4$;//+$8':\u0142'$&$\" )(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode(";h.h &;\xC3.b &;\xC0.\\ &;`.V &%;\xAD/L#;\xB1/C$;\xBC/:$;\xB1/1$;\xAE/($8%:g%!\")(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;Y/_#;\xB1/V$;\xAD/M$;\xB1/D$;\xC1/;$;\xB1/2$;\xAE/)$8':\u0143'\"&\")(''#(&'#(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\xBF/\x83#$%;\xB1/>#;\xAB/5$;\xB1/,$;\xBF/#$+$)($'#(#'#(\"'#&'#0H*%;\xB1/>#;\xAB/5$;\xB1/,$;\xBF/#$+$)($'#(#'#(\"'#&'#&/)$8\":+\"\"! )(\"'#&'#"), - peg$decode("%;\xAF/L#;\xB1/C$;\xC1/:$;\xB1/1$;\xB0/($8%:\u0144%!\")(%'#($'#(#'#(\"'#&'#"), - peg$decode("%;\xC5/;#;\\/2$;\xC4/)$8#:\u0145#\"! )(#'#(\"'#&'#"), - peg$decode("%$%2\xB6\"\"6\xB67\xB7/,#;\\/#$+\")(\"'#&'#0<*%2\xB6\"\"6\xB67\xB7/,#;\\/#$+\")(\"'#&'#&/' 8!:\u0146!! )"), - peg$decode("2\u0147\"\"6\u01477\u0148"), - peg$decode("3\u0149\"\"5&7\u014A"), - peg$decode("2\u014B\"\"6\u014B7\u014C") - ], - - peg$currPos = 0, - peg$savedPos = 0, - peg$posDetailsCache = [{ line: 1, column: 1 }], - peg$maxFailPos = 0, - peg$maxFailExpected = [], - peg$silentFails = 0, - - peg$result; - - if ("startRule" in options) { - if (!(options.startRule in peg$startRuleIndices)) { - throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); - } - - peg$startRuleIndex = peg$startRuleIndices[options.startRule]; - } - - function text() { - return input.substring(peg$savedPos, peg$currPos); - } - - function location() { - return peg$computeLocation(peg$savedPos, peg$currPos); - } - - function expected(description, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - - throw peg$buildStructuredError( - [peg$otherExpectation(description)], - input.substring(peg$savedPos, peg$currPos), - location - ); - } - - function error(message, location) { - location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) - - throw peg$buildSimpleError(message, location); - } - - function peg$literalExpectation(text, ignoreCase) { - return { type: "literal", text: text, ignoreCase: ignoreCase }; - } - - function peg$classExpectation(parts, inverted, ignoreCase) { - return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; - } - - function peg$anyExpectation() { - return { type: "any" }; - } - - function peg$endExpectation() { - return { type: "end" }; - } - - function peg$otherExpectation(description) { - return { type: "other", description: description }; - } - - function peg$computePosDetails(pos) { - var details = peg$posDetailsCache[pos], p; - - if (details) { - return details; - } else { - p = pos - 1; - while (!peg$posDetailsCache[p]) { - p--; - } - - details = peg$posDetailsCache[p]; - details = { - line: details.line, - column: details.column - }; - - while (p < pos) { - if (input.charCodeAt(p) === 10) { - details.line++; - details.column = 1; - } else { - details.column++; - } - - p++; - } - - peg$posDetailsCache[pos] = details; - return details; - } - } - - function peg$computeLocation(startPos, endPos) { - var startPosDetails = peg$computePosDetails(startPos), - endPosDetails = peg$computePosDetails(endPos); - - return { - start: { - offset: startPos, - line: startPosDetails.line, - column: startPosDetails.column - }, - end: { - offset: endPos, - line: endPosDetails.line, - column: endPosDetails.column - } - }; - } - - function peg$fail(expected) { - if (peg$currPos < peg$maxFailPos) { return; } - - if (peg$currPos > peg$maxFailPos) { - peg$maxFailPos = peg$currPos; - peg$maxFailExpected = []; - } - - peg$maxFailExpected.push(expected); - } - - function peg$buildSimpleError(message, location) { - return new peg$SyntaxError(message, null, null, location); - } - - function peg$buildStructuredError(expected, found, location) { - return new peg$SyntaxError( - peg$SyntaxError.buildMessage(expected, found), - expected, - found, - location - ); - } - - function peg$decode(s) { - var bc = new Array(s.length), i; - - for (i = 0; i < s.length; i++) { - bc[i] = s.charCodeAt(i) - 32; - } - - return bc; - } - - function peg$parseRule(index) { - var bc = peg$bytecode[index], - ip = 0, - ips = [], - end = bc.length, - ends = [], - stack = [], - params, i; - - while (true) { - while (ip < end) { - switch (bc[ip]) { - case 0: - stack.push(peg$consts[bc[ip + 1]]); - ip += 2; - break; - - case 1: - stack.push(void 0); - ip++; - break; - - case 2: - stack.push(null); - ip++; - break; - - case 3: - stack.push(peg$FAILED); - ip++; - break; - - case 4: - stack.push([]); - ip++; - break; - - case 5: - stack.push(peg$currPos); - ip++; - break; - - case 6: - stack.pop(); - ip++; - break; - - case 7: - peg$currPos = stack.pop(); - ip++; - break; - - case 8: - stack.length -= bc[ip + 1]; - ip += 2; - break; - - case 9: - stack.splice(-2, 1); - ip++; - break; - - case 10: - stack[stack.length - 2].push(stack.pop()); - ip++; - break; - - case 11: - stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1])); - ip += 2; - break; - - case 12: - stack.push(input.substring(stack.pop(), peg$currPos)); - ip++; - break; - - case 13: - ends.push(end); - ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); - - if (stack[stack.length - 1]) { - end = ip + 3 + bc[ip + 1]; - ip += 3; - } else { - end = ip + 3 + bc[ip + 1] + bc[ip + 2]; - ip += 3 + bc[ip + 1]; - } - - break; - - case 14: - ends.push(end); - ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); - - if (stack[stack.length - 1] === peg$FAILED) { - end = ip + 3 + bc[ip + 1]; - ip += 3; - } else { - end = ip + 3 + bc[ip + 1] + bc[ip + 2]; - ip += 3 + bc[ip + 1]; - } - - break; - - case 15: - ends.push(end); - ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); - - if (stack[stack.length - 1] !== peg$FAILED) { - end = ip + 3 + bc[ip + 1]; - ip += 3; - } else { - end = ip + 3 + bc[ip + 1] + bc[ip + 2]; - ip += 3 + bc[ip + 1]; - } - - break; - - case 16: - if (stack[stack.length - 1] !== peg$FAILED) { - ends.push(end); - ips.push(ip); - - end = ip + 2 + bc[ip + 1]; - ip += 2; - } else { - ip += 2 + bc[ip + 1]; - } - - break; - - case 17: - ends.push(end); - ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); - - if (input.length > peg$currPos) { - end = ip + 3 + bc[ip + 1]; - ip += 3; - } else { - end = ip + 3 + bc[ip + 1] + bc[ip + 2]; - ip += 3 + bc[ip + 1]; - } - - break; - - case 18: - ends.push(end); - ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); - - if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]) { - end = ip + 4 + bc[ip + 2]; - ip += 4; - } else { - end = ip + 4 + bc[ip + 2] + bc[ip + 3]; - ip += 4 + bc[ip + 2]; - } - - break; - - case 19: - ends.push(end); - ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); - - if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]) { - end = ip + 4 + bc[ip + 2]; - ip += 4; - } else { - end = ip + 4 + bc[ip + 2] + bc[ip + 3]; - ip += 4 + bc[ip + 2]; - } - - break; - - case 20: - ends.push(end); - ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); - - if (peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))) { - end = ip + 4 + bc[ip + 2]; - ip += 4; - } else { - end = ip + 4 + bc[ip + 2] + bc[ip + 3]; - ip += 4 + bc[ip + 2]; - } - - break; - - case 21: - stack.push(input.substr(peg$currPos, bc[ip + 1])); - peg$currPos += bc[ip + 1]; - ip += 2; - break; - - case 22: - stack.push(peg$consts[bc[ip + 1]]); - peg$currPos += peg$consts[bc[ip + 1]].length; - ip += 2; - break; - - case 23: - stack.push(peg$FAILED); - if (peg$silentFails === 0) { - peg$fail(peg$consts[bc[ip + 1]]); - } - ip += 2; - break; - - case 24: - peg$savedPos = stack[stack.length - 1 - bc[ip + 1]]; - ip += 2; - break; - - case 25: - peg$savedPos = peg$currPos; - ip++; - break; - - case 26: - params = bc.slice(ip + 4, ip + 4 + bc[ip + 3]); - for (i = 0; i < bc[ip + 3]; i++) { - params[i] = stack[stack.length - 1 - params[i]]; - } - - stack.splice( - stack.length - bc[ip + 2], - bc[ip + 2], - peg$consts[bc[ip + 1]].apply(null, params) - ); - - ip += 4 + bc[ip + 3]; - break; - - case 27: - stack.push(peg$parseRule(bc[ip + 1])); - ip += 2; - break; - - case 28: - peg$silentFails++; - ip++; - break; - - case 29: - peg$silentFails--; - ip++; - break; - - default: - throw new Error("Invalid opcode: " + bc[ip] + "."); - } - } - - if (ends.length > 0) { - end = ends.pop(); - ip = ips.pop(); - } else { - break; - } - } - - return stack[0]; - } - - - var util = require('util'); - - function debug(str){ - console.log(str); - } - - function inspect(obj){ - console.log(util.inspect(obj, false, 10)); - } - - function createUnaryExpr(op, e) { - return { - type : 'unary_expr', - operator : op, - expr : e - } - } - - function createBinaryExpr(op, left, right) { - return { - type : 'binary_expr', - operator : op, - left : left, - right : right - } - } - - function createList(head, tail) { - var result = [head]; - for (var i = 0; i < tail.length; i++) { - result.push(tail[i][3]); - } - return result; - } - - function createExprList(head, tail, room) { - var epList = createList(head, tail); - var exprList = []; - var ep; - for (var i = 0; i < epList.length; i++) { - ep = epList[i]; - //the ep has already added to the global params - if (ep.type == 'param') { - ep.room = room; - ep.pos = i; - } else { - exprList.push(ep); - } - } - return exprList; - } - - function createBinaryExprChain(head, tail) { - var result = head; - for (var i = 0; i < tail.length; i++) { - result = createBinaryExpr(tail[i][1], result, tail[i][3]); - } - return result; - } - - var reservedMap = { - 'SHOW' : true, - 'DROP' : true, - 'SELECT' : true, - 'UPDATE' : true, - 'CREATE' : true, - 'DELETE' : true, - 'INSERT' : true, - 'REPLACE' : true, - 'EXPLAIN' : true, - 'ALL' : true, - 'DISTINCT': true, - 'AS' : true, - 'TABLE' : true, - 'INTO' : true, - 'FROM' : true, - 'SET' : true, - 'LEFT' : true, - 'ON' : true, - 'INNER' : true, - 'JOIN' : true, - 'UNION' : true, - 'VALUES' : true, - 'EXISTS' : true, - 'WHERE' : true, - 'GROUP' : true, - 'BY' : true, - 'HAVING' : true, - 'ORDER' : true, - 'ASC' : true, - 'DESC' : true, - 'LIMIT' : true, - 'BETWEEN' : true, - 'IN' : true, - 'IS' : true, - 'LIKE' : true, - 'CONTAINS': true, - 'NOT' : true, - 'AND' : true, - 'OR' : true, - - //literal - 'TRUE' : true, - 'FALSE' : true, - 'NULL' : true - } - - var cmpPrefixMap = { - '+' : true, - '-' : true, - '*' : true, - '/' : true, - '>' : true, - '<' : true, - '!' : true, - '=' : true, - - //between - 'B' : true, - 'b' : true, - //for is or in - 'I' : true, - 'i' : true, - //for like - 'L' : true, - 'l' : true, - //for not - 'N' : true, - 'n' : true, - //for contains - 'C' : true, - 'c' : true, - } - - //used for store refered parmas - var params = []; - - //used for dependency analysis - var varList = []; - - - peg$result = peg$parseRule(peg$startRuleIndex); - - if (peg$result !== peg$FAILED && peg$currPos === input.length) { - return peg$result; - } else { - if (peg$result !== peg$FAILED && peg$currPos < input.length) { - peg$fail(peg$endExpectation()); - } - - throw peg$buildStructuredError( - peg$maxFailExpected, - peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, - peg$maxFailPos < input.length - ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) - : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) - ); - } - } - - return { - SyntaxError: peg$SyntaxError, - parse: peg$parse - }; -}); diff --git a/core/cache.js b/core/cache.js deleted file mode 100644 index 9b5c60e..0000000 --- a/core/cache.js +++ /dev/null @@ -1,12 +0,0 @@ - -class Cache extends Map { - constructor(options){ - super(...arguments) - } - set(key,value){ - super.set(key,value); - } -} - - -module.exports=Cache; \ No newline at end of file diff --git a/core/index.html b/core/index.html deleted file mode 100644 index 244d42f..0000000 --- a/core/index.html +++ /dev/null @@ -1,9 +0,0 @@ - -
- - - - 1 - - - \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index db61d06..0000000 --- a/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const parser = require("./lib/parser"); -const filter = require("./lib/filter"); - -module.exports={ - parser, - filter -} diff --git a/lib/core/comment.js b/lib/core/comment.js new file mode 100644 index 0000000..773152c --- /dev/null +++ b/lib/core/comment.js @@ -0,0 +1,521 @@ +/* + * Generated by PEG.js 0.10.0. + * + * http://pegjs.org/ + */ +(function (root, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } + else if (typeof module === "object" && module.exports) { + module.exports = factory(); + } +})(this, function () { + "use strict"; + function peg$subclass(child, parent) { + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + } + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + peg$subclass(peg$SyntaxError, Error); + peg$SyntaxError.buildMessage = function (expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function (expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + "class": function (expectation) { + var escapedParts = "", i; + for (i = 0; i < expectation.parts.length; i++) { + escapedParts += expectation.parts[i] instanceof Array + ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) + : classEscape(expectation.parts[i]); + } + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + any: function (expectation) { + return "any character"; + }, + end: function (expectation) { + return "end of input"; + }, + other: function (expectation) { + return expectation.description; + } + }; + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + function literalEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function (ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return '\\x' + hex(ch); }); + } + function classEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/\]/g, '\\]') + .replace(/\^/g, '\\^') + .replace(/-/g, '\\-') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function (ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return '\\x' + hex(ch); }); + } + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + function describeExpected(expected) { + var descriptions = new Array(expected.length), i, j; + for (i = 0; i < expected.length; i++) { + descriptions[i] = describeExpectation(expected[i]); + } + descriptions.sort(); + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + descriptions.length = j; + } + switch (descriptions.length) { + case 1: + return descriptions[0]; + case 2: + return descriptions[0] + " or " + descriptions[1]; + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } + } + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + }; + function peg$parse(input, options) { + options = options !== void 0 ? options : {}; + var peg$FAILED = {}, peg$startRuleIndices = { start: 0 }, peg$startRuleIndex = 0, peg$consts = [ + function (union_stmt) { + return { lines, text: union_stmt }; + }, + peg$anyExpectation(), + function (word) { return word; }, + function (words, comment) { return ''; }, + function (words, quote) { return quote; }, + ";", + peg$literalExpectation(";", false), + function (words) { isSplit = true; return ";"; }, + function (words, stmt) { + const text = words.join("") + stmt; + let index = Math.max(lines.length - 1, 0); + lines[index] = (lines[index] || '') + text; + if (isSplit) { + isSplit = false; + lines.push(''); + } + return text; + }, + function (stmt, other) { + const text = stmt.join("") + other.join(""); + let index = Math.max(lines.length - 1, 0); + lines[index] = lines[index] + other.join(""); + return text; + }, + function (comment) { + return comment; + }, + /^[^\r\n]/, + peg$classExpectation(["\r", "\n"], true, false), + function (start, words) { + return start + words.join(""); + }, + "*/", + peg$literalExpectation("*/", false), + function (start, word) { return word; }, + function (start, words, end) { return start + words.join("") + end; }, + "\"", + peg$literalExpectation("\"", false), + /^[^"]/, + peg$classExpectation(["\""], true, false), + function (start, words, end) { return start + words.join("") + end; }, + "'", + peg$literalExpectation("'", false), + /^[^']/, + peg$classExpectation(["'"], true, false), + "--", + peg$literalExpectation("--", false), + /^[\r\n]/, + peg$classExpectation(["\r", "\n"], false, false), + "/*", + peg$literalExpectation("/*", false), + /^[ \t\r\n]/, + peg$classExpectation([" ", "\t", "\r", "\n"], false, false) + ], peg$bytecode = [ + peg$decode("%;!/' 8!: !! )"), + peg$decode("%$%$%%<;&=.##&&!&'#/6#1\"\"5!7!/($8\":\"\"! )(\"'#&'#0L*%%<;&=.##&&!&'#/6#1\"\"5!7!/($8\":\"\"! )(\"'#&'#&/j#%;\"/( 8!:#!\"\" ).H &%;%/( 8!:$!\"\" ).5 &%2%\"\"6%7&/' 8!:'!!\")/)$8\":(\"\"! )(\"'#&'#0\xCD*%$%%<;&=.##&&!&'#/6#1\"\"5!7!/($8\":\"\"! )(\"'#&'#0L*%%<;&=.##&&!&'#/6#1\"\"5!7!/($8\":\"\"! )(\"'#&'#&/j#%;\"/( 8!:#!\"\" ).H &%;%/( 8!:$!\"\" ).5 &%2%\"\"6%7&/' 8!:'!!\")/)$8\":(\"\"! )(\"'#&'#&/C#$1\"\"5!7!0(*1\"\"5!7!&/)$8\":)\"\"! )(\"'#&'#"), + peg$decode("%;$.# &;#/' 8!:*!! )"), + peg$decode("%;'/E#$4+\"\"5!7,0)*4+\"\"5!7,&/)$8\":-\"\"! )(\"'#&'#"), + peg$decode("%;)/\xA3#$%%<2.\"\"6.7/=.##&&!&'#/7#1\"\"5!7!/)$8\":0\"\"$ )(\"'#&'#0S*%%<2.\"\"6.7/=.##&&!&'#/7#1\"\"5!7!/)$8\":0\"\"$ )(\"'#&'#&/3$;*/*$8#:1##\"! )(#'#(\"'#&'#"), + peg$decode("%22\"\"6273/U#$44\"\"5!750)*44\"\"5!75&/9$22\"\"6273/*$8#:6##\"! )(#'#(\"'#&'#.e &%27\"\"6778/U#$49\"\"5!7:0)*49\"\"5!7:&/9$27\"\"6778/*$8#:6##\"! )(#'#(\"'#&'#"), + peg$decode(";'.G &;).A &22\"\"6273.5 &27\"\"6778.) &2%\"\"6%7&"), + peg$decode("2;\"\"6;7<"), + peg$decode("4=\"\"5!7>"), + peg$decode("2?\"\"6?7@"), + peg$decode("2.\"\"6.7/"), + peg$decode("$;,0#*;,&"), + peg$decode("4A\"\"5!7B") + ], peg$currPos = 0, peg$savedPos = 0, peg$posDetailsCache = [{ line: 1, column: 1 }], peg$maxFailPos = 0, peg$maxFailExpected = [], peg$silentFails = 0, peg$result; + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleIndices)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + peg$startRuleIndex = peg$startRuleIndices[options.startRule]; + } + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + function expected(description, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location); + } + function error(message, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildSimpleError(message, location); + } + function peg$literalExpectation(text, ignoreCase) { + return { type: "literal", text: text, ignoreCase: ignoreCase }; + } + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; + } + function peg$anyExpectation() { + return { type: "any" }; + } + function peg$endExpectation() { + return { type: "end" }; + } + function peg$otherExpectation(description) { + return { type: "other", description: description }; + } + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], p; + if (details) { + return details; + } + else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } + else { + details.column++; + } + p++; + } + peg$posDetailsCache[pos] = details; + return details; + } + } + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), endPosDetails = peg$computePosDetails(endPos); + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { + return; + } + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + peg$maxFailExpected.push(expected); + } + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location); + } + function peg$decode(s) { + var bc = new Array(s.length), i; + for (i = 0; i < s.length; i++) { + bc[i] = s.charCodeAt(i) - 32; + } + return bc; + } + function peg$parseRule(index) { + var bc = peg$bytecode[index], ip = 0, ips = [], end = bc.length, ends = [], stack = [], params, i; + while (true) { + while (ip < end) { + switch (bc[ip]) { + case 0: + stack.push(peg$consts[bc[ip + 1]]); + ip += 2; + break; + case 1: + stack.push(void 0); + ip++; + break; + case 2: + stack.push(null); + ip++; + break; + case 3: + stack.push(peg$FAILED); + ip++; + break; + case 4: + stack.push([]); + ip++; + break; + case 5: + stack.push(peg$currPos); + ip++; + break; + case 6: + stack.pop(); + ip++; + break; + case 7: + peg$currPos = stack.pop(); + ip++; + break; + case 8: + stack.length -= bc[ip + 1]; + ip += 2; + break; + case 9: + stack.splice(-2, 1); + ip++; + break; + case 10: + stack[stack.length - 2].push(stack.pop()); + ip++; + break; + case 11: + stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1])); + ip += 2; + break; + case 12: + stack.push(input.substring(stack.pop(), peg$currPos)); + ip++; + break; + case 13: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1]) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 14: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1] === peg$FAILED) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 15: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1] !== peg$FAILED) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 16: + if (stack[stack.length - 1] !== peg$FAILED) { + ends.push(end); + ips.push(ip); + end = ip + 2 + bc[ip + 1]; + ip += 2; + } + else { + ip += 2 + bc[ip + 1]; + } + break; + case 17: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (input.length > peg$currPos) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 18: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 19: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 20: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 21: + stack.push(input.substr(peg$currPos, bc[ip + 1])); + peg$currPos += bc[ip + 1]; + ip += 2; + break; + case 22: + stack.push(peg$consts[bc[ip + 1]]); + peg$currPos += peg$consts[bc[ip + 1]].length; + ip += 2; + break; + case 23: + stack.push(peg$FAILED); + if (peg$silentFails === 0) { + peg$fail(peg$consts[bc[ip + 1]]); + } + ip += 2; + break; + case 24: + peg$savedPos = stack[stack.length - 1 - bc[ip + 1]]; + ip += 2; + break; + case 25: + peg$savedPos = peg$currPos; + ip++; + break; + case 26: + params = bc.slice(ip + 4, ip + 4 + bc[ip + 3]); + for (i = 0; i < bc[ip + 3]; i++) { + params[i] = stack[stack.length - 1 - params[i]]; + } + stack.splice(stack.length - bc[ip + 2], bc[ip + 2], peg$consts[bc[ip + 1]].apply(null, params)); + ip += 4 + bc[ip + 3]; + break; + case 27: + stack.push(peg$parseRule(bc[ip + 1])); + ip += 2; + break; + case 28: + peg$silentFails++; + ip++; + break; + case 29: + peg$silentFails--; + ip++; + break; + default: + throw new Error("Invalid opcode: " + bc[ip] + "."); + } + } + if (ends.length > 0) { + end = ends.pop(); + ip = ips.pop(); + } + else { + break; + } + } + return stack[0]; + } + let lines = []; + let isSplit = false; + peg$result = peg$parseRule(peg$startRuleIndex); + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } + else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); + } + } + return { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; +}); diff --git a/lib/core/sqlAutoCompleteParser.js b/lib/core/sqlAutoCompleteParser.js new file mode 100644 index 0000000..8665064 --- /dev/null +++ b/lib/core/sqlAutoCompleteParser.js @@ -0,0 +1,9123 @@ +// Licensed to Cloudera, Inc. under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. Cloudera, Inc. licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +var SqlParseSupport = (function () { + // endsWith polyfill from hue_utils.js, needed as workers live in their own js environment + if (!String.prototype.endsWith) { + String.prototype.endsWith = function (searchString, position) { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.lastIndexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; + } + /** + * Calculates the Optimal String Alignment distance between two strings. Returns 0 when the strings are equal and the + * distance when not, distances is less than or equal to the length of the longest string. + * + * @param strA + * @param strB + * @param [ignoreCase] + * @returns {number} The similarity + */ + var stringDistance = function (strA, strB, ignoreCase) { + if (ignoreCase) { + strA = strA.toLowerCase(); + strB = strB.toLowerCase(); + } + // TODO: Consider other algorithms for performance + var strALength = strA.length; + var strBLength = strB.length; + if (strALength === 0) { + return strBLength; + } + if (strBLength === 0) { + return strALength; + } + var distances = new Array(strALength); + var cost, deletion, insertion, substitution, transposition; + for (var i = 0; i <= strALength; i++) { + distances[i] = new Array(strBLength); + distances[i][0] = i; + for (var j = 1; j <= strBLength; j++) { + if (!i) { + distances[0][j] = j; + } + else { + cost = strA[i - 1] === strB[j - 1] ? 0 : 1; + deletion = distances[i - 1][j] + 1; + insertion = distances[i][j - 1] + 1; + substitution = distances[i - 1][j - 1] + cost; + if (deletion <= insertion && deletion <= substitution) { + distances[i][j] = deletion; + } + else if (insertion <= deletion && insertion <= substitution) { + distances[i][j] = insertion; + } + else { + distances[i][j] = substitution; + } + if (i > 1 && j > 1 && strA[i] === strB[j - 1] && strA[i - 1] === strB[j]) { + transposition = distances[i - 2][j - 2] + cost; + if (transposition < distances[i][j]) { + distances[i][j] = transposition; + } + } + } + } + } + return distances[strALength][strBLength]; + }; + var equalIgnoreCase = function (a, b) { + return a && b && a.toLowerCase() === b.toLowerCase(); + }; + var initSqlParser = function (parser) { + var SIMPLE_TABLE_REF_SUGGESTIONS = ['suggestJoinConditions', 'suggestAggregateFunctions', 'suggestFilters', 'suggestGroupBys', 'suggestOrderBys']; + parser.prepareNewStatement = function () { + linkTablePrimaries(); + parser.commitLocations(); + delete parser.yy.lateralViews; + delete parser.yy.latestCommonTableExpressions; + delete parser.yy.correlatedSubQuery; + parser.yy.subQueries = []; + parser.yy.selectListAliases = []; + parser.yy.latestTablePrimaries = []; + prioritizeSuggestions(); + }; + parser.yy.parseError = function (message, error) { + parser.yy.errors.push(error); + return message; + }; + parser.addCommonTableExpressions = function (identifiers) { + parser.yy.result.commonTableExpressions = identifiers; + parser.yy.latestCommonTableExpressions = identifiers; + }; + parser.isInSubquery = function () { + return !!parser.yy.primariesStack.length; + }; + parser.pushQueryState = function () { + parser.yy.resultStack.push(parser.yy.result); + parser.yy.locationsStack.push(parser.yy.locations); + parser.yy.lateralViewsStack.push(parser.yy.lateralViews); + parser.yy.selectListAliasesStack.push(parser.yy.selectListAliases); + parser.yy.primariesStack.push(parser.yy.latestTablePrimaries); + parser.yy.subQueriesStack.push(parser.yy.subQueries); + parser.yy.result = {}; + parser.yy.locations = []; + parser.yy.selectListAliases = []; // Not allowed in correlated sub-queries + parser.yy.lateralViews = []; // Not allowed in correlated sub-queries + if (parser.yy.correlatedSubQuery) { + parser.yy.latestTablePrimaries = parser.yy.latestTablePrimaries.concat(); + parser.yy.subQueries = parser.yy.subQueries.concat(); + } + else { + parser.yy.latestTablePrimaries = []; + parser.yy.subQueries = []; + } + }; + parser.popQueryState = function (subQuery) { + linkTablePrimaries(); + parser.commitLocations(); + if (Object.keys(parser.yy.result).length === 0) { + parser.yy.result = parser.yy.resultStack.pop(); + } + else { + parser.yy.resultStack.pop(); + } + var oldSubQueries = parser.yy.subQueries; + parser.yy.subQueries = parser.yy.subQueriesStack.pop(); + if (subQuery) { + if (oldSubQueries.length > 0) { + subQuery.subQueries = oldSubQueries; + } + parser.yy.subQueries.push(subQuery); + } + parser.yy.lateralViews = parser.yy.lateralViewsStack.pop(); + parser.yy.latestTablePrimaries = parser.yy.primariesStack.pop(); + parser.yy.locations = parser.yy.locationsStack.pop(); + parser.yy.selectListAliases = parser.yy.selectListAliasesStack.pop(); + }; + parser.suggestSelectListAliases = function () { + if (parser.yy.selectListAliases && parser.yy.selectListAliases.length > 0 && parser.yy.result.suggestColumns + && (typeof parser.yy.result.suggestColumns.identifierChain === 'undefined' || parser.yy.result.suggestColumns.identifierChain.length === 0)) { + parser.yy.result.suggestColumnAliases = parser.yy.selectListAliases; + } + }; + parser.isHive = function () { + return parser.yy.activeDialect === 'hive'; + }; + parser.isImpala = function () { + return parser.yy.activeDialect === 'impala'; + }; + parser.mergeSuggestKeywords = function () { + var result = []; + Array.prototype.slice.call(arguments).forEach(function (suggestion) { + if (typeof suggestion !== 'undefined' && typeof suggestion.suggestKeywords !== 'undefined') { + result = result.concat(suggestion.suggestKeywords); + } + }); + if (result.length > 0) { + return { suggestKeywords: result }; + } + return {}; + }; + parser.suggestValueExpressionKeywords = function (valueExpression, extras) { + var expressionKeywords = parser.getValueExpressionKeywords(valueExpression, extras); + parser.suggestKeywords(expressionKeywords.suggestKeywords); + if (expressionKeywords.suggestColRefKeywords) { + parser.suggestColRefKeywords(expressionKeywords.suggestColRefKeywords); + } + if (valueExpression.lastType) { + parser.addColRefIfExists(valueExpression.lastType); + } + else { + parser.addColRefIfExists(valueExpression); + } + }; + parser.getSelectListKeywords = function (excludeAsterisk) { + var keywords = [{ value: 'CASE', weight: 450 }, 'FALSE', 'TRUE', 'NULL']; + if (!excludeAsterisk) { + keywords.push({ value: '*', weight: 10000 }); + } + if (parser.isHive()) { + keywords = keywords.concat(['EXISTS', 'NOT']); + } + return keywords; + }; + parser.getValueExpressionKeywords = function (valueExpression, extras) { + var types = valueExpression.lastType ? valueExpression.lastType.types : valueExpression.types; + // We could have valueExpression.columnReference to suggest based on column type + var keywords = ['<', '<=', '<=>', '<>', '=', '>', '>=', 'BETWEEN', 'IN', 'IS NOT NULL', 'IS NULL', 'IS NOT TRUE', 'IS TRUE', 'IS NOT FALSE', 'IS FALSE', 'NOT BETWEEN', 'NOT IN']; + if (parser.isImpala()) { + keywords = keywords.concat(['IS DISTINCT FROM', 'IS NOT DISTINCT FROM', 'IS NOT UNKNOWN', 'IS UNKNOWN']); + } + if (extras) { + keywords = keywords.concat(extras); + } + if (valueExpression.suggestKeywords) { + keywords = keywords.concat(valueExpression.suggestKeywords); + } + if (types.length === 1 && types[0] === 'COLREF') { + return { + suggestKeywords: keywords, + suggestColRefKeywords: { + BOOLEAN: ['AND', 'OR'], + NUMBER: ['+', '-', '*', '/', '%', 'DIV'], + STRING: parser.isImpala() ? ['ILIKE', 'IREGEXP', 'LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE'] : ['LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE'] + } + }; + } + if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['BOOLEAN'], types)) { + keywords = keywords.concat(['AND', 'OR']); + } + if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['NUMBER'], types)) { + keywords = keywords.concat(['+', '-', '*', '/', '%', 'DIV']); + } + if (typeof SqlFunctions === 'undefined' || SqlFunctions.matchesType(parser.yy.activeDialect, ['STRING'], types)) { + keywords = keywords.concat(parser.isImpala() ? ['ILIKE', 'IREGEXP', 'LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE'] : ['LIKE', 'NOT LIKE', 'REGEXP', 'RLIKE']); + } + return { suggestKeywords: keywords }; + }; + parser.getTypeKeywords = function () { + if (parser.isHive()) { + return ['BIGINT', 'BINARY', 'BOOLEAN', 'CHAR', 'DATE', 'DECIMAL', 'DOUBLE', 'DOUBLE PRECISION', 'FLOAT', 'INT', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR']; + } + if (parser.isImpala()) { + return ['BIGINT', 'BOOLEAN', 'CHAR', 'DECIMAL', 'DOUBLE', 'FLOAT', 'INT', 'REAL', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR']; + } + return ['BIGINT', 'BOOLEAN', 'CHAR', 'DECIMAL', 'DOUBLE', 'FLOAT', 'INT', 'SMALLINT', 'TIMESTAMP', 'STRING', 'TINYINT', 'VARCHAR']; + }; + parser.getColumnDataTypeKeywords = function () { + if (parser.isHive()) { + return parser.getTypeKeywords().concat(['ARRAY<>', 'MAP<>', 'STRUCT<>', 'UNIONTYPE<>']); + } + if (parser.isImpala()) { + return parser.getTypeKeywords().concat(['ARRAY<>', 'MAP<>', 'STRUCT<>']); + } + return parser.getTypeKeywords(); + }; + parser.addColRefIfExists = function (valueExpression) { + if (valueExpression.columnReference) { + parser.yy.result.colRef = { identifierChain: valueExpression.columnReference }; + } + }; + parser.selectListNoTableSuggest = function (selectListEdit, hasDistinctOrAll) { + if (selectListEdit.cursorAtStart) { + var keywords = parser.getSelectListKeywords(); + if (!hasDistinctOrAll) { + keywords = keywords.concat([{ value: 'ALL', weight: 2 }, { value: 'DISTINCT', weight: 2 }]); + } + if (parser.isImpala()) { + keywords.push('STRAIGHT_JOIN'); + } + parser.suggestKeywords(keywords); + } + else { + parser.checkForKeywords(selectListEdit); + } + if (selectListEdit.suggestFunctions) { + parser.suggestFunctions(); + } + if (selectListEdit.suggestColumns) { + parser.suggestColumns(); + } + if (selectListEdit.suggestAggregateFunctions && (!hasDistinctOrAll || hasDistinctOrAll === 'ALL')) { + parser.suggestAggregateFunctions(); + parser.suggestAnalyticFunctions(); + } + }; + parser.suggestJoinConditions = function (details) { + parser.yy.result.suggestJoinConditions = details || {}; + if (parser.yy.latestTablePrimaries && !parser.yy.result.suggestJoinConditions.tablePrimaries) { + parser.yy.result.suggestJoinConditions.tablePrimaries = parser.yy.latestTablePrimaries.concat(); + } + }; + parser.suggestJoins = function (details) { + parser.yy.result.suggestJoins = details || {}; + }; + parser.valueExpressionSuggest = function (oppositeValueExpression, operator) { + if (oppositeValueExpression && oppositeValueExpression.columnReference) { + parser.suggestValues(); + parser.yy.result.colRef = { identifierChain: oppositeValueExpression.columnReference }; + } + parser.suggestColumns(); + parser.suggestFunctions(); + var keywords = [{ value: 'CASE', weight: 450 }, { value: 'FALSE', weight: 450 }, { value: 'NULL', weight: 450 }, { value: 'TRUE', weight: 450 }]; + if (parser.isHive() || typeof oppositeValueExpression === 'undefined' || typeof operator === 'undefined') { + keywords = keywords.concat(['EXISTS', 'NOT']); + } + if (oppositeValueExpression && oppositeValueExpression.types[0] === 'NUMBER') { + parser.applyTypeToSuggestions(['NUMBER']); + } + else if (parser.isImpala() && (typeof operator === 'undefined' || operator === '-' || operator === '+')) { + keywords.push('INTERVAL'); + } + parser.suggestKeywords(keywords); + }; + parser.applyTypeToSuggestions = function (types) { + if (types[0] === 'BOOLEAN') { + return; + } + if (parser.yy.result.suggestFunctions && !parser.yy.result.suggestFunctions.types) { + parser.yy.result.suggestFunctions.types = types; + } + if (parser.yy.result.suggestColumns && !parser.yy.result.suggestColumns.types) { + parser.yy.result.suggestColumns.types = types; + } + }; + parser.findCaseType = function (whenThenList) { + var types = {}; + whenThenList.caseTypes.forEach(function (valueExpression) { + valueExpression.types.forEach(function (type) { + types[type] = true; + }); + }); + if (Object.keys(types).length === 1) { + return { types: [Object.keys(types)[0]] }; + } + return { types: ['T'] }; + }; + parser.findReturnTypes = function (functionName) { + return typeof SqlFunctions === 'undefined' ? ['T'] : SqlFunctions.getReturnTypes(parser.yy.activeDialect, functionName.toLowerCase()); + }; + parser.applyArgumentTypesToSuggestions = function (functionName, position) { + var foundArguments = typeof SqlFunctions === 'undefined' ? ['T'] : SqlFunctions.getArgumentTypes(parser.yy.activeDialect, functionName.toLowerCase(), position); + if (foundArguments.length == 0 && parser.yy.result.suggestColumns) { + delete parser.yy.result.suggestColumns; + delete parser.yy.result.suggestKeyValues; + delete parser.yy.result.suggestValues; + delete parser.yy.result.suggestFunctions; + delete parser.yy.result.suggestIdentifiers; + delete parser.yy.result.suggestKeywords; + } + else { + parser.applyTypeToSuggestions(foundArguments); + } + }; + var getCleanImpalaPrimaries = function (primaries) { + var cleanPrimaries = []; + for (var i = primaries.length - 1; i >= 0; i--) { + var cleanPrimary = primaries[i]; + if (cleanPrimary.identifierChain && cleanPrimary.identifierChain.length > 0) { + for (var j = i - 1; j >= 0; j--) { + var parentPrimary = primaries[j]; + if (parentPrimary.alias && cleanPrimary.identifierChain[0].name === parentPrimary.alias) { + var restOfChain = cleanPrimary.identifierChain.concat(); + restOfChain.shift(); + if (cleanPrimary.alias) { + cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(restOfChain), alias: cleanPrimary.alias, impalaComplex: true }; + } + else { + cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(restOfChain), impalaComplex: true }; + } + } + } + } + cleanPrimaries.push(cleanPrimary); + } + return cleanPrimaries; + }; + parser.commitLocations = function () { + if (parser.yy.locations.length === 0) { + return; + } + var tablePrimaries = parser.yy.latestTablePrimaries; + if (parser.isImpala()) { + tablePrimaries = []; + getCleanImpalaPrimaries(parser.yy.latestTablePrimaries).forEach(function (primary) { + var cleanPrimary = primary; + if (primary.identifierChain && primary.identifierChain.length > 0) { + for (var j = parser.yy.primariesStack.length - 1; j >= 0; j--) { + getCleanImpalaPrimaries(parser.yy.primariesStack[j]).every(function (parentPrimary) { + if (parentPrimary.alias && parentPrimary.alias === primary.identifierChain[0].name) { + var identifierChain = primary.identifierChain.concat(); + identifierChain.shift(); + cleanPrimary = { identifierChain: parentPrimary.identifierChain.concat(identifierChain) }; + if (primary.alias) { + cleanPrimary.alias = primary.alias; + } + return false; + } + return true; + }); + } + } + tablePrimaries.unshift(cleanPrimary); + }); + } + var i = parser.yy.locations.length; + while (i--) { + var location = parser.yy.locations[i]; + if (location.type === 'variable' && location.colRef) { + parser.expandIdentifierChain({ wrapper: location.colRef, tablePrimaries: tablePrimaries, isColumnWrapper: true }); + delete location.colRef.linked; + } + // Impala can have references to previous tables after FROM, i.e. FROM testTable t, t.testArray + // In this testArray would be marked a type table so we need to switch it to column. + if (location.type === 'table' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 1 && tablePrimaries) { + var allPrimaries = tablePrimaries; + parser.yy.primariesStack.forEach(function (parentPrimaries) { + allPrimaries = getCleanImpalaPrimaries(parentPrimaries).concat(allPrimaries); + }); + var found = allPrimaries.filter(function (primary) { + return equalIgnoreCase(primary.alias, location.identifierChain[0].name); + }); + if (found.length > 0) { + location.type = 'column'; + } + } + if (location.type === 'database' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 0 && tablePrimaries) { + var allPrimaries = tablePrimaries; + parser.yy.primariesStack.forEach(function (parentPrimaries) { + allPrimaries = getCleanImpalaPrimaries(parentPrimaries).concat(allPrimaries); + }); + var foundAlias = allPrimaries.filter(function (primary) { + return equalIgnoreCase(primary.alias, location.identifierChain[0].name); + }); + if (foundAlias.length > 0 && parser.isImpala()) { + // Impala complex reference in FROM clause, i.e. FROM testTable t, t.testMap tm + location.type = 'table'; + parser.expandIdentifierChain({ tablePrimaries: allPrimaries, wrapper: location, anyOwner: true }); + location.type = location.identifierChain.length === 1 ? 'table' : 'complex'; + continue; + } + } + if (location.type === 'unknown') { + if (typeof location.identifierChain !== 'undefined' && location.identifierChain.length > 0 && location.identifierChain.length <= 2 && tablePrimaries) { + var found = tablePrimaries.filter(function (primary) { + return equalIgnoreCase(primary.alias, location.identifierChain[0].name) || (primary.identifierChain && equalIgnoreCase(primary.identifierChain[0].name, location.identifierChain[0].name)); + }); + if (!found.length && location.firstInChain) { + found = tablePrimaries.filter(function (primary) { + return !primary.alias && primary.identifierChain && equalIgnoreCase(primary.identifierChain[primary.identifierChain.length - 1].name, location.identifierChain[0].name); + }); + } + if (found.length) { + if (found[0].identifierChain.length > 1 && location.identifierChain.length === 1 && equalIgnoreCase(found[0].identifierChain[0].name, location.identifierChain[0].name)) { + location.type = 'database'; + } + else if (found[0].alias && equalIgnoreCase(location.identifierChain[0].name, found[0].alias) && location.identifierChain.length > 1) { + location.type = 'column'; + parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true }); + } + else if (!found[0].alias && found[0].identifierChain && equalIgnoreCase(location.identifierChain[0].name, found[0].identifierChain[found[0].identifierChain.length - 1].name) && location.identifierChain.length > 1) { + location.type = 'column'; + parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true }); + } + else { + location.type = found[0].impalaComplex ? 'column' : 'table'; + parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true }); + } + } + else { + if (parser.yy.subQueries) { + found = parser.yy.subQueries.filter(function (subQuery) { + return equalIgnoreCase(subQuery.alias, location.identifierChain[0].name); + }); + if (found.length > 0) { + location.type = 'subQuery'; + location.identifierChain = [{ subQuery: found[0].alias }]; + } + } + } + } + } + if (location.type === 'asterisk' && !location.linked) { + if (tablePrimaries && tablePrimaries.length > 0) { + location.tables = []; + location.linked = false; + if (!location.identifierChain) { + location.identifierChain = [{ asterisk: true }]; + } + parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: false }); + if (location.tables.length === 0) { + parser.yy.locations.splice(i, 1); + } + } + else { + parser.yy.locations.splice(i, 1); + } + } + if (location.type === 'table' && typeof location.identifierChain !== 'undefined' && location.identifierChain.length === 1 && location.identifierChain[0].name) { + // Could be a cte reference + parser.yy.locations.some(function (otherLocation) { + if (otherLocation.type === 'alias' && otherLocation.source === 'cte' && SqlUtils.identifierEquals(otherLocation.alias, location.identifierChain[0].name)) { + // TODO: Possibly add the other location if we want to show the link in the future. + // i.e. highlight select definition on hover over alias, also for subquery references. + location.type = 'alias'; + location.target = 'cte'; + location.alias = location.identifierChain[0].name; + delete location.identifierChain; + return true; + } + }); + } + if (location.type === 'table' && (typeof location.identifierChain === 'undefined' || location.identifierChain.length === 0)) { + parser.yy.locations.splice(i, 1); + } + if (location.type === 'unknown') { + location.type = 'column'; + } + // A column location might refer to a previously defined alias, i.e. last 'foo' in "SELECT cast(id AS int) foo FROM tbl ORDER BY foo;" + if (location.type === 'column') { + for (var j = i - 1; j >= 0; j--) { + var otherLocation = parser.yy.locations[j]; + if (otherLocation.type === 'alias' && otherLocation.source === 'column' && location.identifierChain && location.identifierChain.length === 1 && location.identifierChain[0].name && otherLocation.alias && location.identifierChain[0].name.toLowerCase() === otherLocation.alias.toLowerCase()) { + location.type = 'alias'; + location.source = 'column'; + location.alias = location.identifierChain[0].name; + delete location.identifierChain; + location.parentLocation = otherLocation.parentLocation; + break; + } + } + } + if (location.type === 'column') { + if (parser.isHive() && !location.linked) { + location.identifierChain = parser.expandLateralViews(parser.yy.lateralViews, location.identifierChain); + } + var initialIdentifierChain = location.identifierChain ? location.identifierChain.concat() : undefined; + parser.expandIdentifierChain({ tablePrimaries: tablePrimaries, wrapper: location, anyOwner: true, isColumnWrapper: true, isColumnLocation: true }); + if (typeof location.identifierChain === 'undefined') { + parser.yy.locations.splice(i, 1); + } + else if (location.identifierChain.length === 0 && initialIdentifierChain && initialIdentifierChain.length === 1) { + // This is for the case "SELECT tblOrColName FROM db.tblOrColName"; + location.identifierChain = initialIdentifierChain; + } + } + if (location.type === 'column' && location.identifierChain) { + if (location.identifierChain.length > 1 && location.tables && location.tables.length > 0) { + location.type = 'complex'; + } + } + delete location.firstInChain; + if (location.type !== 'column' && location.type !== 'complex') { + delete location.qualified; + } + else if (typeof location.qualified === 'undefined') { + location.qualified = false; + } + } + if (parser.yy.locations.length > 0) { + parser.yy.allLocations = parser.yy.allLocations.concat(parser.yy.locations); + parser.yy.locations = []; + } + }; + var prioritizeSuggestions = function () { + parser.yy.result.lowerCase = parser.yy.lowerCase || false; + var cteIndex = {}; + if (typeof parser.yy.latestCommonTableExpressions !== 'undefined') { + parser.yy.latestCommonTableExpressions.forEach(function (cte) { + cteIndex[cte.alias.toLowerCase()] = cte; + }); + } + SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) { + if (suggestionType !== 'suggestAggregateFunctions' && typeof parser.yy.result[suggestionType] !== 'undefined' && parser.yy.result[suggestionType].tables.length === 0) { + delete parser.yy.result[suggestionType]; + } + else if (typeof parser.yy.result[suggestionType] !== 'undefined' && typeof parser.yy.result[suggestionType].tables !== 'undefined') { + for (var i = parser.yy.result[suggestionType].tables.length - 1; i >= 0; i--) { + var table = parser.yy.result[suggestionType].tables[i]; + if (table.identifierChain.length === 1 && typeof table.identifierChain[0].name !== 'undefined' && typeof cteIndex[table.identifierChain[0].name.toLowerCase()] !== 'undefined') { + parser.yy.result[suggestionType].tables.splice(i, 1); + } + } + } + }); + if (typeof parser.yy.result.colRef !== 'undefined') { + if (!parser.yy.result.colRef.linked || typeof parser.yy.result.colRef.identifierChain === 'undefined' || parser.yy.result.colRef.identifierChain.length === 0) { + delete parser.yy.result.colRef; + if (typeof parser.yy.result.suggestColRefKeywords !== 'undefined') { + Object.keys(parser.yy.result.suggestColRefKeywords).forEach(function (type) { + parser.yy.result.suggestKeywords = parser.yy.result.suggestKeywords.concat(parser.createWeightedKeywords(parser.yy.result.suggestColRefKeywords[type], -1)); + }); + delete parser.yy.result.suggestColRefKeywords; + } + if (parser.yy.result.suggestColumns && parser.yy.result.suggestColumns.types.length === 1 && parser.yy.result.suggestColumns.types[0] === 'COLREF') { + parser.yy.result.suggestColumns.types = ['T']; + } + delete parser.yy.result.suggestValues; + } + } + if (typeof parser.yy.result.colRef !== 'undefined') { + if (!parser.yy.result.suggestValues && !parser.yy.result.suggestColRefKeywords && + (!parser.yy.result.suggestColumns || + parser.yy.result.suggestColumns.types[0] !== 'COLREF')) { + delete parser.yy.result.colRef; + } + } + if (typeof parser.yy.result.suggestIdentifiers !== 'undefined' && parser.yy.result.suggestIdentifiers.length > 0) { + delete parser.yy.result.suggestTables; + delete parser.yy.result.suggestDatabases; + } + if (typeof parser.yy.result.suggestColumns !== 'undefined') { + var suggestColumns = parser.yy.result.suggestColumns; + if (typeof suggestColumns.tables === 'undefined' || suggestColumns.tables.length === 0) { + // Impala supports statements like SELECT * FROM tbl1, tbl2 WHERE db.tbl1.col = tbl2.bla + if (parser.yy.result.suggestColumns.linked && parser.isImpala() && typeof suggestColumns.identifierChain !== 'undefined' && suggestColumns.identifierChain.length > 0) { + if (suggestColumns.identifierChain.length === 1) { + parser.yy.result.suggestTables = suggestColumns; + delete parser.yy.result.suggestColumns; + } + else { + suggestColumns.tables = [{ identifierChain: suggestColumns.identifierChain }]; + delete suggestColumns.identifierChain; + } + } + else { + delete parser.yy.result.suggestColumns; + delete parser.yy.result.subQueries; + } + } + else { + delete parser.yy.result.suggestTables; + delete parser.yy.result.suggestDatabases; + suggestColumns.tables.forEach(function (table) { + if (typeof table.identifierChain !== 'undefined' && table.identifierChain.length === 1 && typeof table.identifierChain[0].name !== 'undefined') { + var cte = cteIndex[table.identifierChain[0].name.toLowerCase()]; + if (typeof cte !== 'undefined') { + delete table.identifierChain[0].name; + table.identifierChain[0].cte = cte.alias; + } + } + else if (typeof table.identifierChain === 'undefined' && table.subQuery) { + table.identifierChain = [{ subQuery: table.subQuery }]; + delete table.subQuery; + } + }); + if (typeof suggestColumns.identifierChain !== 'undefined' && suggestColumns.identifierChain.length === 0) { + delete suggestColumns.identifierChain; + } + } + } + else { + delete parser.yy.result.subQueries; + } + if (typeof parser.yy.result.suggestJoinConditions !== 'undefined') { + if (typeof parser.yy.result.suggestJoinConditions.tables === 'undefined' || parser.yy.result.suggestJoinConditions.tables.length === 0) { + delete parser.yy.result.suggestJoinConditions; + } + } + if (typeof parser.yy.result.suggestTables !== 'undefined' && typeof parser.yy.latestCommonTableExpressions !== 'undefined') { + var ctes = []; + parser.yy.latestCommonTableExpressions.forEach(function (cte) { + var suggestion = { name: cte.alias }; + if (parser.yy.result.suggestTables.prependFrom) { + suggestion.prependFrom = true; + } + if (parser.yy.result.suggestTables.prependQuestionMark) { + suggestion.prependQuestionMark = true; + } + ctes.push(suggestion); + }); + if (ctes.length > 0) { + parser.yy.result.suggestCommonTableExpressions = ctes; + } + } + }; + /** + * Impala supports referencing maps and arrays in the the table reference list i.e. + * + * SELECT m['foo'].bar.| FROM someDb.someTable t, t.someMap m; + * + * From this the tablePrimaries would look like: + * + * [ { alias: 't', identifierChain: [ { name: 'someDb' }, { name: 'someTable' } ] }, + * { alias: 'm', identifierChain: [ { name: 't' }, { name: 'someMap' } ] } ] + * + * with an identifierChain from the select list: + * + * [ { name: 'm', keySet: true }, { name: 'bar' } ] + * + * Calling this would return an expanded identifierChain, given the above it would be: + * + * [ { name: 't' }, { name: 'someMap', keySet: true }, { name: 'bar' } ] + */ + parser.expandImpalaIdentifierChain = function (tablePrimaries, identifierChain) { + var expandedChain = identifierChain.concat(); // Clone in case it's called multiple times. + if (typeof expandedChain === 'undefined' || expandedChain.length === 0) { + return identifierChain; + } + var expand = function (identifier, expandedChain) { + var foundPrimary = tablePrimaries.filter(function (tablePrimary) { + var primaryIdentifier = tablePrimary.alias; + if (!primaryIdentifier && tablePrimary.identifierChain && tablePrimary.identifierChain.length > 0) { + primaryIdentifier = tablePrimary.identifierChain[tablePrimary.identifierChain.length - 1].name; + } + return equalIgnoreCase(primaryIdentifier, identifier); + }); + if (foundPrimary.length === 1 && foundPrimary[0].identifierChain) { + var parentPrimary = tablePrimaries.filter(function (tablePrimary) { + return equalIgnoreCase(tablePrimary.alias, foundPrimary[0].identifierChain[0].name); + }); + if (parentPrimary.length === 1) { + var keySet = expandedChain[0].keySet; + var secondPart = expandedChain.slice(1); + var firstPart = []; + // Clone to make sure we don't add keySet to the primaries + foundPrimary[0].identifierChain.forEach(function (identifier) { + firstPart.push({ name: identifier.name }); + }); + if (keySet && firstPart.length > 0) { + firstPart[firstPart.length - 1].keySet = true; + } + if (firstPart.length === 0 || typeof secondPart === 'undefined' || secondPart.length === 0) { + return firstPart; + } + var result = firstPart.concat(secondPart); + if (result.length > 0) { + return expand(firstPart[0].name, result); + } + else { + return result; + } + } + } + return expandedChain; + }; + return expand(expandedChain[0].name, expandedChain); + }; + parser.identifyPartials = function (beforeCursor, afterCursor) { + var beforeMatch = beforeCursor.match(/[0-9a-zA-Z_]*$/); + var afterMatch = afterCursor.match(/^[0-9a-zA-Z_]*(?:\((?:[^)]*\))?)?/); + return { left: beforeMatch ? beforeMatch[0].length : 0, right: afterMatch ? afterMatch[0].length : 0 }; + }; + parser.expandLateralViews = function (lateralViews, originalIdentifierChain, columnSuggestion) { + var identifierChain = originalIdentifierChain.concat(); // Clone in case it's re-used + var firstIdentifier = identifierChain[0]; + if (typeof lateralViews !== 'undefined') { + lateralViews.concat().reverse().forEach(function (lateralView) { + if (!lateralView.udtf.expression.columnReference) { + return; + } + if (equalIgnoreCase(firstIdentifier.name, lateralView.tableAlias) && identifierChain.length > 1) { + identifierChain.shift(); + firstIdentifier = identifierChain[0]; + if (columnSuggestion) { + delete parser.yy.result.suggestKeywords; + } + } + else if (equalIgnoreCase(firstIdentifier.name, lateralView.tableAlias) && identifierChain.length === 1 && typeof parser.yy.result.suggestColumns !== 'undefined') { + if (columnSuggestion) { + if (typeof parser.yy.result.suggestIdentifiers === 'undefined') { + parser.yy.result.suggestIdentifiers = []; + } + lateralView.columnAliases.forEach(function (columnAlias) { + parser.yy.result.suggestIdentifiers.push({ name: columnAlias, type: 'alias' }); + }); + delete parser.yy.result.suggestColumns; + delete parser.yy.result.suggestKeywords; + } + return identifierChain; + } + if (lateralView.columnAliases.indexOf(firstIdentifier.name) !== -1) { + if (lateralView.columnAliases.length === 2 && lateralView.udtf.function.toLowerCase() === 'explode' && equalIgnoreCase(firstIdentifier.name, lateralView.columnAliases[0])) { + identifierChain[0] = { name: 'key' }; + } + else if (lateralView.columnAliases.length === 2 && lateralView.udtf.function.toLowerCase() === 'explode' && equalIgnoreCase(firstIdentifier.name, lateralView.columnAliases[1])) { + identifierChain[0] = { name: 'value' }; + } + else { + identifierChain[0] = { name: 'item' }; + } + identifierChain = lateralView.udtf.expression.columnReference.concat(identifierChain); + firstIdentifier = identifierChain[0]; + } + }); + } + return identifierChain; + }; + var addCleanTablePrimary = function (tables, tablePrimary) { + if (tablePrimary.alias) { + tables.push({ alias: tablePrimary.alias, identifierChain: tablePrimary.identifierChain }); + } + else { + tables.push({ identifierChain: tablePrimary.identifierChain }); + } + }; + parser.expandIdentifierChain = function (options) { + var wrapper = options.wrapper; + var anyOwner = options.anyOwner; + var isColumnWrapper = options.isColumnWrapper; + var isColumnLocation = options.isColumnLocation; + var tablePrimaries = options.tablePrimaries || parser.yy.latestTablePrimaries; + if (typeof wrapper.identifierChain === 'undefined' || typeof tablePrimaries === 'undefined') { + return; + } + var identifierChain = wrapper.identifierChain.concat(); + if (tablePrimaries.length === 0) { + delete wrapper.identifierChain; + return; + } + if (!anyOwner) { + tablePrimaries = filterTablePrimariesForOwner(tablePrimaries, wrapper.owner); + } + if (identifierChain.length > 0 && identifierChain[identifierChain.length - 1].asterisk) { + var tables = []; + tablePrimaries.forEach(function (tablePrimary) { + if (identifierChain.length > 1 && !tablePrimary.subQueryAlias) { + if (identifierChain.length === 2 && equalIgnoreCase(tablePrimary.alias, identifierChain[0].name)) { + addCleanTablePrimary(tables, tablePrimary); + } + else if (identifierChain.length === 2 && equalIgnoreCase(tablePrimary.identifierChain[0].name, identifierChain[0].name)) { + addCleanTablePrimary(tables, tablePrimary); + } + else if (identifierChain.length === 3 && tablePrimary.identifierChain.length > 1 && + equalIgnoreCase(tablePrimary.identifierChain[0].name, identifierChain[0].name) && + equalIgnoreCase(tablePrimary.identifierChain[1].name, identifierChain[1].name)) { + addCleanTablePrimary(tables, tablePrimary); + } + } + else { + if (tablePrimary.subQueryAlias) { + tables.push({ identifierChain: [{ subQuery: tablePrimary.subQueryAlias }] }); + } + else { + addCleanTablePrimary(tables, tablePrimary); + } + } + }); + // Possible Joins + if (tables.length > 0) { + wrapper.tables = tables; + delete wrapper.identifierChain; + return; + } + } + // Impala can have references to maps or array, i.e. FROM table t, t.map m + // We need to replace those in the identifierChain + if (parser.isImpala()) { + var lengthBefore = identifierChain.length; + identifierChain = parser.expandImpalaIdentifierChain(tablePrimaries, identifierChain); + // Change type of any locations marked as table + if (wrapper.type === 'table' && identifierChain.length > lengthBefore) { + wrapper.type = 'column'; + } + wrapper.identifierChain = identifierChain; + } + // Expand exploded views in the identifier chain + if (parser.isHive() && identifierChain.length > 0) { + identifierChain = parser.expandLateralViews(parser.yy.lateralViews, identifierChain); + wrapper.identifierChain = identifierChain; + } + // IdentifierChain contains a possibly started identifier or empty, example: a.b.c = ['a', 'b', 'c'] + // Reduce the tablePrimaries to the one that matches the first identifier if found + var foundPrimary; + var doubleMatch = false; + var aliasMatch = false; + if (identifierChain.length > 0) { + for (var i = 0; i < tablePrimaries.length; i++) { + if (tablePrimaries[i].subQueryAlias) { + if (equalIgnoreCase(tablePrimaries[i].subQueryAlias, identifierChain[0].name)) { + foundPrimary = tablePrimaries[i]; + } + } + else if (equalIgnoreCase(tablePrimaries[i].alias, identifierChain[0].name)) { + foundPrimary = tablePrimaries[i]; + aliasMatch = true; + break; + } + else if (tablePrimaries[i].identifierChain.length > 1 && identifierChain.length > 1 && + equalIgnoreCase(tablePrimaries[i].identifierChain[0].name, identifierChain[0].name) && + equalIgnoreCase(tablePrimaries[i].identifierChain[1].name, identifierChain[1].name)) { + foundPrimary = tablePrimaries[i]; + doubleMatch = true; + break; + } + else if (!foundPrimary && equalIgnoreCase(tablePrimaries[i].identifierChain[0].name, identifierChain[0].name) && identifierChain.length > (isColumnLocation ? 1 : 0)) { + foundPrimary = tablePrimaries[i]; + // No break as first two can still match. + } + else if (!foundPrimary && tablePrimaries[i].identifierChain.length > 1 && !tablePrimaries[i].alias + && equalIgnoreCase(tablePrimaries[i].identifierChain[tablePrimaries[i].identifierChain.length - 1].name, identifierChain[0].name)) { + // This is for the case SELECT baa. FROM bla.baa, blo.boo; + foundPrimary = tablePrimaries[i]; + break; + } + } + } + if (foundPrimary) { + if (foundPrimary.impalaComplex && wrapper.type === 'column') { + wrapper.type = 'complex'; + } + identifierChain.shift(); + if (doubleMatch) { + identifierChain.shift(); + } + } + else if (tablePrimaries.length === 1 && !isColumnWrapper) { + foundPrimary = tablePrimaries[0]; + } + if (foundPrimary) { + if (isColumnWrapper) { + wrapper.identifierChain = identifierChain; + if (foundPrimary.subQueryAlias) { + wrapper.tables = [{ subQuery: foundPrimary.subQueryAlias }]; + } + else if (foundPrimary.alias) { + if (!isColumnLocation && isColumnWrapper && aliasMatch) { + // TODO: add alias on table in suggestColumns (needs support in sqlAutocomplete3.js) + // the case is: SELECT cu.| FROM customers cu; + // This prevents alias from being added automatically in sqlAutocompleter3.js + wrapper.tables = [{ identifierChain: foundPrimary.identifierChain }]; + } + else { + wrapper.tables = [{ identifierChain: foundPrimary.identifierChain, alias: foundPrimary.alias }]; + } + } + else { + wrapper.tables = [{ identifierChain: foundPrimary.identifierChain }]; + } + } + else { + if (foundPrimary.subQueryAlias) { + identifierChain.unshift({ subQuery: foundPrimary.subQueryAlias }); + } + else { + identifierChain = foundPrimary.identifierChain.concat(identifierChain); + } + if (wrapper.tables) { + wrapper.tables.push({ identifierChain: identifierChain }); + delete wrapper.identifierChain; + } + else { + wrapper.identifierChain = identifierChain; + } + } + } + else { + if (isColumnWrapper) { + wrapper.tables = []; + } + tablePrimaries.forEach(function (tablePrimary) { + var targetTable = tablePrimary.subQueryAlias ? { subQuery: tablePrimary.subQueryAlias } : { identifierChain: tablePrimary.identifierChain }; + if (tablePrimary.alias) { + targetTable.alias = tablePrimary.alias; + } + if (wrapper.tables) { + wrapper.tables.push(targetTable); + } + }); + } + delete wrapper.owner; + wrapper.linked = true; + }; + var suggestLateralViewAliasesAsIdentifiers = function () { + if (typeof parser.yy.lateralViews === 'undefined' || parser.yy.lateralViews.length === 0) { + return; + } + if (typeof parser.yy.result.suggestIdentifiers === 'undefined') { + parser.yy.result.suggestIdentifiers = []; + } + parser.yy.lateralViews.forEach(function (lateralView) { + if (typeof lateralView.tableAlias !== 'undefined') { + parser.yy.result.suggestIdentifiers.push({ name: lateralView.tableAlias + '.', type: 'alias' }); + } + lateralView.columnAliases.forEach(function (columnAlias) { + parser.yy.result.suggestIdentifiers.push({ name: columnAlias, type: 'alias' }); + }); + }); + if (parser.yy.result.suggestIdentifiers.length === 0) { + delete parser.yy.result.suggestIdentifiers; + } + }; + var filterTablePrimariesForOwner = function (tablePrimaries, owner) { + var result = []; + tablePrimaries.forEach(function (primary) { + if (typeof owner === 'undefined' && typeof primary.owner === 'undefined') { + result.push(primary); + } + else if (owner === primary.owner) { + result.push(primary); + } + }); + return result; + }; + var convertTablePrimariesToSuggestions = function (tablePrimaries) { + var tables = []; + var identifiers = []; + tablePrimaries.forEach(function (tablePrimary) { + if (tablePrimary.identifierChain && tablePrimary.identifierChain.length > 0) { + var table = { identifierChain: tablePrimary.identifierChain }; + if (tablePrimary.alias) { + table.alias = tablePrimary.alias; + identifiers.push({ name: table.alias + '.', type: 'alias' }); + if (parser.isImpala()) { + var testForImpalaAlias = [{ name: table.alias }]; + var result = parser.expandImpalaIdentifierChain(tablePrimaries, testForImpalaAlias); + if (result.length > 1) { + // Continue if it's a reference to a complex type + return; + } + } + } + else { + var lastIdentifier = tablePrimary.identifierChain[tablePrimary.identifierChain.length - 1]; + if (typeof lastIdentifier.name !== 'undefined') { + identifiers.push({ name: lastIdentifier.name + '.', type: 'table' }); + } + else if (typeof lastIdentifier.subQuery !== 'undefined') { + identifiers.push({ name: lastIdentifier.subQuery + '.', type: 'sub-query' }); + } + } + tables.push(table); + } + else if (tablePrimary.subQueryAlias) { + identifiers.push({ name: tablePrimary.subQueryAlias + '.', type: 'sub-query' }); + tables.push({ identifierChain: [{ subQuery: tablePrimary.subQueryAlias }] }); + } + }); + if (identifiers.length > 0) { + if (typeof parser.yy.result.suggestIdentifiers === 'undefined') { + parser.yy.result.suggestIdentifiers = identifiers; + } + else { + parser.yy.result.suggestIdentifiers = identifiers.concat(parser.yy.result.suggestIdentifiers); + } + } + parser.yy.result.suggestColumns.tables = tables; + if (parser.yy.result.suggestColumns.identifierChain && parser.yy.result.suggestColumns.identifierChain.length === 0) { + delete parser.yy.result.suggestColumns.identifierChain; + } + parser.yy.result.suggestColumns.linked = true; + }; + var linkTablePrimaries = function () { + if (!parser.yy.cursorFound || typeof parser.yy.latestTablePrimaries === 'undefined') { + return; + } + SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) { + if (typeof parser.yy.result[suggestionType] !== 'undefined' && parser.yy.result[suggestionType].tablePrimaries && !parser.yy.result[suggestionType].linked) { + parser.yy.result[suggestionType].tables = []; + parser.yy.result[suggestionType].tablePrimaries.forEach(function (tablePrimary) { + if (!tablePrimary.subQueryAlias) { + parser.yy.result[suggestionType].tables.push(tablePrimary.alias ? { + identifierChain: tablePrimary.identifierChain.concat(), + alias: tablePrimary.alias + } : { identifierChain: tablePrimary.identifierChain.concat() }); + } + }); + delete parser.yy.result[suggestionType].tablePrimaries; + parser.yy.result[suggestionType].linked = true; + } + }); + if (typeof parser.yy.result.suggestColumns !== 'undefined' && !parser.yy.result.suggestColumns.linked) { + var tablePrimaries = filterTablePrimariesForOwner(parser.yy.latestTablePrimaries, parser.yy.result.suggestColumns.owner); + if (!parser.yy.result.suggestColumns.tables) { + parser.yy.result.suggestColumns.tables = []; + } + if (parser.yy.subQueries.length > 0) { + parser.yy.result.subQueries = parser.yy.subQueries; + } + if (typeof parser.yy.result.suggestColumns.identifierChain === 'undefined' || parser.yy.result.suggestColumns.identifierChain.length === 0) { + if (tablePrimaries.length > 1) { + convertTablePrimariesToSuggestions(tablePrimaries); + } + else { + suggestLateralViewAliasesAsIdentifiers(); + if (tablePrimaries.length === 1 && (tablePrimaries[0].alias || tablePrimaries[0].subQueryAlias)) { + convertTablePrimariesToSuggestions(tablePrimaries); + } + parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true }); + } + } + else { + // Expand exploded views in the identifier chain + if (parser.isHive() && !parser.yy.result.suggestColumns.linked) { + var originalLength = parser.yy.result.suggestColumns.identifierChain.length; + parser.yy.result.suggestColumns.identifierChain = parser.expandLateralViews(parser.yy.lateralViews, parser.yy.result.suggestColumns.identifierChain, true); + // Drop '*' keyword for lateral views + if (typeof parser.yy.result.suggestColumns !== 'undefined') { + if (parser.yy.result.suggestColumns.identifierChain.length > originalLength && + typeof parser.yy.result.suggestKeywords !== 'undefined' && + parser.yy.result.suggestKeywords.length === 1 && + parser.yy.result.suggestKeywords[0].value === '*') { + delete parser.yy.result.suggestKeywords; + } + parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true }); + } + } + else { + parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestColumns, anyOwner: false, isColumnWrapper: true }); + } + } + } + if (typeof parser.yy.result.colRef !== 'undefined' && !parser.yy.result.colRef.linked) { + parser.expandIdentifierChain({ wrapper: parser.yy.result.colRef }); + var primaries = filterTablePrimariesForOwner(parser.yy.latestTablePrimaries); + if (primaries.length === 0 || (primaries.length > 1 && parser.yy.result.colRef.identifierChain.length === 1)) { + parser.yy.result.colRef.identifierChain = []; + } + } + if (typeof parser.yy.result.suggestKeyValues !== 'undefined' && !parser.yy.result.suggestKeyValues.linked) { + parser.expandIdentifierChain({ wrapper: parser.yy.result.suggestKeyValues }); + } + }; + parser.getSubQuery = function (cols) { + var columns = []; + cols.selectList.forEach(function (col) { + var result = {}; + if (col.alias) { + result.alias = col.alias; + } + if (col.valueExpression && col.valueExpression.columnReference) { + result.identifierChain = col.valueExpression.columnReference; + } + else if (col.asterisk) { + result.identifierChain = [{ asterisk: true }]; + } + if (col.valueExpression && col.valueExpression.types && col.valueExpression.types.length === 1) { + result.type = col.valueExpression.types[0]; + } + columns.push(result); + }); + return { + columns: columns + }; + }; + parser.addTablePrimary = function (ref) { + if (typeof parser.yy.latestTablePrimaries === 'undefined') { + parser.yy.latestTablePrimaries = []; + } + parser.yy.latestTablePrimaries.push(ref); + }; + parser.suggestFileFormats = function () { + if (parser.isHive()) { + parser.suggestKeywords(['AVRO', 'INPUTFORMAT', 'ORC', 'PARQUET', 'RCFILE', 'SEQUENCEFILE', 'TEXTFILE']); + } + else { + parser.suggestKeywords(['AVRO', 'KUDU', 'ORC', 'PARQUET', 'RCFILE', 'SEQUENCEFILE', 'TEXTFILE']); + } + }; + parser.getKeywordsForOptionalsLR = function (optionals, keywords, override) { + var result = []; + for (var i = 0; i < optionals.length; i++) { + if (!optionals[i] && (typeof override === 'undefined' || override[i])) { + if (keywords[i] instanceof Array) { + result = result.concat(keywords[i]); + } + else { + result.push(keywords[i]); + } + } + else if (optionals[i]) { + break; + } + } + return result; + }; + parser.suggestDdlAndDmlKeywords = function (extraKeywords) { + var keywords = ['ALTER', 'CREATE', 'DESCRIBE', 'DROP', 'GRANT', 'INSERT', 'REVOKE', 'SELECT', 'SET', 'SHOW', 'TRUNCATE', 'UPDATE', 'USE', 'WITH']; + if (extraKeywords) { + keywords = keywords.concat(extraKeywords); + } + if (parser.isHive()) { + keywords = keywords.concat(['ABORT', 'ANALYZE TABLE', 'DELETE', 'EXPORT', 'IMPORT', 'LOAD', 'MERGE', 'MSCK', 'RELOAD FUNCTION', 'RESET']); + } + if (parser.isImpala()) { + keywords = keywords.concat(['COMMENT ON', 'COMPUTE', 'DELETE', 'INVALIDATE METADATA', 'LOAD', 'REFRESH', 'UPSERT']); + } + parser.suggestKeywords(keywords); + }; + parser.checkForSelectListKeywords = function (selectList) { + if (selectList.length === 0) { + return; + } + var last = selectList[selectList.length - 1]; + if (!last || !last.valueExpression) { + return; + } + var valueExpressionKeywords = parser.getValueExpressionKeywords(last.valueExpression); + var keywords = []; + if (last.suggestKeywords) { + keywords = keywords.concat(last.suggestKeywords); + } + if (valueExpressionKeywords.suggestKeywords) { + keywords = keywords.concat(valueExpressionKeywords.suggestKeywords); + } + if (valueExpressionKeywords.suggestColRefKeywords) { + parser.suggestColRefKeywords(valueExpressionKeywords.suggestColRefKeywords); + parser.addColRefIfExists(last.valueExpression); + } + if (!last.alias) { + keywords.push('AS'); + } + if (keywords.length > 0) { + parser.suggestKeywords(keywords); + } + }; + parser.checkForKeywords = function (expression) { + if (expression) { + if (expression.suggestKeywords && expression.suggestKeywords.length > 0) { + parser.suggestKeywords(expression.suggestKeywords); + } + if (expression.suggestColRefKeywords) { + parser.suggestColRefKeywords(expression.suggestColRefKeywords); + parser.addColRefIfExists(expression); + } + } + }; + parser.createWeightedKeywords = function (keywords, weight) { + var result = []; + keywords.forEach(function (keyword) { + if (typeof keyword.weight !== 'undefined') { + keyword.weight = weight + (keyword.weight / 10); + result.push(keyword); + } + else { + result.push({ value: keyword, weight: weight }); + } + }); + return result; + }; + parser.suggestKeywords = function (keywords) { + var weightedKeywords = []; + if (keywords.length == 0) { + return; + } + keywords.forEach(function (keyword) { + if (typeof keyword.weight !== 'undefined') { + weightedKeywords.push(keyword); + } + else { + weightedKeywords.push({ value: keyword, weight: -1 }); + } + }); + weightedKeywords.sort(function (a, b) { + if (a.weight !== b.weight) { + return b.weight - a.weight; + } + return a.value.localeCompare(b.value); + }); + parser.yy.result.suggestKeywords = weightedKeywords; + }; + parser.suggestColRefKeywords = function (colRefKeywords) { + parser.yy.result.suggestColRefKeywords = colRefKeywords; + }; + parser.suggestTablesOrColumns = function (identifier) { + if (typeof parser.yy.latestTablePrimaries == 'undefined') { + parser.suggestTables({ identifierChain: [{ name: identifier }] }); + return; + } + var tableRef = parser.yy.latestTablePrimaries.filter(function (tablePrimary) { + return equalIgnoreCase(tablePrimary.alias, identifier); + }); + if (tableRef.length > 0) { + parser.suggestColumns({ identifierChain: [{ name: identifier }] }); + } + else { + parser.suggestTables({ identifierChain: [{ name: identifier }] }); + } + }; + parser.suggestFunctions = function (details) { + parser.yy.result.suggestFunctions = details || {}; + }; + parser.suggestAggregateFunctions = function () { + var primaries = []; + var aliases = {}; + parser.yy.latestTablePrimaries.forEach(function (primary) { + if (typeof primary.alias !== 'undefined') { + aliases[primary.alias] = true; + } + // Drop if the first one refers to a table alias (...FROM tbl t, t.map tm ...) + if (typeof primary.identifierChain !== 'undefined' && !aliases[primary.identifierChain[0].name] && typeof primary.owner === 'undefined') { + primaries.push(primary); + } + }); + parser.yy.result.suggestAggregateFunctions = { tablePrimaries: primaries }; + }; + parser.suggestAnalyticFunctions = function () { + parser.yy.result.suggestAnalyticFunctions = true; + }; + parser.suggestSetOptions = function () { + parser.yy.result.suggestSetOptions = true; + }; + parser.suggestIdentifiers = function (identifiers) { + parser.yy.result.suggestIdentifiers = identifiers; + }; + parser.suggestColumns = function (details) { + if (typeof details === 'undefined') { + details = { identifierChain: [] }; + } + else if (typeof details.identifierChain === 'undefined') { + details.identifierChain = []; + } + parser.yy.result.suggestColumns = details; + }; + parser.suggestGroupBys = function (details) { + parser.yy.result.suggestGroupBys = details || {}; + }; + parser.suggestOrderBys = function (details) { + parser.yy.result.suggestOrderBys = details || {}; + }; + parser.suggestFilters = function (details) { + parser.yy.result.suggestFilters = details || {}; + }; + parser.suggestKeyValues = function (details) { + parser.yy.result.suggestKeyValues = details || {}; + }; + parser.suggestTables = function (details) { + parser.yy.result.suggestTables = details || {}; + }; + var adjustLocationForCursor = function (location) { + // columns are 0-based and lines not, so add 1 to cols + var newLocation = { + first_line: location.first_line, + last_line: location.last_line, + first_column: location.first_column + 1, + last_column: location.last_column + 1 + }; + if (parser.yy.cursorFound) { + if (parser.yy.cursorFound.first_line === newLocation.first_line && parser.yy.cursorFound.last_column <= newLocation.first_column) { + var additionalSpace = parser.yy.partialLengths.left + parser.yy.partialLengths.right; + additionalSpace -= parser.yy.partialCursor ? 1 : 3; // For some reason the normal cursor eats 3 positions. + newLocation.first_column = newLocation.first_column + additionalSpace; + newLocation.last_column = newLocation.last_column + additionalSpace; + } + } + return newLocation; + }; + parser.addFunctionLocation = function (location, functionName) { + // Remove trailing '(' from location + var adjustedLocation = { + first_line: location.first_line, + last_line: location.last_line, + first_column: location.first_column, + last_column: location.last_column - 1 + }; + parser.yy.locations.push({ + type: 'function', + location: adjustLocationForCursor(adjustedLocation), + function: functionName.toLowerCase() + }); + }; + parser.addStatementLocation = function (location) { + // Don't report lonely cursor as a statement + if (location.first_line === location.last_line && Math.abs(location.last_column - location.first_column) === 1) { + return; + } + var adjustedLocation; + if (parser.yy.cursorFound && parser.yy.cursorFound.last_line === location.last_line && + parser.yy.cursorFound.first_column >= location.first_column && parser.yy.cursorFound.last_column <= location.last_column) { + var additionalSpace = parser.yy.partialLengths.left + parser.yy.partialLengths.right; + adjustedLocation = { + first_line: location.first_line, + last_line: location.last_line, + first_column: location.first_column + 1, + last_column: location.last_column + additionalSpace - (parser.yy.partialCursor ? 0 : 2) + }; + } + else { + adjustedLocation = { + first_line: location.first_line, + last_line: location.last_line, + first_column: location.first_column + 1, + last_column: location.last_column + 1 + }; + } + parser.yy.locations.push({ + type: 'statement', + location: adjustedLocation + }); + }; + parser.firstDefined = function () { + for (var i = 0; i + 1 < arguments.length; i += 2) { + if (arguments[i]) { + return arguments[i + 1]; + } + } + }; + parser.addClauseLocation = function (type, precedingLocation, locationIfPresent, isCursor) { + var location; + if (isCursor) { + if (parser.yy.partialLengths.left === 0 && parser.yy.partialLengths.right === 0) { + location = { + type: type, + missing: true, + location: adjustLocationForCursor({ + first_line: precedingLocation.last_line, + first_column: precedingLocation.last_column, + last_line: precedingLocation.last_line, + last_column: precedingLocation.last_column + }) + }; + } + else { + location = { + type: type, + missing: false, + location: { + first_line: locationIfPresent.last_line, + first_column: locationIfPresent.last_column - 1, + last_line: locationIfPresent.last_line, + last_column: locationIfPresent.last_column - 1 + parser.yy.partialLengths.right + parser.yy.partialLengths.left + } + }; + } + } + else { + location = { + type: type, + missing: !locationIfPresent, + location: adjustLocationForCursor(locationIfPresent || { + first_line: precedingLocation.last_line, + first_column: precedingLocation.last_column, + last_line: precedingLocation.last_line, + last_column: precedingLocation.last_column + }) + }; + } + if (parser.isInSubquery()) { + location.subquery = true; + } + parser.yy.locations.push(location); + }; + parser.addStatementTypeLocation = function (identifier, location, additionalText) { + if (!parser.isImpala()) { + return; + } + var loc = { + type: 'statementType', + location: adjustLocationForCursor(location), + identifier: identifier + }; + if (typeof additionalText !== 'undefined') { + switch (identifier) { + case 'ALTER': + if (/ALTER\s+VIEW/i.test(additionalText)) { + loc.identifier = 'ALTER VIEW'; + } + else { + loc.identifier = 'ALTER TABLE'; + } + break; + case 'COMPUTE': + loc.identifier = 'COMPUTE STATS'; + break; + case 'CREATE': + if (/CREATE\s+VIEW/i.test(additionalText)) { + loc.identifier = 'CREATE VIEW'; + } + else if (/CREATE\s+TABLE/i.test(additionalText)) { + loc.identifier = 'CREATE TABLE'; + } + else if (/CREATE\s+DATABASE/i.test(additionalText)) { + loc.identifier = 'CREATE DATABASE'; + } + else if (/CREATE\s+ROLE/i.test(additionalText)) { + loc.identifier = 'CREATE ROLE'; + } + else if (/CREATE\s+FUNCTION/i.test(additionalText)) { + loc.identifier = 'CREATE FUNCTION'; + } + else { + loc.identifier = 'CREATE TABLE'; + } + break; + case 'DROP': + if (/DROP\s+VIEW/i.test(additionalText)) { + loc.identifier = 'DROP VIEW'; + } + else if (/DROP\s+TABLE/i.test(additionalText)) { + loc.identifier = 'DROP TABLE'; + } + else if (/DROP\s+DATABASE/i.test(additionalText)) { + loc.identifier = 'DROP DATABASE'; + } + else if (/DROP\s+ROLE/i.test(additionalText)) { + loc.identifier = 'DROP ROLE'; + } + else if (/DROP\s+STATS/i.test(additionalText)) { + loc.identifier = 'DROP STATS'; + } + else if (/DROP\s+FUNCTION/i.test(additionalText)) { + loc.identifier = 'DROP FUNCTION'; + } + else { + loc.identifier = 'DROP TABLE'; + } + break; + case 'INVALIDATE': + loc.identifier = 'INVALIDATE METADATA'; + break; + case 'LOAD': + loc.identifier = 'LOAD DATA'; + break; + case 'TRUNCATE': + loc.identifier = 'TRUNCATE TABLE'; + break; + default: + } + } + parser.yy.locations.push(loc); + }; + parser.addFileLocation = function (location, path) { + parser.yy.locations.push({ + type: 'file', + location: adjustLocationForCursor(location), + path: path + }); + }; + parser.addDatabaseLocation = function (location, identifierChain) { + parser.yy.locations.push({ + type: 'database', + location: adjustLocationForCursor(location), + identifierChain: identifierChain + }); + }; + parser.addTableLocation = function (location, identifierChain) { + parser.yy.locations.push({ + type: 'table', + location: adjustLocationForCursor(location), + identifierChain: identifierChain + }); + }; + parser.addColumnAliasLocation = function (location, alias, parentLocation) { + var aliasLocation = { + type: 'alias', + source: 'column', + alias: alias, + location: adjustLocationForCursor(location), + parentLocation: adjustLocationForCursor(parentLocation) + }; + if (parser.yy.locations.length && parser.yy.locations[parser.yy.locations.length - 1].type === 'column') { + var closestColumn = parser.yy.locations[parser.yy.locations.length - 1]; + if (closestColumn.location.first_line === aliasLocation.parentLocation.first_line && + closestColumn.location.last_line === aliasLocation.parentLocation.last_line && + closestColumn.location.first_column === aliasLocation.parentLocation.first_column && + closestColumn.location.last_column === aliasLocation.parentLocation.last_column) { + parser.yy.locations[parser.yy.locations.length - 1].alias = alias; + } + } + parser.yy.locations.push(aliasLocation); + }; + parser.addTableAliasLocation = function (location, alias, identifierChain) { + parser.yy.locations.push({ + type: 'alias', + source: 'table', + alias: alias, + location: adjustLocationForCursor(location), + identifierChain: identifierChain + }); + }; + parser.addSubqueryAliasLocation = function (location, alias) { + parser.yy.locations.push({ + type: 'alias', + source: 'subquery', + alias: alias, + location: adjustLocationForCursor(location) + }); + }; + parser.addAsteriskLocation = function (location, identifierChain) { + parser.yy.locations.push({ + type: 'asterisk', + location: adjustLocationForCursor(location), + identifierChain: identifierChain + }); + }; + parser.addVariableLocation = function (location, value) { + if (/\$\{[^}]*\}/.test(value)) { + parser.yy.locations.push({ + type: 'variable', + location: adjustLocationForCursor(location), + value: value + }); + } + }; + parser.addColumnLocation = function (location, identifierChain) { + var isVariable = identifierChain.length && /\$\{[^}]*\}/.test(identifierChain[identifierChain.length - 1].name); + if (isVariable) { + parser.yy.locations.push({ + type: 'variable', + location: adjustLocationForCursor(location), + value: identifierChain[identifierChain.length - 1].name + }); + } + else { + parser.yy.locations.push({ + type: 'column', + location: adjustLocationForCursor(location), + identifierChain: identifierChain, + qualified: identifierChain.length > 1 + }); + } + }; + parser.addCteAliasLocation = function (location, alias) { + parser.yy.locations.push({ + type: 'alias', + source: 'cte', + alias: alias, + location: adjustLocationForCursor(location) + }); + }; + parser.addUnknownLocation = function (location, identifierChain) { + var isVariable = identifierChain.length && /\$\{[^}]*\}/.test(identifierChain[identifierChain.length - 1].name); + var loc; + if (isVariable) { + loc = { + type: 'variable', + location: adjustLocationForCursor(location), + value: identifierChain[identifierChain.length - 1].name + }; + } + else { + loc = { + type: 'unknown', + location: adjustLocationForCursor(location), + identifierChain: identifierChain, + qualified: identifierChain.length > 1 + }; + } + parser.yy.locations.push(loc); + return loc; + }; + parser.addColRefToVariableIfExists = function (left, right) { + if (left && left.columnReference && left.columnReference.length && right && right.columnReference && right.columnReference.length && parser.yy.locations.length > 1) { + var addColRefToVariableLocation = function (variableValue, colRef) { + // See if colref is actually an alias + if (colRef.length === 1 && colRef[0].name) { + parser.yy.locations.some(function (location) { + if (location.type === 'column' && location.alias === colRef[0].name) { + colRef = location.identifierChain; + return true; + } + }); + } + for (var i = parser.yy.locations.length - 1; i > 0; i--) { + var location = parser.yy.locations[i]; + if (location.type === 'variable' && location.value === variableValue) { + location.colRef = { identifierChain: colRef }; + break; + } + } + }; + if (/\$\{[^}]*\}/.test(left.columnReference[0].name)) { + // left is variable + addColRefToVariableLocation(left.columnReference[0].name, right.columnReference); + } + else if (/\$\{[^}]*\}/.test(right.columnReference[0].name)) { + // right is variable + addColRefToVariableLocation(right.columnReference[0].name, left.columnReference); + } + } + }; + parser.suggestDatabases = function (details) { + parser.yy.result.suggestDatabases = details || {}; + }; + parser.suggestHdfs = function (details) { + parser.yy.result.suggestHdfs = details || {}; + }; + parser.suggestValues = function (details) { + parser.yy.result.suggestValues = details || {}; + }; + parser.determineCase = function (text) { + if (!parser.yy.caseDetermined) { + parser.yy.lowerCase = text.toLowerCase() === text; + parser.yy.caseDetermined = true; + } + }; + parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) { + if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) { + parser.yy.partialCursor = yytext.indexOf('\u2021') !== -1; + var cursorIndex = parser.yy.partialCursor ? yytext.indexOf('\u2021') : yytext.indexOf('\u2020'); + parser.yy.cursorFound = { + first_line: yylloc.first_line, + last_line: yylloc.last_line, + first_column: yylloc.first_column + cursorIndex, + last_column: yylloc.first_column + cursorIndex + 1 + }; + var remainder = yytext.substring(cursorIndex + 1); + var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length; + if (remainingQuotes > 0 && remainingQuotes & 1 != 0) { + parser.yy.missingEndQuote = false; + lexer.input(); + } + else { + parser.yy.missingEndQuote = true; + lexer.unput(remainder); + } + lexer.popState(); + return true; + } + return false; + }; + var lexerModified = false; + /** + * Main parser function + */ + parser.parseSql = function (beforeCursor, afterCursor, dialect, debug) { + // Jison counts CRLF as two lines in the locations + beforeCursor = beforeCursor.replace(/\r\n|\n\r/gm, '\n'); + afterCursor = afterCursor.replace(/\r\n|\n\r/gm, '\n'); + parser.yy.result = { locations: [] }; + parser.yy.lowerCase = false; + parser.yy.locations = []; + parser.yy.allLocations = []; + parser.yy.subQueries = []; + parser.yy.errors = []; + parser.yy.selectListAliases = []; + parser.yy.locationsStack = []; + parser.yy.primariesStack = []; + parser.yy.lateralViewsStack = []; + parser.yy.subQueriesStack = []; + parser.yy.resultStack = []; + parser.yy.selectListAliasesStack = []; + delete parser.yy.caseDetermined; + delete parser.yy.cursorFound; + delete parser.yy.partialCursor; + parser.prepareNewStatement(); + var REASONABLE_SURROUNDING_LENGTH = 150000; // About 3000 lines before and after + if (beforeCursor.length > REASONABLE_SURROUNDING_LENGTH) { + if ((beforeCursor.length - beforeCursor.lastIndexOf(';')) > REASONABLE_SURROUNDING_LENGTH) { + // Bail out if the last complete statement is more than 150000 chars before + return {}; + } + // Cut it at the first statement found within 150000 chars before + var lastReasonableChunk = beforeCursor.substring(beforeCursor.length - REASONABLE_SURROUNDING_LENGTH); + beforeCursor = lastReasonableChunk.substring(lastReasonableChunk.indexOf(';') + 1); + } + if (afterCursor.length > REASONABLE_SURROUNDING_LENGTH) { + if ((afterCursor.length - afterCursor.indexOf(';')) > REASONABLE_SURROUNDING_LENGTH) { + // No need to bail out for what's comes after, we can still get keyword completion + afterCursor = ''; + } + else { + // Cut it at the last statement found within 150000 chars after + var firstReasonableChunk = afterCursor.substring(0, REASONABLE_SURROUNDING_LENGTH); + afterCursor = firstReasonableChunk.substring(0, firstReasonableChunk.lastIndexOf(';')); + } + } + parser.yy.partialLengths = parser.identifyPartials(beforeCursor, afterCursor); + if (parser.yy.partialLengths.left > 0) { + beforeCursor = beforeCursor.substring(0, beforeCursor.length - parser.yy.partialLengths.left); + } + if (parser.yy.partialLengths.right > 0) { + afterCursor = afterCursor.substring(parser.yy.partialLengths.right); + } + parser.yy.activeDialect = (dialect !== 'hive' && dialect !== 'impala') ? undefined : dialect; + // Hack to set the inital state of the lexer without first having to hit a token + // has to be done as the first token found can be dependant on dialect + if (!lexerModified) { + var originalSetInput = parser.lexer.setInput; + parser.lexer.setInput = function (input, yy) { + var lexer = originalSetInput.bind(parser.lexer)(input, yy); + if (typeof parser.yy.activeDialect !== 'undefined') { + lexer.begin(parser.yy.activeDialect); + } + return lexer; + }; + lexerModified = true; + } + var result; + try { + // Add |CURSOR| or |PARTIAL_CURSOR| to represent the different cursor states in the lexer + result = parser.parse(beforeCursor + (beforeCursor.length == 0 || /[\s\(]$$/.test(beforeCursor) ? ' \u2020 ' : '\u2021') + afterCursor); + } + catch (err) { + // On any error try to at least return any existing result + if (typeof parser.yy.result === 'undefined') { + throw err; + } + if (debug) { + console.log(err); + console.error(err.stack); + } + result = parser.yy.result; + } + if (parser.yy.errors.length > 0) { + parser.yy.result.errors = parser.yy.errors; + if (debug) { + console.log(parser.yy.errors); + } + } + try { + linkTablePrimaries(); + parser.commitLocations(); + // Clean up and prioritize + prioritizeSuggestions(); + } + catch (err) { + if (debug) { + console.log(err); + console.error(err.stack); + } + } + parser.yy.allLocations.sort(function (a, b) { + if (a.location.first_line !== b.location.first_line) { + return a.location.first_line - b.location.first_line; + } + if (a.location.first_column !== b.location.first_column) { + return a.location.first_column - b.location.first_column; + } + if (a.location.last_column !== b.location.last_column) { + return b.location.last_column - a.location.last_column; + } + return b.type.localeCompare(a.type); + }); + parser.yy.result.locations = parser.yy.allLocations; + parser.yy.result.locations.forEach(function (location) { + delete location.linked; + }); + if (typeof parser.yy.result.suggestColumns !== 'undefined') { + delete parser.yy.result.suggestColumns.linked; + } + SIMPLE_TABLE_REF_SUGGESTIONS.forEach(function (suggestionType) { + if (typeof parser.yy.result[suggestionType] !== 'undefined') { + delete parser.yy.result[suggestionType].linked; + } + }); + if (typeof parser.yy.result.colRef !== 'undefined') { + delete parser.yy.result.colRef.linked; + } + if (typeof parser.yy.result.suggestKeyValues !== 'undefined') { + delete parser.yy.result.suggestKeyValues.linked; + } + if (typeof result.error !== 'undefined' && typeof result.error.expected !== 'undefined') { + // Remove any expected tokens from other dialects, jison doesn't remove tokens from other lexer states. + var actualExpected = {}; + result.error.expected.forEach(function (expected) { + var match = expected.match(/\<([a-z]+)\>(.*)/); + if (match !== null) { + if (typeof parser.yy.activeDialect !== 'undefined' && parser.yy.activeDialect === match[1]) { + actualExpected[("'" + match[2])] = true; + } + } + else if (expected.indexOf('CURSOR') == -1) { + actualExpected[expected] = true; + } + }); + result.error.expected = Object.keys(actualExpected); + } + if (typeof result.error !== 'undefined' && result.error.recoverable) { + delete result.error; + } + // Adjust all the statement locations to include white space surrounding them + var lastStatementLocation = null; + result.locations.forEach(function (location) { + if (location.type === 'statement') { + if (lastStatementLocation === null) { + location.location.first_line = 1; + location.location.first_column = 1; + } + else { + location.location.first_line = lastStatementLocation.location.last_line; + location.location.first_column = lastStatementLocation.location.last_column + 1; + } + lastStatementLocation = location; + } + }); + return result; + }; + }; + var SYNTAX_PARSER_NOOP_FUNCTIONS = ['prepareNewStatement', 'addCommonTableExpressions', 'pushQueryState', 'popQueryState', 'suggestSelectListAliases', + 'suggestValueExpressionKeywords', 'getSelectListKeywords', 'getValueExpressionKeywords', 'addColRefIfExists', 'selectListNoTableSuggest', 'suggestJoinConditions', + 'suggestJoins', 'valueExpressionSuggest', 'applyTypeToSuggestions', 'applyArgumentTypesToSuggestions', 'commitLocations', 'identifyPartials', + 'getSubQuery', 'addTablePrimary', 'suggestFileFormats', 'suggestDdlAndDmlKeywords', 'checkForSelectListKeywords', 'checkForKeywords', + 'suggestKeywords', 'suggestColRefKeywords', 'suggestTablesOrColumns', 'suggestFunctions', 'suggestAggregateFunctions', 'suggestAnalyticFunctions', + 'suggestColumns', 'suggestGroupBys', 'suggestIdentifiers', 'suggestOrderBys', 'suggestFilters', 'suggestKeyValues', 'suggestTables', 'addFunctionLocation', + 'addStatementLocation', 'firstDefined', 'addClauseLocation', 'addStatementTypeLocation', 'addFileLocation', 'addDatabaseLocation', 'addColumnAliasLocation', + 'addTableAliasLocation', 'addSubqueryAliasLocation', 'addTableLocation', 'addAsteriskLocation', 'addVariableLocation', 'addColumnLocation', 'addCteAliasLocation', + 'addUnknownLocation', 'addColRefToVariableIfExists', 'suggestDatabases', 'suggestHdfs', 'suggestValues']; + var SYNTAX_PARSER_NOOP = function () { }; + var initSyntaxParser = function (parser) { + // Noop functions for compatibility with the autocomplete parser as the grammar is shared + SYNTAX_PARSER_NOOP_FUNCTIONS.forEach(function (noopFn) { + parser[noopFn] = SYNTAX_PARSER_NOOP; + }); + parser.yy.locations = [{}]; + parser.determineCase = function (text) { + if (!parser.yy.caseDetermined) { + parser.yy.lowerCase = text.toLowerCase() === text; + parser.yy.caseDetermined = true; + } + }; + parser.getKeywordsForOptionalsLR = function () { + return []; + }; + parser.mergeSuggestKeywords = function () { + return {}; + }; + parser.getTypeKeywords = function () { + return []; + }; + parser.getColumnDataTypeKeywords = function () { + return []; + }; + parser.findCaseType = function () { + return { types: ['T'] }; + }; + parser.findReturnTypes = function (functionName) { + return ['T']; + }; + parser.isHive = function () { + return parser.yy.activeDialect === 'hive'; + }; + parser.isImpala = function () { + return parser.yy.activeDialect === 'impala'; + }; + parser.expandImpalaIdentifierChain = function () { + return []; + }; + parser.expandIdentifierChain = function () { + return []; + }; + parser.expandLateralViews = function () { + return []; + }; + parser.createWeightedKeywords = function () { + return []; + }; + parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) { + if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) { + parser.yy.partialCursor = yytext.indexOf('\u2021') !== -1; + var cursorIndex = parser.yy.partialCursor ? yytext.indexOf('\u2021') : yytext.indexOf('\u2020'); + parser.yy.cursorFound = { + first_line: yylloc.first_line, + last_line: yylloc.last_line, + first_column: yylloc.first_column + cursorIndex, + last_column: yylloc.first_column + cursorIndex + 1 + }; + var remainder = yytext.substring(cursorIndex + 1); + var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length; + if (remainingQuotes > 0 && remainingQuotes & 1 != 0) { + parser.yy.missingEndQuote = false; + lexer.input(); + } + else { + parser.yy.missingEndQuote = true; + lexer.unput(remainder); + } + lexer.popState(); + return true; + } + return false; + }; + var lexerModified = false; + parser.yy.parseError = function (str, hash) { + parser.yy.error = hash; + }; + var IGNORED_EXPECTED = { + ';': true, + '.': true, + 'EOF': true, + 'UNSIGNED_INTEGER': true, + 'UNSIGNED_INTEGER_E': true, + 'REGULAR_IDENTIFIER': true, + 'CURSOR': true, + 'PARTIAL_CURSOR': true, + 'HDFS_START_QUOTE': true, + 'HDFS_PATH': true, + 'HDFS_END_QUOTE': true, + 'COMPARISON_OPERATOR': true, + 'ARITHMETIC_OPERATOR': true, + 'VARIABLE_REFERENCE': true, + 'BACKTICK': true, + 'VALUE': true, + 'PARTIAL_VALUE': true, + 'SINGLE_QUOTE': true, + 'DOUBLE_QUOTE': true + }; + var CLEAN_EXPECTED = { + 'BETWEEN_AND': 'AND', + 'OVERWRITE_DIRECTORY': 'OVERWRITE', + 'STORED_AS_DIRECTORIES': 'STORED', + 'LIKE_PARQUET': 'LIKE', + 'PARTITION_VALUE': 'PARTITION' + }; + parser.parseSyntax = function (beforeCursor, afterCursor, dialect, debug) { + parser.yy.caseDetermined = false; + parser.yy.error = undefined; + parser.yy.latestTablePrimaries = []; + parser.yy.subQueries = []; + parser.yy.selectListAliases = []; + parser.yy.latestTablePrimaries = []; + parser.yy.activeDialect = (dialect !== 'hive' && dialect !== 'impala') ? undefined : dialect; + // Hack to set the inital state of the lexer without first having to hit a token + // has to be done as the first token found can be dependant on dialect + if (!lexerModified) { + var originalSetInput = parser.lexer.setInput; + parser.lexer.setInput = function (input, yy) { + var lexer = originalSetInput.bind(parser.lexer)(input, yy); + if (typeof parser.yy.activeDialect !== 'undefined') { + lexer.begin(parser.yy.activeDialect); + } + return lexer; + }; + lexerModified = true; + } + // TODO: Find a way around throwing an exception when the parser finds a syntax error + try { + parser.yy.error = false; + parser.parse(beforeCursor + afterCursor); + } + catch (err) { + if (debug) { + console.log(err); + console.error(err.stack); + console.log(parser.yy.error); + } + } + if (parser.yy.error && (parser.yy.error.loc.last_column < beforeCursor.length || !beforeCursor.endsWith(parser.yy.error.text))) { + var weightedExpected = []; + var addedExpected = {}; + var isLowerCase = parser.yy.caseDetermined && parser.yy.lowerCase || parser.yy.error.text.toLowerCase() === parser.yy.error.text; + if (parser.yy.error.expected.length == 2 && parser.yy.error.expected.indexOf('\';\'') !== -1 && parser.yy.error.expected.indexOf('\'EOF\'') !== -1) { + parser.yy.error.expected = []; + parser.yy.error.expectedStatementEnd = true; + return parser.yy.error; + } + for (var i = 0; i < parser.yy.error.expected.length; i++) { + var expected = parser.yy.error.expected[i]; + // Strip away the surrounding ' chars + expected = expected.substring(1, expected.length - 1); + // TODO: Only suggest alphanumeric? + if (!IGNORED_EXPECTED[expected] && /[a-z_]+/i.test(expected)) { + if (dialect && expected.indexOf('<' + dialect + '>') == 0) { + expected = expected.substring(dialect.length + 2); + } + else if (/^<[a-z]+>/.test(expected)) { + continue; + } + expected = CLEAN_EXPECTED[expected] || expected; + if (expected === parser.yy.error.text.toUpperCase()) { + // Can happen when the lexer entry for a rule contains multiple words like 'stored' in 'stored as parquet' + return false; + } + var text = isLowerCase ? expected.toLowerCase() : expected; + if (text && !addedExpected[text]) { + addedExpected[text] = true; + weightedExpected.push({ + text: text, + distance: stringDistance(parser.yy.error.text, text, true) + }); + } + } + } + if (weightedExpected.length === 0) { + parser.yy.error.expected = []; + parser.yy.error.incompleteStatement = true; + return parser.yy.error; + } + weightedExpected.sort(function (a, b) { + if (a.distance === b.distance) { + return a.text.localeCompare(b.text); + } + return a.distance - b.distance; + }); + parser.yy.error.expected = weightedExpected; + parser.yy.error.incompleteStatement = true; + return parser.yy.error; + } + else if (parser.yy.error) { + parser.yy.error.expected = []; + parser.yy.error.incompleteStatement = true; + return parser.yy.error; + } + return false; + }; + }; + var initGlobalSearchParser = function (parser) { + parser.identifyPartials = function (beforeCursor, afterCursor) { + var beforeMatch = beforeCursor.match(/[0-9a-zA-Z_]*$/); + var afterMatch = afterCursor.match(/^[0-9a-zA-Z_]*(?:\((?:[^)]*\))?)?/); + return { left: beforeMatch ? beforeMatch[0].length : 0, right: afterMatch ? afterMatch[0].length : 0 }; + }; + parser.mergeFacets = function (a, b) { + if (!a.facets) { + a.facets = {}; + } + if (!b.facets) { + return; + } + Object.keys(b.facets).forEach(function (key) { + if (a.facets[key]) { + Object.keys(b.facets[key]).forEach(function (val) { + a.facets[key][val.toLowerCase()] = true; + }); + } + else { + a.facets[key] = b.facets[key]; + } + }); + }; + parser.mergeText = function (a, b) { + if (!a.text) { + a.text = []; + } + if (!b.text) { + return; + } + a.text = a.text.concat(b.text); + }; + parser.handleQuotedValueWithCursor = function (lexer, yytext, yylloc, quoteChar) { + if (yytext.indexOf('\u2020') !== -1 || yytext.indexOf('\u2021') !== -1) { + var cursorIndex = yytext.indexOf('\u2020'); + parser.yy.cursorFound = { + first_line: yylloc.first_line, + last_line: yylloc.last_line, + first_column: yylloc.first_column + cursorIndex, + last_column: yylloc.first_column + cursorIndex + 1 + }; + var remainder = yytext.substring(cursorIndex + 1); + var remainingQuotes = (lexer.upcomingInput().match(new RegExp(quoteChar, 'g')) || []).length; + if (remainingQuotes > 0 && remainingQuotes & 1 != 0) { + parser.yy.missingEndQuote = false; + lexer.input(); + } + else { + parser.yy.missingEndQuote = true; + lexer.unput(remainder); + } + lexer.popState(); + return true; + } + return false; + }; + parser.parseGlobalSearch = function (beforeCursor, afterCursor, debug) { + delete parser.yy.cursorFound; + var result; + try { + result = parser.parse(beforeCursor + '\u2020' + afterCursor); + } + catch (err) { + if (debug) { + console.log(err); + console.error(err.stack); + console.log(parser.yy.error); + } + return { + facets: {}, + text: [] + }; + } + return result; + }; + }; + return { + initSqlParser: initSqlParser, + initSyntaxParser: initSyntaxParser, + stringDistance: stringDistance, + initGlobalSearchParser: initGlobalSearchParser + }; +})(); +/* parser generated by jison 0.4.18 */ +/* + Returns a Parser object of the following structure: + + Parser: { + yy: {} + } + + Parser.prototype: { + yy: {}, + trace: function(), + symbols_: {associative list: name ==> number}, + terminals_: {associative list: number ==> name}, + productions_: [...], + performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), + table: [...], + defaultActions: {...}, + parseError: function(str, hash), + parse: function(input), + + lexer: { + EOF: 1, + parseError: function(str, hash), + setInput: function(input), + input: function(), + unput: function(str), + more: function(), + less: function(n), + pastInput: function(), + upcomingInput: function(), + showPosition: function(), + test_match: function(regex_match_array, rule_index), + next: function(), + lex: function(), + begin: function(condition), + popState: function(), + _currentRules: function(), + topState: function(), + pushState: function(condition), + + options: { + ranges: boolean (optional: true ==> token location info will include a .range[] member) + flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) + backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) + }, + + performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), + rules: [...], + conditions: {associative list: name ==> set}, + } + } + + + token location info (@$, _$, etc.): { + first_line: n, + last_line: n, + first_column: n, + last_column: n, + range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) + } + + + the parseError function receives a 'hash' object with these members for lexer and parser errors: { + text: (matched text) + token: (the produced terminal token, if any) + line: (yylineno) + } + while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { + loc: (yylloc) + expected: (string describing the set of expected tokens) + recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) + } +*/ +var sqlAutocompleteParser = (function () { + var o = function (k, v, o, l) { for (o = o || {}, l = k.length; l--; o[k[l]] = v) + ; return o; }, $V0 = [2, 6, 10, 19, 24, 26, 28, 30, 32, 33, 34, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 56, 58, 59, 60, 61, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 156, 157, 158, 160, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 438, 439, 440, 441, 452, 569, 570, 571, 577, 763, 826, 868, 930, 931, 933, 1166, 1190, 1191, 1192, 1193, 1195, 1213, 1227, 1252, 1253, 1278, 1314], $V1 = [2, 4], $V2 = [6, 10], $V3 = [2, 5], $V4 = [1, 6], $V5 = [1, 385], $V6 = [1, 359], $V7 = [1, 442], $V8 = [1, 13], $V9 = [1, 422], $Va = [1, 17], $Vb = [1, 19], $Vc = [1, 20], $Vd = [1, 23], $Ve = [1, 24], $Vf = [1, 78], $Vg = [1, 79], $Vh = [1, 80], $Vi = [1, 25], $Vj = [1, 81], $Vk = [1, 82], $Vl = [1, 30], $Vm = [1, 32], $Vn = [1, 83], $Vo = [1, 33], $Vp = [1, 34], $Vq = [1, 35], $Vr = [1, 38], $Vs = [1, 39], $Vt = [1, 383], $Vu = [1, 473], $Vv = [1, 42], $Vw = [1, 43], $Vx = [1, 46], $Vy = [1, 85], $Vz = [1, 88], $VA = [1, 89], $VB = [1, 91], $VC = [1, 50], $VD = [1, 90], $VE = [1, 51], $VF = [1, 92], $VG = [1, 93], $VH = [1, 545], $VI = [1, 94], $VJ = [1, 95], $VK = [1, 56], $VL = [1, 96], $VM = [1, 562], $VN = [1, 531], $VO = [1, 98], $VP = [1, 58], $VQ = [1, 100], $VR = [1, 102], $VS = [1, 59], $VT = [1, 60], $VU = [1, 103], $VV = [1, 104], $VW = [1, 105], $VX = [1, 62], $VY = [1, 63], $VZ = [1, 106], $V_ = [1, 65], $V$ = [1, 532], $V01 = [1, 67], $V11 = [1, 57], $V21 = [1, 68], $V31 = [1, 69], $V41 = [1, 107], $V51 = [1, 108], $V61 = [1, 110], $V71 = [1, 111], $V81 = [1, 112], $V91 = [1, 113], $Va1 = [1, 71], $Vb1 = [1, 559], $Vc1 = [1, 114], $Vd1 = [1, 115], $Ve1 = [1, 72], $Vf1 = [1, 116], $Vg1 = [1, 118], $Vh1 = [1, 278], $Vi1 = [1, 119], $Vj1 = [1, 121], $Vk1 = [1, 122], $Vl1 = [1, 123], $Vm1 = [1, 124], $Vn1 = [1, 75], $Vo1 = [1, 125], $Vp1 = [1, 126], $Vq1 = [1, 127], $Vr1 = [1, 542], $Vs1 = [1, 76], $Vt1 = [1, 129], $Vu1 = [1, 131], $Vv1 = [1, 307], $Vw1 = [1, 310], $Vx1 = [1, 311], $Vy1 = [1, 312], $Vz1 = [1, 316], $VA1 = [1, 317], $VB1 = [1, 318], $VC1 = [1, 319], $VD1 = [1, 196], $VE1 = [1, 198], $VF1 = [1, 199], $VG1 = [1, 179], $VH1 = [1, 204], $VI1 = [1, 205], $VJ1 = [1, 194], $VK1 = [1, 186], $VL1 = [1, 166], $VM1 = [1, 290], $VN1 = [1, 260], $VO1 = [1, 330], $VP1 = [1, 349], $VQ1 = [1, 384], $VR1 = [1, 16], $VS1 = [1, 40], $VT1 = [1, 14], $VU1 = [1, 15], $VV1 = [1, 18], $VW1 = [1, 21], $VX1 = [1, 22], $VY1 = [1, 26], $VZ1 = [1, 27], $V_1 = [1, 28], $V$1 = [1, 29], $V02 = [1, 31], $V12 = [1, 36], $V22 = [1, 37], $V32 = [1, 41], $V42 = [1, 44], $V52 = [1, 45], $V62 = [1, 47], $V72 = [1, 48], $V82 = [1, 49], $V92 = [1, 52], $Va2 = [1, 53], $Vb2 = [1, 54], $Vc2 = [1, 55], $Vd2 = [1, 61], $Ve2 = [1, 64], $Vf2 = [1, 66], $Vg2 = [1, 70], $Vh2 = [1, 73], $Vi2 = [1, 74], $Vj2 = [1, 77], $Vk2 = [1, 84], $Vl2 = [1, 86], $Vm2 = [1, 87], $Vn2 = [1, 97], $Vo2 = [1, 99], $Vp2 = [1, 101], $Vq2 = [1, 109], $Vr2 = [1, 117], $Vs2 = [1, 120], $Vt2 = [1, 128], $Vu2 = [1, 130], $Vv2 = [1, 132], $Vw2 = [1, 133], $Vx2 = [1, 134], $Vy2 = [1, 135], $Vz2 = [1, 136], $VA2 = [1, 137], $VB2 = [1, 138], $VC2 = [1, 139], $VD2 = [1, 140], $VE2 = [1, 141], $VF2 = [1, 142], $VG2 = [1, 143], $VH2 = [1, 144], $VI2 = [1, 145], $VJ2 = [1, 146], $VK2 = [1, 147], $VL2 = [1, 148], $VM2 = [1, 149], $VN2 = [1, 150], $VO2 = [1, 151], $VP2 = [1, 152], $VQ2 = [1, 153], $VR2 = [1, 154], $VS2 = [1, 155], $VT2 = [1, 156], $VU2 = [1, 157], $VV2 = [1, 158], $VW2 = [1, 159], $VX2 = [1, 160], $VY2 = [1, 161], $VZ2 = [1, 162], $V_2 = [1, 163], $V$2 = [1, 164], $V03 = [1, 165], $V13 = [1, 167], $V23 = [1, 168], $V33 = [1, 169], $V43 = [1, 170], $V53 = [1, 171], $V63 = [1, 172], $V73 = [1, 173], $V83 = [1, 174], $V93 = [1, 175], $Va3 = [1, 176], $Vb3 = [1, 177], $Vc3 = [1, 178], $Vd3 = [1, 180], $Ve3 = [1, 181], $Vf3 = [1, 182], $Vg3 = [1, 183], $Vh3 = [1, 184], $Vi3 = [1, 185], $Vj3 = [1, 187], $Vk3 = [1, 188], $Vl3 = [1, 189], $Vm3 = [1, 190], $Vn3 = [1, 191], $Vo3 = [1, 192], $Vp3 = [1, 193], $Vq3 = [1, 195], $Vr3 = [1, 197], $Vs3 = [1, 200], $Vt3 = [1, 201], $Vu3 = [1, 202], $Vv3 = [1, 203], $Vw3 = [1, 206], $Vx3 = [1, 207], $Vy3 = [1, 208], $Vz3 = [1, 209], $VA3 = [1, 210], $VB3 = [1, 211], $VC3 = [1, 212], $VD3 = [1, 213], $VE3 = [1, 214], $VF3 = [1, 215], $VG3 = [1, 216], $VH3 = [1, 217], $VI3 = [1, 218], $VJ3 = [1, 219], $VK3 = [1, 220], $VL3 = [1, 221], $VM3 = [1, 222], $VN3 = [1, 223], $VO3 = [1, 224], $VP3 = [1, 225], $VQ3 = [1, 226], $VR3 = [1, 227], $VS3 = [1, 228], $VT3 = [1, 229], $VU3 = [1, 230], $VV3 = [1, 231], $VW3 = [1, 232], $VX3 = [1, 233], $VY3 = [1, 234], $VZ3 = [1, 235], $V_3 = [1, 236], $V$3 = [1, 237], $V04 = [1, 238], $V14 = [1, 239], $V24 = [1, 240], $V34 = [1, 241], $V44 = [1, 242], $V54 = [1, 243], $V64 = [1, 244], $V74 = [1, 245], $V84 = [1, 246], $V94 = [1, 247], $Va4 = [1, 248], $Vb4 = [1, 249], $Vc4 = [1, 250], $Vd4 = [1, 251], $Ve4 = [1, 252], $Vf4 = [1, 253], $Vg4 = [1, 254], $Vh4 = [1, 255], $Vi4 = [1, 256], $Vj4 = [1, 257], $Vk4 = [1, 258], $Vl4 = [1, 259], $Vm4 = [1, 261], $Vn4 = [1, 262], $Vo4 = [1, 263], $Vp4 = [1, 264], $Vq4 = [1, 265], $Vr4 = [1, 266], $Vs4 = [1, 267], $Vt4 = [1, 268], $Vu4 = [1, 269], $Vv4 = [1, 270], $Vw4 = [1, 271], $Vx4 = [1, 272], $Vy4 = [1, 273], $Vz4 = [1, 274], $VA4 = [1, 275], $VB4 = [1, 276], $VC4 = [1, 277], $VD4 = [1, 279], $VE4 = [1, 280], $VF4 = [1, 281], $VG4 = [1, 282], $VH4 = [1, 283], $VI4 = [1, 284], $VJ4 = [1, 285], $VK4 = [1, 286], $VL4 = [1, 287], $VM4 = [1, 288], $VN4 = [1, 289], $VO4 = [1, 291], $VP4 = [1, 292], $VQ4 = [1, 293], $VR4 = [1, 294], $VS4 = [1, 295], $VT4 = [1, 296], $VU4 = [1, 297], $VV4 = [1, 298], $VW4 = [1, 299], $VX4 = [1, 300], $VY4 = [1, 301], $VZ4 = [1, 302], $V_4 = [1, 303], $V$4 = [1, 304], $V05 = [1, 305], $V15 = [1, 306], $V25 = [1, 308], $V35 = [1, 309], $V45 = [1, 313], $V55 = [1, 314], $V65 = [1, 315], $V75 = [1, 320], $V85 = [1, 321], $V95 = [1, 322], $Va5 = [1, 323], $Vb5 = [1, 324], $Vc5 = [1, 325], $Vd5 = [1, 326], $Ve5 = [1, 327], $Vf5 = [1, 328], $Vg5 = [1, 329], $Vh5 = [1, 331], $Vi5 = [1, 332], $Vj5 = [1, 333], $Vk5 = [1, 334], $Vl5 = [1, 335], $Vm5 = [1, 336], $Vn5 = [1, 337], $Vo5 = [1, 338], $Vp5 = [1, 339], $Vq5 = [1, 340], $Vr5 = [1, 341], $Vs5 = [1, 342], $Vt5 = [1, 343], $Vu5 = [1, 344], $Vv5 = [1, 345], $Vw5 = [1, 346], $Vx5 = [1, 347], $Vy5 = [1, 348], $Vz5 = [1, 350], $VA5 = [1, 351], $VB5 = [1, 352], $VC5 = [1, 553], $VD5 = [1, 554], $VE5 = [1, 555], $VF5 = [1, 386], $VG5 = [1, 533], $VH5 = [1, 528], $VI5 = [1, 563], $VJ5 = [1, 564], $VK5 = [1, 475], $VL5 = [1, 540], $VM5 = [1, 485], $VN5 = [1, 501], $VO5 = [1, 423], $VP5 = [1, 424], $VQ5 = [1, 425], $VR5 = [1, 466], $VS5 = [1, 543], $VT5 = [1, 474], $VU5 = [1, 570], $VV5 = [1, 443], $VW5 = [1, 444], $VX5 = [1, 523], $VY5 = [1, 569], $VZ5 = [1, 546], $V_5 = [1, 472], $V$5 = [1, 558], $V06 = [1, 541], $V16 = [1, 588], $V26 = [1, 587], $V36 = [2, 213], $V46 = [1, 592], $V56 = [1, 614], $V66 = [1, 615], $V76 = [1, 616], $V86 = [1, 617], $V96 = [1, 618], $Va6 = [1, 619], $Vb6 = [1, 620], $Vc6 = [1, 621], $Vd6 = [1, 622], $Ve6 = [1, 623], $Vf6 = [1, 624], $Vg6 = [1, 625], $Vh6 = [1, 626], $Vi6 = [1, 627], $Vj6 = [1, 628], $Vk6 = [1, 629], $Vl6 = [1, 630], $Vm6 = [1, 631], $Vn6 = [1, 632], $Vo6 = [1, 633], $Vp6 = [1, 634], $Vq6 = [1, 635], $Vr6 = [1, 636], $Vs6 = [1, 637], $Vt6 = [1, 638], $Vu6 = [1, 639], $Vv6 = [1, 640], $Vw6 = [1, 641], $Vx6 = [1, 642], $Vy6 = [1, 643], $Vz6 = [1, 644], $VA6 = [1, 645], $VB6 = [1, 646], $VC6 = [1, 647], $VD6 = [1, 648], $VE6 = [1, 649], $VF6 = [1, 650], $VG6 = [1, 651], $VH6 = [1, 652], $VI6 = [1, 653], $VJ6 = [1, 654], $VK6 = [1, 655], $VL6 = [1, 656], $VM6 = [1, 657], $VN6 = [1, 658], $VO6 = [1, 659], $VP6 = [1, 660], $VQ6 = [1, 661], $VR6 = [1, 662], $VS6 = [1, 663], $VT6 = [1, 664], $VU6 = [1, 665], $VV6 = [1, 666], $VW6 = [1, 667], $VX6 = [1, 668], $VY6 = [1, 669], $VZ6 = [1, 670], $V_6 = [1, 671], $V$6 = [1, 672], $V07 = [1, 673], $V17 = [1, 674], $V27 = [1, 675], $V37 = [1, 676], $V47 = [1, 677], $V57 = [1, 678], $V67 = [1, 679], $V77 = [1, 680], $V87 = [1, 681], $V97 = [1, 682], $Va7 = [1, 683], $Vb7 = [1, 684], $Vc7 = [1, 685], $Vd7 = [1, 686], $Ve7 = [1, 687], $Vf7 = [1, 688], $Vg7 = [1, 689], $Vh7 = [1, 690], $Vi7 = [1, 691], $Vj7 = [1, 692], $Vk7 = [1, 693], $Vl7 = [1, 591], $Vm7 = [1, 694], $Vn7 = [1, 695], $Vo7 = [1, 696], $Vp7 = [1, 697], $Vq7 = [1, 698], $Vr7 = [1, 699], $Vs7 = [1, 700], $Vt7 = [1, 701], $Vu7 = [1, 702], $Vv7 = [1, 703], $Vw7 = [1, 704], $Vx7 = [1, 705], $Vy7 = [1, 706], $Vz7 = [1, 707], $VA7 = [1, 708], $VB7 = [1, 709], $VC7 = [1, 710], $VD7 = [1, 711], $VE7 = [1, 712], $VF7 = [1, 713], $VG7 = [1, 714], $VH7 = [1, 715], $VI7 = [1, 716], $VJ7 = [1, 717], $VK7 = [1, 718], $VL7 = [1, 719], $VM7 = [1, 720], $VN7 = [1, 721], $VO7 = [1, 722], $VP7 = [1, 723], $VQ7 = [1, 724], $VR7 = [1, 725], $VS7 = [1, 726], $VT7 = [1, 727], $VU7 = [1, 728], $VV7 = [1, 729], $VW7 = [1, 730], $VX7 = [1, 731], $VY7 = [1, 732], $VZ7 = [1, 733], $V_7 = [1, 734], $V$7 = [1, 735], $V08 = [1, 736], $V18 = [1, 737], $V28 = [1, 738], $V38 = [1, 739], $V48 = [1, 740], $V58 = [1, 741], $V68 = [1, 742], $V78 = [1, 743], $V88 = [1, 744], $V98 = [1, 745], $Va8 = [1, 611], $Vb8 = [1, 612], $Vc8 = [1, 610], $Vd8 = [1, 608], $Ve8 = [1, 609], $Vf8 = [1, 607], $Vg8 = [1, 599], $Vh8 = [1, 605], $Vi8 = [1, 601], $Vj8 = [1, 604], $Vk8 = [1, 606], $Vl8 = [1, 603], $Vm8 = [1, 600], $Vn8 = [1, 602], $Vo8 = [19, 307], $Vp8 = [2, 2790], $Vq8 = [2, 309], $Vr8 = [1, 768], $Vs8 = [1, 765], $Vt8 = [1, 767], $Vu8 = [2, 364], $Vv8 = [1, 771], $Vw8 = [1, 769], $Vx8 = [1, 773], $Vy8 = [1, 775], $Vz8 = [1, 779], $VA8 = [1, 774], $VB8 = [1, 776], $VC8 = [1, 778], $VD8 = [1, 777], $VE8 = [2, 389], $VF8 = [2, 399], $VG8 = [2, 407], $VH8 = [1, 781], $VI8 = [2, 440], $VJ8 = [1, 785], $VK8 = [1, 786], $VL8 = [1, 788], $VM8 = [2, 454], $VN8 = [1, 798], $VO8 = [1, 804], $VP8 = [1, 814], $VQ8 = [1, 810], $VR8 = [1, 825], $VS8 = [1, 848], $VT8 = [1, 834], $VU8 = [1, 835], $VV8 = [1, 816], $VW8 = [1, 815], $VX8 = [1, 822], $VY8 = [1, 846], $VZ8 = [1, 819], $V_8 = [1, 828], $V$8 = [1, 836], $V09 = [1, 830], $V19 = [1, 827], $V29 = [1, 839], $V39 = [1, 831], $V49 = [1, 838], $V59 = [1, 811], $V69 = [1, 812], $V79 = [1, 813], $V89 = [1, 821], $V99 = [1, 843], $Va9 = [1, 826], $Vb9 = [1, 850], $Vc9 = [1, 817], $Vd9 = [1, 818], $Ve9 = [1, 844], $Vf9 = [1, 849], $Vg9 = [1, 824], $Vh9 = [6, 10, 399, 957], $Vi9 = [2, 871], $Vj9 = [1, 857], $Vk9 = [19, 26, 30, 59, 74, 79, 80, 97, 113, 131, 145, 182, 218, 307, 339, 352, 438, 439, 440, 452, 569, 570, 571, 577, 763, 826, 868, 930, 931, 933, 1166, 1190, 1191, 1192, 1193, 1195, 1213, 1227, 1252, 1253, 1278, 1314], $Vl9 = [2, 174], $Vm9 = [1, 860], $Vn9 = [1, 859], $Vo9 = [1, 861], $Vp9 = [26, 30, 59, 74, 79, 80, 97, 113, 131, 145, 182, 218, 307, 339, 352, 438, 439, 440, 452, 569, 570, 571, 577, 763, 826, 868, 930, 931, 933, 1166, 1190, 1191, 1192, 1193, 1195, 1213, 1227, 1252, 1253, 1278, 1314], $Vq9 = [2, 171], $Vr9 = [2, 557], $Vs9 = [2, 864], $Vt9 = [1, 865], $Vu9 = [1, 867], $Vv9 = [2, 6, 10, 399], $Vw9 = [1, 870], $Vx9 = [1, 882], $Vy9 = [1, 902], $Vz9 = [1, 903], $VA9 = [2, 3154], $VB9 = [2, 908], $VC9 = [1, 924], $VD9 = [1, 925], $VE9 = [1, 926], $VF9 = [1, 938], $VG9 = [1, 936], $VH9 = [1, 934], $VI9 = [1, 937], $VJ9 = [1, 932], $VK9 = [1, 933], $VL9 = [1, 935], $VM9 = [1, 939], $VN9 = [19, 178, 193, 222, 262, 342], $VO9 = [2, 653], $VP9 = [1, 949], $VQ9 = [1, 950], $VR9 = [1, 951], $VS9 = [1, 967], $VT9 = [1, 998], $VU9 = [1, 975], $VV9 = [1, 987], $VW9 = [1, 999], $VX9 = [1, 1003], $VY9 = [1, 991], $VZ9 = [1, 1006], $V_9 = [1, 986], $V$9 = [1, 968], $V0a = [1, 1007], $V1a = [1, 1008], $V2a = [1, 1005], $V3a = [1, 973], $V4a = [2, 623], $V5a = [1, 1000], $V6a = [1, 1004], $V7a = [1, 996], $V8a = [1, 997], $V9a = [1, 1022], $Vaa = [1, 1028], $Vba = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 402], $Vca = [2, 627], $Vda = [1, 1037], $Vea = [1, 1038], $Vfa = [2, 633], $Vga = [1, 1041], $Vha = [1, 1042], $Via = [1, 1058], $Vja = [1, 1084], $Vka = [1, 1089], $Vla = [1, 1082], $Vma = [1, 1073], $Vna = [1, 1072], $Voa = [1, 1088], $Vpa = [1, 1087], $Vqa = [1, 1061], $Vra = [1, 1077], $Vsa = [1, 1085], $Vta = [1, 1092], $Vua = [1, 1091], $Vva = [1, 1078], $Vwa = [1, 1090], $Vxa = [1, 1059], $Vya = [1, 1060], $Vza = [1, 1098], $VAa = [1, 1097], $VBa = [1, 1101], $VCa = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161], $VDa = [1, 1109], $VEa = [1, 1110], $VFa = [19, 45, 216], $VGa = [1, 1129], $VHa = [1, 1126], $VIa = [1, 1130], $VJa = [1, 1119], $VKa = [1, 1118], $VLa = [1, 1120], $VMa = [1, 1122], $VNa = [1, 1123], $VOa = [1, 1124], $VPa = [1, 1125], $VQa = [19, 106, 122, 133, 147, 157, 178, 181, 193, 196, 201, 210, 222, 229, 262, 296, 337, 342, 1101], $VRa = [19, 39, 42, 46, 65, 76, 91, 106, 107, 108, 120, 121, 128, 143, 144, 145, 147, 148, 171, 174, 182, 193, 195, 196, 197, 205, 210, 215, 217, 224, 230, 247, 250, 256, 262, 263, 439, 440], $VSa = [1, 1136], $VTa = [1, 1135], $VUa = [2, 3064], $VVa = [19, 577], $VWa = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 181, 195, 201, 296, 337, 402], $VXa = [6, 10, 267, 273, 348, 577], $VYa = [19, 267, 273, 348, 577], $VZa = [1, 1145], $V_a = [1, 1146], $V$a = [2, 6, 10, 26, 28, 30, 32, 33, 34, 37, 38, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 56, 58, 59, 60, 61, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 101, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 156, 157, 158, 160, 161, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 438, 439, 440, 452, 569, 570, 571, 577, 763, 826, 868, 930, 931, 933, 1166, 1190, 1191, 1192, 1193, 1195, 1213, 1227, 1252, 1253, 1278, 1314], $V0b = [19, 837], $V1b = [2, 2833], $V2b = [1, 1152], $V3b = [1, 1151], $V4b = [1, 1155], $V5b = [2, 114], $V6b = [1, 1157], $V7b = [1, 1159], $V8b = [6, 10, 19, 307, 324, 394, 837], $V9b = [6, 10, 19, 307, 394, 837], $Vab = [6, 10, 324], $Vbb = [2, 694], $Vcb = [1, 1164], $Vdb = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 167, 168, 170, 175, 176, 180, 183, 184, 188, 189, 194, 203, 206, 207, 208, 209, 212, 213, 231, 233, 239, 242, 244, 246, 249, 250, 251, 254, 258, 264, 265, 266, 267, 269, 273, 274, 275, 281, 282, 283, 285, 286, 287, 288, 289, 290, 293, 294, 297, 299, 300, 301, 302, 305, 307, 308, 309, 310, 311, 312, 313, 314, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 328, 330, 331, 332, 333, 334, 335, 336, 338, 339, 340, 341, 343, 344, 345, 347, 348, 349, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 398, 399, 402, 403, 441, 445, 452, 543, 571, 577, 583, 656, 663, 668, 762, 826, 837, 868, 906, 908, 910, 957, 975, 1006, 1190], $Veb = [1, 1166], $Vfb = [1, 1165], $Vgb = [6, 10, 19, 307, 324, 394, 398, 837], $Vhb = [2, 2872], $Vib = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 167, 168, 170, 175, 176, 180, 183, 184, 188, 189, 194, 203, 204, 206, 207, 208, 209, 212, 213, 231, 233, 239, 242, 244, 246, 249, 250, 251, 254, 258, 264, 265, 266, 267, 269, 273, 274, 275, 281, 282, 283, 285, 286, 287, 288, 289, 290, 293, 294, 297, 299, 300, 301, 302, 305, 307, 308, 309, 310, 311, 312, 313, 314, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 328, 330, 331, 332, 333, 334, 335, 336, 338, 339, 340, 341, 343, 344, 345, 347, 348, 349, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 398, 399, 402, 403, 441, 445, 452, 543, 571, 577, 583, 656, 663, 668, 762, 826, 837, 868, 906, 908, 910, 952, 957, 975, 1006, 1190], $Vjb = [2, 36], $Vkb = [2, 155], $Vlb = [6, 10, 307], $Vmb = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $Vnb = [2, 6, 10, 170, 176, 184, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 577, 656, 663, 1190], $Vob = [6, 10, 19, 170, 176, 184, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $Vpb = [2, 1293], $Vqb = [1, 1175], $Vrb = [1, 1176], $Vsb = [1, 1180], $Vtb = [1, 1177], $Vub = [1, 1174], $Vvb = [1, 1181], $Vwb = [1, 1178], $Vxb = [1, 1182], $Vyb = [1, 1179], $Vzb = [1, 1186], $VAb = [1, 1187], $VBb = [1, 1191], $VCb = [1, 1188], $VDb = [1, 1192], $VEb = [1, 1189], $VFb = [1, 1193], $VGb = [1, 1190], $VHb = [2, 1372], $VIb = [6, 10, 19, 170, 176, 184, 206, 231, 242, 264, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $VJb = [2, 1413], $VKb = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 206, 231, 242, 264, 265, 266, 286, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 402, 445, 577, 656, 663, 1190], $VLb = [1, 1203], $VMb = [2, 6, 10, 170, 176, 184, 206, 231, 242, 264, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 1190], $VNb = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 206, 231, 242, 264, 265, 266, 286, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 402, 445, 577, 656, 663, 957, 1190], $VOb = [6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 188, 203, 206, 212, 231, 242, 244, 258, 264, 265, 266, 267, 269, 273, 274, 275, 286, 294, 307, 308, 309, 310, 311, 313, 317, 318, 320, 322, 324, 325, 326, 328, 330, 333, 335, 338, 339, 347, 348, 351, 352, 394, 398, 399, 402, 441, 445, 452, 543, 577, 656, 663, 762, 826, 837, 868, 906, 908, 910, 957, 1190], $VPb = [2, 711], $VQb = [1, 1209], $VRb = [1, 1208], $VSb = [1, 1207], $VTb = [352, 577], $VUb = [2, 1391], $VVb = [1, 1215], $VWb = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 188, 203, 206, 212, 231, 242, 244, 258, 264, 265, 266, 267, 269, 273, 274, 275, 286, 294, 307, 308, 309, 310, 313, 317, 318, 320, 322, 324, 325, 326, 328, 330, 333, 335, 338, 339, 347, 348, 351, 352, 394, 398, 399, 402, 445, 452, 543, 577, 656, 663, 762, 826, 837, 868, 906, 908, 910, 1190], $VXb = [19, 324], $VYb = [6, 10, 19, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 445, 577, 656, 663, 957, 1190], $VZb = [2, 1419], $V_b = [2, 6, 10, 170, 176, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 445, 577, 656, 663, 1190], $V$b = [2, 6, 10, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 445, 577, 656, 663, 1190], $V0c = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $V1c = [207, 281, 387, 395], $V2c = [1, 1229], $V3c = [1, 1230], $V4c = [2, 896], $V5c = [2, 6, 10, 307, 398, 399, 577, 1190, 1192, 1227], $V6c = [2, 6, 10, 19, 307, 394, 398, 399, 577, 1190, 1192, 1227], $V7c = [2, 6, 10, 399, 957], $V8c = [1, 1246], $V9c = [1, 1256], $Vac = [1, 1258], $Vbc = [1, 1260], $Vcc = [1, 1269], $Vdc = [1, 1278], $Vec = [1, 1279], $Vfc = [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 402], $Vgc = [178, 193, 222, 262, 342], $Vhc = [1, 1350], $Vic = [2, 872], $Vjc = [2, 6, 10, 347, 399, 957], $Vkc = [2, 170], $Vlc = [6, 10, 26, 30, 59, 74, 79, 80, 97, 113, 131, 145, 182, 218, 307, 339, 352, 438, 439, 440, 452, 569, 570, 571, 577, 763, 826, 868, 930, 931, 933, 1166, 1190, 1191, 1192, 1193, 1195, 1213, 1227, 1252, 1253, 1278, 1314], $Vmc = [6, 10, 19], $Vnc = [2, 665], $Voc = [2, 2077], $Vpc = [1, 1397], $Vqc = [1, 1399], $Vrc = [19, 307, 394], $Vsc = [1, 1410], $Vtc = [19, 66, 238], $Vuc = [2, 3136], $Vvc = [1, 1419], $Vwc = [19, 66, 185, 238], $Vxc = [2, 1498], $Vyc = [2, 3155], $Vzc = [6, 10, 19, 339], $VAc = [6, 10, 339], $VBc = [6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 188, 328, 339, 398, 402], $VCc = [2, 764], $VDc = [6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 188, 328, 339, 402], $VEc = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 236, 281, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 392, 395, 396, 397, 398, 402, 403, 404, 441, 762, 763, 794, 806], $VFc = [2, 894], $VGc = [1, 1439], $VHc = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 236, 260, 281, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 392, 394, 395, 396, 397, 398, 399, 402, 403, 404, 441, 577, 762, 763, 794, 806], $VIc = [6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 311, 402], $VJc = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 311, 402], $VKc = [19, 193, 262, 342], $VLc = [2, 630], $VMc = [1, 1450], $VNc = [1, 1451], $VOc = [2, 658], $VPc = [1, 1454], $VQc = [2, 654], $VRc = [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161], $VSc = [6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 402], $VTc = [2, 655], $VUc = [1, 1471], $VVc = [1, 1501], $VWc = [1, 1502], $VXc = [1, 1509], $VYc = [1, 1510], $VZc = [1, 1512], $V_c = [1, 1514], $V$c = [19, 319], $V0d = [1, 1517], $V1d = [1, 1521], $V2d = [2, 3294], $V3d = [1, 1527], $V4d = [6, 10, 19, 319, 403], $V5d = [2, 662], $V6d = [1, 1549], $V7d = [6, 10, 19, 319], $V8d = [2, 3378], $V9d = [2, 624], $Vad = [19, 193, 262, 342, 1101], $Vbd = [6, 10, 19, 324], $Vcd = [6, 10, 19, 312, 319, 403], $Vdd = [19, 230], $Ved = [6, 10, 170, 176, 206, 231, 242, 309, 310, 320, 325, 445, 656, 663], $Vfd = [2, 970], $Vgd = [1, 1566], $Vhd = [1, 1572], $Vid = [2, 2963], $Vjd = [6, 10, 1190], $Vkd = [2, 3019], $Vld = [1, 1585], $Vmd = [1, 1613], $Vnd = [1, 1624], $Vod = [1, 1612], $Vpd = [1, 1596], $Vqd = [1, 1594], $Vrd = [1, 1679], $Vsd = [1, 1611], $Vtd = [1, 1614], $Vud = [1, 1590], $Vvd = [1, 1606], $Vwd = [1, 1678], $Vxd = [1, 1656], $Vyd = [1, 1639], $Vzd = [1, 1647], $VAd = [1, 1667], $VBd = [1, 1668], $VCd = [1, 1665], $VDd = [1, 1666], $VEd = [1, 1648], $VFd = [1, 1673], $VGd = [1, 1676], $VHd = [1, 1677], $VId = [1, 1657], $VJd = [1, 1658], $VKd = [1, 1659], $VLd = [1, 1660], $VMd = [1, 1661], $VNd = [1, 1663], $VOd = [1, 1670], $VPd = [1, 1671], $VQd = [1, 1672], $VRd = [1, 1655], $VSd = [1, 1641], $VTd = [1, 1662], $VUd = [1, 1669], $VVd = [1, 1664], $VWd = [1, 1674], $VXd = [1, 1675], $VYd = [1, 1638], $VZd = [1, 1593], $V_d = [1, 1592], $V$d = [1, 1591], $V0e = [1, 1595], $V1e = [1, 1653], $V2e = [1, 1654], $V3e = [1, 1615], $V4e = [1, 1616], $V5e = [1, 1640], $V6e = [2, 625], $V7e = [1, 1684], $V8e = [2, 1954], $V9e = [1, 1703], $Vae = [2, 1955], $Vbe = [1, 1721], $Vce = [1, 1729], $Vde = [1, 1713], $Vee = [1, 1726], $Vfe = [1, 1724], $Vge = [1, 1728], $Vhe = [1, 1730], $Vie = [1, 1727], $Vje = [1, 1725], $Vke = [1, 1716], $Vle = [1, 1717], $Vme = [1, 1722], $Vne = [19, 39, 172, 188, 250, 311, 328, 898], $Voe = [1, 1733], $Vpe = [1, 1741], $Vqe = [1, 1742], $Vre = [2, 1851], $Vse = [1, 1746], $Vte = [1, 1760], $Vue = [2, 1962], $Vve = [1, 1762], $Vwe = [19, 39, 898], $Vxe = [19, 188, 328], $Vye = [1, 1771], $Vze = [1, 1772], $VAe = [19, 83, 84], $VBe = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 402, 860], $VCe = [19, 291, 398], $VDe = [1, 1773], $VEe = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 175, 211, 240, 251, 268, 270, 271, 277, 289, 290, 293, 297, 299, 305, 314, 340, 341, 344, 345, 349, 352, 398, 399, 402, 577, 1040], $VFe = [2, 3030], $VGe = [1, 1787], $VHe = [1, 1789], $VIe = [6, 10, 352, 577, 1190], $VJe = [1, 1792], $VKe = [1, 1794], $VLe = [1, 1797], $VMe = [1, 1799], $VNe = [1, 1805], $VOe = [1, 1809], $VPe = [1, 1807], $VQe = [188, 250, 328], $VRe = [1, 1814], $VSe = [1, 1825], $VTe = [1, 1832], $VUe = [2, 3062], $VVe = [1, 1837], $VWe = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 262, 402], $VXe = [1, 1849], $VYe = [1, 1845], $VZe = [1, 1850], $V_e = [1, 1843], $V$e = [1, 1844], $V0f = [1, 1846], $V1f = [1, 1847], $V2f = [1, 1848], $V3f = [1, 1869], $V4f = [1, 1867], $V5f = [1, 1868], $V6f = [2, 1297], $V7f = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 398, 402], $V8f = [2, 1304], $V9f = [1, 1890], $Vaf = [1, 1889], $Vbf = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 266, 273, 279, 294, 308, 313, 317, 318, 326, 333, 338, 347, 398, 399, 402], $Vcf = [1, 1892], $Vdf = [1, 1894], $Vef = [1, 1896], $Vff = [1, 1898], $Vgf = [1, 1900], $Vhf = [1, 1902], $Vif = [1, 1905], $Vjf = [1, 1911], $Vkf = [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 398, 402], $Vlf = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $Vmf = [2, 1383], $Vnf = [1, 1933], $Vof = [2, 6, 10, 170, 176, 184, 206, 231, 242, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 1190], $Vpf = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 264, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 583, 656, 663, 957, 1190], $Vqf = [1, 1943], $Vrf = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 212, 231, 233, 239, 242, 244, 246, 249, 250, 258, 266, 274, 275, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 331, 332, 333, 334, 335, 336, 338, 343, 347, 350, 351, 352, 382, 383, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 441, 445, 452, 543, 571, 577, 583, 656, 663, 668, 957, 1190], $Vsf = [1, 1949], $Vtf = [1, 1948], $Vuf = [1, 1977], $Vvf = [1, 1976], $Vwf = [1, 1975], $Vxf = [1, 1974], $Vyf = [2, 919], $Vzf = [1, 1984], $VAf = [1, 1992], $VBf = [1, 1993], $VCf = [1, 1991], $VDf = [1, 1995], $VEf = [1, 1996], $VFf = [2, 6, 10, 307, 394, 398, 399, 577, 1190, 1192, 1227], $VGf = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 188, 203, 206, 212, 231, 242, 244, 258, 264, 265, 266, 267, 269, 273, 274, 275, 286, 294, 307, 308, 309, 310, 311, 313, 317, 318, 320, 322, 324, 325, 326, 328, 330, 333, 335, 338, 339, 347, 348, 351, 352, 394, 398, 399, 402, 445, 452, 543, 577, 656, 663, 762, 826, 837, 868, 906, 908, 910, 957, 1190], $VHf = [1, 2012], $VIf = [1, 2015], $VJf = [307, 394], $VKf = [2, 6, 10, 170, 176, 184, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $VLf = [2, 6, 10, 170, 176, 184, 206, 231, 242, 264, 265, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 324, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $VMf = [1, 2039], $VNf = [6, 10, 319], $VOf = [1, 2094], $VPf = [1, 2096], $VQf = [1, 2111], $VRf = [1, 2105], $VSf = [1, 2103], $VTf = [1, 2099], $VUf = [1, 2113], $VVf = [1, 2117], $VWf = [1, 2118], $VXf = [1, 2115], $VYf = [1, 2112], $VZf = [1, 2102], $V_f = [1, 2101], $V$f = [1, 2100], $V0g = [1, 2104], $V1g = [1, 2114], $V2g = [2, 6, 10, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 445, 577, 656, 663, 957, 1190], $V3g = [1, 2121], $V4g = [6, 10, 43], $V5g = [2, 2070], $V6g = [6, 10, 394], $V7g = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 212, 231, 233, 239, 242, 244, 246, 249, 250, 258, 266, 274, 275, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 331, 332, 333, 334, 335, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 452, 543, 571, 577, 583, 656, 663, 668, 957, 1190], $V8g = [2, 1248], $V9g = [1, 2150], $Vag = [1, 2164], $Vbg = [1, 2166], $Vcg = [1, 2179], $Vdg = [1, 2180], $Veg = [1, 2199], $Vfg = [1, 2216], $Vgg = [1, 2215], $Vhg = [1, 2217], $Vig = [6, 10, 27, 31, 36, 37, 41, 44, 53, 55, 57, 102, 103, 104, 114, 127, 129, 188, 322, 328, 339, 762, 826, 868, 906, 908, 910], $Vjg = [2, 2113], $Vkg = [6, 10, 19, 37, 40, 75, 90, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 319, 328, 335, 398, 452, 543, 957, 975], $Vlg = [2, 726], $Vmg = [1, 2253], $Vng = [6, 10, 207], $Vog = [1, 2296], $Vpg = [1, 2295], $Vqg = [1, 2302], $Vrg = [1, 2301], $Vsg = [2, 3283], $Vtg = [2, 3295], $Vug = [2, 3311], $Vvg = [1, 2311], $Vwg = [2, 3324], $Vxg = [1, 2326], $Vyg = [1, 2327], $Vzg = [1, 2329], $VAg = [2, 640], $VBg = [1, 2334], $VCg = [1, 2335], $VDg = [2, 3365], $VEg = [1, 2339], $VFg = [1, 2344], $VGg = [2, 3383], $VHg = [1, 2351], $VIg = [2, 6, 10, 170, 176, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 957, 1190], $VJg = [2, 975], $VKg = [1, 2366], $VLg = [1, 2364], $VMg = [1, 2365], $VNg = [2, 6, 10, 19, 170, 176, 206, 231, 242, 266, 294, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 445, 656, 663, 957, 1190], $VOg = [2, 971], $VPg = [2, 6, 10, 170, 176, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 1190], $VQg = [6, 10, 170, 176, 206, 242, 310, 320, 325, 347, 399, 656, 663, 957, 1190], $VRg = [6, 10, 170, 176, 206, 231, 242, 309, 310, 320, 325, 445, 656, 663, 1190], $VSg = [1, 2401], $VTg = [1, 2402], $VUg = [1, 2400], $VVg = [1, 2399], $VWg = [1, 2404], $VXg = [1, 2403], $VYg = [1, 2395], $VZg = [1, 2394], $V_g = [1, 2390], $V$g = [1, 2391], $V0h = [1, 2392], $V1h = [1, 2393], $V2h = [1, 2396], $V3h = [1, 2397], $V4h = [1, 2411], $V5h = [1, 2410], $V6h = [1, 2409], $V7h = [1, 2413], $V8h = [1, 2412], $V9h = [1, 2405], $Vah = [1, 2406], $Vbh = [1, 2407], $Vch = [1, 2408], $Vdh = [1, 2414], $Veh = [1, 2415], $Vfh = [1, 2416], $Vgh = [1, 2439], $Vhh = [1, 2440], $Vih = [1, 2428], $Vjh = [1, 2427], $Vkh = [1, 2422], $Vlh = [1, 2438], $Vmh = [1, 2421], $Vnh = [1, 2442], $Voh = [1, 2441], $Vph = [1, 2443], $Vqh = [1, 2430], $Vrh = [1, 2429], $Vsh = [1, 2423], $Vth = [1, 2424], $Vuh = [1, 2425], $Vvh = [1, 2426], $Vwh = [1, 2431], $Vxh = [1, 2432], $Vyh = [1, 2433], $Vzh = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 319, 320, 322, 325, 326, 332, 333, 334, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VAh = [1, 2450], $VBh = [1, 2454], $VCh = [1, 2470], $VDh = [1, 2473], $VEh = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 325, 326, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $VFh = [2, 1221], $VGh = [1, 2476], $VHh = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 249, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 452, 571, 577, 583, 656, 663, 668, 957, 1190], $VIh = [2, 1233], $VJh = [2, 1465], $VKh = [1, 2484], $VLh = [1, 2486], $VMh = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 207, 209, 231, 233, 239, 242, 246, 249, 250, 266, 281, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 398, 399, 402, 445, 452, 571, 577, 583, 656, 663, 668, 957, 1190], $VNh = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 249, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 327, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 452, 571, 577, 583, 656, 663, 668, 957, 1190], $VOh = [2, 793], $VPh = [1, 2497], $VQh = [1, 2498], $VRh = [1, 2513], $VSh = [1, 2536], $VTh = [1, 2545], $VUh = [1, 2543], $VVh = [1, 2544], $VWh = [1, 2550], $VXh = [1, 2551], $VYh = [1, 2552], $VZh = [1, 2553], $V_h = [1, 2554], $V$h = [1, 2555], $V0i = [1, 2556], $V1i = [1, 2557], $V2i = [1, 2558], $V3i = [1, 2560], $V4i = [1, 2561], $V5i = [1, 2562], $V6i = [1, 2563], $V7i = [1, 2559], $V8i = [1, 2565], $V9i = [2, 756], $Vai = [1, 2571], $Vbi = [19, 32, 67, 85, 89, 95, 109, 124, 211, 240, 268, 270, 271, 277, 1040], $Vci = [1, 2577], $Vdi = [6, 10, 19, 352], $Vei = [2, 1897], $Vfi = [2, 6, 10, 19, 29, 35, 37, 40, 63, 69, 75, 86, 90, 105, 114, 117, 121, 152, 153, 154, 155, 167, 212, 244, 249, 258, 269, 274, 275, 286, 312, 322, 323, 328, 335, 352, 385, 387, 389, 394, 399, 452, 543, 577, 952, 957, 1190], $Vgi = [2, 643], $Vhi = [1, 2602], $Vii = [2, 1963], $Vji = [6, 10, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543], $Vki = [1, 2616], $Vli = [1, 2631], $Vmi = [1, 2634], $Vni = [6, 10, 117, 274, 352, 577, 1190], $Voi = [2, 3021], $Vpi = [1, 2639], $Vqi = [19, 117, 274, 352, 577, 1209], $Vri = [1, 2642], $Vsi = [1, 2654], $Vti = [6, 10, 352], $Vui = [1, 2667], $Vvi = [1, 2669], $Vwi = [2, 3035], $Vxi = [1, 2681], $Vyi = [1, 2691], $Vzi = [6, 10, 19, 307, 837], $VAi = [2, 2900], $VBi = [1, 2707], $VCi = [1, 2706], $VDi = [1, 2708], $VEi = [6, 10, 19, 352, 394], $VFi = [1, 2718], $VGi = [1, 2717], $VHi = [2, 6, 10, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 656, 663, 1190], $VIi = [2, 6, 10, 19, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 394, 399, 656, 663, 957, 1190], $VJi = [1, 2729], $VKi = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 170, 176, 184, 206, 231, 242, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 398, 399, 402, 445, 577, 656, 663, 1190], $VLi = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 170, 176, 184, 206, 231, 242, 266, 273, 279, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 398, 399, 402, 445, 577, 656, 663, 1190], $VMi = [1, 2730], $VNi = [1, 2734], $VOi = [1, 2736], $VPi = [1, 2738], $VQi = [1, 2740], $VRi = [1, 2744], $VSi = [1, 2746], $VTi = [1, 2748], $VUi = [1, 2750], $VVi = [2, 6, 10, 170, 176, 184, 206, 231, 242, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 1190], $VWi = [1, 2759], $VXi = [1, 2763], $VYi = [1, 2765], $VZi = [1, 2767], $V_i = [2, 712], $V$i = [1, 2775], $V0j = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 165, 167, 170, 176, 183, 184, 188, 194, 203, 206, 207, 209, 212, 231, 233, 239, 242, 244, 246, 258, 264, 265, 266, 267, 269, 273, 274, 275, 281, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 319, 320, 322, 324, 325, 326, 328, 330, 332, 333, 334, 335, 338, 339, 343, 347, 348, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 398, 399, 402, 445, 452, 543, 571, 577, 656, 663, 668, 762, 826, 837, 868, 906, 908, 910, 975, 1190], $V1j = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 250, 264, 265, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 324, 325, 326, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $V2j = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 264, 265, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 319, 320, 322, 324, 325, 326, 332, 333, 334, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $V3j = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 168, 170, 176, 183, 184, 188, 194, 206, 207, 209, 212, 231, 233, 236, 239, 242, 244, 246, 247, 255, 258, 264, 265, 266, 267, 269, 273, 274, 275, 281, 283, 285, 286, 287, 288, 292, 294, 300, 301, 302, 303, 304, 307, 308, 309, 310, 311, 312, 313, 315, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 332, 333, 334, 335, 338, 343, 346, 347, 348, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 402, 403, 404, 445, 452, 543, 571, 577, 656, 663, 668, 762, 763, 794, 837, 1190, 1192, 1227], $V4j = [1, 2778], $V5j = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 445, 577, 656, 663, 957, 1190], $V6j = [1, 2791], $V7j = [6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 286, 957], $V8j = [1, 2816], $V9j = [1, 2815], $Vaj = [117, 274, 352, 577], $Vbj = [1, 2882], $Vcj = [1, 2881], $Vdj = [1, 2875], $Vej = [1, 2880], $Vfj = [1, 2889], $Vgj = [1, 2884], $Vhj = [1, 2883], $Vij = [1, 2876], $Vjj = [1, 2877], $Vkj = [1, 2878], $Vlj = [1, 2879], $Vmj = [1, 2885], $Vnj = [1, 2886], $Voj = [1, 2887], $Vpj = [1, 2897], $Vqj = [1, 2898], $Vrj = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 249, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 331, 332, 333, 334, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 398, 399, 402, 445, 452, 571, 577, 583, 656, 663, 668, 957, 1190], $Vsj = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 168, 170, 175, 176, 183, 184, 188, 194, 206, 207, 209, 231, 233, 239, 242, 246, 249, 250, 251, 266, 281, 283, 285, 286, 287, 288, 289, 290, 293, 294, 297, 299, 300, 301, 302, 305, 307, 308, 309, 310, 312, 313, 314, 316, 317, 318, 319, 320, 321, 322, 323, 325, 326, 328, 331, 332, 333, 334, 336, 338, 339, 340, 341, 343, 344, 345, 347, 349, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 398, 399, 402, 445, 452, 571, 577, 583, 656, 663, 668, 868, 957, 1190], $Vtj = [2, 6, 10, 347, 399], $Vuj = [2, 1249], $Vvj = [1, 2938], $Vwj = [2, 2906], $Vxj = [1, 2954], $Vyj = [6, 10, 19, 307], $Vzj = [6, 10, 19, 351], $VAj = [2, 3413], $VBj = [1, 2975], $VCj = [6, 10, 351], $VDj = [1, 2978], $VEj = [6, 10, 19, 307, 350, 351, 394], $VFj = [6, 10, 307, 351], $VGj = [6, 10, 307, 351, 394], $VHj = [2, 19, 40, 387, 394, 399, 452], $VIj = [2, 772], $VJj = [1, 2984], $VKj = [2, 867], $VLj = [1, 2987], $VMj = [1, 3001], $VNj = [1, 3000], $VOj = [1, 2999], $VPj = [2, 6, 10, 19, 170, 176, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 583, 656, 663, 957, 1190], $VQj = [2, 1699], $VRj = [2, 6, 10, 170, 176, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 399, 445, 656, 663, 1190], $VSj = [2, 1265], $VTj = [2, 6, 10, 170, 176, 206, 231, 242, 307, 309, 310, 320, 325, 347, 351, 394, 399, 445, 656, 663, 1190], $VUj = [1, 3010], $VVj = [2, 2118], $VWj = [1, 3027], $VXj = [1, 3028], $VYj = [1, 3030], $VZj = [6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 352, 402, 577, 1190], $V_j = [19, 40, 121, 167, 286, 452], $V$j = [2, 2585], $V0k = [40, 121, 167, 286, 452], $V1k = [1, 3038], $V2k = [6, 10, 37, 40, 75, 90, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 319, 328, 335, 398, 452, 543, 975], $V3k = [1, 3046], $V4k = [1, 3050], $V5k = [1, 3053], $V6k = [2, 645], $V7k = [1, 3063], $V8k = [1, 3065], $V9k = [1, 3064], $Vak = [1, 3066], $Vbk = [2, 2747], $Vck = [1, 3075], $Vdk = [1, 3074], $Vek = [2, 3240], $Vfk = [1, 3099], $Vgk = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 188, 194, 204, 206, 209, 212, 214, 220, 225, 231, 233, 235, 239, 242, 243, 244, 245, 246, 248, 249, 250, 257, 258, 266, 269, 274, 275, 278, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 321, 322, 323, 325, 326, 328, 331, 332, 333, 334, 335, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 452, 543, 571, 577, 583, 656, 663, 668, 952, 957, 1055, 1190, 1209], $Vhk = [1, 3104], $Vik = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 212, 231, 233, 239, 242, 244, 246, 249, 250, 258, 266, 269, 274, 275, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 316, 317, 318, 319, 320, 322, 323, 325, 326, 328, 331, 332, 333, 334, 335, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 452, 543, 571, 577, 583, 656, 663, 668, 952, 957, 1190], $Vjk = [2, 3275], $Vkk = [1, 3105], $Vlk = [1, 3107], $Vmk = [2, 3298], $Vnk = [2, 3313], $Vok = [1, 3115], $Vpk = [2, 687], $Vqk = [2, 3374], $Vrk = [2, 6, 10, 170, 176, 206, 242, 266, 294, 308, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 957, 1190], $Vsk = [2, 1525], $Vtk = [1, 3138], $Vuk = [2, 976], $Vvk = [19, 291], $Vwk = [2, 1085], $Vxk = [2, 6, 10, 170, 176, 206, 242, 266, 294, 308, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 1190], $Vyk = [6, 10, 170, 176, 206, 242, 320, 325, 347, 399, 656, 663, 957, 1190], $Vzk = [1, 3145], $VAk = [2, 6, 10, 170, 176, 206, 231, 242, 266, 294, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 445, 656, 663, 1190], $VBk = [1, 3160], $VCk = [151, 298, 304, 323, 346], $VDk = [2, 1262], $VEk = [2, 3099], $VFk = [1, 3237], $VGk = [1, 3251], $VHk = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VIk = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 320, 322, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 391, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VJk = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 331, 333, 336, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $VKk = [2, 1088], $VLk = [2, 1089], $VMk = [2, 1090], $VNk = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VOk = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 331, 333, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $VPk = [2, 1091], $VQk = [1, 3254], $VRk = [1, 3261], $VSk = [1, 3257], $VTk = [1, 3260], $VUk = [1, 3259], $VVk = [1, 3271], $VWk = [2, 301, 302], $VXk = [2, 19, 301, 302, 350], $VYk = [1, 3283], $VZk = [1, 3284], $V_k = [1, 3291], $V$k = [1, 3292], $V0l = [1, 3299], $V1l = [1, 3304], $V2l = [1, 3307], $V3l = [1, 3309], $V4l = [1, 3310], $V5l = [1, 3311], $V6l = [1, 3312], $V7l = [1, 3313], $V8l = [1, 3314], $V9l = [1, 3315], $Val = [1, 3308], $Vbl = [1, 3321], $Vcl = [1, 3322], $Vdl = [1, 3320], $Vel = [1, 3327], $Vfl = [1, 3328], $Vgl = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 209, 236, 281, 283, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 395, 396, 397, 398, 402, 403, 404, 441, 762, 763, 794], $Vhl = [1, 3330], $Vil = [1, 3331], $Vjl = [1, 3333], $Vkl = [6, 10, 19, 188, 207, 281, 328, 395], $Vll = [6, 10, 188, 328], $Vml = [6, 10, 188, 207, 281, 328, 395], $Vnl = [6, 10, 19, 188, 212, 328, 543], $Vol = [2, 745], $Vpl = [1, 3361], $Vql = [1, 3363], $Vrl = [1, 3374], $Vsl = [6, 10, 19, 40, 75, 121, 167, 212, 244, 275, 286, 352, 452, 543, 577, 957, 1190], $Vtl = [2, 2454], $Vul = [1, 3389], $Vvl = [2, 1868], $Vwl = [6, 10, 19, 167, 286, 957], $Vxl = [1, 3396], $Vyl = [6, 10, 167, 286], $Vzl = [2, 1984], $VAl = [1, 3407], $VBl = [2, 1927], $VCl = [6, 10, 19, 94, 394], $VDl = [6, 10, 94], $VEl = [2, 1900], $VFl = [1, 3419], $VGl = [1, 3420], $VHl = [2, 1968], $VIl = [1, 3427], $VJl = [1, 3426], $VKl = [2, 6, 10, 394, 399], $VLl = [2, 740], $VMl = [19, 315], $VNl = [2, 2357], $VOl = [6, 10, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 315, 335, 543], $VPl = [1, 3433], $VQl = [2, 650], $VRl = [1, 3443], $VSl = [1, 3444], $VTl = [6, 10, 352, 398, 577, 1190], $VUl = [2, 2395], $VVl = [1, 3470], $VWl = [1, 3471], $VXl = [19, 352, 577], $VYl = [1, 3479], $VZl = [2, 6, 10, 37, 40, 75, 87, 90, 114, 117, 121, 167, 179, 188, 212, 237, 244, 258, 261, 269, 274, 275, 278, 286, 315, 328, 335, 352, 452, 543, 577, 952, 1190, 1230], $V_l = [6, 10, 188, 212, 328, 543], $V$l = [1, 3489], $V0m = [1, 3493], $V1m = [1, 3509], $V2m = [1, 3508], $V3m = [2, 325, 394, 399], $V4m = [2, 1205], $V5m = [1, 3513], $V6m = [1, 3516], $V7m = [1, 3515], $V8m = [2, 325, 399], $V9m = [19, 325, 394, 399], $Vam = [6, 10, 188, 267, 273, 328, 348, 577], $Vbm = [2, 2894], $Vcm = [1, 3534], $Vdm = [2, 2798], $Vem = [2, 6, 10, 37, 53, 75, 114, 115, 117, 121, 167, 188, 212, 244, 247, 258, 264, 267, 273, 274, 275, 286, 315, 324, 328, 335, 348, 352, 394, 399, 543, 577, 1190], $Vfm = [6, 10, 19, 170, 176, 184, 206, 231, 242, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $Vgm = [2, 1354], $Vhm = [1, 3554], $Vim = [1, 3553], $Vjm = [1, 3556], $Vkm = [2, 6, 10, 170, 176, 184, 206, 231, 242, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $Vlm = [1, 3562], $Vmm = [1, 3563], $Vnm = [19, 92, 336], $Vom = [2, 713], $Vpm = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 184, 188, 203, 206, 212, 231, 242, 244, 258, 264, 265, 266, 267, 269, 273, 274, 275, 281, 286, 294, 307, 308, 309, 310, 311, 313, 317, 318, 320, 322, 324, 325, 326, 328, 330, 333, 335, 338, 339, 347, 348, 351, 352, 394, 398, 399, 402, 441, 445, 452, 543, 577, 656, 663, 762, 826, 837, 868, 906, 908, 910, 957, 1190], $Vqm = [1, 3573], $Vrm = [19, 307, 837], $Vsm = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 285, 311, 321, 762, 763], $Vtm = [2, 1633], $Vum = [1, 3581], $Vvm = [1, 3596], $Vwm = [1, 3595], $Vxm = [1, 3598], $Vym = [1, 3619], $Vzm = [1, 3620], $VAm = [26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 236, 281, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 395, 396, 397, 398, 402, 403, 404, 762, 763, 794], $VBm = [267, 273, 348, 577], $VCm = [1, 3681], $VDm = [394, 399], $VEm = [2, 394, 399], $VFm = [2, 2083], $VGm = [2, 2904], $VHm = [2, 2907], $VIm = [1, 3696], $VJm = [2, 3133], $VKm = [1, 3699], $VLm = [1, 3700], $VMm = [1, 3726], $VNm = [1, 3740], $VOm = [1, 3745], $VPm = [1, 3747], $VQm = [2, 2114], $VRm = [2, 952], $VSm = [2, 75, 244, 952], $VTm = [403, 404], $VUm = [121, 167, 286], $VVm = [1, 3790], $VWm = [1, 3800], $VXm = [1, 3802], $VYm = [1, 3816], $VZm = [1, 3819], $V_m = [1, 3824], $V$m = [1, 3809], $V0n = [1, 3825], $V1n = [1, 3826], $V2n = [1, 3817], $V3n = [1, 3812], $V4n = [1, 3813], $V5n = [1, 3821], $V6n = [1, 3820], $V7n = [1, 3815], $V8n = [1, 3814], $V9n = [1, 3811], $Van = [1, 3810], $Vbn = [1, 3818], $Vcn = [1, 3823], $Vdn = [1, 3808], $Ven = [1, 3822], $Vfn = [1, 3803], $Vgn = [2, 2574], $Vhn = [2, 2741], $Vin = [2, 3266], $Vjn = [2, 6, 10, 170, 176, 242, 266, 294, 308, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 957, 1190], $Vkn = [2, 1530], $Vln = [1, 3872], $Vmn = [2, 1526], $Vnn = [2, 6, 10, 170, 176, 242, 266, 294, 308, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 1190], $Von = [6, 10, 170, 176, 242, 320, 325, 347, 399, 656, 663, 957, 1190], $Vpn = [1, 3882], $Vqn = [170, 176, 206, 242, 320, 325, 656, 663], $Vrn = [6, 10, 170, 176, 206, 231, 242, 309, 310, 320, 325, 351, 445, 656, 663, 1190], $Vsn = [2, 3026], $Vtn = [1, 3902], $Vun = [1, 3905], $Vvn = [2, 1642], $Vwn = [2, 1643], $Vxn = [2, 1644], $Vyn = [2, 1645], $Vzn = [2, 1646], $VAn = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VBn = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VCn = [2, 1263], $VDn = [1, 3925], $VEn = [1, 3924], $VFn = [1, 3922], $VGn = [1, 3923], $VHn = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 322, 325, 326, 331, 333, 336, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $VIn = [2, 1099], $VJn = [2, 1100], $VKn = [2, 1101], $VLn = [2, 1102], $VMn = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 320, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 391, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $VNn = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 250, 266, 283, 286, 287, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 331, 333, 336, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $VOn = [2, 1109], $VPn = [2, 1110], $VQn = [2, 1111], $VRn = [2, 1112], $VSn = [2, 1113], $VTn = [2, 3100], $VUn = [1, 3941], $VVn = [2, 301, 302, 350], $VWn = [1, 3963], $VXn = [2, 1448], $VYn = [325, 399], $VZn = [2, 1476], $V_n = [1, 3979], $V$n = [19, 327], $V0o = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 236, 281, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 395, 396, 397, 398, 399, 402, 403, 404, 441, 762, 763, 794], $V1o = [1, 4002], $V2o = [1, 4015], $V3o = [6, 10, 19, 212, 543], $V4o = [2, 1986], $V5o = [6, 10, 212, 543], $V6o = [1, 4037], $V7o = [1, 4043], $V8o = [1, 4044], $V9o = [1, 4047], $Vao = [2, 1866], $Vbo = [6, 10, 19, 40, 75, 117, 121, 167, 212, 244, 274, 275, 286, 452, 543, 957], $Vco = [1, 4066], $Vdo = [1, 4067], $Veo = [1, 4069], $Vfo = [2, 1869], $Vgo = [2, 2430], $Vho = [1, 4074], $Vio = [1, 4075], $Vjo = [1, 4077], $Vko = [1, 4081], $Vlo = [1, 4083], $Vmo = [1, 4084], $Vno = [1, 4085], $Voo = [1, 4082], $Vpo = [1, 4086], $Vqo = [2, 1925], $Vro = [1, 4095], $Vso = [2, 1873], $Vto = [6, 10, 19, 35, 105], $Vuo = [2, 1956], $Vvo = [1, 4106], $Vwo = [1, 4107], $Vxo = [6, 10, 35, 105], $Vyo = [1, 4128], $Vzo = [1, 4129], $VAo = [1, 4126], $VBo = [1, 4127], $VCo = [1, 4143], $VDo = [1, 4145], $VEo = [2, 1904], $VFo = [1, 4151], $VGo = [2, 2169], $VHo = [1, 4160], $VIo = [2, 2766], $VJo = [1, 4163], $VKo = [1, 4168], $VLo = [19, 167, 286], $VMo = [2, 603], $VNo = [1, 4178], $VOo = [1, 4181], $VPo = [1, 4186], $VQo = [1, 4196], $VRo = [1, 4197], $VSo = [1, 4194], $VTo = [1, 4195], $VUo = [1, 4208], $VVo = [2, 2797], $VWo = [1, 4225], $VXo = [2, 2799], $VYo = [2, 6, 10, 19, 170, 176, 184, 206, 231, 242, 266, 294, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 351, 394, 399, 445, 577, 656, 663, 957, 1190], $VZo = [1, 4248], $V_o = [1, 4258], $V$o = [6, 10, 81, 169], $V0p = [2, 2060], $V1p = [1, 4311], $V2p = [6, 10, 19, 315], $V3p = [2, 3144], $V4p = [2, 3386], $V5p = [2, 3411], $V6p = [2, 1700], $V7p = [2, 916], $V8p = [1, 4353], $V9p = [2, 1702], $Vap = [1, 4354], $Vbp = [6, 10, 19, 37, 40, 75, 90, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 328, 335, 452, 543, 957], $Vcp = [2, 2156], $Vdp = [6, 10, 37, 40, 75, 90, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 328, 335, 452, 543], $Vep = [1, 4368], $Vfp = [1, 4367], $Vgp = [2, 2126], $Vhp = [1, 4371], $Vip = [2, 2463], $Vjp = [1, 4377], $Vkp = [1, 4380], $Vlp = [19, 394, 399], $Vmp = [167, 286], $Vnp = [1, 4385], $Vop = [1, 4391], $Vpp = [2, 2638], $Vqp = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 207, 236, 281, 285, 292, 303, 304, 311, 321, 322, 323, 346, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 391, 395, 396, 397, 398, 402, 403, 404, 762, 763, 794], $Vrp = [1, 4392], $Vsp = [6, 10, 19, 255], $Vtp = [1, 4409], $Vup = [2, 2545], $Vvp = [2, 19, 280, 394, 399], $Vwp = [2, 6, 10, 19, 29, 35, 40, 63, 75, 105, 152, 153, 154, 155, 244, 249, 280, 322, 323, 389, 394, 399, 452], $Vxp = [2, 821], $Vyp = [1, 4415], $Vzp = [1, 4419], $VAp = [2, 2529], $VBp = [1, 4431], $VCp = [1, 4432], $VDp = [1, 4433], $VEp = [2, 3347], $VFp = [2, 6, 10, 170, 176, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 656, 663, 957, 1190], $VGp = [2, 1014], $VHp = [1, 4442], $VIp = [2, 1531], $VJp = [2, 1527], $VKp = [2, 982], $VLp = [1, 4448], $VMp = [1, 4447], $VNp = [1, 4445], $VOp = [2, 6, 10, 170, 176, 183, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 352, 394, 399, 656, 663, 957, 1190], $VPp = [2, 1002], $VQp = [2, 6, 10, 170, 176, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 656, 663, 1190], $VRp = [6, 10, 170, 176, 242, 320, 347, 399, 656, 663, 957, 1190], $VSp = [1, 4456], $VTp = [170, 176, 242, 320, 325, 656, 663], $VUp = [2, 6, 10, 170, 176, 183, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 352, 399, 656, 663, 1190], $VVp = [2, 6, 10, 19, 170, 176, 183, 206, 242, 310, 320, 325, 347, 352, 394, 399, 656, 663, 957, 1190], $VWp = [1, 4484], $VXp = [6, 10, 19, 350], $VYp = [1, 4502], $VZp = [19, 343], $V_p = [2, 3113], $V$p = [1, 4517], $V0q = [2, 1482], $V1q = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 233, 239, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 319, 320, 322, 325, 326, 327, 332, 333, 334, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $V2q = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 188, 194, 206, 207, 209, 231, 233, 239, 242, 246, 266, 281, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 312, 313, 317, 318, 319, 320, 322, 325, 326, 328, 332, 333, 334, 338, 343, 347, 350, 351, 352, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $V3q = [1, 4573], $V4q = [1, 4577], $V5q = [1, 4581], $V6q = [2, 749], $V7q = [1, 4588], $V8q = [2, 1987], $V9q = [1, 4600], $Vaq = [1, 4601], $Vbq = [1, 4602], $Vcq = [1, 4599], $Vdq = [1, 4623], $Veq = [2, 2446], $Vfq = [1, 4634], $Vgq = [1, 4635], $Vhq = [6, 10, 40, 75, 121, 167, 212, 244, 275, 286, 452, 543], $Viq = [1, 4640], $Vjq = [1, 4641], $Vkq = [19, 123, 276], $Vlq = [2, 2011], $Vmq = [1, 4644], $Vnq = [1, 4648], $Voq = [19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 207, 281, 304, 323, 346, 382, 383, 391, 395, 403, 404, 689], $Vpq = [1, 4655], $Vqq = [6, 10, 19, 29, 35, 63, 105, 394, 399], $Vrq = [2, 2183], $Vsq = [1, 4674], $Vtq = [1, 4672], $Vuq = [1, 4673], $Vvq = [1, 4671], $Vwq = [1, 4677], $Vxq = [1, 4669], $Vyq = [1, 4675], $Vzq = [2, 6, 10, 29, 35, 63, 105, 394, 399], $VAq = [1, 4681], $VBq = [1, 4680], $VCq = [2, 6, 10, 19, 29, 35, 40, 63, 105, 152, 153, 154, 155, 249, 322, 323, 389, 394, 399, 452], $VDq = [2, 6, 10, 29, 35, 40, 63, 105, 152, 153, 154, 155, 249, 322, 323, 389, 394, 399, 452], $VEq = [2, 739], $VFq = [19, 352], $VGq = [1, 4695], $VHq = [6, 10, 19, 35, 37, 40, 75, 90, 105, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 328, 335, 452, 543, 957], $VIq = [1, 4699], $VJq = [6, 10, 35, 37, 40, 75, 90, 105, 114, 117, 121, 167, 212, 244, 258, 269, 274, 275, 286, 328, 335, 452, 543], $VKq = [6, 10, 38, 40, 73, 75, 117, 121, 167, 212, 243, 244, 274, 275, 286, 321, 323, 352, 452, 543, 577, 957, 1190], $VLq = [6, 10, 19, 38, 40, 73, 75, 117, 121, 167, 212, 243, 244, 274, 275, 286, 321, 323, 352, 452, 543, 577, 957, 1209], $VMq = [2, 1206], $VNq = [1, 4750], $VOq = [1, 4752], $VPq = [2, 1355], $VQq = [2, 2801], $VRq = [1, 4769], $VSq = [1, 4771], $VTq = [1, 4796], $VUq = [6, 10, 81], $VVq = [2, 2064], $VWq = [2, 2061], $VXq = [1, 4818], $VYq = [1, 4819], $VZq = [2, 2908], $V_q = [2, 3165], $V$q = [6, 10, 19, 37, 75, 114, 117, 121, 167, 212, 244, 258, 274, 275, 286, 335, 543, 957], $V0r = [2, 2297], $V1r = [1, 4856], $V2r = [1, 4857], $V3r = [6, 10, 37, 75, 114, 117, 121, 167, 212, 244, 258, 274, 275, 286, 335, 543], $V4r = [1, 4860], $V5r = [2, 6, 10, 19], $V6r = [2, 2589], $V7r = [1, 4890], $V8r = [6, 10, 255], $V9r = [6, 10, 19, 394], $Var = [2, 6, 10, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 663, 957, 1190], $Vbr = [2, 1039], $Vcr = [1, 4918], $Vdr = [1, 4919], $Ver = [1, 4920], $Vfr = [2, 1015], $Vgr = [2, 6, 10, 19, 170, 176, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 399, 656, 663, 957, 1190], $Vhr = [1, 4924], $Vir = [1, 4925], $Vjr = [2, 6, 10, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 663, 1190], $Vkr = [6, 10, 242, 320, 347, 399, 663, 957, 1190], $Vlr = [1, 4939], $Vmr = [1, 4940], $Vnr = [1, 4941], $Vor = [170, 176, 242, 320, 656, 663], $Vpr = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 333, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 656, 663, 668, 1190], $Vqr = [1, 4985], $Vrr = [2, 6, 10, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 170, 176, 183, 184, 194, 206, 209, 231, 242, 246, 250, 266, 283, 286, 287, 288, 294, 300, 301, 302, 307, 308, 309, 310, 313, 317, 318, 320, 325, 326, 331, 333, 336, 338, 343, 347, 350, 351, 352, 385, 386, 394, 399, 402, 445, 571, 577, 583, 656, 663, 668, 957, 1190], $Vsr = [2, 1108], $Vtr = [2, 1679], $Vur = [2, 1487], $Vvr = [1, 5006], $Vwr = [1, 5005], $Vxr = [1, 5003], $Vyr = [1, 5027], $Vzr = [1, 5032], $VAr = [2, 1751], $VBr = [19, 207, 281, 304, 346, 348, 382, 383, 395, 403, 404], $VCr = [1, 5046], $VDr = [1, 5050], $VEr = [1, 5052], $VFr = [6, 10, 38, 40, 73, 75, 117, 121, 167, 212, 243, 244, 274, 275, 286, 321, 323, 352, 452, 543, 577, 1190], $VGr = [2, 1801], $VHr = [2, 1875], $VIr = [2, 2184], $VJr = [2, 6, 10, 19, 29, 35, 40, 63, 105, 152, 153, 154, 155, 249, 322, 323, 394, 399, 452], $VKr = [2, 6, 10, 29, 35, 40, 63, 105, 152, 153, 154, 155, 249, 322, 323, 394, 399, 452], $VLr = [1, 5077], $VMr = [1, 5083], $VNr = [1, 5085], $VOr = [1, 5089], $VPr = [1, 5091], $VQr = [1, 5093], $VRr = [1, 5099], $VSr = [1, 5101], $VTr = [1, 5108], $VUr = [6, 10, 19, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 315, 335, 543], $VVr = [2, 2170], $VWr = [2, 2258], $VXr = [1, 5136], $VYr = [2, 2436], $VZr = [1, 5138], $V_r = [6, 10, 40, 73, 75, 117, 121, 167, 212, 243, 244, 274, 275, 286, 321, 323, 352, 452, 543, 577, 1190], $V$r = [1, 5143], $V0s = [19, 167], $V1s = [2, 2802], $V2s = [2, 1619], $V3s = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 167, 402], $V4s = [2, 6, 10, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 170, 176, 184, 206, 231, 242, 309, 310, 320, 325, 347, 351, 399, 402, 445, 577, 656, 663, 1190], $V5s = [2, 2068], $V6s = [1, 5191], $V7s = [2, 2065], $V8s = [1, 5194], $V9s = [2, 2905], $Vas = [2, 2909], $Vbs = [1, 5207], $Vcs = [2, 1703], $Vds = [2, 1701], $Ves = [6, 10, 19, 37, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543, 957], $Vfs = [2, 2313], $Vgs = [6, 10, 37, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543], $Vhs = [1, 5221], $Vis = [1, 5248], $Vjs = [1, 5253], $Vks = [2, 2550], $Vls = [6, 10, 278], $Vms = [1, 5265], $Vns = [2, 6, 10, 266, 294, 308, 313, 317, 318, 326, 333, 338, 347, 399, 663, 957, 1190], $Vos = [2, 1070], $Vps = [1, 5274], $Vqs = [1, 5273], $Vrs = [2, 1040], $Vss = [2, 6, 10, 19, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 399, 663, 957, 1190], $Vts = [2, 1042], $Vus = [2, 1003], $Vvs = [2, 6, 10, 266, 294, 308, 313, 317, 318, 326, 333, 338, 347, 399, 663, 1190], $Vws = [6, 10, 347, 399, 663, 957, 1190], $Vxs = [1, 5294], $Vys = [1, 5293], $Vzs = [2, 6, 10, 19, 242, 320, 347, 399, 663, 957, 1190], $VAs = [242, 320, 663], $VBs = [2, 6, 10, 170, 176, 183, 206, 242, 266, 294, 308, 310, 313, 317, 318, 320, 325, 326, 333, 338, 347, 352, 394, 399, 656, 663, 1190], $VCs = [2, 1107], $VDs = [2, 1096], $VEs = [1, 5351], $VFs = [19, 288, 785], $VGs = [19, 288, 398, 785], $VHs = [2, 1478], $VIs = [1, 5365], $VJs = [1, 5372], $VKs = [6, 10, 40, 75, 117, 121, 167, 212, 244, 274, 275, 286, 323, 352, 452, 543, 577, 1190], $VLs = [1, 5383], $VMs = [1, 5382], $VNs = [1, 5388], $VOs = [1, 5389], $VPs = [2, 389, 394], $VQs = [1, 5394], $VRs = [2, 19, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 168, 175, 251, 285, 289, 290, 293, 297, 299, 305, 314, 321, 340, 341, 344, 345, 349, 389, 394, 402, 441], $VSs = [1, 5395], $VTs = [1, 5396], $VUs = [1, 5403], $VVs = [1, 5404], $VWs = [1, 5401], $VXs = [1, 5402], $VYs = [6, 10, 19, 75, 114, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543, 957], $VZs = [1, 5405], $V_s = [2, 1030], $V$s = [1, 5411], $V0t = [1, 5410], $V1t = [1, 5412], $V2t = [1, 5413], $V3t = [1, 5416], $V4t = [1, 5418], $V5t = [1, 5424], $V6t = [1, 5426], $V7t = [2, 2441], $V8t = [1, 5430], $V9t = [6, 10, 40, 73, 75, 117, 121, 167, 212, 243, 244, 274, 275, 286, 323, 352, 452, 543, 577, 1190], $Vat = [1, 5441], $Vbt = [1, 5443], $Vct = [19, 399], $Vdt = [2, 1387], $Vet = [1, 5457], $Vft = [2, 1635], $Vgt = [2, 2347], $Vht = [2, 2590], $Vit = [6, 10, 19, 40, 69, 75, 117, 121, 244, 274, 275, 312, 335, 452], $Vjt = [2, 2619], $Vkt = [6, 10, 40, 69, 75, 117, 121, 244, 274, 275, 312, 335, 452], $Vlt = [1, 5508], $Vmt = [6, 10, 40, 69, 75, 117, 121, 244, 274, 275, 312, 335, 352, 452], $Vnt = [1, 5523], $Vot = [2, 6, 10, 266, 294, 308, 313, 317, 318, 326, 333, 338, 347, 399, 957, 1190], $Vpt = [2, 1080], $Vqt = [1, 5533], $Vrt = [2, 1071], $Vst = [1, 5535], $Vtt = [2, 1016], $Vut = [1, 5542], $Vvt = [2, 6, 10, 19, 170, 176, 242, 250, 266, 294, 308, 313, 317, 318, 320, 326, 331, 333, 336, 338, 347, 394, 399, 656, 663, 957, 1190], $Vwt = [2, 991], $Vxt = [1, 5546], $Vyt = [2, 6, 10, 266, 294, 308, 313, 317, 318, 326, 333, 338, 347, 399, 1190], $Vzt = [6, 10, 347, 399, 957, 1190], $VAt = [2, 6, 10, 170, 176, 242, 246, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 394, 399, 656, 663, 1190], $VBt = [1, 5609], $VCt = [1, 5624], $VDt = [2, 144, 174, 295, 382, 385, 399, 785], $VEt = [2, 1497], $VFt = [19, 144, 174, 295, 382, 385, 399, 785], $VGt = [2, 2431], $VHt = [1, 5640], $VIt = [1, 5641], $VJt = [2, 2369], $VKt = [2, 6, 10, 19, 170, 176, 242, 246, 250, 266, 294, 308, 313, 317, 318, 320, 326, 331, 333, 336, 338, 347, 394, 399, 656, 663, 957, 1190], $VLt = [1, 5683], $VMt = [2, 3122], $VNt = [6, 10, 19, 75, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543, 957], $VOt = [2, 2373], $VPt = [6, 10, 75, 117, 121, 167, 212, 244, 274, 275, 286, 335, 543], $VQt = [1, 5710], $VRt = [6, 10, 19, 40, 75, 117, 121, 244, 274, 275, 312, 335, 452], $VSt = [2, 2623], $VTt = [1, 5725], $VUt = [6, 10, 40, 75, 117, 121, 244, 274, 275, 312, 335, 452], $VVt = [1, 5740], $VWt = [2, 6, 10, 19, 266, 294, 308, 313, 317, 318, 326, 333, 338, 347, 399, 663, 957, 1190], $VXt = [2, 1076], $VYt = [2, 1050], $VZt = [2, 1054], $V_t = [2, 1058], $V$t = [1, 5756], $V0u = [2, 6, 10, 19, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 394, 399, 663, 957, 1190], $V1u = [2, 1035], $V2u = [1, 5760], $V3u = [1, 5762], $V4u = [1, 5761], $V5u = [1, 5764], $V6u = [2, 6, 10, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 394, 399, 663, 1190], $V7u = [1, 5780], $V8u = [2, 6, 10, 170, 176, 242, 266, 294, 308, 313, 317, 318, 320, 326, 333, 338, 347, 394, 399, 656, 663, 1190], $V9u = [1, 5807], $Vau = [2, 385, 399], $Vbu = [2, 1507], $Vcu = [1, 5830], $Vdu = [1, 5829], $Veu = [1, 5828], $Vfu = [1, 5826], $Vgu = [1, 5827], $Vhu = [19, 385, 399], $Viu = [1, 5840], $Vju = [1, 5859], $Vku = [2, 2450], $Vlu = [1, 5863], $Vmu = [1, 5865], $Vnu = [6, 10, 40, 75, 117, 121, 167, 212, 244, 274, 275, 286, 352, 452, 543, 577, 1190], $Vou = [2, 1388], $Vpu = [2, 2382], $Vqu = [1, 5895], $Vru = [1, 5893], $Vsu = [6, 10, 75, 121, 167, 212, 244, 275, 286, 543], $Vtu = [1, 5897], $Vuu = [1, 5912], $Vvu = [6, 10, 19, 40, 75, 117, 121, 244, 274, 275, 335, 452], $Vwu = [2, 2625], $Vxu = [6, 10, 40, 75, 117, 121, 244, 274, 275, 335, 452], $Vyu = [1, 5921], $Vzu = [1, 5922], $VAu = [6, 10, 19, 214, 225, 235, 257], $VBu = [2, 2557], $VCu = [6, 10, 214, 225, 235, 257], $VDu = [1, 5932], $VEu = [2, 1082], $VFu = [1, 5947], $VGu = [1, 5948], $VHu = [1, 5950], $VIu = [2, 3116], $VJu = [2, 1517], $VKu = [1, 5965], $VLu = [1, 5966], $VMu = [1, 5967], $VNu = [19, 306, 329], $VOu = [19, 335], $VPu = [1, 5977], $VQu = [6, 10, 19, 40, 75, 117, 121, 167, 212, 244, 274, 275, 286, 352, 452, 543, 577, 957, 1190, 1209], $VRu = [1, 5985], $VSu = [6, 10, 121, 167, 212, 275, 286, 543], $VTu = [6, 10, 19, 40, 75, 121, 167, 212, 244, 275, 286, 452, 543, 957], $VUu = [1, 6002], $VVu = [1, 6003], $VWu = [1, 6020], $VXu = [1, 6021], $VYu = [1, 6026], $VZu = [1, 6027], $V_u = [6, 10, 40, 75, 121, 244, 275, 452], $V$u = [6, 10, 19, 225, 235, 257], $V0v = [2, 2560], $V1v = [6, 10, 225, 235, 257], $V2v = [1, 6042], $V3v = [2, 1489], $V4v = [2, 19, 385, 399], $V5v = [2, 2286], $V6v = [1, 6065], $V7v = [1, 6066], $V8v = [1, 6067], $V9v = [2, 2460], $Vav = [6, 10, 167, 212, 286, 543], $Vbv = [1, 6089], $Vcv = [19, 50, 110, 219], $Vdv = [1, 6094], $Vev = [1, 6099], $Vfv = [1, 6103], $Vgv = [1, 6112], $Vhv = [6, 10, 40, 121, 275, 452], $Viv = [6, 10, 19, 225, 235], $Vjv = [2, 2563], $Vkv = [6, 10, 225, 235], $Vlv = [1, 6131], $Vmv = [1, 6147], $Vnv = [1, 6148], $Vov = [2, 2276], $Vpv = [1, 6151], $Vqv = [2, 6, 10, 19, 399], $Vrv = [6, 10, 19, 40, 167, 212, 286, 452, 543, 957], $Vsv = [1, 6187], $Vtv = [1, 6188], $Vuv = [6, 10, 40, 452], $Vvv = [6, 10, 19, 235], $Vwv = [2, 2566], $Vxv = [6, 10, 235], $Vyv = [1, 6208], $Vzv = [2, 19, 399], $VAv = [6, 10, 957], $VBv = [2, 2465], $VCv = [2, 2345], $VDv = [2, 2346], $VEv = [2, 2569], $VFv = [1, 6267], $VGv = [2, 2469], $VHv = [2, 2330], $VIv = [2, 2329], $VJv = [2, 2599], $VKv = [2, 2501], $VLv = [2, 2328]; + var parser = { trace: function trace() { }, + yy: {}, + symbols_: { "error": 2, "SqlSyntax": 3, "NewStatement": 4, "SqlStatements": 5, "EOF": 6, "SqlAutocomplete": 7, "SqlStatements_EDIT": 8, "SqlStatement": 9, ";": 10, "NonStartingToken": 11, "SqlStatement_EDIT": 12, "DataDefinition": 13, "DataManipulation": 14, "QuerySpecification": 15, "ExplainClause": 16, "AnyCursor": 17, "CommonTableExpression": 18, "CURSOR": 19, "ExplainClause_EDIT": 20, "DataDefinition_EDIT": 21, "DataManipulation_EDIT": 22, "QuerySpecification_EDIT": 23, "SetSpecification_EDIT": 24, "NonReservedKeyword": 25, "