//! AlaSQL v4.6.3 build: develop-3129f37a | © 2014-2024 Andrey Gershun & Mathias Wulff | License: MIT
/*
@module alasql
@version 4.6.3

AlaSQL - JavaScript SQL database
© 2014-2024	Andrey Gershun & Mathias Wulff

@license
The MIT License (MIT)

Copyright 2014-2024 Andrey Gershun (agershun@gmail.com) & Mathias Wulff (m@rawu.dk)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
/* eslint-disable */

"use strict";

/**
	@fileoverview AlaSQL JavaScript SQL library
	@see http://github.com/alasql/alasql
*/

/**
	Callback from statement
	@callback statement-callback
	@param {object} data Result data
*/

/**
	UMD envelope for AlaSQL
*/

(function (root, factory) {
	if (typeof define === 'function' && define.amd) {
		define([], factory);
	} else if (typeof exports === 'object') {
		/** alasql main function */
		module.exports = factory();
	} else {
		root.alasql = factory();
	}
}(this, function () {

	/**
		AlaSQL - Main Alasql class
		  @function
		  @param {string|function|object} sql - SQL-statement or data object for fluent interface
		  @param {object} params - SQL parameters
		  @param {function} cb - callback function
		  @param {object} scope - Scope for nested queries
		  @return {any} - Result data object

		@example
	 Standard sync call:
		alasql('CREATE TABLE one');
	 Query:
		  var res = alasql('SELECT * FROM one');
	 Call with parameters:
		  var res = alasql('SELECT * FROM ?',[data]);
	 Standard async call with callback function:
		  alasql('SELECT * FROM ?',[data],function(res){
			console.log(data);
		  });
	 Call with scope for subquery (to pass common values):
		var scope = {one:{a:2,b;20}}
		alasql('SELECT * FROM ? two WHERE two.a = one.a',[data],null,scope);
	 Call for fluent interface with data object:
		alasql(data).Where(function(x){return x.a == 10}).exec();
	 Call for fluent interface without data object:
		alasql().From(data).Where(function(x){return x.a == 10}).exec();
	 */

	let alasql = function (sql, params, cb, scope) {

		params = params || [];

		if (typeof importScripts !== 'function' && alasql.webworker) {
			var id = alasql.lastid++;
			alasql.buffer[id] = cb;
			alasql.webworker.postMessage({ id: id, sql: sql, params: params });
			return;
		}

		if (arguments.length === 0) {
			// Without arguments - Fluent interface
			return new yy.Select({
				columns: [new yy.Column({ columnid: '*' })],
				from: [new yy.ParamValue({ param: 0 })]
			});
		} else if (arguments.length === 1) {
			// Access promise notation without using `.promise(...)`
			if (sql.constructor === Array) {
				return alasql.promise(sql);
			}
		}
		// Avoid setting params if not needed even with callback
		if (typeof params === 'function') {
			scope = cb;
			cb = params;
			params = [];
		}

		if (typeof params !== 'object') {
			params = [params];
		}

		// Standard interface
		// alasql('#sql');
		if (typeof sql === 'string' && sql[0] === '#' && typeof document === "object") {
			sql = document.querySelector(sql).textContent;
		} else if (typeof sql === 'object' && sql instanceof HTMLElement) {
			sql = sql.textContent;
		} else if (typeof sql === 'function') {
			// to run multiline functions
			sql = sql.toString();
			sql = (/\/\*([\S\s]+)\*\//m.exec(sql) || ['', 'Function given as SQL. Plese Provide SQL string or have a /* ... */ syle comment with SQL in the function.'])[1];
		}
		// Run SQL
		return alasql.exec(sql, params, cb, scope);
	};

	/**
		Current version of alasql
		  @constant {string}
	*/
	alasql.version = '4.6.3';
	alasql.build = 'develop-3129f37a';

	/**
		Debug flag
		@type {boolean}
	*/
	alasql.debug = undefined; // Initial debug variable

//*only-for-browser/*
var require = function(){return null}; // as alasqlparser.js is generated, we can not "remove" references to
var __dirname = '';
//*/
/* 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 alasqlparser = (function(){
var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,13],$V1=[1,104],$V2=[1,102],$V3=[1,103],$V4=[1,6],$V5=[1,42],$V6=[1,79],$V7=[1,76],$V8=[1,94],$V9=[1,93],$Va=[1,69],$Vb=[1,101],$Vc=[1,85],$Vd=[1,64],$Ve=[1,71],$Vf=[1,84],$Vg=[1,66],$Vh=[1,70],$Vi=[1,68],$Vj=[1,61],$Vk=[1,74],$Vl=[1,62],$Vm=[1,67],$Vn=[1,83],$Vo=[1,77],$Vp=[1,86],$Vq=[1,87],$Vr=[1,81],$Vs=[1,82],$Vt=[1,80],$Vu=[1,88],$Vv=[1,89],$Vw=[1,90],$Vx=[1,91],$Vy=[1,92],$Vz=[1,98],$VA=[1,65],$VB=[1,78],$VC=[1,72],$VD=[1,96],$VE=[1,97],$VF=[1,63],$VG=[1,73],$VH=[1,108],$VI=[1,107],$VJ=[10,311,607,768],$VK=[10,311,315,607,768],$VL=[1,115],$VM=[1,117],$VN=[1,116],$VO=[1,118],$VP=[1,119],$VQ=[1,120],$VR=[1,121],$VS=[130,358,415],$VT=[1,129],$VU=[1,128],$VV=[1,136],$VW=[1,166],$VX=[1,178],$VY=[1,181],$VZ=[1,176],$V_=[1,184],$V$=[1,188],$V01=[1,162],$V11=[1,185],$V21=[1,172],$V31=[1,174],$V41=[1,177],$V51=[1,186],$V61=[1,203],$V71=[1,204],$V81=[1,168],$V91=[1,169],$Va1=[1,196],$Vb1=[1,191],$Vc1=[1,192],$Vd1=[1,197],$Ve1=[1,198],$Vf1=[1,199],$Vg1=[1,200],$Vh1=[1,201],$Vi1=[1,202],$Vj1=[1,205],$Vk1=[1,206],$Vl1=[1,179],$Vm1=[1,180],$Vn1=[1,182],$Vo1=[1,183],$Vp1=[1,189],$Vq1=[1,195],$Vr1=[1,187],$Vs1=[1,190],$Vt1=[1,175],$Vu1=[1,173],$Vv1=[1,194],$Vw1=[1,207],$Vx1=[2,4,5],$Vy1=[2,480],$Vz1=[1,210],$VA1=[1,215],$VB1=[1,224],$VC1=[1,220],$VD1=[10,72,78,93,98,118,128,162,168,169,183,198,232,249,251,311,315,607,768],$VE1=[2,4,5,10,72,76,77,78,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,183,185,187,198,244,245,285,286,287,288,289,290,291,292,311,315,425,429,607,768],$VF1=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VG1=[1,253],$VH1=[1,260],$VI1=[1,261],$VJ1=[1,270],$VK1=[1,275],$VL1=[1,274],$VM1=[2,4,5,10,72,77,78,93,98,107,118,128,131,132,137,143,145,149,152,154,156,162,168,169,179,180,181,183,198,232,244,245,249,251,269,270,271,275,276,278,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,307,308,311,315,317,322,425,429,607,768],$VN1=[2,162],$VO1=[1,286],$VP1=[10,74,78,311,315,510,607,768],$VQ1=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,193,198,206,208,222,223,224,225,226,227,228,229,230,231,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,307,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,349,361,373,374,375,378,379,391,394,401,405,406,407,408,409,410,411,413,414,422,423,425,429,431,438,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,519,520,521,522,607,768],$VR1=[2,4,5,10,53,72,89,124,146,156,189,271,272,294,311,340,343,344,401,405,406,409,411,413,414,422,423,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,522,607,768],$VS1=[1,567],$VT1=[1,569],$VU1=[1,570],$VV1=[2,512],$VW1=[1,576],$VX1=[1,587],$VY1=[1,590],$VZ1=[1,591],$V_1=[10,78,89,132,137,146,189,301,311,315,475,607,768],$V$1=[10,74,311,315,607,768],$V02=[2,576],$V12=[1,609],$V22=[2,4,5,156],$V32=[1,647],$V42=[1,619],$V52=[1,653],$V62=[1,654],$V72=[1,627],$V82=[1,638],$V92=[1,625],$Va2=[1,633],$Vb2=[1,626],$Vc2=[1,634],$Vd2=[1,636],$Ve2=[1,628],$Vf2=[1,629],$Vg2=[1,648],$Vh2=[1,645],$Vi2=[1,646],$Vj2=[1,622],$Vk2=[1,624],$Vl2=[1,616],$Vm2=[1,617],$Vn2=[1,618],$Vo2=[1,620],$Vp2=[1,621],$Vq2=[1,623],$Vr2=[1,630],$Vs2=[1,631],$Vt2=[1,635],$Vu2=[1,637],$Vv2=[1,639],$Vw2=[1,640],$Vx2=[1,641],$Vy2=[1,642],$Vz2=[1,643],$VA2=[1,649],$VB2=[1,650],$VC2=[1,651],$VD2=[1,652],$VE2=[2,4,5,10,53,72,74,76,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VF2=[2,291],$VG2=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,231,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VH2=[2,368],$VI2=[1,675],$VJ2=[1,685],$VK2=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,231,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VL2=[1,701],$VM2=[1,710],$VN2=[1,709],$VO2=[2,4,5,10,72,74,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],$VP2=[10,72,74,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],$VQ2=[2,202],$VR2=[1,732],$VS2=[10,72,78,93,98,118,128,162,168,169,183,232,249,251,311,315,607,768],$VT2=[2,163],$VU2=[1,735],$VV2=[2,4,5,112],$VW2=[1,748],$VX2=[1,767],$VY2=[1,747],$VZ2=[1,746],$V_2=[1,741],$V$2=[1,742],$V03=[1,744],$V13=[1,745],$V23=[1,749],$V33=[1,750],$V43=[1,751],$V53=[1,752],$V63=[1,753],$V73=[1,754],$V83=[1,755],$V93=[1,756],$Va3=[1,757],$Vb3=[1,758],$Vc3=[1,759],$Vd3=[1,760],$Ve3=[1,761],$Vf3=[1,762],$Vg3=[1,763],$Vh3=[1,764],$Vi3=[1,766],$Vj3=[1,768],$Vk3=[1,769],$Vl3=[1,770],$Vm3=[1,771],$Vn3=[1,772],$Vo3=[1,773],$Vp3=[1,774],$Vq3=[1,777],$Vr3=[1,778],$Vs3=[1,779],$Vt3=[1,780],$Vu3=[1,781],$Vv3=[1,782],$Vw3=[1,783],$Vx3=[1,784],$Vy3=[1,785],$Vz3=[1,786],$VA3=[1,787],$VB3=[1,788],$VC3=[74,89,189],$VD3=[10,74,78,154,187,230,302,311,315,348,361,373,374,378,379,607,768],$VE3=[1,805],$VF3=[10,74,78,305,311,315,607,768],$VG3=[1,806],$VH3=[1,812],$VI3=[1,813],$VJ3=[1,817],$VK3=[10,74,78,311,315,607,768],$VL3=[2,4,5,77,131,132,137,143,145,149,152,154,156,179,180,181,244,245,269,270,271,275,276,278,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,307,308,317,322,425,429],$VM3=[10,72,78,93,98,107,118,128,162,168,169,183,198,232,249,251,311,315,607,768],$VN3=[2,4,5,10,72,77,78,93,98,107,118,128,131,132,137,143,145,149,152,154,156,162,164,168,169,179,180,181,183,185,187,195,198,232,244,245,249,251,269,270,271,275,276,278,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,307,308,311,315,317,322,425,429,607,768],$VO3=[2,4,5,132,301],$VP3=[1,853],$VQ3=[10,74,76,78,311,315,607,768],$VR3=[2,748],$VS3=[10,74,76,78,132,139,141,145,152,311,315,425,429,607,768],$VT3=[2,1171],$VU3=[10,74,76,78,139,141,145,152,311,315,425,429,607,768],$VV3=[10,74,76,78,139,141,145,311,315,425,429,607,768],$VW3=[10,74,78,139,141,311,315,607,768],$VX3=[10,78,89,132,146,189,301,311,315,475,607,768],$VY3=[340,343,344],$VZ3=[2,774],$V_3=[1,878],$V$3=[1,879],$V04=[1,880],$V14=[1,881],$V24=[1,890],$V34=[1,889],$V44=[164,166,339],$V54=[2,453],$V64=[1,945],$V74=[2,4,5,77,131,156,270,294,295,296,297,298],$V84=[1,960],$V94=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,124,128,129,130,131,132,134,135,137,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,319,320,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$Va4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$Vb4=[2,384],$Vc4=[1,967],$Vd4=[311,313,315],$Ve4=[74,305],$Vf4=[74,305,431],$Vg4=[1,974],$Vh4=[74,431],$Vi4=[1,987],$Vj4=[1,986],$Vk4=[1,993],$Vl4=[10,72,78,93,98,118,128,162,168,169,232,249,251,311,315,607,768],$Vm4=[1,1020],$Vn4=[10,72,78,311,315,607,768],$Vo4=[1,1026],$Vp4=[1,1027],$Vq4=[1,1028],$Vr4=[2,4,5,10,72,74,76,77,78,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,198,244,245,285,286,287,288,289,290,291,292,311,315,425,429,607,768],$Vs4=[1,1078],$Vt4=[1,1077],$Vu4=[1,1091],$Vv4=[1,1090],$Vw4=[1,1098],$Vx4=[10,72,74,78,93,98,107,118,128,162,168,169,183,198,232,249,251,311,315,607,768],$Vy4=[1,1130],$Vz4=[10,78,89,146,189,311,315,475,607,768],$VA4=[1,1150],$VB4=[1,1149],$VC4=[1,1148],$VD4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VE4=[1,1164],$VF4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,319,320,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VG4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,320,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VH4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,124,128,129,130,131,132,133,134,135,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,319,320,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VI4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,124,128,129,130,131,132,134,135,137,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,319,320,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VJ4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,319,325,326,327,328,329,330,331,335,336,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VK4=[2,415],$VL4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,107,118,122,128,129,130,131,132,134,135,137,143,145,146,148,149,150,152,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,319,335,336,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VM4=[2,289],$VN4=[2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VO4=[10,78,311,315,607,768],$VP4=[1,1200],$VQ4=[10,77,78,143,145,152,181,307,311,315,425,429,607,768],$VR4=[10,74,78,311,313,315,469,607,768],$VS4=[1,1211],$VT4=[10,72,78,118,128,162,168,169,232,249,251,311,315,607,768],$VU4=[10,72,74,78,93,98,118,128,162,168,169,183,198,232,249,251,311,315,607,768],$VV4=[2,4,5,72,76,77,78,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,185,187,244,245,285,286,287,288,289,290,291,292,425,429],$VW4=[2,4,5,72,74,76,77,78,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,185,187,244,245,285,286,287,288,289,290,291,292,425,429],$VX4=[2,1095],$VY4=[2,4,5,72,74,76,77,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,185,187,244,245,285,286,287,288,289,290,291,292,425,429],$VZ4=[1,1264],$V_4=[10,74,78,128,311,313,315,469,607,768],$V$4=[115,116,124],$V05=[2,593],$V15=[1,1293],$V25=[76,139],$V35=[2,734],$V45=[1,1310],$V55=[1,1311],$V65=[2,4,5,10,53,72,76,89,124,146,156,189,230,271,272,294,311,315,340,343,344,401,405,406,409,411,413,414,422,423,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,522,607,768],$V75=[2,336],$V85=[1,1335],$V95=[1,1349],$Va5=[1,1351],$Vb5=[2,496],$Vc5=[74,78],$Vd5=[10,311,313,315,469,607,768],$Ve5=[10,72,78,118,162,168,169,232,249,251,311,315,607,768],$Vf5=[1,1368],$Vg5=[1,1372],$Vh5=[1,1373],$Vi5=[1,1375],$Vj5=[1,1376],$Vk5=[1,1377],$Vl5=[1,1378],$Vm5=[1,1379],$Vn5=[1,1380],$Vo5=[1,1381],$Vp5=[1,1382],$Vq5=[10,72,74,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,232,249,251,311,315,607,768],$Vr5=[1,1407],$Vs5=[10,72,78,118,162,168,169,249,251,311,315,607,768],$Vt5=[10,72,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,232,249,251,311,315,607,768],$Vu5=[1,1505],$Vv5=[1,1507],$Vw5=[2,4,5,77,143,145,152,156,181,270,294,295,296,297,298,307,425,429],$Vx5=[1,1521],$Vy5=[10,72,74,78,162,168,169,249,251,311,315,607,768],$Vz5=[1,1539],$VA5=[1,1541],$VB5=[1,1542],$VC5=[1,1538],$VD5=[1,1537],$VE5=[1,1536],$VF5=[1,1543],$VG5=[1,1533],$VH5=[1,1534],$VI5=[1,1535],$VJ5=[1,1561],$VK5=[2,4,5,10,53,72,89,124,146,156,189,271,272,294,311,315,340,343,344,401,405,406,409,411,413,414,422,423,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,522,607,768],$VL5=[1,1572],$VM5=[1,1580],$VN5=[1,1579],$VO5=[10,72,78,162,168,169,249,251,311,315,607,768],$VP5=[10,72,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],$VQ5=[2,4,5,10,72,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],$VR5=[1,1640],$VS5=[1,1642],$VT5=[1,1639],$VU5=[1,1641],$VV5=[187,193,373,374,375,378],$VW5=[2,524],$VX5=[1,1647],$VY5=[1,1666],$VZ5=[10,72,78,162,168,169,311,315,607,768],$V_5=[1,1676],$V$5=[1,1677],$V06=[1,1678],$V16=[1,1700],$V26=[4,10,247,311,315,348,361,607,768],$V36=[1,1748],$V46=[10,72,74,78,118,162,168,169,239,249,251,311,315,607,768],$V56=[2,4,5,77],$V66=[1,1844],$V76=[1,1856],$V86=[1,1875],$V96=[10,72,78,162,168,169,311,315,420,607,768],$Va6=[10,74,78,230,311,315,607,768];
var parser = {trace: function trace () { },
yy: {},
symbols_: {"error":2,"Literal":3,"LITERAL":4,"BRALITERAL":5,"NonReserved":6,"LiteralWithSpaces":7,"main":8,"Statements":9,"EOF":10,"Statements_group0":11,"AStatement":12,"ExplainStatement":13,"EXPLAIN":14,"QUERY":15,"PLAN":16,"Statement":17,"AlterTable":18,"AttachDatabase":19,"Call":20,"CreateDatabase":21,"CreateIndex":22,"CreateGraph":23,"CreateTable":24,"CreateView":25,"CreateEdge":26,"CreateVertex":27,"Declare":28,"Delete":29,"DetachDatabase":30,"DropDatabase":31,"DropIndex":32,"DropTable":33,"DropView":34,"If":35,"Insert":36,"Merge":37,"Reindex":38,"RenameTable":39,"Select":40,"ShowCreateTable":41,"ShowColumns":42,"ShowDatabases":43,"ShowIndex":44,"ShowTables":45,"TruncateTable":46,"WithSelect":47,"CreateTrigger":48,"DropTrigger":49,"BeginTransaction":50,"CommitTransaction":51,"RollbackTransaction":52,"EndTransaction":53,"UseDatabase":54,"Update":55,"JavaScript":56,"Source":57,"Assert":58,"While":59,"Continue":60,"Break":61,"BeginEnd":62,"Print":63,"Require":64,"SetVariable":65,"ExpressionStatement":66,"AddRule":67,"Query":68,"Echo":69,"CreateFunction":70,"CreateAggregate":71,"WITH":72,"WithTablesList":73,"COMMA":74,"WithTable":75,"AS":76,"LPAR":77,"RPAR":78,"SelectClause":79,"Select_option0":80,"IntoClause":81,"FromClause":82,"Select_option1":83,"WhereClause":84,"GroupClause":85,"OrderClause":86,"LimitClause":87,"UnionClause":88,"SEARCH":89,"Select_repetition0":90,"Select_option2":91,"PivotClause":92,"PIVOT":93,"Expression":94,"FOR":95,"PivotClause_option0":96,"PivotClause_option1":97,"UNPIVOT":98,"IN":99,"ColumnsList":100,"PivotClause_option2":101,"PivotClause2":102,"AsList":103,"AsLiteral":104,"AsPart":105,"RemoveClause":106,"REMOVE":107,"RemoveClause_option0":108,"RemoveColumnsList":109,"RemoveColumn":110,"Column":111,"LIKE":112,"StringValue":113,"ArrowDot":114,"ARROW":115,"DOT":116,"SearchSelector":117,"ORDER":118,"BY":119,"OrderExpressionsList":120,"SearchSelector_option0":121,"DOTDOT":122,"CARET":123,"EQ":124,"SearchSelector_repetition_plus0":125,"SearchSelector_repetition_plus1":126,"SearchSelector_option1":127,"WHERE":128,"OF":129,"CLASS":130,"NUMBER":131,"STRING":132,"SLASH":133,"VERTEX":134,"EDGE":135,"EXCLAMATION":136,"SHARP":137,"MODULO":138,"GT":139,"LT":140,"GTGT":141,"LTLT":142,"DOLLAR":143,"Json":144,"AT":145,"SET":146,"SetColumnsList":147,"TO":148,"VALUE":149,"ROW":150,"ExprList":151,"COLON":152,"PlusStar":153,"NOT":154,"SearchSelector_repetition2":155,"IF":156,"SearchSelector_repetition3":157,"Aggregator":158,"SearchSelector_repetition4":159,"SearchSelector_group0":160,"SearchSelector_repetition5":161,"UNION":162,"SearchSelectorList":163,"ALL":164,"SearchSelector_repetition6":165,"ANY":166,"SearchSelector_repetition7":167,"INTERSECT":168,"EXCEPT":169,"AND":170,"OR":171,"PATH":172,"RETURN":173,"ResultColumns":174,"REPEAT":175,"SearchSelector_repetition8":176,"SearchSelectorList_repetition0":177,"SearchSelectorList_repetition1":178,"PLUS":179,"STAR":180,"QUESTION":181,"SearchFrom":182,"FROM":183,"SelectModifier":184,"DISTINCT":185,"TopClause":186,"UNIQUE":187,"SelectClause_option0":188,"SELECT":189,"COLUMN":190,"MATRIX":191,"TEXTSTRING":192,"INDEX":193,"RECORDSET":194,"TOP":195,"NumValue":196,"TopClause_option0":197,"INTO":198,"Table":199,"FuncValue":200,"ParamValue":201,"VarValue":202,"FromTablesList":203,"JoinTablesList":204,"ApplyClause":205,"CROSS":206,"APPLY":207,"OUTER":208,"FromTable":209,"FromTable_option0":210,"FromTable_option1":211,"INDEXED":212,"INSERTED":213,"FromString":214,"JoinTable":215,"JoinMode":216,"JoinTableAs":217,"OnClause":218,"JoinTableAs_option0":219,"JoinTableAs_option1":220,"JoinModeMode":221,"NATURAL":222,"JOIN":223,"INNER":224,"LEFT":225,"RIGHT":226,"FULL":227,"SEMI":228,"ANTI":229,"ON":230,"USING":231,"GROUP":232,"GroupExpressionsList":233,"HavingClause":234,"GroupExpression":235,"GROUPING":236,"ROLLUP":237,"CUBE":238,"HAVING":239,"CORRESPONDING":240,"OrderExpression":241,"NullsOrder":242,"NULLS":243,"FIRST":244,"LAST":245,"DIRECTION":246,"COLLATE":247,"NOCASE":248,"LIMIT":249,"OffsetClause":250,"OFFSET":251,"LimitClause_option0":252,"FETCH":253,"LimitClause_option1":254,"LimitClause_option2":255,"LimitClause_option3":256,"ResultColumn":257,"Star":258,"AggrValue":259,"Op":260,"LogicValue":261,"NullValue":262,"ExistsValue":263,"CaseValue":264,"CastClause":265,"ArrayValue":266,"NewClause":267,"Expression_group0":268,"CURRENT_TIMESTAMP":269,"CURRENT_DATE":270,"JAVASCRIPT":271,"CREATE":272,"FUNCTION":273,"AGGREGATE":274,"NEW":275,"CAST":276,"ColumnType":277,"CONVERT":278,"PrimitiveValue":279,"OverClause":280,"OVER":281,"OverPartitionClause":282,"OverOrderByClause":283,"PARTITION":284,"SUM":285,"TOTAL":286,"COUNT":287,"MIN":288,"MAX":289,"AVG":290,"AGGR":291,"ARRAY":292,"FuncValue_option0":293,"REPLACE":294,"DATEADD":295,"DATEDIFF":296,"TIMESTAMPDIFF":297,"INTERVAL":298,"TRUE":299,"FALSE":300,"NSTRING":301,"NULL":302,"EXISTS":303,"ARRAYLBRA":304,"RBRA":305,"ParamValue_group0":306,"BRAQUESTION":307,"CASE":308,"WhensList":309,"ElseClause":310,"END":311,"When":312,"WHEN":313,"THEN":314,"ELSE":315,"REGEXP":316,"TILDA":317,"GLOB":318,"ESCAPE":319,"NOT_LIKE":320,"BARBAR":321,"MINUS":322,"AMPERSAND":323,"BAR":324,"GE":325,"LE":326,"EQEQ":327,"EQEQEQ":328,"NE":329,"NEEQEQ":330,"NEEQEQEQ":331,"CondOp":332,"AllSome":333,"ColFunc":334,"BETWEEN":335,"NOT_BETWEEN":336,"IS":337,"DOUBLECOLON":338,"SOME":339,"UPDATE":340,"SetColumn":341,"SetColumn_group0":342,"DELETE":343,"INSERT":344,"Into":345,"Values":346,"ValuesListsList":347,"DEFAULT":348,"VALUES":349,"ValuesList":350,"Value":351,"DateValue":352,"TemporaryClause":353,"TableClass":354,"IfNotExists":355,"CreateTableDefClause":356,"CreateTableOptionsClause":357,"TABLE":358,"CreateTableOptions":359,"CreateTableOption":360,"IDENTITY":361,"TEMP":362,"ColumnDefsList":363,"ConstraintsList":364,"Constraint":365,"ConstraintName":366,"PrimaryKey":367,"ForeignKey":368,"UniqueKey":369,"IndexKey":370,"Check":371,"CONSTRAINT":372,"CHECK":373,"PRIMARY":374,"KEY":375,"PrimaryKey_option0":376,"ColsList":377,"FOREIGN":378,"REFERENCES":379,"ForeignKey_option0":380,"OnForeignKeyClause":381,"ParColsList":382,"OnDeleteClause":383,"OnUpdateClause":384,"NO":385,"ACTION":386,"UniqueKey_option0":387,"UniqueKey_option1":388,"ColumnDef":389,"ColumnConstraintsClause":390,"ColumnConstraints":391,"SingularColumnType":392,"NumberMax":393,"ENUM":394,"MAXNUM":395,"ColumnConstraintsList":396,"ColumnConstraint":397,"ParLiteral":398,"ColumnConstraint_option0":399,"ColumnConstraint_option1":400,"DROP":401,"DropTable_group0":402,"IfExists":403,"TablesList":404,"ALTER":405,"RENAME":406,"ADD":407,"MODIFY":408,"ATTACH":409,"DATABASE":410,"DETACH":411,"AsClause":412,"USE":413,"SHOW":414,"VIEW":415,"CreateView_option0":416,"CreateView_option1":417,"SubqueryRestriction":418,"READ":419,"ONLY":420,"OPTION":421,"SOURCE":422,"ASSERT":423,"JsonObject":424,"ATLBRA":425,"JsonArray":426,"JsonValue":427,"JsonPrimitiveValue":428,"LCUR":429,"JsonPropertiesList":430,"RCUR":431,"JsonElementsList":432,"JsonProperty":433,"OnOff":434,"SetPropsList":435,"AtDollar":436,"SetProp":437,"OFF":438,"COMMIT":439,"TRANSACTION":440,"ROLLBACK":441,"BEGIN":442,"ElseStatement":443,"WHILE":444,"CONTINUE":445,"BREAK":446,"PRINT":447,"REQUIRE":448,"StringValuesList":449,"PluginsList":450,"Plugin":451,"ECHO":452,"DECLARE":453,"DeclaresList":454,"DeclareItem":455,"TRUNCATE":456,"MERGE":457,"MergeInto":458,"MergeUsing":459,"MergeOn":460,"MergeMatchedList":461,"OutputClause":462,"MergeMatched":463,"MergeNotMatched":464,"MATCHED":465,"MergeMatchedAction":466,"MergeNotMatchedAction":467,"TARGET":468,"OUTPUT":469,"CreateVertex_option0":470,"CreateVertex_option1":471,"CreateVertex_option2":472,"CreateVertexSet":473,"SharpValue":474,"CONTENT":475,"CreateEdge_option0":476,"GRAPH":477,"GraphList":478,"GraphVertexEdge":479,"GraphElement":480,"GraphVertexEdge_option0":481,"GraphVertexEdge_option1":482,"GraphElementVar":483,"GraphVertexEdge_option2":484,"GraphVertexEdge_option3":485,"GraphVertexEdge_option4":486,"GraphVar":487,"GraphAsClause":488,"GraphAtClause":489,"GraphElement2":490,"GraphElement2_option0":491,"GraphElement2_option1":492,"GraphElement2_option2":493,"GraphElement2_option3":494,"GraphElement_option0":495,"GraphElement_option1":496,"GraphElement_option2":497,"SharpLiteral":498,"GraphElement_option3":499,"GraphElement_option4":500,"GraphElement_option5":501,"ColonLiteral":502,"DeleteVertex":503,"DeleteVertex_option0":504,"DeleteEdge":505,"DeleteEdge_option0":506,"DeleteEdge_option1":507,"DeleteEdge_option2":508,"Term":509,"COLONDASH":510,"TermsList":511,"QUESTIONDASH":512,"CALL":513,"TRIGGER":514,"BeforeAfter":515,"InsertDeleteUpdate":516,"CreateTrigger_option0":517,"CreateTrigger_option1":518,"BEFORE":519,"AFTER":520,"INSTEAD":521,"REINDEX":522,"A":523,"ABSENT":524,"ABSOLUTE":525,"ACCORDING":526,"ADA":527,"ADMIN":528,"ALWAYS":529,"ASC":530,"ASSERTION":531,"ASSIGNMENT":532,"ATTRIBUTE":533,"ATTRIBUTES":534,"BASE64":535,"BERNOULLI":536,"BLOCKED":537,"BOM":538,"BREADTH":539,"C":540,"CASCADE":541,"CATALOG":542,"CATALOG_NAME":543,"CHAIN":544,"CHARACTERISTICS":545,"CHARACTERS":546,"CHARACTER_SET_CATALOG":547,"CHARACTER_SET_NAME":548,"CHARACTER_SET_SCHEMA":549,"CLASS_ORIGIN":550,"COBOL":551,"COLLATION":552,"COLLATION_CATALOG":553,"COLLATION_NAME":554,"COLLATION_SCHEMA":555,"COLUMNS":556,"COLUMN_NAME":557,"COMMAND_FUNCTION":558,"COMMAND_FUNCTION_CODE":559,"COMMITTED":560,"CONDITION_NUMBER":561,"CONNECTION":562,"CONNECTION_NAME":563,"CONSTRAINTS":564,"CONSTRAINT_CATALOG":565,"CONSTRAINT_NAME":566,"CONSTRAINT_SCHEMA":567,"CONSTRUCTOR":568,"CONTROL":569,"CURSOR_NAME":570,"DATA":571,"DATETIME_INTERVAL_CODE":572,"DATETIME_INTERVAL_PRECISION":573,"DB":574,"DEFAULTS":575,"DEFERRABLE":576,"DEFERRED":577,"DEFINED":578,"DEFINER":579,"DEGREE":580,"DEPTH":581,"DERIVED":582,"DESC":583,"DESCRIPTOR":584,"DIAGNOSTICS":585,"DISPATCH":586,"DOCUMENT":587,"DOMAIN":588,"DYNAMIC_FUNCTION":589,"DYNAMIC_FUNCTION_CODE":590,"EMPTY":591,"ENCODING":592,"ENFORCED":593,"EXCLUDE":594,"EXCLUDING":595,"EXPRESSION":596,"FILE":597,"FINAL":598,"FLAG":599,"FOLLOWING":600,"FORTRAN":601,"FOUND":602,"FS":603,"G":604,"GENERAL":605,"GENERATED":606,"GO":607,"GOTO":608,"GRANTED":609,"HEX":610,"HIERARCHY":611,"ID":612,"IGNORE":613,"IMMEDIATE":614,"IMMEDIATELY":615,"IMPLEMENTATION":616,"INCLUDING":617,"INCREMENT":618,"INDENT":619,"INITIALLY":620,"INPUT":621,"INSTANCE":622,"INSTANTIABLE":623,"INTEGRITY":624,"INVOKER":625,"ISOLATION":626,"K":627,"KEY_MEMBER":628,"KEY_TYPE":629,"LENGTH":630,"LEVEL":631,"LIBRARY":632,"LINK":633,"LOCATION":634,"LOCATOR":635,"M":636,"MAP":637,"MAPPING":638,"MAXVALUE":639,"MESSAGE_LENGTH":640,"MESSAGE_OCTET_LENGTH":641,"MESSAGE_TEXT":642,"MINVALUE":643,"MORE":644,"MUMPS":645,"NAME":646,"NAMES":647,"NAMESPACE":648,"NESTING":649,"NEXT":650,"NFC":651,"NFD":652,"NFKC":653,"NFKD":654,"NIL":655,"NORMALIZED":656,"NULLABLE":657,"OBJECT":658,"OCTETS":659,"OPTIONS":660,"ORDERING":661,"ORDINALITY":662,"OTHERS":663,"OVERRIDING":664,"P":665,"PAD":666,"PARAMETER_MODE":667,"PARAMETER_NAME":668,"PARAMETER_ORDINAL_POSITION":669,"PARAMETER_SPECIFIC_CATALOG":670,"PARAMETER_SPECIFIC_NAME":671,"PARAMETER_SPECIFIC_SCHEMA":672,"PARTIAL":673,"PASCAL":674,"PASSING":675,"PASSTHROUGH":676,"PERMISSION":677,"PLACING":678,"PLI":679,"PRECEDING":680,"PRESERVE":681,"PRIOR":682,"PRIVILEGES":683,"PUBLIC":684,"RECOVERY":685,"RELATIVE":686,"REPEATABLE":687,"REQUIRING":688,"RESPECT":689,"RESTART":690,"RESTORE":691,"RESTRICT":692,"RETURNED_CARDINALITY":693,"RETURNED_LENGTH":694,"RETURNED_OCTET_LENGTH":695,"RETURNED_SQLSTATE":696,"RETURNING":697,"ROLE":698,"ROUTINE":699,"ROUTINE_CATALOG":700,"ROUTINE_NAME":701,"ROUTINE_SCHEMA":702,"ROW_COUNT":703,"SCALE":704,"SCHEMA":705,"SCHEMA_NAME":706,"SCOPE_CATALOG":707,"SCOPE_NAME":708,"SCOPE_SCHEMA":709,"SECTION":710,"SECURITY":711,"SELECTIVE":712,"SELF":713,"SEQUENCE":714,"SERIALIZABLE":715,"SERVER":716,"SERVER_NAME":717,"SESSION":718,"SETS":719,"SIMPLE":720,"SIZE":721,"SPACE":722,"SPECIFIC_NAME":723,"STANDALONE":724,"STATE":725,"STATEMENT":726,"STRIP":727,"STRUCTURE":728,"STYLE":729,"SUBCLASS_ORIGIN":730,"T":731,"TABLE_NAME":732,"TEMPORARY":733,"TIES":734,"TOKEN":735,"TOP_LEVEL_COUNT":736,"TRANSACTIONS_COMMITTED":737,"TRANSACTIONS_ROLLED_BACK":738,"TRANSACTION_ACTIVE":739,"TRANSFORM":740,"TRANSFORMS":741,"TRIGGER_CATALOG":742,"TRIGGER_NAME":743,"TRIGGER_SCHEMA":744,"TYPE":745,"UNBOUNDED":746,"UNCOMMITTED":747,"UNDER":748,"UNLINK":749,"UNNAMED":750,"UNTYPED":751,"URI":752,"USAGE":753,"USER_DEFINED_TYPE_CATALOG":754,"USER_DEFINED_TYPE_CODE":755,"USER_DEFINED_TYPE_NAME":756,"USER_DEFINED_TYPE_SCHEMA":757,"VALID":758,"VERSION":759,"WHITESPACE":760,"WORK":761,"WRAPPER":762,"WRITE":763,"XMLDECLARATION":764,"XMLSCHEMA":765,"YES":766,"ZONE":767,"SEMICOLON":768,"PERCENT":769,"ROWS":770,"FuncValue_option0_group0":771,"$accept":0,"$end":1},
terminals_: {2:"error",4:"LITERAL",5:"BRALITERAL",10:"EOF",14:"EXPLAIN",15:"QUERY",16:"PLAN",53:"EndTransaction",72:"WITH",74:"COMMA",76:"AS",77:"LPAR",78:"RPAR",89:"SEARCH",93:"PIVOT",95:"FOR",98:"UNPIVOT",99:"IN",107:"REMOVE",112:"LIKE",115:"ARROW",116:"DOT",118:"ORDER",119:"BY",122:"DOTDOT",123:"CARET",124:"EQ",128:"WHERE",129:"OF",130:"CLASS",131:"NUMBER",132:"STRING",133:"SLASH",134:"VERTEX",135:"EDGE",136:"EXCLAMATION",137:"SHARP",138:"MODULO",139:"GT",140:"LT",141:"GTGT",142:"LTLT",143:"DOLLAR",145:"AT",146:"SET",148:"TO",149:"VALUE",150:"ROW",152:"COLON",154:"NOT",156:"IF",162:"UNION",164:"ALL",166:"ANY",168:"INTERSECT",169:"EXCEPT",170:"AND",171:"OR",172:"PATH",173:"RETURN",175:"REPEAT",179:"PLUS",180:"STAR",181:"QUESTION",183:"FROM",185:"DISTINCT",187:"UNIQUE",189:"SELECT",190:"COLUMN",191:"MATRIX",192:"TEXTSTRING",193:"INDEX",194:"RECORDSET",195:"TOP",198:"INTO",206:"CROSS",207:"APPLY",208:"OUTER",212:"INDEXED",213:"INSERTED",222:"NATURAL",223:"JOIN",224:"INNER",225:"LEFT",226:"RIGHT",227:"FULL",228:"SEMI",229:"ANTI",230:"ON",231:"USING",232:"GROUP",236:"GROUPING",237:"ROLLUP",238:"CUBE",239:"HAVING",240:"CORRESPONDING",243:"NULLS",244:"FIRST",245:"LAST",246:"DIRECTION",247:"COLLATE",248:"NOCASE",249:"LIMIT",251:"OFFSET",253:"FETCH",269:"CURRENT_TIMESTAMP",270:"CURRENT_DATE",271:"JAVASCRIPT",272:"CREATE",273:"FUNCTION",274:"AGGREGATE",275:"NEW",276:"CAST",278:"CONVERT",281:"OVER",284:"PARTITION",285:"SUM",286:"TOTAL",287:"COUNT",288:"MIN",289:"MAX",290:"AVG",291:"AGGR",292:"ARRAY",294:"REPLACE",295:"DATEADD",296:"DATEDIFF",297:"TIMESTAMPDIFF",298:"INTERVAL",299:"TRUE",300:"FALSE",301:"NSTRING",302:"NULL",303:"EXISTS",304:"ARRAYLBRA",305:"RBRA",307:"BRAQUESTION",308:"CASE",311:"END",313:"WHEN",314:"THEN",315:"ELSE",316:"REGEXP",317:"TILDA",318:"GLOB",319:"ESCAPE",320:"NOT_LIKE",321:"BARBAR",322:"MINUS",323:"AMPERSAND",324:"BAR",325:"GE",326:"LE",327:"EQEQ",328:"EQEQEQ",329:"NE",330:"NEEQEQ",331:"NEEQEQEQ",335:"BETWEEN",336:"NOT_BETWEEN",337:"IS",338:"DOUBLECOLON",339:"SOME",340:"UPDATE",343:"DELETE",344:"INSERT",348:"DEFAULT",349:"VALUES",352:"DateValue",358:"TABLE",361:"IDENTITY",362:"TEMP",372:"CONSTRAINT",373:"CHECK",374:"PRIMARY",375:"KEY",378:"FOREIGN",379:"REFERENCES",385:"NO",386:"ACTION",391:"ColumnConstraints",394:"ENUM",395:"MAXNUM",401:"DROP",405:"ALTER",406:"RENAME",407:"ADD",408:"MODIFY",409:"ATTACH",410:"DATABASE",411:"DETACH",413:"USE",414:"SHOW",415:"VIEW",419:"READ",420:"ONLY",421:"OPTION",422:"SOURCE",423:"ASSERT",425:"ATLBRA",429:"LCUR",431:"RCUR",438:"OFF",439:"COMMIT",440:"TRANSACTION",441:"ROLLBACK",442:"BEGIN",444:"WHILE",445:"CONTINUE",446:"BREAK",447:"PRINT",448:"REQUIRE",452:"ECHO",453:"DECLARE",456:"TRUNCATE",457:"MERGE",465:"MATCHED",468:"TARGET",469:"OUTPUT",475:"CONTENT",477:"GRAPH",510:"COLONDASH",512:"QUESTIONDASH",513:"CALL",514:"TRIGGER",519:"BEFORE",520:"AFTER",521:"INSTEAD",522:"REINDEX",523:"A",524:"ABSENT",525:"ABSOLUTE",526:"ACCORDING",527:"ADA",528:"ADMIN",529:"ALWAYS",530:"ASC",531:"ASSERTION",532:"ASSIGNMENT",533:"ATTRIBUTE",534:"ATTRIBUTES",535:"BASE64",536:"BERNOULLI",537:"BLOCKED",538:"BOM",539:"BREADTH",540:"C",541:"CASCADE",542:"CATALOG",543:"CATALOG_NAME",544:"CHAIN",545:"CHARACTERISTICS",546:"CHARACTERS",547:"CHARACTER_SET_CATALOG",548:"CHARACTER_SET_NAME",549:"CHARACTER_SET_SCHEMA",550:"CLASS_ORIGIN",551:"COBOL",552:"COLLATION",553:"COLLATION_CATALOG",554:"COLLATION_NAME",555:"COLLATION_SCHEMA",556:"COLUMNS",557:"COLUMN_NAME",558:"COMMAND_FUNCTION",559:"COMMAND_FUNCTION_CODE",560:"COMMITTED",561:"CONDITION_NUMBER",562:"CONNECTION",563:"CONNECTION_NAME",564:"CONSTRAINTS",565:"CONSTRAINT_CATALOG",566:"CONSTRAINT_NAME",567:"CONSTRAINT_SCHEMA",568:"CONSTRUCTOR",569:"CONTROL",570:"CURSOR_NAME",571:"DATA",572:"DATETIME_INTERVAL_CODE",573:"DATETIME_INTERVAL_PRECISION",574:"DB",575:"DEFAULTS",576:"DEFERRABLE",577:"DEFERRED",578:"DEFINED",579:"DEFINER",580:"DEGREE",581:"DEPTH",582:"DERIVED",583:"DESC",584:"DESCRIPTOR",585:"DIAGNOSTICS",586:"DISPATCH",587:"DOCUMENT",588:"DOMAIN",589:"DYNAMIC_FUNCTION",590:"DYNAMIC_FUNCTION_CODE",591:"EMPTY",592:"ENCODING",593:"ENFORCED",594:"EXCLUDE",595:"EXCLUDING",596:"EXPRESSION",597:"FILE",598:"FINAL",599:"FLAG",600:"FOLLOWING",601:"FORTRAN",602:"FOUND",603:"FS",604:"G",605:"GENERAL",606:"GENERATED",607:"GO",608:"GOTO",609:"GRANTED",610:"HEX",611:"HIERARCHY",612:"ID",613:"IGNORE",614:"IMMEDIATE",615:"IMMEDIATELY",616:"IMPLEMENTATION",617:"INCLUDING",618:"INCREMENT",619:"INDENT",620:"INITIALLY",621:"INPUT",622:"INSTANCE",623:"INSTANTIABLE",624:"INTEGRITY",625:"INVOKER",626:"ISOLATION",627:"K",628:"KEY_MEMBER",629:"KEY_TYPE",630:"LENGTH",631:"LEVEL",632:"LIBRARY",633:"LINK",634:"LOCATION",635:"LOCATOR",636:"M",637:"MAP",638:"MAPPING",639:"MAXVALUE",640:"MESSAGE_LENGTH",641:"MESSAGE_OCTET_LENGTH",642:"MESSAGE_TEXT",643:"MINVALUE",644:"MORE",645:"MUMPS",646:"NAME",647:"NAMES",648:"NAMESPACE",649:"NESTING",650:"NEXT",651:"NFC",652:"NFD",653:"NFKC",654:"NFKD",655:"NIL",656:"NORMALIZED",657:"NULLABLE",658:"OBJECT",659:"OCTETS",660:"OPTIONS",661:"ORDERING",662:"ORDINALITY",663:"OTHERS",664:"OVERRIDING",665:"P",666:"PAD",667:"PARAMETER_MODE",668:"PARAMETER_NAME",669:"PARAMETER_ORDINAL_POSITION",670:"PARAMETER_SPECIFIC_CATALOG",671:"PARAMETER_SPECIFIC_NAME",672:"PARAMETER_SPECIFIC_SCHEMA",673:"PARTIAL",674:"PASCAL",675:"PASSING",676:"PASSTHROUGH",677:"PERMISSION",678:"PLACING",679:"PLI",680:"PRECEDING",681:"PRESERVE",682:"PRIOR",683:"PRIVILEGES",684:"PUBLIC",685:"RECOVERY",686:"RELATIVE",687:"REPEATABLE",688:"REQUIRING",689:"RESPECT",690:"RESTART",691:"RESTORE",692:"RESTRICT",693:"RETURNED_CARDINALITY",694:"RETURNED_LENGTH",695:"RETURNED_OCTET_LENGTH",696:"RETURNED_SQLSTATE",697:"RETURNING",698:"ROLE",699:"ROUTINE",700:"ROUTINE_CATALOG",701:"ROUTINE_NAME",702:"ROUTINE_SCHEMA",703:"ROW_COUNT",704:"SCALE",705:"SCHEMA",706:"SCHEMA_NAME",707:"SCOPE_CATALOG",708:"SCOPE_NAME",709:"SCOPE_SCHEMA",710:"SECTION",711:"SECURITY",712:"SELECTIVE",713:"SELF",714:"SEQUENCE",715:"SERIALIZABLE",716:"SERVER",717:"SERVER_NAME",718:"SESSION",719:"SETS",720:"SIMPLE",721:"SIZE",722:"SPACE",723:"SPECIFIC_NAME",724:"STANDALONE",725:"STATE",726:"STATEMENT",727:"STRIP",728:"STRUCTURE",729:"STYLE",730:"SUBCLASS_ORIGIN",731:"T",732:"TABLE_NAME",733:"TEMPORARY",734:"TIES",735:"TOKEN",736:"TOP_LEVEL_COUNT",737:"TRANSACTIONS_COMMITTED",738:"TRANSACTIONS_ROLLED_BACK",739:"TRANSACTION_ACTIVE",740:"TRANSFORM",741:"TRANSFORMS",742:"TRIGGER_CATALOG",743:"TRIGGER_NAME",744:"TRIGGER_SCHEMA",745:"TYPE",746:"UNBOUNDED",747:"UNCOMMITTED",748:"UNDER",749:"UNLINK",750:"UNNAMED",751:"UNTYPED",752:"URI",753:"USAGE",754:"USER_DEFINED_TYPE_CATALOG",755:"USER_DEFINED_TYPE_CODE",756:"USER_DEFINED_TYPE_NAME",757:"USER_DEFINED_TYPE_SCHEMA",758:"VALID",759:"VERSION",760:"WHITESPACE",761:"WORK",762:"WRAPPER",763:"WRITE",764:"XMLDECLARATION",765:"XMLSCHEMA",766:"YES",767:"ZONE",768:"SEMICOLON",769:"PERCENT",770:"ROWS"},
productions_: [0,[3,1],[3,1],[3,2],[7,1],[7,2],[8,2],[9,3],[9,1],[9,1],[13,2],[13,4],[12,1],[17,0],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[47,3],[73,3],[73,1],[75,5],[40,10],[40,4],[92,8],[92,11],[102,4],[104,2],[104,1],[103,3],[103,1],[105,1],[105,3],[106,3],[109,3],[109,1],[110,1],[110,2],[114,1],[114,1],[117,1],[117,5],[117,5],[117,1],[117,2],[117,1],[117,2],[117,2],[117,3],[117,4],[117,4],[117,4],[117,4],[117,4],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,2],[117,2],[117,2],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,2],[117,3],[117,4],[117,3],[117,1],[117,4],[117,2],[117,2],[117,4],[117,4],[117,4],[117,4],[117,4],[117,5],[117,4],[117,4],[117,4],[117,4],[117,4],[117,4],[117,4],[117,4],[117,6],[163,3],[163,1],[153,1],[153,1],[153,1],[182,2],[79,4],[79,4],[79,4],[79,3],[184,1],[184,2],[184,2],[184,2],[184,2],[184,2],[184,2],[184,2],[186,3],[186,4],[186,0],[81,0],[81,2],[81,2],[81,2],[81,2],[81,2],[82,2],[82,3],[82,5],[82,0],[205,6],[205,7],[205,6],[205,7],[203,1],[203,3],[209,4],[209,5],[209,3],[209,3],[209,2],[209,3],[209,1],[209,3],[209,2],[209,3],[209,1],[209,1],[209,2],[209,3],[209,1],[209,1],[209,2],[209,3],[209,1],[209,2],[209,3],[214,1],[199,3],[199,1],[204,2],[204,2],[204,1],[204,1],[215,3],[217,1],[217,2],[217,3],[217,3],[217,2],[217,3],[217,4],[217,5],[217,1],[217,2],[217,3],[217,1],[217,2],[217,3],[216,1],[216,2],[221,1],[221,2],[221,2],[221,3],[221,2],[221,3],[221,2],[221,3],[221,2],[221,2],[221,2],[218,2],[218,2],[218,4],[218,0],[84,0],[84,2],[85,0],[85,4],[233,1],[233,3],[235,5],[235,4],[235,4],[235,1],[234,0],[234,2],[88,0],[88,2],[88,3],[88,2],[88,2],[88,3],[88,4],[88,3],[88,3],[86,0],[86,3],[120,1],[120,3],[242,2],[242,2],[241,1],[241,2],[241,3],[241,3],[241,4],[87,0],[87,3],[87,8],[250,0],[250,2],[174,3],[174,1],[257,3],[257,2],[257,3],[257,2],[257,3],[257,2],[257,1],[258,5],[258,3],[258,1],[111,5],[111,3],[111,3],[111,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,3],[94,3],[94,3],[94,1],[94,1],[94,1],[56,1],[70,5],[71,5],[267,2],[267,2],[265,6],[265,8],[265,6],[265,8],[279,1],[279,1],[279,1],[279,1],[279,1],[279,1],[279,1],[279,1],[259,5],[259,6],[259,6],[280,0],[280,4],[280,4],[280,5],[282,3],[283,3],[158,1],[158,1],[158,1],[158,1],[158,1],[158,1],[158,1],[158,1],[158,1],[158,1],[200,5],[200,3],[200,4],[200,4],[200,3],[200,8],[200,8],[200,8],[200,8],[200,8],[200,3],[151,1],[151,3],[196,1],[261,1],[261,1],[113,1],[113,1],[262,1],[202,2],[263,4],[266,3],[201,2],[201,2],[201,1],[201,1],[264,5],[264,4],[309,2],[309,1],[312,4],[310,2],[310,0],[260,3],[260,3],[260,3],[260,3],[260,5],[260,3],[260,5],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,5],[260,3],[260,3],[260,3],[260,5],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,3],[260,6],[260,6],[260,3],[260,3],[260,2],[260,2],[260,2],[260,2],[260,2],[260,3],[260,5],[260,6],[260,5],[260,6],[260,4],[260,5],[260,3],[260,4],[260,3],[260,4],[260,3],[260,3],[260,3],[260,3],[260,3],[334,1],[334,1],[334,4],[332,1],[332,1],[332,1],[332,1],[332,1],[332,1],[333,1],[333,1],[333,1],[55,6],[55,4],[147,1],[147,3],[341,3],[341,4],[29,5],[29,3],[36,5],[36,4],[36,7],[36,6],[36,5],[36,4],[36,5],[36,8],[36,7],[36,4],[36,6],[36,7],[346,1],[346,1],[345,0],[345,1],[347,3],[347,1],[347,1],[347,5],[347,3],[347,3],[350,1],[350,3],[351,1],[351,1],[351,1],[351,1],[351,1],[351,1],[100,1],[100,3],[24,9],[24,5],[354,1],[354,1],[357,0],[357,1],[359,2],[359,1],[360,1],[360,3],[360,3],[360,3],[353,0],[353,1],[355,0],[355,3],[356,3],[356,1],[356,2],[364,1],[364,3],[365,2],[365,2],[365,2],[365,2],[365,2],[366,0],[366,2],[371,4],[367,6],[368,9],[382,3],[381,0],[381,2],[383,4],[384,4],[369,6],[370,5],[370,5],[377,1],[377,1],[377,3],[377,3],[363,1],[363,3],[389,3],[389,2],[389,1],[392,6],[392,4],[392,1],[392,4],[277,2],[277,1],[393,1],[393,1],[390,0],[390,1],[396,2],[396,1],[398,3],[397,2],[397,5],[397,3],[397,6],[397,1],[397,2],[397,4],[397,2],[397,1],[397,2],[397,1],[397,1],[397,3],[397,5],[33,4],[404,3],[404,1],[403,0],[403,2],[18,6],[18,6],[18,6],[18,8],[18,6],[39,5],[19,4],[19,7],[19,6],[19,9],[30,3],[21,4],[21,6],[21,9],[21,6],[412,0],[412,2],[54,3],[54,2],[31,4],[31,5],[31,5],[22,8],[22,9],[32,3],[43,2],[43,4],[43,3],[43,5],[45,2],[45,4],[45,4],[45,6],[42,4],[42,6],[44,4],[44,6],[41,4],[41,6],[25,11],[25,8],[418,3],[418,3],[418,5],[34,4],[66,2],[57,2],[58,2],[58,2],[58,4],[144,4],[144,2],[144,2],[144,2],[144,2],[144,1],[144,2],[144,2],[427,1],[427,1],[428,1],[428,1],[428,1],[428,1],[428,1],[428,1],[428,1],[428,3],[424,3],[424,4],[424,2],[426,2],[426,3],[426,1],[430,3],[430,1],[433,3],[433,3],[433,3],[432,3],[432,1],[65,4],[65,3],[65,4],[65,5],[65,5],[65,6],[436,1],[436,1],[435,3],[435,2],[437,1],[437,1],[437,3],[434,1],[434,1],[51,2],[52,2],[50,2],[35,4],[35,3],[443,2],[59,3],[60,1],[61,1],[62,3],[63,2],[63,2],[64,2],[64,2],[451,1],[451,1],[69,2],[449,3],[449,1],[450,3],[450,1],[28,2],[454,1],[454,3],[455,3],[455,4],[455,5],[455,6],[46,3],[37,6],[458,1],[458,2],[459,2],[459,4],[460,2],[461,2],[461,2],[461,1],[461,1],[463,4],[463,6],[466,1],[466,3],[464,5],[464,7],[464,7],[464,9],[464,7],[464,9],[467,3],[467,6],[467,3],[467,6],[462,0],[462,2],[462,5],[462,4],[462,7],[27,6],[474,2],[473,0],[473,2],[473,2],[473,1],[26,8],[23,3],[23,4],[478,3],[478,1],[479,3],[479,7],[479,6],[479,3],[479,4],[483,1],[483,1],[487,2],[488,3],[489,2],[490,4],[480,4],[480,3],[480,2],[480,1],[502,2],[498,2],[498,2],[503,4],[505,6],[67,3],[67,2],[511,3],[511,1],[509,1],[509,4],[68,2],[20,2],[48,9],[48,8],[48,9],[515,0],[515,1],[515,1],[515,1],[515,2],[516,1],[516,1],[516,1],[49,3],[38,2],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[11,1],[11,1],[80,0],[80,1],[83,0],[83,1],[90,0],[90,2],[91,0],[91,1],[96,0],[96,1],[97,0],[97,1],[101,0],[101,1],[108,0],[108,1],[121,0],[121,1],[125,1],[125,2],[126,1],[126,2],[127,0],[127,1],[155,0],[155,2],[157,0],[157,2],[159,0],[159,2],[160,1],[160,1],[161,0],[161,2],[165,0],[165,2],[167,0],[167,2],[176,0],[176,2],[177,0],[177,2],[178,0],[178,2],[188,0],[188,1],[197,0],[197,1],[210,0],[210,1],[211,0],[211,1],[219,0],[219,1],[220,0],[220,1],[252,0],[252,1],[254,0],[254,1],[255,0],[255,1],[256,0],[256,1],[268,1],[268,1],[771,1],[771,1],[293,0],[293,1],[306,1],[306,1],[342,1],[342,1],[376,0],[376,1],[380,0],[380,1],[387,0],[387,1],[388,0],[388,1],[399,0],[399,1],[400,0],[400,1],[402,1],[402,1],[416,0],[416,1],[417,0],[417,1],[470,0],[470,1],[471,0],[471,1],[472,0],[472,1],[476,0],[476,1],[481,0],[481,1],[482,0],[482,1],[484,0],[484,1],[485,0],[485,1],[486,0],[486,1],[491,0],[491,1],[492,0],[492,1],[493,0],[493,1],[494,0],[494,1],[495,0],[495,1],[496,0],[496,1],[497,0],[497,1],[499,0],[499,1],[500,0],[500,1],[501,0],[501,1],[504,0],[504,2],[506,0],[506,2],[507,0],[507,2],[508,0],[508,2],[517,0],[517,1],[518,0],[518,1]],
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
/* this == yyval */

var $0 = $$.length - 1;
switch (yystate) {
case 1:

			if (alasql.options.casesensitive) this.$ = $$[$0];
			else this.$ = $$[$0].toLowerCase();

break;
case 2:
 this.$ = doubleq($$[$0].substr(1,$$[$0].length-2)); 
break;
case 3:
 this.$ = $$[$0].toLowerCase() 
break;
case 4:
 this.$ = $$[$0] 
break;
case 5:
 this.$ = $$[$0] ? $$[$0-1] + ' ' + $$[$0] : $$[$0-1] 
break;
case 6:
 return new yy.Statements({statements:$$[$0-1]}); 
break;
case 7:
 this.$ = $$[$0-2]; if($$[$0]) $$[$0-2].push($$[$0]); 
break;
case 8: case 9: case 70: case 80: case 85: case 143: case 177: case 205: case 206: case 243: case 262: case 277: case 363: case 381: case 460: case 483: case 484: case 488: case 496: case 537: case 538: case 575: case 658: case 668: case 692: case 694: case 696: case 711: case 712: case 742: case 766:
 this.$ = [$$[$0]]; 
break;
case 10:
 this.$ = $$[$0]; $$[$0].explain = true; 
break;
case 11:
 this.$ = $$[$0];  $$[$0].explain = true;
break;
case 12:

			this.$ = $$[$0];

			// TODO combine exists and queries
		    if(yy.exists) this.$.exists = yy.exists;
		    delete yy.exists;
		    if(yy.queries) this.$.queries = yy.queries;
			delete yy.queries;

break;
case 13: case 162: case 172: case 238: case 239: case 241: case 249: case 251: case 260: case 271: case 274: case 384: case 500: case 510: case 512: case 524: case 530: case 531: case 576:
 this.$ = undefined; 
break;
case 68:
 this.$ = new yy.WithSelect({withs: $$[$0-1], select:$$[$0]}); 
break;
case 69: case 574:
 $$[$0-2].push($$[$0]); this.$=$$[$0-2]; 
break;
case 71:
 this.$ = {name:$$[$0-4], select:$$[$0-1]}; 
break;
case 72:

			yy.extend(this.$,$$[$0-9]); yy.extend(this.$,$$[$0-8]); yy.extend(this.$,$$[$0-7]); yy.extend(this.$,$$[$0-6]);
		    yy.extend(this.$,$$[$0-5]); yy.extend(this.$,$$[$0-4]);yy.extend(this.$,$$[$0-3]);
		    yy.extend(this.$,$$[$0-2]); yy.extend(this.$,$$[$0-1]); yy.extend(this.$,$$[$0]);
		    this.$ = $$[$0-9];
		    if(yy.exists) this.$.exists = yy.exists.slice();
/*		    if(yy.queries) this.$.queries = yy.queries;
			delete yy.queries;
*/		
break;
case 73:

			this.$ = new yy.Search({selectors:$$[$0-2], from:$$[$0]});
			yy.extend(this.$,$$[$0-1]);

break;
case 74:
 this.$ = {pivot:{expr:$$[$0-5], columnid:$$[$0-3], inlist:$$[$0-2], as:$$[$0]}}; 
break;
case 75:
 this.$ = {unpivot:{tocolumnid:$$[$0-8], forcolumnid:$$[$0-6], inlist:$$[$0-3], as:$$[$0]}}; 
break;
case 76: case 529: case 558: case 594: case 628: case 645: case 646: case 649: case 671:
 this.$ = $$[$0-1]; 
break;
case 77: case 78: case 86: case 147: case 185: case 248: case 284: case 292: case 293: case 294: case 295: case 296: case 297: case 298: case 299: case 300: case 301: case 302: case 303: case 304: case 305: case 308: case 309: case 325: case 326: case 327: case 328: case 329: case 330: case 383: case 449: case 450: case 451: case 452: case 453: case 454: case 525: case 551: case 555: case 557: case 632: case 633: case 634: case 635: case 636: case 637: case 641: case 643: case 644: case 653: case 669: case 670: case 733: case 748: case 749: case 751: case 752: case 758: case 759:
 this.$ = $$[$0]; 
break;
case 79: case 84: case 741: case 765:
 this.$ = $$[$0-2]; this.$.push($$[$0]); 
break;
case 81:
 this.$ = {expr:$$[$0]}; 
break;
case 82:
 this.$ = {expr:$$[$0-2],as:$$[$0]}; 
break;
case 83:
 this.$ = {removecolumns:$$[$0]}; 
break;
case 87:
 this.$ = {like:$$[$0]}; 
break;
case 90: case 104:
 this.$ = {srchid:"PROP", args: [$$[$0]]}; 
break;
case 91:
 this.$ = {srchid:"ORDERBY", args: $$[$0-1]}; 
break;
case 92:

			var dir = $$[$0-1];
			if(!dir) dir = 'ASC';
			this.$ = {srchid:"ORDERBY", args: [{expression: new yy.Column({columnid:'_'}), direction:dir}]};

break;
case 93:
 this.$ = {srchid:"PARENT"}; 
break;
case 94:
 this.$ = {srchid:"APROP", args: [$$[$0]]}; 
break;
case 95:
 this.$ = {selid:"ROOT"};
break;
case 96:
 this.$ = {srchid:"EQ", args: [$$[$0]]}; 
break;
case 97:
 this.$ = {srchid:"LIKE", args: [$$[$0]]}; 
break;
case 98: case 99:
 this.$ = {selid:"WITH", args: $$[$0-1]}; 
break;
case 100:
 this.$ = {srchid:$$[$0-3].toUpperCase(), args:$$[$0-1]}; 
break;
case 101:
 this.$ = {srchid:"WHERE", args:[$$[$0-1]]}; 
break;
case 102:
 this.$ = {selid:"OF", args:[$$[$0-1]]}; 
break;
case 103:
 this.$ = {srchid:"CLASS", args:[$$[$0-1]]}; 
break;
case 105:
 this.$ = {srchid:"NAME", args: [$$[$0].substr(1,$$[$0].length-2)]}; 
break;
case 106:
 this.$ = {srchid:"CHILD"}; 
break;
case 107:
 this.$ = {srchid:"VERTEX"}; 
break;
case 108:
 this.$ = {srchid:"EDGE"}; 
break;
case 109:
 this.$ = {srchid:"REF"}; 
break;
case 110:
 this.$ = {srchid:"SHARP", args:[$$[$0]]}; 
break;
case 111:
 this.$ = {srchid:"ATTR", args:((typeof $$[$0] == 'undefined')?undefined:[$$[$0]])}; 
break;
case 112:
 this.$ = {srchid:"ATTR"}; 
break;
case 113:
 this.$ = {srchid:"OUT"}; 
break;
case 114:
 this.$ = {srchid:"IN"}; 
break;
case 115:
 this.$ = {srchid:"OUTOUT"}; 
break;
case 116:
 this.$ = {srchid:"ININ"}; 
break;
case 117:
 this.$ = {srchid:"CONTENT"}; 
break;
case 118:
 this.$ = {srchid:"EX",args:[new yy.Json({value:$$[$0]})]}; 
break;
case 119:
 this.$ = {srchid:"AT", args:[$$[$0]]}; 
break;
case 120:
 this.$ = {srchid:"AS", args:[$$[$0]]}; 
break;
case 121:
 this.$ = {srchid:"SET", args:$$[$0-1]}; 
break;
case 122:
 this.$ = {selid:"TO", args:[$$[$0]]}; 
break;
case 123:
 this.$ = {srchid:"VALUE"}; 
break;
case 124:
 this.$ = {srchid:"ROW", args:$$[$0-1]}; 
break;
case 125:
 this.$ = {srchid:"CLASS", args:[$$[$0]]}; 
break;
case 126:
 this.$ = {selid:$$[$0],args:[$$[$0-1]] }; 
break;
case 127:
 this.$ = {selid:"NOT",args:$$[$0-1] }; 
break;
case 128:
 this.$ = {selid:"IF",args:$$[$0-1] }; 
break;
case 129:
 this.$ = {selid:$$[$0-3],args:$$[$0-1] }; 
break;
case 130:
 this.$ = {selid:'DISTINCT',args:$$[$0-1] }; 
break;
case 131:
 this.$ = {selid:'UNION',args:$$[$0-1] }; 
break;
case 132:
 this.$ = {selid:'UNIONALL',args:$$[$0-1] }; 
break;
case 133:
 this.$ = {selid:'ALL',args:[$$[$0-1]] }; 
break;
case 134:
 this.$ = {selid:'ANY',args:[$$[$0-1]] }; 
break;
case 135:
 this.$ = {selid:'INTERSECT',args:$$[$0-1] }; 
break;
case 136:
 this.$ = {selid:'EXCEPT',args:$$[$0-1] }; 
break;
case 137:
 this.$ = {selid:'AND',args:$$[$0-1] }; 
break;
case 138:
 this.$ = {selid:'OR',args:$$[$0-1] }; 
break;
case 139:
 this.$ = {selid:'PATH',args:[$$[$0-1]] }; 
break;
case 140:
 this.$ = {srchid:'RETURN',args:$$[$0-1] }; 
break;
case 141:
 this.$ = {selid:'REPEAT',sels:$$[$0-3], args:$$[$0-1] }; 
break;
case 142:
 this.$ = $$[$0-2]; this.$.push($$[$0]);
break;
case 144:
 this.$ = "PLUS"; 
break;
case 145:
 this.$ = "STAR"; 
break;
case 146:
 this.$ = "QUESTION"; 
break;
case 148:
 this.$ = new yy.Select({ columns:$$[$0], distinct: true }); yy.extend(this.$, $$[$0-3]); yy.extend(this.$, $$[$0-1]); 
break;
case 149:
 this.$ = new yy.Select({ columns:$$[$0], distinct: true }); yy.extend(this.$, $$[$0-3]);yy.extend(this.$, $$[$0-1]); 
break;
case 150:
 this.$ = new yy.Select({ columns:$$[$0], all:true }); yy.extend(this.$, $$[$0-3]);yy.extend(this.$, $$[$0-1]); 
break;
case 151:

			if(!$$[$0]) {
				this.$ = new yy.Select({columns:[new yy.Column({columnid:'_',})], modifier:'COLUMN'});
			} else {
				this.$ = new yy.Select({ columns:$$[$0] }); yy.extend(this.$, $$[$0-2]);yy.extend(this.$, $$[$0-1]);
			}

break;
case 152:
 if($$[$0]=='SELECT') this.$ = undefined; else this.$ = {modifier: $$[$0]};  
break;
case 153:
 this.$ = {modifier:'VALUE'}
break;
case 154:
 this.$ = {modifier:'ROW'}
break;
case 155:
 this.$ = {modifier:'COLUMN'}
break;
case 156:
 this.$ = {modifier:'MATRIX'}
break;
case 157:
 this.$ = {modifier:'TEXTSTRING'}
break;
case 158:
 this.$ = {modifier:'INDEX'}
break;
case 159:
 this.$ = {modifier:'RECORDSET'}
break;
case 160:
 this.$ = {top: $$[$0-1], percent:(typeof $$[$0] != 'undefined'?true:undefined)}; 
break;
case 161:
 this.$ = {top: $$[$0-1]}; 
break;
case 163: case 336: case 532: case 533: case 734:
this.$ = undefined; 
break;
case 164: case 165: case 166: case 167:
this.$ = {into: $$[$0]} 
break;
case 168:

			var s = $$[$0];
			s = s.substr(1,s.length-2);
			var x3 = s.substr(-3).toUpperCase();
			var x4 = s.substr(-4).toUpperCase();
			if(s[0] == '#') {
				this.$ = {into: new yy.FuncValue({funcid: 'HTML', args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
			} else if(x3=='XLS' || x3 == 'CSV' || x3=='TAB') {
				this.$ = {into: new yy.FuncValue({funcid: x3, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
			} else if(x4=='XLSX' || x4 == 'JSON') {
				this.$ = {into: new yy.FuncValue({funcid: x4, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
			}

break;
case 169:
 this.$ = { from: $$[$0] }; 
break;
case 170:
 this.$ = { from: $$[$0-1], joins: $$[$0] }; 
break;
case 171:
 this.$ = { from: $$[$0-2], joins: $$[$0-1] }; 
break;
case 173:
 this.$ = new yy.Apply({select: $$[$0-2], applymode:'CROSS', as:$$[$0]}); 
break;
case 174:
 this.$ = new yy.Apply({select: $$[$0-3], applymode:'CROSS', as:$$[$0]}); 
break;
case 175:
 this.$ = new yy.Apply({select: $$[$0-2], applymode:'OUTER', as:$$[$0]}); 
break;
case 176:
 this.$ = new yy.Apply({select: $$[$0-3], applymode:'OUTER', as:$$[$0]}); 
break;
case 178: case 244: case 461: case 539: case 540:
 this.$ = $$[$0-2]; $$[$0-2].push($$[$0]); 
break;
case 179:
 this.$ = $$[$0-2]; this.$.as = $$[$0] 
break;
case 180:
 this.$ = $$[$0-3]; this.$.as = $$[$0] 
break;
case 181:
 this.$ = $$[$0-1]; this.$.as = 'default' 
break;
case 182:
 this.$ = new yy.Json({value:$$[$0-2]}); $$[$0-2].as = $$[$0] 
break;
case 183:
 this.$ = $$[$0-1]; $$[$0-1].as = $$[$0] 
break;
case 184:
 this.$ = $$[$0-2]; $$[$0-2].as = $$[$0] 
break;
case 186: case 647: case 650:
 this.$ = $$[$0-2]; 
break;
case 187: case 191: case 195: case 198:
 this.$ = $$[$0-1]; $$[$0-1].as = $$[$0]; 
break;
case 188: case 192: case 196: case 199:
 this.$ = $$[$0-2]; $$[$0-2].as = $$[$0]; 
break;
case 189: case 190: case 194: case 197:
 this.$ = $$[$0]; $$[$0].as = 'default'; 
break;
case 193:
 this.$ = {inserted:true}; 
break;
case 200:

			var s = $$[$0];
			s = s.substr(1,s.length-2);
			var x3 = s.substr(-3).toUpperCase();
			var x4 = s.substr(-4).toUpperCase();
			var r;
			if(s[0] == '#') {
				r = new yy.FuncValue({funcid: 'HTML', args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
			} else if(x3=='XLS' || x3 == 'CSV' || x3=='TAB') {
				r = new yy.FuncValue({funcid: x3, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
			} else if(x4=='XLSX' || x4 == 'JSON') {
				r = new yy.FuncValue({funcid: x4, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
			} else {
				throw new Error('Unknown string in FROM clause');
			};
			this.$ = r;

break;
case 201:

			if($$[$0-2] == 'INFORMATION_SCHEMA') {
				this.$ = new yy.FuncValue({funcid: $$[$0-2], args:[new yy.StringValue({value:$$[$0]})]});
			} else {
				this.$ = new yy.Table({databaseid: $$[$0-2], tableid:$$[$0]});
			}

break;
case 202:
 this.$ = new yy.Table({tableid: $$[$0]});
break;
case 203: case 204:
 this.$ = $$[$0-1]; $$[$0-1].push($$[$0]); 
break;
case 207:
 this.$ = new yy.Join($$[$0-2]); yy.extend(this.$, $$[$0-1]); yy.extend(this.$, $$[$0]); 
break;
case 208:
 this.$ = {table: $$[$0]}; 
break;
case 209:
 this.$ = {table: $$[$0-1], as: $$[$0] } ; 
break;
case 210:
 this.$ = {table: $$[$0-2], as: $$[$0] } ; 
break;
case 211:
 this.$ = {json:new yy.Json({value:$$[$0-2],as:$$[$0]})}; 
break;
case 212:
 this.$ = {param: $$[$0-1], as: $$[$0] } ; 
break;
case 213:
 this.$ = {param: $$[$0-2], as: $$[$0] } ; 
break;
case 214:
 this.$ = {select: $$[$0-2], as: $$[$0]} ; 
break;
case 215:
 this.$ = {select: $$[$0-3], as: $$[$0] } ; 
break;
case 216:
 this.$ = {func:$$[$0], as:'default'}; 
break;
case 217:
 this.$ = {func:$$[$0-1], as: $$[$0]}; 
break;
case 218:
 this.$ = {func:$$[$0-2], as: $$[$0]}; 
break;
case 219:
 this.$ = {variable:$$[$0],as:'default'}; 
break;
case 220:
 this.$ = {variable:$$[$0-1],as:$$[$0]}; 
break;
case 221:
 this.$ = {variable:$$[$0-2],as:$$[$0]} 
break;
case 222:
 this.$ = { joinmode: $$[$0] } ; 
break;
case 223:
 this.$ = {joinmode: $$[$0-1], natural:true} ; 
break;
case 224: case 225:
 this.$ = "INNER"; 
break;
case 226: case 227:
 this.$ = "LEFT"; 
break;
case 228: case 229:
 this.$ = "RIGHT"; 
break;
case 230: case 231:
 this.$ = "OUTER"; 
break;
case 232:
 this.$ = "SEMI"; 
break;
case 233:
 this.$ = "ANTI"; 
break;
case 234:
 this.$ = "CROSS"; 
break;
case 235:
 this.$ = {on: $$[$0]}; 
break;
case 236: case 706:
 this.$ = {using: $$[$0]}; 
break;
case 237: case 707:
 this.$ = {using: $$[$0-1]}; 
break;
case 240:
 this.$ = {where: new yy.Expression({expression:$$[$0]})}; 
break;
case 242:
 this.$ = {group:$$[$0-1]}; yy.extend(this.$,$$[$0]); 
break;
case 245:
 this.$ = new yy.GroupExpression({type:'GROUPING SETS', group: $$[$0-1]}); 
break;
case 246:
 this.$ = new yy.GroupExpression({type:'ROLLUP', group: $$[$0-1]}); 
break;
case 247:
 this.$ = new yy.GroupExpression({type:'CUBE', group: $$[$0-1]}); 
break;
case 250:
 this.$ = {having:$$[$0]}
break;
case 252:
 this.$ = {union: $$[$0]} ; 
break;
case 253:
 this.$ = {unionall: $$[$0]} ; 
break;
case 254:
 this.$ = {except: $$[$0]} ; 
break;
case 255:
 this.$ = {intersect: $$[$0]} ; 
break;
case 256:
 this.$ = {union: $$[$0], corresponding:true} ; 
break;
case 257:
 this.$ = {unionall: $$[$0], corresponding:true} ; 
break;
case 258:
 this.$ = {except: $$[$0], corresponding:true} ; 
break;
case 259:
 this.$ = {intersect: $$[$0], corresponding:true} ; 
break;
case 261:
 this.$ = {order:$$[$0]}
break;
case 263:
 this.$ = $$[$0-2]; $$[$0-2].push($$[$0])
break;
case 264:
 this.$ = {nullsOrder: 'FIRST'}; 
break;
case 265:
 this.$ = {nullsOrder: 'LAST'}; 
break;
case 266:
 this.$ = new yy.Expression({expression: $$[$0], direction:'ASC'}) 
break;
case 267:
 this.$ = new yy.Expression({expression: $$[$0-1], direction:$$[$0].toUpperCase()}) 
break;
case 268:
 this.$ = new yy.Expression({expression: $$[$0-2], direction:$$[$0-1].toUpperCase()}); yy.extend(this.$, $$[$0]) 
break;
case 269:
 this.$ = new yy.Expression({expression: $$[$0-2], direction:'ASC', nocase:true}) 
break;
case 270:
 this.$ = new yy.Expression({expression: $$[$0-3], direction:$$[$0].toUpperCase(), nocase:true}) 
break;
case 272:
 this.$ = {limit:$$[$0-1]}; yy.extend(this.$, $$[$0]); 
break;
case 273:
 this.$ = {limit:$$[$0-2],offset:$$[$0-6]}; 
break;
case 275:
 this.$ = {offset:$$[$0]}; 
break;
case 276: case 518: case 542: case 657: case 667: case 691: case 693: case 697:
 $$[$0-2].push($$[$0]); this.$ = $$[$0-2]; 
break;
case 278: case 280: case 282:
 $$[$0-2].as = $$[$0]; this.$ = $$[$0-2];
break;
case 279: case 281: case 283:
 $$[$0-1].as = $$[$0]; this.$ = $$[$0-1];
break;
case 285:
 this.$ = new yy.Column({columid: $$[$0], tableid: $$[$0-2], databaseid:$$[$0-4]}); 
break;
case 286:
 this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2]}); 
break;
case 287:
 this.$ = new yy.Column({columnid:$$[$0]}); 
break;
case 288:
 this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2], databaseid:$$[$0-4]});
break;
case 289: case 290:
 this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2]});
break;
case 291:
 this.$ = new yy.Column({columnid: $$[$0]});
break;
case 306:
 this.$ = new yy.DomainValueValue(); 
break;
case 307:
 this.$ = new yy.Json({value:$$[$0]}); 
break;
case 310: case 311: case 312:

			if(!yy.queries) yy.queries = [];
			yy.queries.push($$[$0-1]);
			$$[$0-1].queriesidx = yy.queries.length;
			this.$ = $$[$0-1];

break;
case 313:
this.$ = $$[$0]
break;
case 314:
 this.$ = new yy.FuncValue({funcid:'CURRENT_TIMESTAMP'});
break;
case 315:
 this.$ = new yy.FuncValue({funcid:'CURRENT_DATE'});
break;
case 316:
 this.$ = new yy.JavaScript({value:$$[$0].substr(2,$$[$0].length-4)}); 
break;
case 317:
 this.$ = new yy.JavaScript({value:'alasql.fn["'+$$[$0-2]+'"] = '+$$[$0].substr(2,$$[$0].length-4)}); 
break;
case 318:
 this.$ = new yy.JavaScript({value:'alasql.aggr["'+$$[$0-2]+'"] = '+$$[$0].substr(2,$$[$0].length-4)}); 
break;
case 319:
 this.$ = new yy.FuncValue({funcid:$$[$0], newid:true}); 
break;
case 320:
 this.$ = $$[$0]; yy.extend(this.$,{newid:true}); 
break;
case 321:
 this.$ = new yy.Convert({expression:$$[$0-3]}) ; yy.extend(this.$,$$[$0-1]) ; 
break;
case 322:
 this.$ = new yy.Convert({expression:$$[$0-5], style:$$[$0-1]}) ; yy.extend(this.$,$$[$0-3]) ; 
break;
case 323:
 this.$ = new yy.Convert({expression:$$[$0-1]}) ; yy.extend(this.$,$$[$0-3]) ; 
break;
case 324:
 this.$ = new yy.Convert({expression:$$[$0-3], style:$$[$0-1]}) ; yy.extend(this.$,$$[$0-5]) ; 
break;
case 331:
 this.$ = new yy.FuncValue({funcid:'CURRENT_TIMESTAMP'}); 
break;
case 332:
 this.$ = new yy.FuncValue({funcid:'CURRENT_DATE'}); 
break;
case 333:

		  if($$[$0-2].length > 1 && ($$[$0-4].toUpperCase() == 'MAX' || $$[$0-4].toUpperCase() == 'MIN')) {
		  	this.$ = new yy.FuncValue({funcid:$$[$0-4],args:$$[$0-2]});
		  } else {
			this.$ = new yy.AggrValue({aggregatorid: $$[$0-4].toUpperCase(), expression: $$[$0-2].pop(), over:$$[$0]});
		  }

break;
case 334:
 this.$ = new yy.AggrValue({aggregatorid: $$[$0-5].toUpperCase(), expression: $$[$0-2], distinct:true, over:$$[$0]}); 
break;
case 335:
 this.$ = new yy.AggrValue({aggregatorid: $$[$0-5].toUpperCase(), expression: $$[$0-2],
		 over:$$[$0]}); 
break;
case 337: case 338:
 this.$ = new yy.Over(); yy.extend(this.$,$$[$0-1]); 
break;
case 339:
 this.$ = new yy.Over(); yy.extend(this.$,$$[$0-2]); yy.extend(this.$,$$[$0-1]);
break;
case 340:
 this.$ = {partition:$$[$0]}; 
break;
case 341:
 this.$ = {order:$$[$0]}; 
break;
case 342:
 this.$ = "SUM"; 
break;
case 343:
 this.$ = "TOTAL"; 
break;
case 344:
 this.$ = "COUNT"; 
break;
case 345:
 this.$ = "MIN"; 
break;
case 346: case 553:
 this.$ = "MAX"; 
break;
case 347:
 this.$ = "AVG"; 
break;
case 348:
 this.$ = "FIRST"; 
break;
case 349:
 this.$ = "LAST"; 
break;
case 350:
 this.$ = "AGGR"; 
break;
case 351:
 this.$ = "ARRAY"; 
break;
case 352:

			var funcid = $$[$0-4];
			var exprlist = $$[$0-1];
			if(exprlist.length > 1 && (funcid.toUpperCase() == 'MIN' || funcid.toUpperCase() == 'MAX')) {
					this.$ = new yy.FuncValue({funcid: funcid, args: exprlist});
			} else if(alasql.aggr[$$[$0-4]]) {
		    	this.$ = new yy.AggrValue({aggregatorid: 'REDUCE',
                      funcid: funcid, expression: exprlist.pop(),distinct:($$[$0-2]=='DISTINCT') });
		    } else {
			    this.$ = new yy.FuncValue({funcid: funcid, args: exprlist});
			};

break;
case 353: case 356:
 this.$ = new yy.FuncValue({ funcid: $$[$0-2] }) 
break;
case 354:
 this.$ = new yy.FuncValue({ funcid: 'IIF', args:$$[$0-1] }) 
break;
case 355:
 this.$ = new yy.FuncValue({ funcid: 'REPLACE', args:$$[$0-1] }) 
break;
case 357:
 this.$ = new yy.FuncValue({ funcid: 'DATEADD', args:[new yy.StringValue({value:$$[$0-5]}),$$[$0-3],$$[$0-1]]}) 
break;
case 358:
 this.$ = new yy.FuncValue({ funcid: 'DATEADD', args:[$$[$0-5],$$[$0-3],$$[$0-1]]}) 
break;
case 359:
 this.$ = new yy.FuncValue({ funcid: 'DATEDIFF', args:[new yy.StringValue({value:$$[$0-5]}),$$[$0-3],$$[$0-1]]}) 
break;
case 360:
 this.$ = new yy.FuncValue({ funcid: 'DATEDIFF', args:[$$[$0-5],$$[$0-3],$$[$0-1]]}) 
break;
case 361:
 this.$ = new yy.FuncValue({ funcid: 'TIMESTAMPDIFF', args:[new yy.StringValue({value:$$[$0-5]}),$$[$0-3],$$[$0-1]]}) 
break;
case 362:
 this.$ = new yy.FuncValue({ funcid: 'INTERVAL', args:[$$[$0-1],new yy.StringValue({value:($$[$0]).toLowerCase()})]}); 
break;
case 364:
 $$[$0-2].push($$[$0]); this.$ = $$[$0-2] 
break;
case 365:
 this.$ = new yy.NumValue({value:+$$[$0]}); 
break;
case 366:
 this.$ = new yy.LogicValue({value:true}); 
break;
case 367:
 this.$ = new yy.LogicValue({value:false}); 
break;
case 368:
 this.$ = new yy.StringValue({value: $$[$0].substr(1,$$[$0].length-2).replace(/(\\\')/g,"'").replace(/(\'\')/g,"'")}); 
break;
case 369:
 this.$ = new yy.StringValue({value: $$[$0].substr(2,$$[$0].length-3).replace(/(\\\')/g,"'").replace(/(\'\')/g,"'")}); 
break;
case 370:
 this.$ = new yy.NullValue({value:undefined}); 
break;
case 371:
 this.$ = new yy.VarValue({variable:$$[$0]}); 
break;
case 372:

			if(!yy.exists) yy.exists = [];
			this.$ = new yy.ExistsValue({value:$$[$0-1], existsidx:yy.exists.length});
			yy.exists.push($$[$0-1]);

break;
case 373:
 this.$ = new yy.ArrayValue({value:$$[$0-1]}); 
break;
case 374: case 375:
 this.$ = new yy.ParamValue({param: $$[$0]}); 
break;
case 376:

			if(typeof yy.question == 'undefined') yy.question = 0;
			this.$ = new yy.ParamValue({param: yy.question++});

break;
case 377:

			if(typeof yy.question == 'undefined') yy.question = 0;
			this.$ = new yy.ParamValue({param: yy.question++, array:true});

break;
case 378:
 this.$ = new yy.CaseValue({expression:$$[$0-3], whens: $$[$0-2], elses: $$[$0-1]}); 
break;
case 379:
 this.$ = new yy.CaseValue({whens: $$[$0-2], elses: $$[$0-1]}); 
break;
case 380: case 709: case 710:
 this.$ = $$[$0-1]; this.$.push($$[$0]); 
break;
case 382:
 this.$ = {when: $$[$0-2], then: $$[$0] }; 
break;
case 385: case 386:
 this.$ = new yy.Op({left:$$[$0-2], op:'REGEXP', right:$$[$0]}); 
break;
case 387:
 this.$ = new yy.Op({left:$$[$0-2], op:'GLOB', right:$$[$0]}); 
break;
case 388:
 this.$ = new yy.Op({left:$$[$0-2], op:'LIKE', right:$$[$0]}); 
break;
case 389:
 this.$ = new yy.Op({left:$$[$0-4], op:'LIKE', right:$$[$0-2], escape:$$[$0]}); 
break;
case 390:
 this.$ = new yy.Op({left:$$[$0-2], op:'NOT LIKE', right:$$[$0] }); 
break;
case 391:
 this.$ = new yy.Op({left:$$[$0-4], op:'NOT LIKE', right:$$[$0-2], escape:$$[$0] }); 
break;
case 392:
 this.$ = new yy.Op({left:$$[$0-2], op:'||', right:$$[$0]}); 
break;
case 393:
 this.$ = new yy.Op({left:$$[$0-2], op:'+', right:$$[$0]}); 
break;
case 394:
 this.$ = new yy.Op({left:$$[$0-2], op:'-', right:$$[$0]}); 
break;
case 395:
 this.$ = new yy.Op({left:$$[$0-2], op:'*', right:$$[$0]}); 
break;
case 396:
 this.$ = new yy.Op({left:$$[$0-2], op:'/', right:$$[$0]}); 
break;
case 397:
 this.$ = new yy.Op({left:$$[$0-2], op:'%', right:$$[$0]}); 
break;
case 398:
 this.$ = new yy.Op({left:$$[$0-2], op:'^', right:$$[$0]}); 
break;
case 399:
 this.$ = new yy.Op({left:$$[$0-2], op:'>>', right:$$[$0]}); 
break;
case 400:
 this.$ = new yy.Op({left:$$[$0-2], op:'<<', right:$$[$0]}); 
break;
case 401:
 this.$ = new yy.Op({left:$$[$0-2], op:'&', right:$$[$0]}); 
break;
case 402:
 this.$ = new yy.Op({left:$$[$0-2], op:'|', right:$$[$0]}); 
break;
case 403: case 404: case 406:
 this.$ = new yy.Op({left:$$[$0-2], op:'->' , right:$$[$0]}); 
break;
case 405:
 this.$ = new yy.Op({left:$$[$0-4], op:'->' , right:$$[$0-1]}); 
break;
case 407: case 408: case 410:
 this.$ = new yy.Op({left:$$[$0-2], op:'!' , right:$$[$0]}); 
break;
case 409:
 this.$ = new yy.Op({left:$$[$0-4], op:'!' , right:$$[$0-1]}); 
break;
case 411:
 this.$ = new yy.Op({left:$$[$0-2], op:'>' , right:$$[$0]}); 
break;
case 412:
 this.$ = new yy.Op({left:$$[$0-2], op:'>=' , right:$$[$0]}); 
break;
case 413:
 this.$ = new yy.Op({left:$$[$0-2], op:'<' , right:$$[$0]}); 
break;
case 414:
 this.$ = new yy.Op({left:$$[$0-2], op:'<=' , right:$$[$0]}); 
break;
case 415:
 this.$ = new yy.Op({left:$$[$0-2], op:'=' , right:$$[$0]}); 
break;
case 416:
 this.$ = new yy.Op({left:$$[$0-2], op:'==' , right:$$[$0]}); 
break;
case 417:
 this.$ = new yy.Op({left:$$[$0-2], op:'===' , right:$$[$0]}); 
break;
case 418:
 this.$ = new yy.Op({left:$$[$0-2], op:'!=' , right:$$[$0]}); 
break;
case 419:
 this.$ = new yy.Op({left:$$[$0-2], op:'!==' , right:$$[$0]}); 
break;
case 420:
 this.$ = new yy.Op({left:$$[$0-2], op:'!===' , right:$$[$0]}); 
break;
case 421:

			if(!yy.queries) yy.queries = [];
			this.$ = new yy.Op({left:$$[$0-5], op:$$[$0-4] , allsome:$$[$0-3], right:$$[$0-1], queriesidx: yy.queries.length});
			yy.queries.push($$[$0-1]);

break;
case 422:

			this.$ = new yy.Op({left:$$[$0-5], op:$$[$0-4] , allsome:$$[$0-3], right:$$[$0-1]});

break;
case 423:

			if($$[$0-2].op == 'BETWEEN1') {

				if($$[$0-2].left.op == 'AND') {
					this.$ = new yy.Op({left:$$[$0-2].left.left,op:'AND',right:
						new yy.Op({left:$$[$0-2].left.right, op:'BETWEEN',
							right1:$$[$0-2].right, right2:$$[$0]})
					});
				} else {
					this.$ = new yy.Op({left:$$[$0-2].left, op:'BETWEEN',
						right1:$$[$0-2].right, right2:$$[$0]});
				}

			} else if($$[$0-2].op == 'NOT BETWEEN1') {
				if($$[$0-2].left.op == 'AND') {
					this.$ = new yy.Op({left:$$[$0-2].left.left,op:'AND',right:
						new yy.Op({left:$$[$0-2].left.right, op:'NOT BETWEEN',
							right1:$$[$0-2].right, right2:$$[$0]})
					});
				} else {
					this.$ = new yy.Op({left:$$[$0-2].left, op:'NOT BETWEEN',
						right1:$$[$0-2].right, right2:$$[$0]});
				}
			} else {
				this.$ = new yy.Op({left:$$[$0-2], op:'AND', right:$$[$0]});
			}

break;
case 424:
 this.$ = new yy.Op({left:$$[$0-2], op:'OR' , right:$$[$0]}); 
break;
case 425:
 this.$ = new yy.UniOp({op:'NOT' , right:$$[$0]}); 
break;
case 426:
 this.$ = new yy.UniOp({op:'-' , right:$$[$0]}); 
break;
case 427:
 this.$ = new yy.UniOp({op:'+' , right:$$[$0]}); 
break;
case 428:
 this.$ = new yy.UniOp({op:'~' , right:$$[$0]}); 
break;
case 429:
 this.$ = new yy.UniOp({op:'#' , right:$$[$0]}); 
break;
case 430:
 this.$ = new yy.UniOp({right: $$[$0-1]}); 
break;
case 431:

			if(!yy.queries) yy.queries = [];
			this.$ = new yy.Op({left: $$[$0-4], op:'IN', right:$$[$0-1], queriesidx: yy.queries.length});
			yy.queries.push($$[$0-1]);

break;
case 432:

			if(!yy.queries) yy.queries = [];
			this.$ = new yy.Op({left: $$[$0-5], op:'NOT IN', right:$$[$0-1], queriesidx: yy.queries.length});
			yy.queries.push($$[$0-1]);

break;
case 433:
 this.$ = new yy.Op({left: $$[$0-4], op:'IN', right:$$[$0-1]}); 
break;
case 434:
 this.$ = new yy.Op({left: $$[$0-5], op:'NOT IN', right:$$[$0-1]}); 
break;
case 435:
 this.$ = new yy.Op({left: $$[$0-3], op:'IN', right:[]}); 
break;
case 436:
 this.$ = new yy.Op({left: $$[$0-4], op:'NOT IN', right:[]}); 
break;
case 437: case 439:
 this.$ = new yy.Op({left: $$[$0-2], op:'IN', right:$$[$0]}); 
break;
case 438: case 440:
 this.$ = new yy.Op({left: $$[$0-3], op:'NOT IN', right:$$[$0]}); 
break;
case 441:

/*			var expr = $$[$0];
			if(expr.left && expr.left.op == 'AND') {
				this.$ = new yy.Op({left:new yy.Op({left:$$[$0-2], op:'BETWEEN', right:expr.left}), op:'AND', right:expr.right });
			} else {
*/
				this.$ = new yy.Op({left:$$[$0-2], op:'BETWEEN1', right:$$[$0] });

break;
case 442:

				this.$ = new yy.Op({left:$$[$0-2], op:'NOT BETWEEN1', right:$$[$0] });

break;
case 443:
 this.$ = new yy.Op({op:'IS' , left:$$[$0-2], right:$$[$0]}); 
break;
case 444:

			this.$ = new yy.Op({
				op:'IS',
				left:$$[$0-2],
				right: new yy.UniOp({
					op:'NOT',
					right:new yy.NullValue({value:undefined})
				})
			});

break;
case 445:
 this.$ = new yy.Convert({expression:$$[$0-2]}) ; yy.extend(this.$,$$[$0]) ; 
break;
case 446: case 447:
 this.$ = $$[$0];
break;
case 448:
 this.$ = $$[$0-1];
break;
case 455:
 this.$ = 'ALL'; 
break;
case 456:
 this.$ = 'SOME'; 
break;
case 457:
 this.$ = 'ANY'; 
break;
case 458:
 this.$ = new yy.Update({table:$$[$0-4], columns:$$[$0-2], where:$$[$0]}); 
break;
case 459:
 this.$ = new yy.Update({table:$$[$0-2], columns:$$[$0]}); 
break;
case 462:
 this.$ = new yy.SetColumn({column:$$[$0-2], expression:$$[$0]})
break;
case 463:
 this.$ = new yy.SetColumn({variable:$$[$0-2], expression:$$[$0], method:$$[$0-3]})
break;
case 464:
 this.$ = new yy.Delete({table:$$[$0-2], where:$$[$0]});
break;
case 465:
 this.$ = new yy.Delete({table:$$[$0]});
break;
case 466:
 this.$ = new yy.Insert({into:$$[$0-2], values: $$[$0]}); 
break;
case 467:
 this.$ = new yy.Insert({into:$$[$0-1], values: $$[$0]}); 
break;
case 468: case 470:
 this.$ = new yy.Insert({into:$$[$0-2], values: $$[$0], orreplace:true}); 
break;
case 469: case 471:
 this.$ = new yy.Insert({into:$$[$0-1], values: $$[$0], orreplace:true}); 
break;
case 472:
 this.$ = new yy.Insert({into:$$[$0-2], "default": true}) ; 
break;
case 473:
 this.$ = new yy.Insert({into:$$[$0-5], columns: $$[$0-3], values: $$[$0]}); 
break;
case 474:
 this.$ = new yy.Insert({into:$$[$0-4], columns: $$[$0-2], values: $$[$0]}); 
break;
case 475:
 this.$ = new yy.Insert({into:$$[$0-1], select: $$[$0]}); 
break;
case 476:
 this.$ = new yy.Insert({into:$$[$0-1], select: $$[$0], orreplace:true}); 
break;
case 477:
 this.$ = new yy.Insert({into:$$[$0-4], columns: $$[$0-2], select: $$[$0]}); 
break;
case 482:
 this.$ = [$$[$0-1]]; 
break;
case 485:
this.$ = $$[$0-4]; $$[$0-4].push($$[$0-1])
break;
case 486: case 487: case 489: case 497:
this.$ = $$[$0-2]; $$[$0-2].push($$[$0])
break;
case 498:

			this.$ = new yy.CreateTable({table:$$[$0-4]});
			yy.extend(this.$,$$[$0-7]);
			yy.extend(this.$,$$[$0-6]);
			yy.extend(this.$,$$[$0-5]);
			yy.extend(this.$,$$[$0-2]);
			yy.extend(this.$,$$[$0]);

break;
case 499:

			this.$ = new yy.CreateTable({table:$$[$0]});
			yy.extend(this.$,$$[$0-3]);
			yy.extend(this.$,$$[$0-2]);
			yy.extend(this.$,$$[$0-1]);

break;
case 501:
 this.$ = {class:true}; 
break;
case 511:
 this.$ = {temporary:true}; 
break;
case 513:
 this.$ = {ifnotexists: true}; 
break;
case 514:
 this.$ = {columns: $$[$0-2], constraints: $$[$0]}; 
break;
case 515:
 this.$ = {columns: $$[$0]}; 
break;
case 516:
 this.$ = {as: $$[$0]} 
break;
case 517: case 541:
 this.$ = [$$[$0]];
break;
case 519: case 520: case 521: case 522: case 523:
 $$[$0].constraintid = $$[$0-1]; this.$ = $$[$0]; 
break;
case 526:
 this.$ = {type: 'CHECK', expression: $$[$0-1]}; 
break;
case 527:
 this.$ = {type: 'PRIMARY KEY', columns: $$[$0-1], clustered:($$[$0-3]+'').toUpperCase()}; 
break;
case 528:
 this.$ = {type: 'FOREIGN KEY', columns: $$[$0-5], fktable: $$[$0-2], fkcolumns: $$[$0-1]}; 
break;
case 534:

			this.$ = {type: 'UNIQUE', columns: $$[$0-1], clustered:($$[$0-3]+'').toUpperCase()};

break;
case 543:
 this.$ = new yy.ColumnDef({columnid:$$[$0-2]}); yy.extend(this.$,$$[$0-1]); yy.extend(this.$,$$[$0]);
break;
case 544:
 this.$ = new yy.ColumnDef({columnid:$$[$0-1]}); yy.extend(this.$,$$[$0]); 
break;
case 545:
 this.$ = new yy.ColumnDef({columnid:$$[$0], dbtypeid: ''}); 
break;
case 546:
 this.$ = {dbtypeid: $$[$0-5], dbsize: $$[$0-3], dbprecision: +$$[$0-1]} 
break;
case 547:
 this.$ = {dbtypeid: $$[$0-3], dbsize: $$[$0-1]} 
break;
case 548:
 this.$ = {dbtypeid: $$[$0]} 
break;
case 549:
 this.$ = {dbtypeid: 'ENUM', enumvalues: $$[$0-1]} 
break;
case 550:
 this.$ = $$[$0-1]; $$[$0-1].dbtypeid += '[' + $$[$0] + ']'; 
break;
case 552: case 760:
 this.$ = +$$[$0]; 
break;
case 554:
this.$ = undefined
break;
case 556:

			yy.extend($$[$0-1],$$[$0]); this.$ = $$[$0-1];

break;
case 559:
this.$ = {primarykey:true};
break;
case 560: case 561:
this.$ = {foreignkey:{table:$$[$0-1], columnid: $$[$0]}};
break;
case 562:
 this.$ = {identity: {value:$$[$0-3],step:$$[$0-1]}} 
break;
case 563:
 this.$ = {identity: {value:1,step:1}} 
break;
case 564: case 566:
this.$ = {"default":$$[$0]};
break;
case 565:
this.$ = {"default":$$[$0-1]};
break;
case 567:
this.$ = {null:true}; 
break;
case 568:
this.$ = {notnull:true}; 
break;
case 569:
this.$ = {check:$$[$0]}; 
break;
case 570:
this.$ = {unique:true}; 
break;
case 571:
this.$ = {"onupdate":$$[$0]};
break;
case 572:
this.$ = {"onupdate":$$[$0-1]};
break;
case 573:
 this.$ = new yy.DropTable({tables:$$[$0],type:$$[$0-2]}); yy.extend(this.$, $$[$0-1]); 
break;
case 577:
 this.$ = {ifexists: true};
break;
case 578:
 this.$ = new yy.AlterTable({table:$$[$0-3], renameto: $$[$0]});
break;
case 579:
 this.$ = new yy.AlterTable({table:$$[$0-3], addcolumn: $$[$0]});
break;
case 580:
 this.$ = new yy.AlterTable({table:$$[$0-3], modifycolumn: $$[$0]});
break;
case 581:
 this.$ = new yy.AlterTable({table:$$[$0-5], renamecolumn: $$[$0-2], to: $$[$0]});
break;
case 582:
 this.$ = new yy.AlterTable({table:$$[$0-3], dropcolumn: $$[$0]});
break;
case 583:
 this.$ = new yy.AlterTable({table:$$[$0-2], renameto: $$[$0]});
break;
case 584:
 this.$ = new yy.AttachDatabase({databaseid:$$[$0], engineid:$$[$0-2].toUpperCase() });
break;
case 585:
 this.$ = new yy.AttachDatabase({databaseid:$$[$0-3], engineid:$$[$0-5].toUpperCase(), args:$$[$0-1] });
break;
case 586:
 this.$ = new yy.AttachDatabase({databaseid:$$[$0-2], engineid:$$[$0-4].toUpperCase(), as:$$[$0] });
break;
case 587:
 this.$ = new yy.AttachDatabase({databaseid:$$[$0-5], engineid:$$[$0-7].toUpperCase(), as:$$[$0], args:$$[$0-3]});
break;
case 588:
 this.$ = new yy.DetachDatabase({databaseid:$$[$0]});
break;
case 589:
 this.$ = new yy.CreateDatabase({databaseid:$$[$0] }); yy.extend(this.$,$$[$0]); 
break;
case 590:
 this.$ = new yy.CreateDatabase({engineid:$$[$0-4].toUpperCase(), databaseid:$$[$0-1], as:$$[$0] }); yy.extend(this.$,$$[$0-2]); 
break;
case 591:
 this.$ = new yy.CreateDatabase({engineid:$$[$0-7].toUpperCase(), databaseid:$$[$0-4], args:$$[$0-2], as:$$[$0] }); yy.extend(this.$,$$[$0-5]); 
break;
case 592:
 this.$ = new yy.CreateDatabase({engineid:$$[$0-4].toUpperCase(),
		    as:$$[$0], args:[$$[$0-1]] }); yy.extend(this.$,$$[$0-2]); 
break;
case 593:
this.$ = undefined;
break;
case 595: case 596:
 this.$ = new yy.UseDatabase({databaseid: $$[$0] });
break;
case 597:
 this.$ = new yy.DropDatabase({databaseid: $$[$0] }); yy.extend(this.$,$$[$0-1]); 
break;
case 598: case 599:
 this.$ = new yy.DropDatabase({databaseid: $$[$0], engineid:$$[$0-3].toUpperCase() }); yy.extend(this.$,$$[$0-1]); 
break;
case 600:
 this.$ = new yy.CreateIndex({indexid:$$[$0-5], table:$$[$0-3], columns:$$[$0-1]})
break;
case 601:
 this.$ = new yy.CreateIndex({indexid:$$[$0-5], table:$$[$0-3], columns:$$[$0-1], unique:true})
break;
case 602:
 this.$ = new yy.DropIndex({indexid:$$[$0]});
break;
case 603:
 this.$ = new yy.ShowDatabases();
break;
case 604:
 this.$ = new yy.ShowDatabases({like:$$[$0]});
break;
case 605:
 this.$ = new yy.ShowDatabases({engineid:$$[$0-1].toUpperCase() });
break;
case 606:
 this.$ = new yy.ShowDatabases({engineid:$$[$0-3].toUpperCase() , like:$$[$0]});
break;
case 607:
 this.$ = new yy.ShowTables();
break;
case 608:
 this.$ = new yy.ShowTables({like:$$[$0]});
break;
case 609:
 this.$ = new yy.ShowTables({databaseid: $$[$0]});
break;
case 610:
 this.$ = new yy.ShowTables({like:$$[$0], databaseid: $$[$0-2]});
break;
case 611:
 this.$ = new yy.ShowColumns({table: $$[$0]});
break;
case 612:
 this.$ = new yy.ShowColumns({table: $$[$0-2], databaseid:$$[$0]});
break;
case 613:
 this.$ = new yy.ShowIndex({table: $$[$0]});
break;
case 614:
 this.$ = new yy.ShowIndex({table: $$[$0-2], databaseid: $$[$0]});
break;
case 615:
 this.$ = new yy.ShowCreateTable({table: $$[$0]});
break;
case 616:
 this.$ = new yy.ShowCreateTable({table: $$[$0-2], databaseid:$$[$0]});
break;
case 617:

			this.$ = new yy.CreateTable({table:$$[$0-6],view:true,select:$$[$0-1],viewcolumns:$$[$0-4]});
			yy.extend(this.$,$$[$0-9]);
			yy.extend(this.$,$$[$0-7]);

break;
case 618:

			this.$ = new yy.CreateTable({table:$$[$0-3],view:true,select:$$[$0-1]});
			yy.extend(this.$,$$[$0-6]);
			yy.extend(this.$,$$[$0-4]);

break;
case 622:
 this.$ = new yy.DropTable({tables:$$[$0], view:true}); yy.extend(this.$, $$[$0-1]); 
break;
case 623: case 770:
 this.$ = new yy.ExpressionStatement({expression:$$[$0]}); 
break;
case 624:
 this.$ = new yy.Source({url:$$[$0].value}); 
break;
case 625:
 this.$ = new yy.Assert({value:$$[$0]}); 
break;
case 626:
 this.$ = new yy.Assert({value:$$[$0].value}); 
break;
case 627:
 this.$ = new yy.Assert({value:$$[$0], message:$$[$0-2]}); 
break;
case 629: case 640: case 642:
 this.$ = $$[$0].value; 
break;
case 630: case 638:
 this.$ = +$$[$0].value; 
break;
case 631:
 this.$ = (!!$$[$0].value); 
break;
case 639:
 this.$ = ""+$$[$0].value; 
break;
case 648:
 this.$ = {}; 
break;
case 651:
 this.$ = []; 
break;
case 652:
 yy.extend($$[$0-2],$$[$0]); this.$ = $$[$0-2]; 
break;
case 654:
 this.$ = {}; this.$[$$[$0-2].substr(1,$$[$0-2].length-2)] = $$[$0]; 
break;
case 655: case 656:
 this.$ = {}; this.$[$$[$0-2]] = $$[$0]; 
break;
case 659:
 this.$ = new yy.SetVariable({variable:$$[$0-2].toLowerCase(), value:$$[$0]});
break;
case 660:
 this.$ = new yy.SetVariable({variable:$$[$0-1].toLowerCase(), value:$$[$0]});
break;
case 661:
 this.$ = new yy.SetVariable({variable:$$[$0-2], expression:$$[$0]});
break;
case 662:
 this.$ = new yy.SetVariable({variable:$$[$0-3], props: $$[$0-2], expression:$$[$0]});
break;
case 663:
 this.$ = new yy.SetVariable({variable:$$[$0-2], expression:$$[$0], method:$$[$0-3]});
break;
case 664:
 this.$ = new yy.SetVariable({variable:$$[$0-3], props: $$[$0-2], expression:$$[$0], method:$$[$0-4]});
break;
case 665:
this.$ = '@'; 
break;
case 666:
this.$ = '$'; 
break;
case 672:
 this.$ = true; 
break;
case 673:
 this.$ = false; 
break;
case 674:
 this.$ = new yy.CommitTransaction(); 
break;
case 675:
 this.$ = new yy.RollbackTransaction(); 
break;
case 676:
 this.$ = new yy.BeginTransaction(); 
break;
case 677:
 this.$ = new yy.If({expression:$$[$0-2],thenstat:$$[$0-1], elsestat:$$[$0]});
			if($$[$0-1].exists) this.$.exists = $$[$0-1].exists;
			if($$[$0-1].queries) this.$.queries = $$[$0-1].queries;

break;
case 678:

			this.$ = new yy.If({expression:$$[$0-1],thenstat:$$[$0]});
			if($$[$0].exists) this.$.exists = $$[$0].exists;
			if($$[$0].queries) this.$.queries = $$[$0].queries;

break;
case 679:
this.$ = $$[$0];
break;
case 680:
 this.$ = new yy.While({expression:$$[$0-1],loopstat:$$[$0]});
			if($$[$0].exists) this.$.exists = $$[$0].exists;
			if($$[$0].queries) this.$.queries = $$[$0].queries;

break;
case 681:
 this.$ = new yy.Continue(); 
break;
case 682:
 this.$ = new yy.Break(); 
break;
case 683:
 this.$ = new yy.BeginEnd({statements:$$[$0-1]}); 
break;
case 684:
 this.$ = new yy.Print({exprs:$$[$0]});
break;
case 685:
 this.$ = new yy.Print({select:$$[$0]});
break;
case 686:
 this.$ = new yy.Require({paths:$$[$0]}); 
break;
case 687:
 this.$ = new yy.Require({plugins:$$[$0]}); 
break;
case 688: case 689:
this.$ = $$[$0].toUpperCase(); 
break;
case 690:
 this.$ = new yy.Echo({expr:$$[$0]}); 
break;
case 695:
 this.$ = new yy.Declare({declares:$$[$0]}); 
break;
case 698:
 this.$ = {variable: $$[$0-1]}; yy.extend(this.$,$$[$0]); 
break;
case 699:
 this.$ = {variable: $$[$0-2]}; yy.extend(this.$,$$[$0]); 
break;
case 700:
 this.$ = {variable: $$[$0-3], expression:$$[$0]}; yy.extend(this.$,$$[$0-2]);
break;
case 701:
 this.$ = {variable: $$[$0-4], expression:$$[$0]}; yy.extend(this.$,$$[$0-2]);
break;
case 702:
 this.$ = new yy.TruncateTable({table:$$[$0]});
break;
case 703:

			this.$ = new yy.Merge(); yy.extend(this.$,$$[$0-4]); yy.extend(this.$,$$[$0-3]);
			yy.extend(this.$,$$[$0-2]);
			yy.extend(this.$,{matches:$$[$0-1]});yy.extend(this.$,$$[$0]);

break;
case 704: case 705:
 this.$ = {into: $$[$0]}; 
break;
case 708:
 this.$ = {on:$$[$0]}; 
break;
case 713:
 this.$ = {matched:true, action:$$[$0]} 
break;
case 714:
 this.$ = {matched:true, expr: $$[$0-2], action:$$[$0]} 
break;
case 715:
 this.$ = {delete:true}; 
break;
case 716:
 this.$ = {update:$$[$0]}; 
break;
case 717: case 718:
 this.$ = {matched:false, bytarget: true, action:$$[$0]} 
break;
case 719: case 720:
 this.$ = {matched:false, bytarget: true, expr:$$[$0-2], action:$$[$0]} 
break;
case 721:
 this.$ = {matched:false, bysource: true, action:$$[$0]} 
break;
case 722:
 this.$ = {matched:false, bysource: true, expr:$$[$0-2], action:$$[$0]} 
break;
case 723:
 this.$ = {insert:true, values:$$[$0]}; 
break;
case 724:
 this.$ = {insert:true, values:$$[$0], columns:$$[$0-3]}; 
break;
case 725:
 this.$ = {insert:true, defaultvalues:true}; 
break;
case 726:
 this.$ = {insert:true, defaultvalues:true, columns:$$[$0-3]}; 
break;
case 728:
 this.$ = {output:{columns:$$[$0]}} 
break;
case 729:
 this.$ = {output:{columns:$$[$0-3], intovar: $$[$0], method:$$[$0-1]}} 
break;
case 730:
 this.$ = {output:{columns:$$[$0-2], intotable: $$[$0]}} 
break;
case 731:
 this.$ = {output:{columns:$$[$0-5], intotable: $$[$0-3], intocolumns:$$[$0-1]}} 
break;
case 732:

			this.$ = new yy.CreateVertex({class:$$[$0-3],sharp:$$[$0-2], name:$$[$0-1]});
			yy.extend(this.$,$$[$0]);

break;
case 735:
 this.$ = {sets:$$[$0]}; 
break;
case 736:
 this.$ = {content:$$[$0]}; 
break;
case 737:
 this.$ = {select:$$[$0]}; 
break;
case 738:

			this.$ = new yy.CreateEdge({from:$$[$0-3],to:$$[$0-1],name:$$[$0-5]});
			yy.extend(this.$,$$[$0]);

break;
case 739:
 this.$ = new yy.CreateGraph({graph:$$[$0]}); 
break;
case 740:
 this.$ = new yy.CreateGraph({from:$$[$0]}); 
break;
case 743:

			this.$ = $$[$0-2];
			if($$[$0-1]) this.$.json = new yy.Json({value:$$[$0-1]});
			if($$[$0]) this.$.as = $$[$0];

break;
case 744:

			this.$ = {source:$$[$0-6], target: $$[$0]};
			if($$[$0-3]) this.$.json = new yy.Json({value:$$[$0-3]});
			if($$[$0-2]) this.$.as = $$[$0-2];
			yy.extend(this.$,$$[$0-4]);

break;
case 745:

			this.$ = {source:$$[$0-5], target: $$[$0]};
			if($$[$0-2]) this.$.json = new yy.Json({value:$$[$0-3]});
			if($$[$0-1]) this.$.as = $$[$0-2];

break;
case 746:

			this.$ = {source:$$[$0-2], target: $$[$0]};

break;
case 750:
 this.$ = {vars:$$[$0], method:$$[$0-1]}; 
break;
case 753: case 754:

			var s3 = $$[$0-1];
			this.$ = {prop:$$[$0-3], sharp:$$[$0-2], name:(typeof s3 == 'undefined')?undefined:s3.substr(1,s3.length-2), class:$$[$0]};

break;
case 755:

			var s2 = $$[$0-1];
			this.$ = {sharp:$$[$0-2], name:(typeof s2 == 'undefined')?undefined:s2.substr(1,s2.length-2), class:$$[$0]};

break;
case 756:

			var s1 = $$[$0-1];
			this.$ = {name:(typeof s1 == 'undefined')?undefined:s1.substr(1,s1.length-2), class:$$[$0]};

break;
case 757:

			this.$ = {class:$$[$0]};

break;
case 763:
 this.$ = new yy.AddRule({left:$$[$0-2], right:$$[$0]}); 
break;
case 764:
 this.$ = new yy.AddRule({right:$$[$0]}); 
break;
case 767:
 this.$ = {termid: $$[$0]}; 
break;
case 768:
 this.$ = {termid:$$[$0-3], args:$$[$0-1]}; 
break;
case 771:

			this.$ = new yy.CreateTrigger({trigger:$$[$0-6], when:$$[$0-5], action:$$[$0-4], table:$$[$0-2], statement:$$[$0]});
			if($$[$0].exists) this.$.exists = $$[$0].exists;
			if($$[$0].queries) this.$.queries = $$[$0].queries;

break;
case 772:

			this.$ = new yy.CreateTrigger({trigger:$$[$0-5], when:$$[$0-4], action:$$[$0-3], table:$$[$0-1], funcid:$$[$0]});

break;
case 773:

			this.$ = new yy.CreateTrigger({trigger:$$[$0-6], when:$$[$0-4], action:$$[$0-3], table:$$[$0-5], statement:$$[$0]});
			if($$[$0].exists) this.$.exists = $$[$0].exists;
			if($$[$0].queries) this.$.queries = $$[$0].queries;

break;
case 774: case 775: case 777:
 this.$ = 'AFTER'; 
break;
case 776:
 this.$ = 'BEFORE'; 
break;
case 778:
 this.$ = 'INSTEADOF'; 
break;
case 779:
 this.$ = 'INSERT'; 
break;
case 780:
 this.$ = 'DELETE'; 
break;
case 781:
 this.$ = 'UPDATE'; 
break;
case 782:
 this.$ = new yy.DropTrigger({trigger:$$[$0]}); 
break;
case 783:
 this.$ = new yy.Reindex({indexid:$$[$0]});
break;
case 1057: case 1077: case 1079: case 1081: case 1085: case 1087: case 1089: case 1091: case 1093: case 1095:
this.$ = [];
break;
case 1058: case 1072: case 1074: case 1078: case 1080: case 1082: case 1086: case 1088: case 1090: case 1092: case 1094: case 1096:
$$[$0-1].push($$[$0]);
break;
case 1071: case 1073:
this.$ = [$$[$0]];
break;
}
},
table: [o([10,607,768],$V0,{8:1,9:2,12:3,13:4,17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,2:$V1,4:$V2,5:$V3,14:$V4,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),{1:[3]},{10:[1,105],11:106,607:$VH,768:$VI},o($VJ,[2,8]),o($VJ,[2,9]),o($VK,[2,12]),o($VJ,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:109,2:$V1,4:$V2,5:$V3,15:[1,110],53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VK,[2,14]),o($VK,[2,15]),o($VK,[2,16]),o($VK,[2,17]),o($VK,[2,18]),o($VK,[2,19]),o($VK,[2,20]),o($VK,[2,21]),o($VK,[2,22]),o($VK,[2,23]),o($VK,[2,24]),o($VK,[2,25]),o($VK,[2,26]),o($VK,[2,27]),o($VK,[2,28]),o($VK,[2,29]),o($VK,[2,30]),o($VK,[2,31]),o($VK,[2,32]),o($VK,[2,33]),o($VK,[2,34]),o($VK,[2,35]),o($VK,[2,36]),o($VK,[2,37]),o($VK,[2,38]),o($VK,[2,39]),o($VK,[2,40]),o($VK,[2,41]),o($VK,[2,42]),o($VK,[2,43]),o($VK,[2,44]),o($VK,[2,45]),o($VK,[2,46]),o($VK,[2,47]),o($VK,[2,48]),o($VK,[2,49]),o($VK,[2,50]),o($VK,[2,51]),o($VK,[2,52]),o($VK,[2,53]),o($VK,[2,54]),o($VK,[2,55]),o($VK,[2,56]),o($VK,[2,57]),o($VK,[2,58]),o($VK,[2,59]),o($VK,[2,60]),o($VK,[2,61]),o($VK,[2,62]),o($VK,[2,63]),o($VK,[2,64]),o($VK,[2,65]),o($VK,[2,66]),o($VK,[2,67]),{358:[1,111]},{2:$V1,3:112,4:$V2,5:$V3},{2:$V1,3:114,4:$V2,5:$V3,156:$VL,200:113,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR},o($VS,[2,510],{3:123,353:127,2:$V1,4:$V2,5:$V3,134:$VT,135:$VU,187:[1,125],193:[1,124],273:[1,131],274:[1,132],362:[1,133],410:[1,122],477:[1,126],514:[1,130]}),{145:$VV,454:134,455:135},{183:[1,137]},{410:[1,138]},{2:$V1,3:140,4:$V2,5:$V3,130:[1,146],193:[1,141],358:[1,145],402:142,410:[1,139],415:[1,143],514:[1,144]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:147,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vx1,$Vy1,{345:208,171:[1,209],198:$Vz1}),o($Vx1,$Vy1,{345:211,198:$Vz1}),{2:$V1,3:223,4:$V2,5:$V3,77:$VA1,132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,198:[1,214],199:217,200:219,201:218,202:221,209:213,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1,458:212},{2:$V1,3:225,4:$V2,5:$V3},{358:[1,226]},o($VD1,[2,1053],{80:227,106:228,107:[1,229]}),o($VE1,[2,1057],{90:230}),{2:$V1,3:234,4:$V2,5:$V3,190:[1,232],193:[1,235],272:[1,231],358:[1,236],410:[1,233]},{358:[1,237]},{2:$V1,3:240,4:$V2,5:$V3,73:238,75:239},o([311,607,768],$V0,{12:3,13:4,17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,9:242,2:$V1,4:$V2,5:$V3,14:$V4,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,440:[1,241],441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),{440:[1,243]},{440:[1,244]},{2:$V1,3:246,4:$V2,5:$V3,410:[1,245]},{2:$V1,3:248,4:$V2,5:$V3,199:247},o($VF1,[2,316]),{113:249,132:$VY,301:$Vn1},{2:$V1,3:114,4:$V2,5:$V3,113:255,131:$VX,132:[1,252],143:$V_,144:250,145:$VG1,152:$V11,156:$VL,181:$V51,196:254,200:259,201:258,261:256,262:257,269:$VH1,270:$VI1,279:251,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:262,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK,[2,681]),o($VK,[2,682]),{2:$V1,3:171,4:$V2,5:$V3,40:264,56:167,77:$VW,79:75,89:$V7,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:263,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,184:99,189:$Vb,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:271,4:$V2,5:$V3,113:268,132:$VY,301:$Vn1,449:266,450:267,451:269,452:$VJ1},{2:$V1,3:272,4:$V2,5:$V3,143:$VK1,145:$VL1,436:273},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:276,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{510:[1,277]},{2:$V1,3:100,4:$V2,5:$V3,509:279,511:278},{2:$V1,3:114,4:$V2,5:$V3,156:$VL,200:280,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:281,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VM1,$VN1,{186:285,164:[1,284],185:[1,282],187:[1,283],195:$VO1}),o($VP1,[2,767],{77:[1,287]}),o([2,4,5,10,72,77,78,93,98,107,118,128,131,132,137,143,145,152,154,156,162,164,168,169,179,180,181,183,185,187,195,198,232,244,245,249,251,269,270,271,275,276,278,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,307,308,311,315,317,322,425,429,607,768],[2,152],{149:[1,288],150:[1,289],190:[1,290],191:[1,291],192:[1,292],193:[1,293],194:[1,294]}),o($VQ1,[2,1]),o($VQ1,[2,2]),{6:295,131:[1,444],172:[1,467],243:[1,443],244:[1,378],245:[1,412],249:[1,416],375:[1,409],386:[1,300],407:[1,302],415:[1,554],419:[1,476],421:[1,448],422:[1,514],438:[1,447],440:[1,530],445:[1,347],465:[1,423],469:[1,453],475:[1,346],519:[1,312],520:[1,304],521:[1,404],523:[1,296],524:[1,297],525:[1,298],526:[1,299],527:[1,301],528:[1,303],529:[1,305],530:[1,306],531:[1,307],532:[1,308],533:[1,309],534:[1,310],535:[1,311],536:[1,313],537:[1,314],538:[1,315],539:[1,316],540:[1,317],541:[1,318],542:[1,319],543:[1,320],544:[1,321],545:[1,322],546:[1,323],547:[1,324],548:[1,325],549:[1,326],550:[1,327],551:[1,328],552:[1,329],553:[1,330],554:[1,331],555:[1,332],556:[1,333],557:[1,334],558:[1,335],559:[1,336],560:[1,337],561:[1,338],562:[1,339],563:[1,340],564:[1,341],565:[1,342],566:[1,343],567:[1,344],568:[1,345],569:[1,348],570:[1,349],571:[1,350],572:[1,351],573:[1,352],574:[1,353],575:[1,354],576:[1,355],577:[1,356],578:[1,357],579:[1,358],580:[1,359],581:[1,360],582:[1,361],583:[1,362],584:[1,363],585:[1,364],586:[1,365],587:[1,366],588:[1,367],589:[1,368],590:[1,369],591:[1,370],592:[1,371],593:[1,372],594:[1,373],595:[1,374],596:[1,375],597:[1,376],598:[1,377],599:[1,379],600:[1,380],601:[1,381],602:[1,382],603:[1,383],604:[1,384],605:[1,385],606:[1,386],607:[1,387],608:[1,388],609:[1,389],610:[1,390],611:[1,391],612:[1,392],613:[1,393],614:[1,394],615:[1,395],616:[1,396],617:[1,397],618:[1,398],619:[1,399],620:[1,400],621:[1,401],622:[1,402],623:[1,403],624:[1,405],625:[1,406],626:[1,407],627:[1,408],628:[1,410],629:[1,411],630:[1,413],631:[1,414],632:[1,415],633:[1,417],634:[1,418],635:[1,419],636:[1,420],637:[1,421],638:[1,422],639:[1,424],640:[1,425],641:[1,426],642:[1,427],643:[1,428],644:[1,429],645:[1,430],646:[1,431],647:[1,432],648:[1,433],649:[1,434],650:[1,435],651:[1,436],652:[1,437],653:[1,438],654:[1,439],655:[1,440],656:[1,441],657:[1,442],658:[1,445],659:[1,446],660:[1,449],661:[1,450],662:[1,451],663:[1,452],664:[1,454],665:[1,455],666:[1,456],667:[1,457],668:[1,458],669:[1,459],670:[1,460],671:[1,461],672:[1,462],673:[1,463],674:[1,464],675:[1,465],676:[1,466],677:[1,468],678:[1,469],679:[1,470],680:[1,471],681:[1,472],682:[1,473],683:[1,474],684:[1,475],685:[1,477],686:[1,478],687:[1,479],688:[1,480],689:[1,481],690:[1,482],691:[1,483],692:[1,484],693:[1,485],694:[1,486],695:[1,487],696:[1,488],697:[1,489],698:[1,490],699:[1,491],700:[1,492],701:[1,493],702:[1,494],703:[1,495],704:[1,496],705:[1,497],706:[1,498],707:[1,499],708:[1,500],709:[1,501],710:[1,502],711:[1,503],712:[1,504],713:[1,505],714:[1,506],715:[1,507],716:[1,508],717:[1,509],718:[1,510],719:[1,511],720:[1,512],721:[1,513],722:[1,515],723:[1,516],724:[1,517],725:[1,518],726:[1,519],727:[1,520],728:[1,521],729:[1,522],730:[1,523],731:[1,524],732:[1,525],733:[1,526],734:[1,527],735:[1,528],736:[1,529],737:[1,531],738:[1,532],739:[1,533],740:[1,534],741:[1,535],742:[1,536],743:[1,537],744:[1,538],745:[1,539],746:[1,540],747:[1,541],748:[1,542],749:[1,543],750:[1,544],751:[1,545],752:[1,546],753:[1,547],754:[1,548],755:[1,549],756:[1,550],757:[1,551],758:[1,552],759:[1,553],760:[1,555],761:[1,556],762:[1,557],763:[1,558],764:[1,559],765:[1,560],766:[1,561],767:[1,562]},{1:[2,6]},o($VJ,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:563,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VR1,[2,1051]),o($VR1,[2,1052]),o($VJ,[2,10]),{16:[1,564]},{2:$V1,3:248,4:$V2,5:$V3,199:565},{410:[1,566]},o($VK,[2,770]),{77:$VS1},{77:[1,568]},{77:$VT1},{77:$VU1},{77:[1,571]},{77:[1,572]},{77:[1,573]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:574,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vx1,$VV1,{355:575,156:$VW1}),{410:[1,577]},{2:$V1,3:578,4:$V2,5:$V3},{193:[1,579]},{2:$V1,3:585,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,183:[1,581],436:592,478:580,479:582,480:583,483:584,487:589,498:586,502:588},{130:[1,596],354:593,358:[1,595],415:[1,594]},{113:598,132:$VY,183:[2,1151],301:$Vn1,476:597},o($V_1,[2,1145],{470:599,3:600,2:$V1,4:$V2,5:$V3}),{2:$V1,3:601,4:$V2,5:$V3},{4:[1,602]},{4:[1,603]},o($VS,[2,511]),o($VK,[2,695],{74:[1,604]}),o($V$1,[2,696]),{2:$V1,3:605,4:$V2,5:$V3},{2:$V1,3:248,4:$V2,5:$V3,199:606},{2:$V1,3:607,4:$V2,5:$V3},o($Vx1,$V02,{403:608,156:$V12}),{410:[1,610]},{2:$V1,3:611,4:$V2,5:$V3},o($Vx1,$V02,{403:612,156:$V12}),o($Vx1,$V02,{403:613,156:$V12}),{2:$V1,3:614,4:$V2,5:$V3},o($V22,[2,1139]),o($V22,[2,1140]),o($VK,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:615,114:632,332:644,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$V82,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,146:$V9,154:$Vg2,156:$Va,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,189:$Vb,271:$Vc,272:$Vd,294:$Ve,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VF1,[2,292]),o($VF1,[2,293]),o($VF1,[2,294]),o($VF1,[2,295]),o($VF1,[2,296]),o($VF1,[2,297]),o($VF1,[2,298]),o($VF1,[2,299]),o($VF1,[2,300]),o($VF1,[2,301]),o($VF1,[2,302]),o($VF1,[2,303]),o($VF1,[2,304]),o($VF1,[2,305]),o($VF1,[2,306]),o($VF1,[2,307]),o($VF1,[2,308]),o($VF1,[2,309]),{2:$V1,3:171,4:$V2,5:$V3,26:661,27:660,36:656,40:655,56:167,77:$VW,79:75,89:$V7,94:658,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,184:99,189:$Vb,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,268:657,269:$V81,270:$V91,271:$Vc,272:[1,662],275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:[1,659],295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,344:$Vh,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,313]),o($VF1,[2,314]),o($VE2,[2,315],{77:$VU1}),{77:[1,663]},o([2,4,5,10,53,72,74,76,78,89,93,95,98,99,107,112,115,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VF2,{77:$VS1,116:[1,664]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:665,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:666,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:667,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:668,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:669,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,287]),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,231,232,239,244,245,246,247,249,251,253,269,270,271,272,275,276,278,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,305,307,308,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,420,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768,769,770],[2,365]),o($VG2,[2,366]),o($VG2,[2,367]),o($VG2,$VH2),o($VG2,[2,369]),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,370]),{2:$V1,3:671,4:$V2,5:$V3,131:[1,672],306:670},{2:$V1,3:673,4:$V2,5:$V3},o($VG2,[2,376]),o($VG2,[2,377]),{2:$V1,3:674,4:$V2,5:$V3,77:$VI2,113:676,131:$VX,132:$VY,143:$V_,152:$V11,181:$V51,196:677,201:679,261:678,299:$Vl1,300:$Vm1,301:$Vn1,307:$Vr1,424:680,429:$Vw1},{77:[1,681]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:682,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,309:683,312:684,313:$VJ2,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{77:[1,686]},{77:[1,687]},o($VK2,[2,633]),{2:$V1,3:702,4:$V2,5:$V3,77:$VL2,111:697,113:695,131:$VX,132:$VY,143:$V_,144:692,145:$VG1,152:$V11,156:$VL,181:$V51,196:694,200:700,201:699,261:696,262:698,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,305:[1,690],307:$Vr1,424:193,425:$Vv1,426:688,427:691,428:693,429:$Vw1,432:689},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:703,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:704,4:$V2,5:$V3,156:$VL,200:705,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR},{77:[2,342]},{77:[2,343]},{77:[2,344]},{77:[2,345]},{77:[2,346]},{77:[2,347]},{77:[2,348]},{77:[2,349]},{77:[2,350]},{77:[2,351]},{2:$V1,3:711,4:$V2,5:$V3,131:$VM2,132:$VN2,430:706,431:[1,707],433:708},{2:$V1,3:248,4:$V2,5:$V3,199:712},{294:[1,713]},o($Vx1,[2,481]),{2:$V1,3:248,4:$V2,5:$V3,199:714},{231:[1,716],459:715},{231:[2,704]},{2:$V1,3:223,4:$V2,5:$V3,77:$VA1,132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,199:217,200:219,201:218,202:221,209:717,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},{40:718,79:75,89:$V7,184:99,189:$Vb},o($VO2,[2,1101],{210:719,76:[1,720]}),o($VP2,[2,185],{3:721,2:$V1,4:$V2,5:$V3,76:[1,722],154:[1,723]}),o($VP2,[2,189],{3:724,2:$V1,4:$V2,5:$V3,76:[1,725]}),o($VP2,[2,190],{3:726,2:$V1,4:$V2,5:$V3,76:[1,727]}),o($VP2,[2,193]),o($VP2,[2,194],{3:728,2:$V1,4:$V2,5:$V3,76:[1,729]}),o($VP2,[2,197],{3:730,2:$V1,4:$V2,5:$V3,76:[1,731]}),o([2,4,5,10,72,74,76,78,93,98,118,128,154,162,168,169,183,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],$VQ2,{77:$VS1,116:$VR2}),o([2,4,5,10,72,74,76,78,93,98,118,128,162,168,169,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,311,315,607,768],[2,200]),o($VK,[2,783]),{2:$V1,3:248,4:$V2,5:$V3,199:733},o($VS2,$VT2,{81:734,198:$VU2}),o($VD1,[2,1054]),o($VV2,[2,1067],{108:736,190:[1,737]}),o([10,78,183,311,315,607,768],$VT2,{424:193,81:738,117:739,3:740,114:743,144:765,158:775,160:776,2:$V1,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,115:$V52,116:$V62,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,198:$VU2,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,425:$Vv1,429:$Vw1}),{358:[1,789]},{183:[1,790]},o($VK,[2,603],{112:[1,791]}),{410:[1,792]},{183:[1,793]},o($VK,[2,607],{112:[1,794],183:[1,795]}),{2:$V1,3:248,4:$V2,5:$V3,199:796},{40:797,74:[1,798],79:75,89:$V7,184:99,189:$Vb},o($VC3,[2,70]),{76:[1,799]},o($VK,[2,676]),{11:106,311:[1,800],607:$VH,768:$VI},o($VK,[2,674]),o($VK,[2,675]),{2:$V1,3:801,4:$V2,5:$V3},o($VK,[2,596]),{146:[1,802]},o([2,4,5,10,53,72,74,76,77,78,89,95,124,128,143,145,146,148,149,152,154,156,181,183,187,189,230,271,272,294,302,307,311,315,340,343,344,348,349,361,373,374,378,379,401,405,406,407,408,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,519,520,521,522,607,768],$VQ2,{116:$VR2}),o($VK,[2,624]),o($VK,[2,625]),o($VK,[2,626]),o($VK,$VH2,{74:[1,803]}),{77:$VI2,113:676,131:$VX,132:$VY,143:$V_,152:$V11,181:$V51,196:677,201:679,261:678,299:$Vl1,300:$Vm1,301:$Vn1,307:$Vr1,424:680,429:$Vw1},o($VD3,[2,325]),o($VD3,[2,326]),o($VD3,[2,327]),o($VD3,[2,328]),o($VD3,[2,329]),o($VD3,[2,330]),o($VD3,[2,331]),o($VD3,[2,332],{77:$VU1}),o($VK,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,114:632,332:644,12:804,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$V82,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,146:$V9,154:$Vg2,156:$Va,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,189:$Vb,271:$Vc,272:$Vd,294:$Ve,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VK,[2,684],{74:$VE3}),o($VK,[2,685]),o($VF3,[2,363],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VK,[2,686],{74:[1,807]}),o($VK,[2,687],{74:[1,808]}),o($V$1,[2,692]),o($V$1,[2,694]),o($V$1,[2,688]),o($V$1,[2,689]),{114:814,115:$V52,116:$V62,124:[1,809],230:$VH3,434:810,435:811,438:$VI3},{2:$V1,3:815,4:$V2,5:$V3},o($Vx1,[2,665]),o($Vx1,[2,666]),o($VK,[2,623],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:100,4:$V2,5:$V3,509:279,511:816},o($VK,[2,764],{74:$VJ3}),o($VK3,[2,766]),o($VK,[2,769]),o($VK,[2,690],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VL3,$VN1,{186:818,195:$VO1}),o($VL3,$VN1,{186:819,195:$VO1}),o($VL3,$VN1,{186:820,195:$VO1}),o($VM3,[2,1097],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,188:821,174:822,257:823,94:824,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),{77:[1,826],131:$VX,196:825},{2:$V1,3:100,4:$V2,5:$V3,509:279,511:827},o($VN3,[2,153]),o($VN3,[2,154]),o($VN3,[2,155]),o($VN3,[2,156]),o($VN3,[2,157]),o($VN3,[2,158]),o($VN3,[2,159]),o($VQ1,[2,3]),o($VQ1,[2,784]),o($VQ1,[2,785]),o($VQ1,[2,786]),o($VQ1,[2,787]),o($VQ1,[2,788]),o($VQ1,[2,789]),o($VQ1,[2,790]),o($VQ1,[2,791]),o($VQ1,[2,792]),o($VQ1,[2,793]),o($VQ1,[2,794]),o($VQ1,[2,795]),o($VQ1,[2,796]),o($VQ1,[2,797]),o($VQ1,[2,798]),o($VQ1,[2,799]),o($VQ1,[2,800]),o($VQ1,[2,801]),o($VQ1,[2,802]),o($VQ1,[2,803]),o($VQ1,[2,804]),o($VQ1,[2,805]),o($VQ1,[2,806]),o($VQ1,[2,807]),o($VQ1,[2,808]),o($VQ1,[2,809]),o($VQ1,[2,810]),o($VQ1,[2,811]),o($VQ1,[2,812]),o($VQ1,[2,813]),o($VQ1,[2,814]),o($VQ1,[2,815]),o($VQ1,[2,816]),o($VQ1,[2,817]),o($VQ1,[2,818]),o($VQ1,[2,819]),o($VQ1,[2,820]),o($VQ1,[2,821]),o($VQ1,[2,822]),o($VQ1,[2,823]),o($VQ1,[2,824]),o($VQ1,[2,825]),o($VQ1,[2,826]),o($VQ1,[2,827]),o($VQ1,[2,828]),o($VQ1,[2,829]),o($VQ1,[2,830]),o($VQ1,[2,831]),o($VQ1,[2,832]),o($VQ1,[2,833]),o($VQ1,[2,834]),o($VQ1,[2,835]),o($VQ1,[2,836]),o($VQ1,[2,837]),o($VQ1,[2,838]),o($VQ1,[2,839]),o($VQ1,[2,840]),o($VQ1,[2,841]),o($VQ1,[2,842]),o($VQ1,[2,843]),o($VQ1,[2,844]),o($VQ1,[2,845]),o($VQ1,[2,846]),o($VQ1,[2,847]),o($VQ1,[2,848]),o($VQ1,[2,849]),o($VQ1,[2,850]),o($VQ1,[2,851]),o($VQ1,[2,852]),o($VQ1,[2,853]),o($VQ1,[2,854]),o($VQ1,[2,855]),o($VQ1,[2,856]),o($VQ1,[2,857]),o($VQ1,[2,858]),o($VQ1,[2,859]),o($VQ1,[2,860]),o($VQ1,[2,861]),o($VQ1,[2,862]),o($VQ1,[2,863]),o($VQ1,[2,864]),o($VQ1,[2,865]),o($VQ1,[2,866]),o($VQ1,[2,867]),o($VQ1,[2,868]),o($VQ1,[2,869]),o($VQ1,[2,870]),o($VQ1,[2,871]),o($VQ1,[2,872]),o($VQ1,[2,873]),o($VQ1,[2,874]),o($VQ1,[2,875]),o($VQ1,[2,876]),o($VQ1,[2,877]),o($VQ1,[2,878]),o($VQ1,[2,879]),o($VQ1,[2,880]),o($VQ1,[2,881]),o($VQ1,[2,882]),o($VQ1,[2,883]),o($VQ1,[2,884]),o($VQ1,[2,885]),o($VQ1,[2,886]),o($VQ1,[2,887]),o($VQ1,[2,888]),o($VQ1,[2,889]),o($VQ1,[2,890]),o($VQ1,[2,891]),o($VQ1,[2,892]),o($VQ1,[2,893]),o($VQ1,[2,894]),o($VQ1,[2,895]),o($VQ1,[2,896]),o($VQ1,[2,897]),o($VQ1,[2,898]),o($VQ1,[2,899]),o($VQ1,[2,900]),o($VQ1,[2,901]),o($VQ1,[2,902]),o($VQ1,[2,903]),o($VQ1,[2,904]),o($VQ1,[2,905]),o($VQ1,[2,906]),o($VQ1,[2,907]),o($VQ1,[2,908]),o($VQ1,[2,909]),o($VQ1,[2,910]),o($VQ1,[2,911]),o($VQ1,[2,912]),o($VQ1,[2,913]),o($VQ1,[2,914]),o($VQ1,[2,915]),o($VQ1,[2,916]),o($VQ1,[2,917]),o($VQ1,[2,918]),o($VQ1,[2,919]),o($VQ1,[2,920]),o($VQ1,[2,921]),o($VQ1,[2,922]),o($VQ1,[2,923]),o($VQ1,[2,924]),o($VQ1,[2,925]),o($VQ1,[2,926]),o($VQ1,[2,927]),o($VQ1,[2,928]),o($VQ1,[2,929]),o($VQ1,[2,930]),o($VQ1,[2,931]),o($VQ1,[2,932]),o($VQ1,[2,933]),o($VQ1,[2,934]),o($VQ1,[2,935]),o($VQ1,[2,936]),o($VQ1,[2,937]),o($VQ1,[2,938]),o($VQ1,[2,939]),o($VQ1,[2,940]),o($VQ1,[2,941]),o($VQ1,[2,942]),o($VQ1,[2,943]),o($VQ1,[2,944]),o($VQ1,[2,945]),o($VQ1,[2,946]),o($VQ1,[2,947]),o($VQ1,[2,948]),o($VQ1,[2,949]),o($VQ1,[2,950]),o($VQ1,[2,951]),o($VQ1,[2,952]),o($VQ1,[2,953]),o($VQ1,[2,954]),o($VQ1,[2,955]),o($VQ1,[2,956]),o($VQ1,[2,957]),o($VQ1,[2,958]),o($VQ1,[2,959]),o($VQ1,[2,960]),o($VQ1,[2,961]),o($VQ1,[2,962]),o($VQ1,[2,963]),o($VQ1,[2,964]),o($VQ1,[2,965]),o($VQ1,[2,966]),o($VQ1,[2,967]),o($VQ1,[2,968]),o($VQ1,[2,969]),o($VQ1,[2,970]),o($VQ1,[2,971]),o($VQ1,[2,972]),o($VQ1,[2,973]),o($VQ1,[2,974]),o($VQ1,[2,975]),o($VQ1,[2,976]),o($VQ1,[2,977]),o($VQ1,[2,978]),o($VQ1,[2,979]),o($VQ1,[2,980]),o($VQ1,[2,981]),o($VQ1,[2,982]),o($VQ1,[2,983]),o($VQ1,[2,984]),o($VQ1,[2,985]),o($VQ1,[2,986]),o($VQ1,[2,987]),o($VQ1,[2,988]),o($VQ1,[2,989]),o($VQ1,[2,990]),o($VQ1,[2,991]),o($VQ1,[2,992]),o($VQ1,[2,993]),o($VQ1,[2,994]),o($VQ1,[2,995]),o($VQ1,[2,996]),o($VQ1,[2,997]),o($VQ1,[2,998]),o($VQ1,[2,999]),o($VQ1,[2,1000]),o($VQ1,[2,1001]),o($VQ1,[2,1002]),o($VQ1,[2,1003]),o($VQ1,[2,1004]),o($VQ1,[2,1005]),o($VQ1,[2,1006]),o($VQ1,[2,1007]),o($VQ1,[2,1008]),o($VQ1,[2,1009]),o($VQ1,[2,1010]),o($VQ1,[2,1011]),o($VQ1,[2,1012]),o($VQ1,[2,1013]),o($VQ1,[2,1014]),o($VQ1,[2,1015]),o($VQ1,[2,1016]),o($VQ1,[2,1017]),o($VQ1,[2,1018]),o($VQ1,[2,1019]),o($VQ1,[2,1020]),o($VQ1,[2,1021]),o($VQ1,[2,1022]),o($VQ1,[2,1023]),o($VQ1,[2,1024]),o($VQ1,[2,1025]),o($VQ1,[2,1026]),o($VQ1,[2,1027]),o($VQ1,[2,1028]),o($VQ1,[2,1029]),o($VQ1,[2,1030]),o($VQ1,[2,1031]),o($VQ1,[2,1032]),o($VQ1,[2,1033]),o($VQ1,[2,1034]),o($VQ1,[2,1035]),o($VQ1,[2,1036]),o($VQ1,[2,1037]),o($VQ1,[2,1038]),o($VQ1,[2,1039]),o($VQ1,[2,1040]),o($VQ1,[2,1041]),o($VQ1,[2,1042]),o($VQ1,[2,1043]),o($VQ1,[2,1044]),o($VQ1,[2,1045]),o($VQ1,[2,1046]),o($VQ1,[2,1047]),o($VQ1,[2,1048]),o($VQ1,[2,1049]),o($VQ1,[2,1050]),o($VJ,[2,7]),o($VJ,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:828,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),{401:[1,832],406:[1,829],407:[1,830],408:[1,831]},{2:$V1,3:833,4:$V2,5:$V3},o($VL3,[2,1121],{293:834,771:836,78:[1,835],164:[1,838],185:[1,837]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:839,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:840,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{78:[1,841]},{2:$V1,3:842,4:$V2,5:$V3,132:[1,843]},{2:$V1,3:844,4:$V2,5:$V3,132:[1,845]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:846,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:847,4:$V2,5:$V3,99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:848,4:$V2,5:$V3},{154:[1,849]},o($VO3,$VV1,{355:850,156:$VW1}),{230:[1,851]},{2:$V1,3:852,4:$V2,5:$V3},o($VK,[2,739],{74:$VP3}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:854,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK3,[2,742]),o($VQ3,[2,1153],{424:193,481:855,144:856,139:$VR3,141:$VR3,145:$VG1,425:$Vv1,429:$Vw1}),{139:[1,857],141:[1,858]},o($VS3,$VT3,{495:860,498:861,77:[1,859],137:$VY1}),o($VU3,[2,1177],{499:862,132:[1,863]}),o($VV3,[2,1181],{501:864,502:865,152:$VZ1}),o($VV3,[2,757]),o($VW3,[2,749]),{2:$V1,3:866,4:$V2,5:$V3,131:[1,867]},{2:$V1,3:868,4:$V2,5:$V3},{2:$V1,3:869,4:$V2,5:$V3},o($Vx1,$VV1,{355:870,156:$VW1}),o($Vx1,$VV1,{355:871,156:$VW1}),o($V22,[2,500]),o($V22,[2,501]),{183:[1,872]},{183:[2,1152]},o($VX3,[2,1147],{471:873,474:874,137:[1,875]}),o($V_1,[2,1146]),o($VY3,$VZ3,{515:876,95:$V_3,230:[1,877],519:$V$3,520:$V04,521:$V14}),{76:[1,882]},{76:[1,883]},{145:$VV,455:884},{4:$V24,7:888,76:[1,886],277:885,392:887,394:$V34},o($VK,[2,465],{128:[1,891]}),o($VK,[2,588]),{2:$V1,3:892,4:$V2,5:$V3},{303:[1,893]},o($VO3,$V02,{403:894,156:$V12}),o($VK,[2,602]),{2:$V1,3:248,4:$V2,5:$V3,199:896,404:895},{2:$V1,3:248,4:$V2,5:$V3,199:896,404:897},o($VK,[2,782]),o($VJ,[2,678],{443:898,315:[1,899]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:900,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:901,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:902,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:903,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:904,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:905,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:906,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:907,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:908,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:909,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:910,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:911,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:912,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:913,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:914,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:915,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:916,4:$V2,5:$V3,77:[1,918],131:$VX,156:$VL,196:917,200:919,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR},{2:$V1,3:920,4:$V2,5:$V3,77:[1,922],131:$VX,156:$VL,196:921,200:923,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR},o($V44,[2,449],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:924,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),o($V44,[2,450],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:925,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),o($V44,[2,451],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:926,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),o($V44,[2,452],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:927,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),o($V44,$V54,{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:928,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:929,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:930,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($V44,[2,454],{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:931,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:932,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:933,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{164:[1,935],166:[1,937],333:934,339:[1,936]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:938,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:939,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:702,4:$V2,5:$V3,77:[1,940],111:943,145:$V64,156:$VL,200:944,202:942,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,334:941},{99:[1,946],302:[1,947]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:948,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:949,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:950,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{4:$V24,7:888,277:951,392:887,394:$V34},o($V74,[2,88]),o($V74,[2,89]),{78:[1,952]},{78:[1,953]},{78:[1,954]},{78:[1,955],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($Vx1,$Vy1,{345:211,77:$VT1,198:$Vz1}),{78:[2,1117]},{78:[2,1118]},{134:$VT,135:$VU},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:956,152:$V11,154:$V21,156:$VL,158:170,164:[1,958],179:$V31,180:$V41,181:$V51,185:[1,957],196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:959,4:$V2,5:$V3,149:$V84,180:[1,961]},o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,118,122,128,129,130,131,132,134,135,137,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,319,335,336,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,425],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,337:$VC2}),o($V94,[2,426],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,180:$Vk2,317:$Vm2,321:$Vp2}),o($V94,[2,427],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,180:$Vk2,317:$Vm2,321:$Vp2}),o($Va4,[2,428],{114:632,332:644,321:$Vp2}),o($Va4,[2,429],{114:632,332:644,321:$Vp2}),o($VG2,[2,374]),o($VG2,[2,1123]),o($VG2,[2,1124]),o($VG2,[2,375]),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,231,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,371]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:962,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK2,[2,629]),o($VK2,[2,630]),o($VK2,[2,631]),o($VK2,[2,632]),o($VK2,[2,634]),{40:963,79:75,89:$V7,184:99,189:$Vb},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,309:964,312:684,313:$VJ2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{310:965,311:$Vb4,312:966,313:$VJ2,315:$Vc4},o($Vd4,[2,381]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:968,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:969,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{4:$V24,7:888,277:970,392:887,394:$V34},o($VK2,[2,635]),{74:[1,972],305:[1,971]},o($VK2,[2,651]),o($Ve4,[2,658]),o($Vf4,[2,636]),o($Vf4,[2,637]),o($Vf4,[2,638]),o($Vf4,[2,639]),o($Vf4,[2,640]),o($Vf4,[2,641]),o($Vf4,[2,642]),o($Vf4,[2,643]),o($Vf4,[2,644]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:973,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o([2,4,5,10,53,72,74,76,78,89,93,95,98,99,107,112,115,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,431,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],$VF2,{77:$VS1,116:$Vg4}),{74:$VE3,305:[1,975]},o($VE2,[2,319],{77:$VS1}),o($VF1,[2,320]),{74:[1,977],431:[1,976]},o($VK2,[2,648]),o($Vh4,[2,653]),{152:[1,978]},{152:[1,979]},{152:[1,980]},{40:985,77:[1,984],79:75,89:$V7,143:$V_,144:988,145:$VG1,149:$Vi4,152:$V11,181:$V51,184:99,189:$Vb,201:989,307:$Vr1,346:981,347:982,348:[1,983],349:$Vj4,424:193,425:$Vv1,429:$Vw1},o($Vx1,$Vy1,{345:990,198:$Vz1}),{77:$Vk4,143:$V_,144:988,145:$VG1,149:$Vi4,152:$V11,181:$V51,201:989,307:$Vr1,346:991,347:992,349:$Vj4,424:193,425:$Vv1,429:$Vw1},{230:[1,995],460:994},{2:$V1,3:223,4:$V2,5:$V3,77:[1,997],132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,199:217,200:219,201:218,202:221,209:996,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},{231:[2,705]},{78:[1,998]},o($VP2,[2,1103],{211:999,3:1000,2:$V1,4:$V2,5:$V3}),o($VO2,[2,1102]),o($VP2,[2,183]),{2:$V1,3:1001,4:$V2,5:$V3},{212:[1,1002]},o($VP2,[2,187]),{2:$V1,3:1003,4:$V2,5:$V3},o($VP2,[2,191]),{2:$V1,3:1004,4:$V2,5:$V3},o($VP2,[2,195]),{2:$V1,3:1005,4:$V2,5:$V3},o($VP2,[2,198]),{2:$V1,3:1006,4:$V2,5:$V3},{2:$V1,3:1007,4:$V2,5:$V3},{148:[1,1008]},o($Vl4,[2,172],{82:1009,183:[1,1010]}),{2:$V1,3:223,4:$V2,5:$V3,132:[1,1015],143:$V_,145:[1,1016],152:$V11,156:$VL,181:$V51,199:1011,200:1012,201:1013,202:1014,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1},{2:$V1,3:1021,4:$V2,5:$V3,109:1017,110:1018,111:1019,112:$Vm4},o($VV2,[2,1068]),o($Vn4,[2,1059],{91:1022,182:1023,183:[1,1024]}),o($VE1,[2,1058],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o([2,4,5,10,72,74,76,78,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,198,244,245,285,286,287,288,289,290,291,292,311,315,425,429,607,768],[2,90],{77:[1,1029]}),{119:[1,1030]},o($Vr4,[2,93]),{2:$V1,3:1031,4:$V2,5:$V3},o($Vr4,[2,95]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1032,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1033,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,114:743,115:$V52,116:$V62,117:1035,118:$V_2,122:$V$2,123:$V03,124:$V13,125:1034,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{77:[1,1036]},{77:[1,1037]},{77:[1,1038]},{77:[1,1039]},o($Vr4,[2,104]),o($Vr4,[2,105]),o($Vr4,[2,106]),o($Vr4,[2,107]),o($Vr4,[2,108]),o($Vr4,[2,109]),{2:$V1,3:1040,4:$V2,5:$V3},{2:$V1,3:1041,4:$V2,5:$V3,133:[1,1042]},o($Vr4,[2,113]),o($Vr4,[2,114]),o($Vr4,[2,115]),o($Vr4,[2,116]),o($Vr4,[2,117]),o($Vr4,[2,118]),{2:$V1,3:1043,4:$V2,5:$V3,77:$VI2,113:676,131:$VX,132:$VY,143:$V_,152:$V11,181:$V51,196:677,201:679,261:678,299:$Vl1,300:$Vm1,301:$Vn1,307:$Vr1,424:680,429:$Vw1},{145:[1,1044]},{77:[1,1045]},{145:[1,1046]},o($Vr4,[2,123]),{77:[1,1047]},{2:$V1,3:1048,4:$V2,5:$V3},{77:[1,1049]},{77:[1,1050]},{77:[1,1051]},{77:[1,1052]},{77:[1,1053],164:[1,1054]},{77:[1,1055]},{77:[1,1056]},{77:[1,1057]},{77:[1,1058]},{77:[1,1059]},{77:[1,1060]},{77:[1,1061]},{77:[1,1062]},{77:[1,1063]},{77:[2,1083]},{77:[2,1084]},{2:$V1,3:248,4:$V2,5:$V3,199:1064},{2:$V1,3:248,4:$V2,5:$V3,199:1065},{113:1066,132:$VY,301:$Vn1},o($VK,[2,605],{112:[1,1067]}),{2:$V1,3:248,4:$V2,5:$V3,199:1068},{113:1069,132:$VY,301:$Vn1},{2:$V1,3:1070,4:$V2,5:$V3},o($VK,[2,702]),o($VK,[2,68]),{2:$V1,3:240,4:$V2,5:$V3,75:1071},{77:[1,1072]},o($VK,[2,683]),o($VK,[2,595]),{2:$V1,3:1021,4:$V2,5:$V3,111:1075,143:$Vs4,145:$Vt4,147:1073,341:1074,342:1076},{144:1079,145:$VG1,424:193,425:$Vv1,429:$Vw1},o($VK,[2,680]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1080,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($V44,$V54,{259:148,200:149,260:150,111:151,258:152,196:153,261:154,113:155,262:156,201:157,202:158,263:159,264:160,265:161,144:163,266:164,267:165,56:167,158:170,3:171,424:193,94:1081,2:$V1,4:$V2,5:$V3,77:$VW,131:$VX,132:$VY,137:$VZ,143:$V_,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,179:$V31,180:$V41,181:$V51,244:$V61,245:$V71,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,425:$Vv1,429:$Vw1}),{113:1082,132:$VY,301:$Vn1},{2:$V1,3:271,4:$V2,5:$V3,451:1083,452:$VJ1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1085,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,230:$VH3,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1,434:1084,438:$VI3},o($VK,[2,660]),{114:1087,115:$V52,116:$V62,124:[1,1086]},o($VK,[2,672]),o($VK,[2,673]),{2:$V1,3:1089,4:$V2,5:$V3,77:$Vu4,131:$Vv4,437:1088},{114:814,115:$V52,116:$V62,124:[1,1092],435:1093},o($VK,[2,763],{74:$VJ3}),{2:$V1,3:100,4:$V2,5:$V3,509:1094},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,174:1095,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:823,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,174:1096,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:823,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,174:1097,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:823,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VM3,[2,151]),o($VM3,[2,1098],{74:$Vw4}),o($Vx4,[2,277]),o($Vx4,[2,284],{114:632,332:644,3:1100,113:1102,2:$V1,4:$V2,5:$V3,76:[1,1099],99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,131:[1,1101],132:$VY,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,301:$Vn1,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VM1,[2,1099],{197:1103,769:[1,1104]}),{131:$VX,196:1105},{74:$VJ3,78:[1,1106]},o($VJ,[2,11]),{148:[1,1107],190:[1,1108]},{190:[1,1109]},{190:[1,1110]},{190:[1,1111]},o($VK,[2,584],{76:[1,1113],77:[1,1112]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1114,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VG2,[2,353]),o($VL3,[2,1122]),o($VL3,[2,1119]),o($VL3,[2,1120]),{74:$VE3,78:[1,1115]},{74:$VE3,78:[1,1116]},o($VG2,[2,356]),{74:[1,1117]},{74:[1,1118]},{74:[1,1119]},{74:[1,1120]},{74:[1,1121],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VG2,[2,362]),o($VK,[2,589]),{303:[1,1122]},{2:$V1,3:1123,4:$V2,5:$V3,113:1124,132:$VY,301:$Vn1},{2:$V1,3:248,4:$V2,5:$V3,199:1125},{230:[1,1126]},{2:$V1,3:585,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,436:592,479:1127,480:583,483:584,487:589,498:586,502:588},o($VK,[2,740],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VK3,[2,1155],{482:1128,488:1129,76:$Vy4}),o($VQ3,[2,1154]),{2:$V1,3:1133,4:$V2,5:$V3,132:$VX1,137:$VY1,144:1132,145:$VG1,152:$VZ1,424:193,425:$Vv1,429:$Vw1,480:1131,498:586,502:588},{2:$V1,3:1133,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,436:592,480:1135,483:1134,487:589,498:586,502:588},{2:$V1,3:585,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,436:592,478:1136,479:582,480:583,483:584,487:589,498:586,502:588},o($VU3,[2,1173],{496:1137,132:[1,1138]}),o($VS3,[2,1172]),o($VV3,[2,1179],{500:1139,502:1140,152:$VZ1}),o($VU3,[2,1178]),o($VV3,[2,756]),o($VV3,[2,1182]),o($VS3,[2,759]),o($VS3,[2,760]),o($VV3,[2,758]),o($VW3,[2,750]),{2:$V1,3:248,4:$V2,5:$V3,199:1141},{2:$V1,3:248,4:$V2,5:$V3,199:1142},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1143,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vz4,[2,1149],{472:1144,113:1145,132:$VY,301:$Vn1}),o($VX3,[2,1148]),{2:$V1,3:1146,4:$V2,5:$V3},{340:$VA4,343:$VB4,344:$VC4,516:1147},{2:$V1,3:248,4:$V2,5:$V3,199:1151},o($VY3,[2,775]),o($VY3,[2,776]),o($VY3,[2,777]),{129:[1,1152]},{271:[1,1153]},{271:[1,1154]},o($V$1,[2,697]),o($V$1,[2,698],{124:[1,1155]}),{4:$V24,7:888,277:1156,392:887,394:$V34},o([2,4,10,53,72,74,76,77,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,551],{5:[1,1157]}),o([2,5,10,53,72,74,76,78,89,93,95,98,99,107,112,115,116,118,122,123,124,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,230,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,302,305,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,348,361,373,374,378,379,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,548],{4:[1,1159],77:[1,1158]}),{77:[1,1160]},o($VD4,[2,4]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1161,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK,[2,597]),o($VO3,[2,577]),{2:$V1,3:1162,4:$V2,5:$V3,113:1163,132:$VY,301:$Vn1},o($VK,[2,573],{74:$VE4}),o($V$1,[2,575]),o($VK,[2,622],{74:$VE4}),o($VK,[2,677]),o($VK,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:1165,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VF4,[2,385],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($Va4,[2,386],{114:632,332:644,321:$Vp2}),o($VF4,[2,387],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VG4,[2,388],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,319:[1,1166],321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VG4,[2,390],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,319:[1,1167],321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VF1,[2,392],{114:632,332:644}),o($V94,[2,393],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,180:$Vk2,317:$Vm2,321:$Vp2}),o($V94,[2,394],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,180:$Vk2,317:$Vm2,321:$Vp2}),o($VH4,[2,395],{114:632,332:644,115:$V52,116:$V62,123:$V72,136:$Va2,317:$Vm2,321:$Vp2}),o($VH4,[2,396],{114:632,332:644,115:$V52,116:$V62,123:$V72,136:$Va2,317:$Vm2,321:$Vp2}),o($VH4,[2,397],{114:632,332:644,115:$V52,116:$V62,123:$V72,136:$Va2,317:$Vm2,321:$Vp2}),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,112,118,122,123,124,128,129,130,131,132,133,134,135,137,138,139,140,141,142,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,179,180,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,316,318,319,320,322,323,324,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,398],{114:632,332:644,115:$V52,116:$V62,136:$Va2,317:$Vm2,321:$Vp2}),o($VI4,[2,399],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2}),o($VI4,[2,400],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2}),o($VI4,[2,401],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2}),o($VI4,[2,402],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2}),o($VE2,[2,403],{77:$VS1}),o($VF1,[2,404]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1168,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,406]),o($VE2,[2,407],{77:$VS1}),o($VF1,[2,408]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1169,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,410]),o($VJ4,[2,411],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,412],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,413],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,414],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o([2,4,5,10,53,72,89,99,124,139,140,146,154,156,170,171,189,271,272,294,311,315,325,326,327,328,329,330,331,335,336,338,340,343,344,401,405,406,409,411,413,414,422,423,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,522,607,768],$VK4,{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,416],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,417],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,418],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,419],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($VJ4,[2,420],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),{77:[1,1170]},{77:[2,455]},{77:[2,456]},{77:[2,457]},o($VL4,[2,423],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,337:$VC2}),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,107,118,122,128,129,130,131,132,134,135,137,143,145,146,148,149,150,152,156,162,164,166,168,169,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,319,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,424],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2}),{2:$V1,3:171,4:$V2,5:$V3,40:1171,56:167,77:$VW,78:[1,1173],79:75,89:$V7,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1172,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,184:99,189:$Vb,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,437]),o($VF1,[2,439]),o($VF1,[2,446]),o($VF1,[2,447]),{2:$V1,3:674,4:$V2,5:$V3,77:[1,1174]},{2:$V1,3:702,4:$V2,5:$V3,77:[1,1175],111:943,145:$V64,156:$VL,200:944,202:1177,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,334:1176},o($VF1,[2,444]),o($VL4,[2,441],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,337:$VC2}),o($VL4,[2,442],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,337:$VC2}),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,99,107,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,189,198,206,208,222,223,224,225,226,227,228,229,232,239,244,245,246,247,249,251,271,272,285,286,287,288,289,290,291,292,294,301,305,311,313,314,315,319,325,326,327,328,329,330,331,335,336,337,338,340,343,344,401,405,406,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,469,475,510,512,513,522,607,768],[2,443],{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VF1,[2,445]),o($VF1,[2,310]),o($VF1,[2,311]),o($VF1,[2,312]),o($VF1,[2,430]),{74:$VE3,78:[1,1178]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1179,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1180,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,$VM4),o($VN4,[2,290]),o($VF1,[2,286]),{78:[1,1182],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1183]},{310:1184,311:$Vb4,312:966,313:$VJ2,315:$Vc4},{311:[1,1185]},o($Vd4,[2,380]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1186,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,314:[1,1187],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{76:[1,1188],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{74:[1,1189]},o($VK2,[2,649]),{2:$V1,3:702,4:$V2,5:$V3,77:$VL2,111:697,113:695,131:$VX,132:$VY,143:$V_,144:692,145:$VG1,152:$V11,156:$VL,181:$V51,196:694,200:700,201:699,261:696,262:698,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,305:[1,1190],307:$Vr1,424:193,425:$Vv1,427:1191,428:693,429:$Vw1},{78:[1,1192],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:1193,4:$V2,5:$V3,149:$V84},o($VF1,[2,373]),o($VK2,[2,646]),{2:$V1,3:711,4:$V2,5:$V3,131:$VM2,132:$VN2,431:[1,1194],433:1195},{2:$V1,3:702,4:$V2,5:$V3,77:$VL2,111:697,113:695,131:$VX,132:$VY,143:$V_,144:692,145:$VG1,152:$V11,156:$VL,181:$V51,196:694,200:700,201:699,261:696,262:698,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1,424:193,425:$Vv1,427:1196,428:693,429:$Vw1},{2:$V1,3:702,4:$V2,5:$V3,77:$VL2,111:697,113:695,131:$VX,132:$VY,143:$V_,144:692,145:$VG1,152:$V11,156:$VL,181:$V51,196:694,200:700,201:699,261:696,262:698,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1,424:193,425:$Vv1,427:1197,428:693,429:$Vw1},{2:$V1,3:702,4:$V2,5:$V3,77:$VL2,111:697,113:695,131:$VX,132:$VY,143:$V_,144:692,145:$VG1,152:$V11,156:$VL,181:$V51,196:694,200:700,201:699,261:696,262:698,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1,424:193,425:$Vv1,427:1198,428:693,429:$Vw1},{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1199,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,467],{74:$VP4}),{149:$Vi4,346:1201,349:$Vj4},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1205,100:1202,111:1204,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,350:1203,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,475]),o($VQ4,[2,478]),o($VQ4,[2,479]),o($VR4,[2,483]),o($VR4,[2,484]),{2:$V1,3:248,4:$V2,5:$V3,199:1206},{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1207,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,471],{74:$VP4}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1205,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,350:1203,424:193,425:$Vv1,429:$Vw1},{313:$VS4,461:1208,463:1209,464:1210},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1212,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{230:[2,706]},{2:$V1,3:223,4:$V2,5:$V3,40:718,77:$VA1,79:75,89:$V7,132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,184:99,189:$Vb,199:217,200:219,201:218,202:221,209:1213,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},o($VP2,[2,181],{3:1214,2:$V1,4:$V2,5:$V3,76:[1,1215]}),o($VP2,[2,182]),o($VP2,[2,1104]),o($VP2,[2,184]),o($VP2,[2,186]),o($VP2,[2,188]),o($VP2,[2,192]),o($VP2,[2,196]),o($VP2,[2,199]),o([2,4,5,10,53,72,74,76,77,78,89,93,95,98,118,124,128,143,145,146,148,149,152,154,156,162,168,169,181,183,187,189,206,208,222,223,224,225,226,227,228,229,230,231,232,249,251,271,272,294,302,307,311,315,340,343,344,348,349,361,373,374,378,379,401,405,406,407,408,409,411,413,414,422,423,425,429,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,519,520,521,522,607,768],[2,201]),{2:$V1,3:1216,4:$V2,5:$V3},o($VT4,[2,1055],{83:1217,92:1218,93:[1,1219],98:[1,1220]}),{2:$V1,3:223,4:$V2,5:$V3,77:[1,1222],132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,199:217,200:219,201:218,202:221,203:1221,209:1223,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},o($VS2,[2,164]),o($VS2,[2,165]),o($VS2,[2,166]),o($VS2,[2,167]),o($VS2,[2,168]),{2:$V1,3:674,4:$V2,5:$V3},o($VD1,[2,83],{74:[1,1224]}),o($VU4,[2,85]),o($VU4,[2,86]),{113:1225,132:$VY,301:$Vn1},o([10,72,74,78,93,98,118,124,128,162,168,169,183,198,206,208,222,223,224,225,226,227,228,229,232,249,251,311,315,607,768],$VF2,{116:$Vg4}),o($Vn4,[2,73]),o($Vn4,[2,1060]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1226,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vr4,[2,126]),o($Vr4,[2,144]),o($Vr4,[2,145]),o($Vr4,[2,146]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,78:[2,1075],94:265,111:151,113:155,127:1227,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1228,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{77:[1,1229]},o($Vr4,[2,94]),o([2,4,5,10,72,74,76,77,78,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,198,244,245,285,286,287,288,289,290,291,292,311,315,425,429,607,768],[2,96],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o([2,4,5,10,72,74,76,77,78,112,118,122,124,128,129,130,131,132,134,135,137,139,140,143,145,146,148,149,150,152,154,156,162,164,166,168,169,170,171,172,173,175,181,183,185,187,198,244,245,285,286,287,288,289,290,291,292,311,315,425,429,607,768],[2,97],{114:632,332:644,99:$V32,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1230],112:$VZ2,114:743,115:$V52,116:$V62,117:1231,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},o($VV4,[2,1071],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,114:743,115:$V52,116:$V62,117:1233,118:$V_2,122:$V$2,123:$V03,124:$V13,126:1232,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1234,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1235,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1236,4:$V2,5:$V3},o($Vr4,[2,110]),o($Vr4,[2,111]),o($Vr4,[2,112]),o($Vr4,[2,119]),{2:$V1,3:1237,4:$V2,5:$V3},{2:$V1,3:1021,4:$V2,5:$V3,111:1075,143:$Vs4,145:$Vt4,147:1238,341:1074,342:1076},{2:$V1,3:1239,4:$V2,5:$V3},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1240,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vr4,[2,125]),o($VV4,[2,1077],{155:1241}),o($VV4,[2,1079],{157:1242}),o($VV4,[2,1081],{159:1243}),o($VV4,[2,1085],{161:1244}),o($VW4,$VX4,{163:1245,178:1246}),{77:[1,1247]},o($VV4,[2,1087],{165:1248}),o($VV4,[2,1089],{167:1249}),o($VW4,$VX4,{178:1246,163:1250}),o($VW4,$VX4,{178:1246,163:1251}),o($VW4,$VX4,{178:1246,163:1252}),o($VW4,$VX4,{178:1246,163:1253}),{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,114:743,115:$V52,116:$V62,117:1254,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,174:1255,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:823,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VY4,[2,1091],{176:1256}),o($VK,[2,615],{183:[1,1257]}),o($VK,[2,611],{183:[1,1258]}),o($VK,[2,604]),{113:1259,132:$VY,301:$Vn1},o($VK,[2,613],{183:[1,1260]}),o($VK,[2,608]),o($VK,[2,609],{112:[1,1261]}),o($VC3,[2,69]),{40:1262,79:75,89:$V7,184:99,189:$Vb},o($VK,[2,459],{74:$VZ4,128:[1,1263]}),o($V_4,[2,460]),{124:[1,1265]},{2:$V1,3:1266,4:$V2,5:$V3},o($Vx1,[2,1125]),o($Vx1,[2,1126]),o($VK,[2,627]),o($VF3,[2,364],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VJ4,$VK4,{114:632,332:644,112:$V42,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,337:$VC2}),o($V$1,[2,691]),o($V$1,[2,693]),o($VK,[2,659]),o($VK,[2,661],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1267,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1089,4:$V2,5:$V3,77:$Vu4,131:$Vv4,437:1268},o($V$4,[2,668]),o($V$4,[2,669]),o($V$4,[2,670]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1269,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1270,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{114:1087,115:$V52,116:$V62,124:[1,1271]},o($VK3,[2,765]),o($VM3,[2,148],{74:$Vw4}),o($VM3,[2,149],{74:$Vw4}),o($VM3,[2,150],{74:$Vw4}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:1272,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1273,4:$V2,5:$V3,113:1275,131:[1,1274],132:$VY,301:$Vn1},o($Vx4,[2,279]),o($Vx4,[2,281]),o($Vx4,[2,283]),o($VM1,[2,160]),o($VM1,[2,1100]),{78:[1,1276]},o($VP1,[2,768]),{2:$V1,3:1277,4:$V2,5:$V3},{2:$V1,3:1278,4:$V2,5:$V3},{2:$V1,3:1280,4:$V2,5:$V3,389:1279},{2:$V1,3:1280,4:$V2,5:$V3,389:1281},{2:$V1,3:1282,4:$V2,5:$V3},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1283,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1284,4:$V2,5:$V3},{74:$VE3,78:[1,1285]},o($VG2,[2,354]),o($VG2,[2,355]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1286,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1287,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1288,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1289,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1290,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VO3,[2,513]),o($VK,$V05,{412:1291,76:$V15,77:[1,1292]}),o($VK,$V05,{412:1294,76:$V15}),{77:[1,1295]},{2:$V1,3:248,4:$V2,5:$V3,199:1296},o($VK3,[2,741]),o($VK3,[2,743]),o($VK3,[2,1156]),{143:$VK1,145:$VL1,436:1297},o($V25,[2,1157],{424:193,484:1298,144:1299,145:$VG1,425:$Vv1,429:$Vw1}),{76:$Vy4,139:[2,1161],486:1300,488:1301},o([10,74,76,78,132,139,145,152,311,315,425,429,607,768],$VT3,{495:860,498:861,137:$VY1}),o($VK3,[2,746]),o($VK3,$VR3),{74:$VP3,78:[1,1302]},o($VV3,[2,1175],{497:1303,502:1304,152:$VZ1}),o($VU3,[2,1174]),o($VV3,[2,755]),o($VV3,[2,1180]),o($VK,[2,499],{77:[1,1305]}),{76:[1,1307],77:[1,1306]},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,148:[1,1308],154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VO4,$V35,{79:75,184:99,473:1309,40:1312,89:$V7,146:$V45,189:$Vb,475:$V55}),o($Vz4,[2,1150]),o($VX3,[2,733]),{230:[1,1313]},o($V65,[2,779]),o($V65,[2,780]),o($V65,[2,781]),o($VY3,$VZ3,{515:1314,95:$V_3,519:$V$3,520:$V04,521:$V14}),o($VY3,[2,778]),o($VK,[2,317]),o($VK,[2,318]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1315,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($V$1,[2,699],{124:[1,1316]}),o($VD4,[2,550]),{131:[1,1318],393:1317,395:[1,1319]},o($VD4,[2,5]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1205,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,350:1320,424:193,425:$Vv1,429:$Vw1},o($VK,[2,464],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VK,[2,598]),o($VK,[2,599]),{2:$V1,3:248,4:$V2,5:$V3,199:1321},o($VK,[2,679]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1322,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1323,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{78:[1,1324],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1325],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:171,4:$V2,5:$V3,40:1326,56:167,77:$VW,79:75,89:$V7,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1327,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,184:99,189:$Vb,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{78:[1,1328]},{74:$VE3,78:[1,1329]},o($VF1,[2,435]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1330,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,40:1331,56:167,77:$VW,78:[1,1333],79:75,89:$V7,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1332,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,184:99,189:$Vb,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,438]),o($VF1,[2,440]),o($VF1,$V75,{280:1334,281:$V85}),{78:[1,1336],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1337],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:1338,4:$V2,5:$V3,180:[1,1339]},o($VK2,[2,628]),o($VF1,[2,372]),{311:[1,1340]},o($VF1,[2,379]),{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,311:[2,383],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1341,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{4:$V24,7:888,277:1342,392:887,394:$V34},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1343,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK2,[2,650]),o($Ve4,[2,657]),o($Vf4,[2,645]),o($VN4,$VM4),o($VK2,[2,647]),o($Vh4,[2,652]),o($Vh4,[2,654]),o($Vh4,[2,655]),o($Vh4,[2,656]),o($VO4,[2,466],{74:$VP4}),{77:[1,1345],143:$V_,144:1346,145:$VG1,152:$V11,181:$V51,201:1347,307:$Vr1,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,472]),{74:$V95,78:[1,1348]},{74:$Va5,78:[1,1350]},o([74,78,99,112,115,116,123,124,133,136,138,139,140,141,142,154,170,171,179,180,316,317,318,320,321,322,323,324,325,326,327,328,329,330,331,335,336,337,338],$Vb5),o($Vc5,[2,488],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{40:1354,77:$Vk4,79:75,89:$V7,143:$V_,144:988,145:$VG1,149:$Vi4,152:$V11,181:$V51,184:99,189:$Vb,201:989,307:$Vr1,346:1352,347:1353,349:$Vj4,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,470],{74:$VP4}),o($VK,[2,727],{462:1355,463:1356,464:1357,313:$VS4,469:[1,1358]}),o($Vd5,[2,711]),o($Vd5,[2,712]),{154:[1,1360],465:[1,1359]},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,313:[2,708],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1361]},o($VP2,[2,179]),{2:$V1,3:1362,4:$V2,5:$V3},o($VK,[2,583]),o($Ve5,[2,239],{84:1363,128:[1,1364]}),o($VT4,[2,1056]),{77:[1,1365]},{77:[1,1366]},o($Vl4,[2,169],{204:1367,215:1369,205:1370,216:1371,221:1374,74:$Vf5,206:$Vg5,208:$Vh5,222:$Vi5,223:$Vj5,224:$Vk5,225:$Vl5,226:$Vm5,227:$Vn5,228:$Vo5,229:$Vp5}),{2:$V1,3:223,4:$V2,5:$V3,40:718,77:$VA1,79:75,89:$V7,132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,184:99,189:$Vb,199:217,200:219,201:218,202:221,203:1383,209:1223,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},o($Vq5,[2,177]),{2:$V1,3:1021,4:$V2,5:$V3,110:1384,111:1019,112:$Vm4},o($VU4,[2,87]),o($Vn4,[2,147],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{78:[1,1385]},{74:$VE3,78:[2,1076]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,78:[2,1069],94:1390,111:151,113:155,120:1386,121:1387,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1388,244:$V61,245:$V71,246:[1,1389],258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vr4,[2,98]),o($VV4,[2,1072],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1391],112:$VZ2,114:743,115:$V52,116:$V62,117:1392,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},o($VV4,[2,1073],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),{78:[1,1393],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1394],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1395]},o($Vr4,[2,120]),{74:$VZ4,78:[1,1396]},o($Vr4,[2,122]),{74:$VE3,78:[1,1397]},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1398],112:$VZ2,114:743,115:$V52,116:$V62,117:1399,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1400],112:$VZ2,114:743,115:$V52,116:$V62,117:1401,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1402],112:$VZ2,114:743,115:$V52,116:$V62,117:1403,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1404],112:$VZ2,114:743,115:$V52,116:$V62,117:1405,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{74:$Vr5,78:[1,1406]},o($Vc5,[2,143],{424:193,3:740,114:743,144:765,158:775,160:776,117:1408,2:$V1,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,115:$V52,116:$V62,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,425:$Vv1,429:$Vw1}),o($VW4,$VX4,{178:1246,163:1409}),{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1410],112:$VZ2,114:743,115:$V52,116:$V62,117:1411,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,78:[1,1412],112:$VZ2,114:743,115:$V52,116:$V62,117:1413,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{74:$Vr5,78:[1,1414]},{74:$Vr5,78:[1,1415]},{74:$Vr5,78:[1,1416]},{74:$Vr5,78:[1,1417]},{78:[1,1418],153:1025,179:$Vo4,180:$Vp4,181:$Vq4},{74:$Vw4,78:[1,1419]},{2:$V1,3:740,4:$V2,5:$V3,72:$VW2,74:[1,1420],76:$VX2,77:$VY2,112:$VZ2,114:743,115:$V52,116:$V62,117:1421,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,144:765,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,158:775,160:776,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1422,4:$V2,5:$V3},{2:$V1,3:1423,4:$V2,5:$V3},o($VK,[2,606]),{2:$V1,3:1424,4:$V2,5:$V3},{113:1425,132:$VY,301:$Vn1},{78:[1,1426]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1427,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1021,4:$V2,5:$V3,111:1075,143:$Vs4,145:$Vt4,341:1428,342:1076},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1429,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{124:[1,1430]},o($VK,[2,662],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($V$4,[2,667]),{78:[1,1431],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VK,[2,663],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1432,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vx4,[2,276]),o($Vx4,[2,278]),o($Vx4,[2,280]),o($Vx4,[2,282]),o($VM1,[2,161]),o($VK,[2,578]),{148:[1,1433]},o($VK,[2,579]),o($VK3,[2,545],{392:887,7:888,277:1434,4:$V24,391:[1,1435],394:$V34}),o($VK,[2,580]),o($VK,[2,582]),{74:$VE3,78:[1,1436]},o($VK,[2,586]),o($VG2,[2,352]),{74:[1,1437],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{74:[1,1438],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{74:[1,1439],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{74:[1,1440],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{74:[1,1441],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VK,[2,590]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1442,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1443,4:$V2,5:$V3},o($VK,[2,592]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1390,111:151,113:155,120:1444,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1388,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{77:[1,1445]},{2:$V1,3:1446,4:$V2,5:$V3},{76:$Vy4,139:[2,1159],485:1447,488:1448},o($V25,[2,1158]),{139:[1,1449]},{139:[2,1162]},o($VK3,[2,747]),o($VV3,[2,754]),o($VV3,[2,1176]),{2:$V1,3:1280,4:$V2,5:$V3,76:[1,1452],356:1450,363:1451,389:1453},{2:$V1,3:1021,4:$V2,5:$V3,100:1454,111:1455},{40:1456,79:75,89:$V7,184:99,189:$Vb},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1457,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,732]),{2:$V1,3:1021,4:$V2,5:$V3,111:1075,143:$Vs4,145:$Vt4,147:1458,341:1074,342:1076},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1459,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,737]),{2:$V1,3:248,4:$V2,5:$V3,199:1460},{340:$VA4,343:$VB4,344:$VC4,516:1461},o($V$1,[2,700],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1462,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{74:[1,1463],78:[1,1464]},o($Vc5,[2,552]),o($Vc5,[2,553]),{74:$Va5,78:[1,1465]},o($V$1,[2,574]),o($VF4,[2,389],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VF4,[2,391],{114:632,332:644,115:$V52,116:$V62,123:$V72,133:$V92,136:$Va2,138:$Vb2,141:$Ve2,142:$Vf2,179:$Vj2,180:$Vk2,317:$Vm2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2}),o($VF1,[2,405]),o($VF1,[2,409]),{78:[1,1466]},{74:$VE3,78:[1,1467]},o($VF1,[2,431]),o($VF1,[2,433]),{78:[1,1468],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1469]},{74:$VE3,78:[1,1470]},o($VF1,[2,436]),o($VF1,[2,333]),{77:[1,1471]},o($VF1,$V75,{280:1472,281:$V85}),o($VF1,$V75,{280:1473,281:$V85}),o($VN4,[2,288]),o($VF1,[2,285]),o($VF1,[2,378]),o($Vd4,[2,382],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{74:[1,1475],78:[1,1474]},{74:[1,1477],78:[1,1476],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{2:$V1,3:1338,4:$V2,5:$V3},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1205,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,350:1478,424:193,425:$Vv1,429:$Vw1},o($VR4,[2,486]),o($VR4,[2,487]),{40:1481,77:$Vk4,79:75,89:$V7,143:$V_,144:988,145:$VG1,149:$Vi4,152:$V11,181:$V51,184:99,189:$Vb,201:989,307:$Vr1,346:1479,347:1480,349:$Vj4,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1021,4:$V2,5:$V3,111:1482},o($VR4,[2,482]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1483,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1484,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,469],{74:$VP4}),o($VO4,[2,476]),o($VK,[2,703]),o($Vd5,[2,709]),o($Vd5,[2,710]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:824,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,174:1485,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,257:823,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{170:[1,1487],314:[1,1486]},{465:[1,1488]},{230:[2,707]},o($VP2,[2,180]),o($Vs5,[2,241],{85:1489,232:[1,1490]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1491,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1492,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1493,4:$V2,5:$V3},o($Vl4,[2,170],{216:1371,221:1374,215:1494,205:1495,206:$Vg5,208:$Vh5,222:$Vi5,223:$Vj5,224:$Vk5,225:$Vl5,226:$Vm5,227:$Vn5,228:$Vo5,229:$Vp5}),{2:$V1,3:223,4:$V2,5:$V3,77:$VA1,132:$VB1,143:$V_,144:216,145:$V$,152:$V11,156:$VL,181:$V51,199:217,200:219,201:218,202:221,209:1496,213:$VC1,214:222,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},o($Vt5,[2,205]),o($Vt5,[2,206]),{2:$V1,3:223,4:$V2,5:$V3,77:[1,1501],143:$V_,144:1499,145:$V$,152:$V11,156:$VL,181:$V51,199:1498,200:1502,201:1500,202:1503,217:1497,270:$VM,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,307:$Vr1,424:193,425:$Vv1,429:$Vw1},{207:[1,1504],223:$Vu5},{207:[1,1506],223:$Vv5},o($Vw5,[2,222]),{206:[1,1510],208:[1,1509],221:1508,223:$Vj5,224:$Vk5,225:$Vl5,226:$Vm5,227:$Vn5,228:$Vo5,229:$Vp5},o($Vw5,[2,224]),{223:[1,1511]},{208:[1,1513],223:[1,1512]},{208:[1,1515],223:[1,1514]},{208:[1,1516]},{223:[1,1517]},{223:[1,1518]},{74:$Vf5,204:1519,205:1370,206:$Vg5,208:$Vh5,215:1369,216:1371,221:1374,222:$Vi5,223:$Vj5,224:$Vk5,225:$Vl5,226:$Vm5,227:$Vn5,228:$Vo5,229:$Vp5},o($VU4,[2,84]),o($Vr4,[2,100]),{74:$Vx5,78:[1,1520]},{78:[1,1522]},o($Vy5,[2,262]),{78:[2,1070]},o($Vy5,[2,266],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,246:[1,1523],247:[1,1524],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($Vr4,[2,99]),o($VV4,[2,1074],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,101]),o($Vr4,[2,102]),o($Vr4,[2,103]),o($Vr4,[2,121]),o($Vr4,[2,124]),o($Vr4,[2,127]),o($VV4,[2,1078],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,128]),o($VV4,[2,1080],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,129]),o($VV4,[2,1082],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,130]),o($VV4,[2,1086],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,131]),o($VW4,[2,1093],{177:1525}),o($VW4,[2,1096],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),{74:$Vr5,78:[1,1526]},o($Vr4,[2,133]),o($VV4,[2,1088],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,134]),o($VV4,[2,1090],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,135]),o($Vr4,[2,136]),o($Vr4,[2,137]),o($Vr4,[2,138]),o($Vr4,[2,139]),o($Vr4,[2,140]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:265,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,151:1527,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VY4,[2,1092],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($VK,[2,616]),o($VK,[2,612]),o($VK,[2,614]),o($VK,[2,610]),o($VC3,[2,71]),o($VK,[2,458],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($V_4,[2,461]),o($V_4,[2,462],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1528,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($V$4,[2,671]),o($VK,[2,664],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:1529,4:$V2,5:$V3},o($VK3,[2,554],{390:1530,396:1531,397:1532,371:1540,154:$Vz5,187:$VA5,230:$VB5,302:$VC5,348:$VD5,361:$VE5,373:$VF5,374:$VG5,378:$VH5,379:$VI5}),o($VK3,[2,544]),o($VK,[2,585],{76:[1,1544]}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1545,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1546,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1547,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1548,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1549,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{74:$VE3,78:[1,1550]},o($VK,[2,594]),{74:$Vx5,78:[1,1551]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1390,111:151,113:155,120:1552,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1388,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o([10,74,78,139,311,315,607,768],[2,751]),{139:[1,1553]},{139:[2,1160]},{2:$V1,3:1133,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,436:592,480:1135,483:1554,487:589,498:586,502:588},{78:[1,1555]},{74:[1,1556],78:[2,515]},{40:1557,79:75,89:$V7,184:99,189:$Vb},o($Vc5,[2,541]),{74:$V95,78:[1,1558]},o($Vq5,$Vb5),o($VK,[2,1143],{417:1559,418:1560,72:$VJ5}),o($VO4,$V35,{79:75,184:99,114:632,332:644,40:1312,473:1562,89:$V7,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,146:$V45,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,189:$Vb,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2,475:$V55}),o($VO4,[2,735],{74:$VZ4}),o($VO4,[2,736],{74:$VE3}),o([10,53,72,89,124,146,156,189,271,272,294,311,315,340,343,344,401,405,406,409,411,413,414,422,423,439,441,442,444,445,446,447,448,452,453,456,457,510,512,513,522,607,768],[2,1191],{517:1563,3:1564,2:$V1,4:$V2,5:$V3,76:[1,1565]}),o($VK5,[2,1193],{518:1566,76:[1,1567]}),o($V$1,[2,701],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{131:[1,1568]},o($VD4,[2,547]),o($VD4,[2,549]),o($VF1,[2,421]),o($VF1,[2,422]),o($VF1,[2,448]),o($VF1,[2,432]),o($VF1,[2,434]),{118:$VL5,282:1569,283:1570,284:[1,1571]},o($VF1,[2,334]),o($VF1,[2,335]),o($VF1,[2,321]),{131:[1,1573]},o($VF1,[2,323]),{131:[1,1574]},{74:$Va5,78:[1,1575]},{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1576,424:193,425:$Vv1,429:$Vw1},o($VO4,[2,474],{74:$VP4}),o($VO4,[2,477]),o($Vq5,[2,497]),o($Vc5,[2,489],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VO4,[2,468],{74:$VP4}),o($VK,[2,728],{74:$Vw4,198:[1,1577]}),{340:$VM5,343:$VN5,466:1578},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1581,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{119:[1,1583],170:[1,1584],314:[1,1582]},o($VO5,[2,260],{86:1585,118:[1,1586]}),{119:[1,1587]},o($Ve5,[2,240],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{95:[1,1588],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{95:[1,1589]},o($Vt5,[2,203]),o($Vt5,[2,204]),o($Vq5,[2,178]),o($Vt5,[2,238],{218:1590,230:[1,1591],231:[1,1592]}),o($VP5,[2,208],{3:1593,2:$V1,4:$V2,5:$V3,76:[1,1594]}),o($VQ5,[2,1105],{219:1595,76:[1,1596]}),{2:$V1,3:1597,4:$V2,5:$V3,76:[1,1598]},{40:1599,79:75,89:$V7,184:99,189:$Vb},o($VP5,[2,216],{3:1600,2:$V1,4:$V2,5:$V3,76:[1,1601]}),o($VP5,[2,219],{3:1602,2:$V1,4:$V2,5:$V3,76:[1,1603]}),{77:[1,1604]},o($Vw5,[2,234]),{77:[1,1605]},o($Vw5,[2,230]),o($Vw5,[2,223]),{223:$Vv5},{223:$Vu5},o($Vw5,[2,225]),o($Vw5,[2,226]),{223:[1,1606]},o($Vw5,[2,228]),{223:[1,1607]},{223:[1,1608]},o($Vw5,[2,232]),o($Vw5,[2,233]),{78:[1,1609],205:1495,206:$Vg5,208:$Vh5,215:1494,216:1371,221:1374,222:$Vi5,223:$Vj5,224:$Vk5,225:$Vl5,226:$Vm5,227:$Vn5,228:$Vo5,229:$Vp5},o($Vr4,[2,91]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1390,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1610,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vr4,[2,92]),o($Vy5,[2,267],{242:1611,243:[1,1612]}),{248:[1,1613]},o($Vc5,[2,142],{424:193,3:740,114:743,144:765,158:775,160:776,117:1614,2:$V1,4:$V2,5:$V3,72:$VW2,76:$VX2,77:$VY2,112:$VZ2,115:$V52,116:$V62,118:$V_2,122:$V$2,123:$V03,124:$V13,128:$V23,129:$V33,130:$V43,131:$V53,132:$V63,133:$V73,134:$V83,135:$V93,136:$Va3,137:$Vb3,138:$Vc3,139:$Vd3,140:$Ve3,141:$Vf3,142:$Vg3,143:$Vh3,145:$Vi3,146:$Vj3,148:$Vk3,149:$Vl3,150:$Vm3,152:$Vn3,154:$Vo3,156:$Vp3,162:$Vq3,164:$Vr3,166:$Vs3,168:$Vt3,169:$Vu3,170:$Vv3,171:$Vw3,172:$Vx3,173:$Vy3,175:$Vz3,185:$VA3,187:$VB3,244:$V61,245:$V71,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,425:$Vv1,429:$Vw1}),o($Vr4,[2,132]),{74:$VE3,78:[1,1615]},o($V_4,[2,463],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($VK,[2,581]),o($VK3,[2,543]),o($VK3,[2,555],{371:1540,397:1616,154:$Vz5,187:$VA5,230:$VB5,302:$VC5,348:$VD5,361:$VE5,373:$VF5,374:$VG5,378:$VH5,379:$VI5}),o($VD3,[2,557]),{375:[1,1617]},{375:[1,1618]},{2:$V1,3:248,4:$V2,5:$V3,199:1619},o($VD3,[2,563],{77:[1,1620]}),{2:$V1,3:114,4:$V2,5:$V3,77:[1,1622],113:255,131:$VX,132:$VY,143:$V_,152:$V11,156:$VL,181:$V51,196:254,200:1623,201:258,261:256,262:257,269:$VH1,270:$VI1,279:1621,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1},o($VD3,[2,567]),{302:[1,1624]},o($VD3,[2,569]),o($VD3,[2,570]),{340:[1,1625]},{77:[1,1626]},{2:$V1,3:1627,4:$V2,5:$V3},{78:[1,1628],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1629],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1630],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1631],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{78:[1,1632],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VK,$V05,{412:1633,76:$V15}),o($VK,[2,600]),{74:$Vx5,78:[1,1634]},{2:$V1,3:1133,4:$V2,5:$V3,132:$VX1,137:$VY1,143:$VK1,145:$VL1,152:$VZ1,436:592,480:1135,483:1635,487:589,498:586,502:588},o($VK3,[2,745]),o($VK,[2,502],{357:1636,359:1637,360:1638,4:$VR5,247:$VS5,348:$VT5,361:$VU5}),o($VV5,$VW5,{3:1280,364:1643,389:1644,365:1645,366:1646,2:$V1,4:$V2,5:$V3,372:$VX5}),{78:[2,516]},{76:[1,1648]},o($VK,[2,618]),o($VK,[2,1144]),{373:[1,1650],419:[1,1649]},o($VO4,[2,738]),o($VK,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:1651,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VK,[2,772]),o($VK5,[2,1192]),o($VK,$V0,{17:5,18:7,19:8,20:9,21:10,22:11,23:12,24:13,25:14,26:15,27:16,28:17,29:18,30:19,31:20,32:21,33:22,34:23,35:24,36:25,37:26,38:27,39:28,40:29,41:30,42:31,43:32,44:33,45:34,46:35,47:36,48:37,49:38,50:39,51:40,52:41,54:43,55:44,56:45,57:46,58:47,59:48,60:49,61:50,62:51,63:52,64:53,65:54,66:55,67:56,68:57,69:58,70:59,71:60,79:75,509:95,184:99,3:100,12:1652,2:$V1,4:$V2,5:$V3,53:$V5,72:$V6,89:$V7,124:$V8,146:$V9,156:$Va,189:$Vb,271:$Vc,272:$Vd,294:$Ve,340:$Vf,343:$Vg,344:$Vh,401:$Vi,405:$Vj,406:$Vk,409:$Vl,411:$Vm,413:$Vn,414:$Vo,422:$Vp,423:$Vq,439:$Vr,441:$Vs,442:$Vt,444:$Vu,445:$Vv,446:$Vw,447:$Vx,448:$Vy,452:$Vz,453:$VA,456:$VB,457:$VC,510:$VD,512:$VE,513:$VF,522:$VG}),o($VK5,[2,1194]),{78:[1,1653]},{78:[1,1654],118:$VL5,283:1655},{78:[1,1656]},{119:[1,1657]},{119:[1,1658]},{78:[1,1659]},{78:[1,1660]},o($VR4,[2,485]),o($VO4,[2,473],{74:$VP4}),{2:$V1,3:248,4:$V2,5:$V3,143:$VK1,145:$VL1,199:1662,436:1661},o($Vd5,[2,713]),o($Vd5,[2,715]),{146:[1,1663]},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,314:[1,1664],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},{344:$VY5,467:1665},{422:[1,1668],468:[1,1667]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1669,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VZ5,[2,271],{87:1670,249:[1,1671],251:[1,1672]}),{119:[1,1673]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,233:1674,235:1675,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1680,4:$V2,5:$V3},{2:$V1,3:1681,4:$V2,5:$V3},o($Vt5,[2,207]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1682,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1021,4:$V2,5:$V3,77:[1,1684],100:1683,111:1455},o($VP5,[2,209]),{2:$V1,3:1685,4:$V2,5:$V3},o($VP5,[2,1107],{220:1686,3:1687,2:$V1,4:$V2,5:$V3}),o($VQ5,[2,1106]),o($VP5,[2,212]),{2:$V1,3:1688,4:$V2,5:$V3},{78:[1,1689]},o($VP5,[2,217]),{2:$V1,3:1690,4:$V2,5:$V3},o($VP5,[2,220]),{2:$V1,3:1691,4:$V2,5:$V3},{40:1692,79:75,89:$V7,184:99,189:$Vb},{40:1693,79:75,89:$V7,184:99,189:$Vb},o($Vw5,[2,227]),o($Vw5,[2,229]),o($Vw5,[2,231]),o($Vl4,[2,171]),o($Vy5,[2,263]),o($Vy5,[2,268]),{244:[1,1694],245:[1,1695]},o($Vy5,[2,269],{246:[1,1696]}),o($VW4,[2,1094],{153:1025,179:$Vo4,180:$Vp4,181:$Vq4}),o($Vr4,[2,141]),o($VD3,[2,556]),o($VD3,[2,559]),{379:[1,1697]},o($VD3,[2,1137],{400:1698,398:1699,77:$V16}),{131:$VX,196:1701},o($VD3,[2,564]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1702,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VD3,[2,566]),o($VD3,[2,568]),{2:$V1,3:114,4:$V2,5:$V3,77:[1,1704],113:255,131:$VX,132:$VY,143:$V_,152:$V11,156:$VL,181:$V51,196:254,200:259,201:258,261:256,262:257,269:$VH1,270:$VI1,279:1703,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,307:$Vr1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1705,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VK,[2,587]),o($VG2,[2,357]),o($VG2,[2,358]),o($VG2,[2,359]),o($VG2,[2,360]),o($VG2,[2,361]),o($VK,[2,591]),o($VK,[2,601]),o($VK3,[2,744]),o($VK,[2,498]),o($VK,[2,503],{360:1706,4:$VR5,247:$VS5,348:$VT5,361:$VU5}),o($V26,[2,505]),o($V26,[2,506]),{124:[1,1707]},{124:[1,1708]},{124:[1,1709]},{74:[1,1710],78:[2,514]},o($Vc5,[2,542]),o($Vc5,[2,517]),{187:[1,1718],193:[1,1719],367:1711,368:1712,369:1713,370:1714,371:1715,373:$VF5,374:[1,1716],375:[1,1720],378:[1,1717]},{2:$V1,3:1721,4:$V2,5:$V3},{40:1722,79:75,89:$V7,184:99,189:$Vb},{420:[1,1723]},{421:[1,1724]},o($VK,[2,771]),o($VK,[2,773]),o($VD4,[2,546]),o($VF1,[2,337]),{78:[1,1725]},o($VF1,[2,338]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,233:1726,235:1675,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1390,111:151,113:155,120:1727,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1388,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($VF1,[2,322]),o($VF1,[2,324]),{2:$V1,3:1728,4:$V2,5:$V3},o($VK,[2,730],{77:[1,1729]}),{2:$V1,3:1021,4:$V2,5:$V3,111:1075,143:$Vs4,145:$Vt4,147:1730,341:1074,342:1076},{340:$VM5,343:$VN5,466:1731},o($Vd5,[2,717]),{77:[1,1733],348:[1,1734],349:[1,1732]},{170:[1,1736],314:[1,1735]},{170:[1,1738],314:[1,1737]},{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,314:[1,1739],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($Vn4,[2,251],{88:1740,162:[1,1741],168:[1,1743],169:[1,1742]}),{131:$VX,196:1744},{131:$VX,196:1745},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1390,111:151,113:155,120:1746,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,241:1388,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},o($Vs5,[2,249],{234:1747,74:$V36,239:[1,1749]}),o($V46,[2,243]),{146:[1,1750]},{77:[1,1751]},{77:[1,1752]},o($V46,[2,248],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{78:[2,1061],96:1753,99:[1,1755],102:1754},{99:[1,1756]},o($Vt5,[2,235],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),o($Vt5,[2,236],{74:$V95}),{2:$V1,3:1021,4:$V2,5:$V3,100:1757,111:1455},o($VP5,[2,210]),o($VP5,[2,211]),o($VP5,[2,1108]),o($VP5,[2,213]),{2:$V1,3:1758,4:$V2,5:$V3,76:[1,1759]},o($VP5,[2,218]),o($VP5,[2,221]),{78:[1,1760]},{78:[1,1761]},o($Vy5,[2,264]),o($Vy5,[2,265]),o($Vy5,[2,270]),{2:$V1,3:248,4:$V2,5:$V3,199:1762},o($VD3,[2,561]),o($VD3,[2,1138]),{2:$V1,3:1763,4:$V2,5:$V3},{74:[1,1764]},{78:[1,1765],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VD3,[2,571]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1766,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{78:[1,1767],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($V26,[2,504]),{2:$V1,3:1768,4:$V2,5:$V3},{131:$VX,196:1769},{2:$V1,3:1770,4:$V2,5:$V3},o($VV5,$VW5,{366:1646,365:1771,372:$VX5}),o($VK3,[2,519]),o($VK3,[2,520]),o($VK3,[2,521]),o($VK3,[2,522]),o($VK3,[2,523]),{375:[1,1772]},{375:[1,1773]},o($V56,[2,1131],{387:1774,375:[1,1775]}),{2:$V1,3:1776,4:$V2,5:$V3},{2:$V1,3:1777,4:$V2,5:$V3},o($VV5,[2,525]),o($VK,[2,1141],{416:1778,418:1779,72:$VJ5}),o($VK,[2,619]),o($VK,[2,620],{372:[1,1780]}),o($VF1,[2,339]),o([78,118],[2,340],{74:$V36}),{74:$Vx5,78:[2,341]},o($VK,[2,729]),{2:$V1,3:1021,4:$V2,5:$V3,100:1781,111:1455},o($Vd5,[2,716],{74:$VZ4}),o($Vd5,[2,714]),{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1782,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1021,4:$V2,5:$V3,100:1783,111:1455},{349:[1,1784]},{344:$VY5,467:1785},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1786,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{344:$VY5,467:1787},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1788,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{344:$VY5,467:1789},o($Vn4,[2,72]),{40:1790,79:75,89:$V7,164:[1,1791],184:99,189:$Vb,240:[1,1792]},{40:1793,79:75,89:$V7,184:99,189:$Vb,240:[1,1794]},{40:1795,79:75,89:$V7,184:99,189:$Vb,240:[1,1796]},o($VZ5,[2,274],{250:1797,251:[1,1798]}),{252:1799,253:[2,1109],770:[1,1800]},o($VO5,[2,261],{74:$Vx5}),o($Vs5,[2,242]),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,235:1801,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1802,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{77:[1,1803]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,233:1804,235:1675,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,233:1805,235:1675,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{78:[1,1806]},{78:[2,1062]},{77:[1,1807]},{77:[1,1808]},{74:$V95,78:[1,1809]},o($VP5,[2,214]),{2:$V1,3:1810,4:$V2,5:$V3},{2:$V1,3:1811,4:$V2,5:$V3,76:[1,1812]},{2:$V1,3:1813,4:$V2,5:$V3,76:[1,1814]},o($VD3,[2,1135],{399:1815,398:1816,77:$V16}),{78:[1,1817]},{131:$VX,196:1818},o($VD3,[2,565]),{78:[1,1819],99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($VD3,[2,526]),o($V26,[2,507]),o($V26,[2,508]),o($V26,[2,509]),o($Vc5,[2,518]),{2:$V1,3:1821,4:$V2,5:$V3,77:[2,1127],376:1820},{77:[1,1822]},{2:$V1,3:1824,4:$V2,5:$V3,77:[2,1133],388:1823},o($V56,[2,1132]),{77:[1,1825]},{77:[1,1826]},o($VK,[2,617]),o($VK,[2,1142]),o($VV5,$VW5,{366:1646,365:1827,372:$VX5}),{74:$V95,78:[1,1828]},o($Vd5,[2,723],{74:$VP4}),{74:$V95,78:[1,1829]},o($Vd5,[2,725]),o($Vd5,[2,718]),{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,314:[1,1830],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($Vd5,[2,721]),{99:$V32,112:$V42,114:632,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,314:[1,1831],316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,332:644,335:$VA2,336:$VB2,337:$VC2,338:$VD2},o($Vd5,[2,719]),o($Vn4,[2,252]),{40:1832,79:75,89:$V7,184:99,189:$Vb,240:[1,1833]},{40:1834,79:75,89:$V7,184:99,189:$Vb},o($Vn4,[2,254]),{40:1835,79:75,89:$V7,184:99,189:$Vb},o($Vn4,[2,255]),{40:1836,79:75,89:$V7,184:99,189:$Vb},o($VZ5,[2,272]),{131:$VX,196:1837},{253:[1,1838]},{253:[2,1110]},o($V46,[2,244]),o($Vs5,[2,250],{114:632,332:644,99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1679,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,233:1839,235:1675,236:$V_5,237:$V$5,238:$V06,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{74:$V36,78:[1,1840]},{74:$V36,78:[1,1841]},o($VT4,[2,1063],{97:1842,104:1843,3:1845,2:$V1,4:$V2,5:$V3,76:$V66}),{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1848,103:1846,105:1847,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1021,4:$V2,5:$V3,100:1849,111:1455},o($Vt5,[2,237]),o($VP5,[2,215]),o($Vt5,[2,173]),{2:$V1,3:1850,4:$V2,5:$V3},o($Vt5,[2,175]),{2:$V1,3:1851,4:$V2,5:$V3},o($VD3,[2,560]),o($VD3,[2,1136]),o($VD3,[2,558]),{78:[1,1852]},o($VD3,[2,572]),{77:[1,1853]},{77:[2,1128]},{2:$V1,3:1855,4:$V2,5:$V3,132:$V76,377:1854},{77:[1,1857]},{77:[2,1134]},{2:$V1,3:1021,4:$V2,5:$V3,100:1858,111:1455},{2:$V1,3:1021,4:$V2,5:$V3,100:1859,111:1455},o($VK,[2,621]),o($VK,[2,731]),{348:[1,1861],349:[1,1860]},{344:$VY5,467:1862},{340:$VM5,343:$VN5,466:1863},o($Vn4,[2,253]),{40:1864,79:75,89:$V7,184:99,189:$Vb},o($Vn4,[2,256]),o($Vn4,[2,258]),o($Vn4,[2,259]),o($VZ5,[2,275]),{131:[2,1111],254:1865,650:[1,1866]},{74:$V36,78:[1,1867]},o($V46,[2,246]),o($V46,[2,247]),o($VT4,[2,74]),o($VT4,[2,1064]),{2:$V1,3:1868,4:$V2,5:$V3},o($VT4,[2,78]),{74:[1,1870],78:[1,1869]},o($Vc5,[2,80]),o($Vc5,[2,81],{114:632,332:644,76:[1,1871],99:$V32,112:$V42,115:$V52,116:$V62,123:$V72,124:$VG3,133:$V92,136:$Va2,138:$Vb2,139:$Vc2,140:$Vd2,141:$Ve2,142:$Vf2,154:$Vg2,170:$Vh2,171:$Vi2,179:$Vj2,180:$Vk2,316:$Vl2,317:$Vm2,318:$Vn2,320:$Vo2,321:$Vp2,322:$Vq2,323:$Vr2,324:$Vs2,325:$Vt2,326:$Vu2,327:$Vv2,328:$Vw2,329:$Vx2,330:$Vy2,331:$Vz2,335:$VA2,336:$VB2,337:$VC2,338:$VD2}),{74:$V95,78:[1,1872]},o($Vt5,[2,174]),o($Vt5,[2,176]),o($VD3,[2,562]),{2:$V1,3:1855,4:$V2,5:$V3,132:$V76,377:1873},{74:$V86,78:[1,1874]},o($Vc5,[2,537]),o($Vc5,[2,538]),{2:$V1,3:1021,4:$V2,5:$V3,100:1876,111:1455},{74:$V95,78:[1,1877]},{74:$V95,78:[1,1878]},{77:$Vk4,143:$V_,144:988,145:$VG1,152:$V11,181:$V51,201:989,307:$Vr1,347:1879,424:193,425:$Vv1,429:$Vw1},{349:[1,1880]},o($Vd5,[2,720]),o($Vd5,[2,722]),o($Vn4,[2,257]),{131:$VX,196:1881},{131:[2,1112]},o($V46,[2,245]),o($VT4,[2,77]),{78:[2,76]},{2:$V1,3:171,4:$V2,5:$V3,56:167,77:$VW,94:1848,105:1882,111:151,113:155,131:$VX,132:$VY,137:$VZ,143:$V_,144:163,145:$V$,149:$V01,152:$V11,154:$V21,156:$VL,158:170,179:$V31,180:$V41,181:$V51,196:153,200:149,201:157,202:158,244:$V61,245:$V71,258:152,259:148,260:150,261:154,262:156,263:159,264:160,265:161,266:164,267:165,269:$V81,270:$V91,271:$Vc,275:$Va1,276:$Vb1,278:$Vc1,285:$Vd1,286:$Ve1,287:$Vf1,288:$Vg1,289:$Vh1,290:$Vi1,291:$Vj1,292:$Vk1,294:$VN,295:$VO,296:$VP,297:$VQ,298:$VR,299:$Vl1,300:$Vm1,301:$Vn1,302:$Vo1,303:$Vp1,304:$Vq1,307:$Vr1,308:$Vs1,317:$Vt1,322:$Vu1,424:193,425:$Vv1,429:$Vw1},{2:$V1,3:1883,4:$V2,5:$V3},{78:[1,1884]},{74:$V86,78:[1,1885]},{379:[1,1886]},{2:$V1,3:1887,4:$V2,5:$V3,132:[1,1888]},{74:$V95,78:[1,1889]},o($VK3,[2,535]),o($VK3,[2,536]),o($Vd5,[2,724],{74:$VP4}),o($Vd5,[2,726]),o($V96,[2,1113],{255:1890,770:[1,1891]}),o($Vc5,[2,79]),o($Vc5,[2,82]),o($VT4,[2,1065],{3:1845,101:1892,104:1893,2:$V1,4:$V2,5:$V3,76:$V66}),o($VK3,[2,527]),{2:$V1,3:248,4:$V2,5:$V3,199:1894},o($Vc5,[2,539]),o($Vc5,[2,540]),o($VK3,[2,534]),o($VZ5,[2,1115],{256:1895,420:[1,1896]}),o($V96,[2,1114]),o($VT4,[2,75]),o($VT4,[2,1066]),o($Va6,[2,1129],{380:1897,382:1898,77:[1,1899]}),o($VZ5,[2,273]),o($VZ5,[2,1116]),o($VK3,[2,530],{381:1900,383:1901,230:[1,1902]}),o($Va6,[2,1130]),{2:$V1,3:1855,4:$V2,5:$V3,132:$V76,377:1903},o($VK3,[2,528]),{230:[1,1905],384:1904},{343:[1,1906]},{74:$V86,78:[1,1907]},o($VK3,[2,531]),{340:[1,1908]},{385:[1,1909]},o($Va6,[2,529]),{385:[1,1910]},{386:[1,1911]},{386:[1,1912]},{230:[2,532]},o($VK3,[2,533])],
defaultActions: {105:[2,6],197:[2,342],198:[2,343],199:[2,344],200:[2,345],201:[2,346],202:[2,347],203:[2,348],204:[2,349],205:[2,350],206:[2,351],213:[2,704],598:[2,1152],660:[2,1117],661:[2,1118],717:[2,705],787:[2,1083],788:[2,1084],935:[2,455],936:[2,456],937:[2,457],996:[2,706],1301:[2,1162],1361:[2,707],1389:[2,1070],1448:[2,1160],1557:[2,516],1754:[2,1062],1800:[2,1110],1821:[2,1128],1824:[2,1134],1866:[2,1112],1869:[2,76],1911:[2,532]},
parseError: function parseError (str, hash) {
    if (hash.recoverable) {
        this.trace(str);
    } else {
        var error = new Error(str);
        error.hash = hash;
        throw error;
    }
},
parse: function parse (input) {
    var self = this,
        stack = [0],
        tstack = [], // token stack
        vstack = [null], // semantic value stack
        lstack = [], // location stack
        table = this.table,
        yytext = '',
        yylineno = 0,
        yyleng = 0,
        recovering = 0,
        TERROR = 2,
        EOF = 1;

    var args = lstack.slice.call(arguments, 1);

    //this.reductionCount = this.shiftCount = 0;

    var lexer = Object.create(this.lexer);
    var sharedState = { yy: {} };
    // copy state
    for (var k in this.yy) {
      if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
        sharedState.yy[k] = this.yy[k];
      }
    }

    lexer.setInput(input, sharedState.yy);
    sharedState.yy.lexer = lexer;
    sharedState.yy.parser = this;
    if (typeof lexer.yylloc == 'undefined') {
        lexer.yylloc = {};
    }
    var yyloc = lexer.yylloc;
    lstack.push(yyloc);

    var ranges = lexer.options && lexer.options.ranges;

    if (typeof sharedState.yy.parseError === 'function') {
        this.parseError = sharedState.yy.parseError;
    } else {
        this.parseError = Object.getPrototypeOf(this).parseError;
    }

    function popStack (n) {
        stack.length = stack.length - 2 * n;
        vstack.length = vstack.length - n;
        lstack.length = lstack.length - n;
    }

_token_stack:
    var lex = function () {
        var token;
        token = lexer.lex() || EOF;
        // if token isn't its numeric value, convert
        if (typeof token !== 'number') {
            token = self.symbols_[token] || token;
        }
        return token;
    }

    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
    while (true) {
        // retreive state number from top of stack
        state = stack[stack.length - 1];

        // use default actions if available
        if (this.defaultActions[state]) {
            action = this.defaultActions[state];
        } else {
            if (symbol === null || typeof symbol == 'undefined') {
                symbol = lex();
            }
            // read action for current state and first input
            action = table[state] && table[state][symbol];
        }

_handle_error:
        // handle parse error
        if (typeof action === 'undefined' || !action.length || !action[0]) {
            var error_rule_depth;
            var errStr = '';

            // Return the rule stack depth where the nearest error rule can be found.
            // Return FALSE when no error recovery rule was found.
            var locateNearestErrorRecoveryRule = function (state) {
                var stack_probe = stack.length - 1;
                var depth = 0;

                // try to recover from error
                for(;;) {
                    // check for error recovery rule in this state
                    if ((TERROR.toString()) in table[state]) {
                        return depth;
                    }
                    if (state === 0 || stack_probe < 2) {
                        return false; // No suitable error recovery rule available.
                    }
                    stack_probe -= 2; // popStack(1): [symbol, action]
                    state = stack[stack_probe];
                    ++depth;
                }
            }

            if (!recovering) {
                // first see if there's any chance at hitting an error recovery rule:
                error_rule_depth = locateNearestErrorRecoveryRule(state);

                // Report error
                expected = [];
                for (p in table[state]) {
                    if (this.terminals_[p] && p > TERROR) {
                        expected.push("'"+this.terminals_[p]+"'");
                    }
                }
                if (lexer.showPosition) {
                    errStr = 'Parse error on line '+(yylineno+1)+":\n"+lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + (this.terminals_[symbol] || symbol)+ "'";
                } else {
                    errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " +
                                  (symbol == EOF ? "end of input" :
                                              ("'"+(this.terminals_[symbol] || symbol)+"'"));
                }
                this.parseError(errStr, {
                    text: lexer.match,
                    token: this.terminals_[symbol] || symbol,
                    line: lexer.yylineno,
                    loc: yyloc,
                    expected: expected,
                    recoverable: (error_rule_depth !== false)
                });
            } else if (preErrorSymbol !== EOF) {
                error_rule_depth = locateNearestErrorRecoveryRule(state);
            }

            // just recovered from another error
            if (recovering == 3) {
                if (symbol === EOF || preErrorSymbol === EOF) {
                    throw new Error(errStr || 'Parsing halted while starting to recover from another error.');
                }

                // discard current lookahead and grab another
                yyleng = lexer.yyleng;
                yytext = lexer.yytext;
                yylineno = lexer.yylineno;
                yyloc = lexer.yylloc;
                symbol = lex();
            }

            // try to recover from error
            if (error_rule_depth === false) {
                throw new Error(errStr || 'Parsing halted. No suitable error recovery rule available.');
            }
            popStack(error_rule_depth);

            preErrorSymbol = (symbol == TERROR ? null : symbol); // save the lookahead token
            symbol = TERROR;         // insert generic error symbol as new lookahead
            state = stack[stack.length-1];
            action = table[state] && table[state][TERROR];
            recovering = 3; // allow 3 real symbols to be shifted before reporting a new error
        }

        // this shouldn't happen, unless resolve defaults are off
        if (action[0] instanceof Array && action.length > 1) {
            throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);
        }

        switch (action[0]) {
            case 1: // shift
                //this.shiftCount++;

                stack.push(symbol);
                vstack.push(lexer.yytext);
                lstack.push(lexer.yylloc);
                stack.push(action[1]); // push state
                symbol = null;
                if (!preErrorSymbol) { // normal execution/no error
                    yyleng = lexer.yyleng;
                    yytext = lexer.yytext;
                    yylineno = lexer.yylineno;
                    yyloc = lexer.yylloc;
                    if (recovering > 0) {
                        recovering--;
                    }
                } else {
                    // error just occurred, resume old lookahead f/ before error
                    symbol = preErrorSymbol;
                    preErrorSymbol = null;
                }
                break;

            case 2:
                // reduce
                //this.reductionCount++;

                len = this.productions_[action[1]][1];

                // perform semantic action
                yyval.$ = vstack[vstack.length-len]; // default to $$ = $1
                // default location, uses first token for firsts, last for lasts
                yyval._$ = {
                    first_line: lstack[lstack.length-(len||1)].first_line,
                    last_line: lstack[lstack.length-1].last_line,
                    first_column: lstack[lstack.length-(len||1)].first_column,
                    last_column: lstack[lstack.length-1].last_column
                };
                if (ranges) {
                  yyval._$.range = [lstack[lstack.length-(len||1)].range[0], lstack[lstack.length-1].range[1]];
                }
                r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args));

                if (typeof r !== 'undefined') {
                    return r;
                }

                // pop off stack
                if (len) {
                    stack = stack.slice(0,-1*len*2);
                    vstack = vstack.slice(0, -1*len);
                    lstack = lstack.slice(0, -1*len);
                }

                stack.push(this.productions_[action[1]][0]);    // push nonterminal (reduce)
                vstack.push(yyval.$);
                lstack.push(yyval._$);
                // goto new state = table[STATE][NONTERMINAL]
                newState = table[stack[stack.length-2]][stack[stack.length-1]];
                stack.push(newState);
                break;

            case 3:
                // accept
                return true;
        }

    }

    return true;
}};

// from https://www.postgresql.org/docs/current/static/sql-keywords-appendix.html
// JSON.stringify([].slice.call(document.querySelectorAll('tr')).filter(x => x.children.length == 5 && x.children[2].innerText == 'reserved').map(x => x.children[0].innerText))

var nonReserved = ["A","ABSENT","ABSOLUTE","ACCORDING","ACTION","ADA","ADD","ADMIN","AFTER","ALWAYS","ASC","ASSERTION","ASSIGNMENT","ATTRIBUTE","ATTRIBUTES","BASE64","BEFORE","BERNOULLI","BLOCKED","BOM","BREADTH","C","CASCADE","CATALOG","CATALOG_NAME","CHAIN","CHARACTERISTICS","CHARACTERS","CHARACTER_SET_CATALOG","CHARACTER_SET_NAME","CHARACTER_SET_SCHEMA","CLASS_ORIGIN","COBOL","COLLATION","COLLATION_CATALOG","COLLATION_NAME","COLLATION_SCHEMA","COLUMNS","COLUMN_NAME","COMMAND_FUNCTION","COMMAND_FUNCTION_CODE","COMMITTED","CONDITION_NUMBER","CONNECTION","CONNECTION_NAME","CONSTRAINTS","CONSTRAINT_CATALOG","CONSTRAINT_NAME","CONSTRAINT_SCHEMA","CONSTRUCTOR","CONTENT","CONTINUE","CONTROL","CURSOR_NAME","DATA","DATETIME_INTERVAL_CODE","DATETIME_INTERVAL_PRECISION","DB","DEFAULTS","DEFERRABLE","DEFERRED","DEFINED","DEFINER","DEGREE","DEPTH","DERIVED","DESC","DESCRIPTOR","DIAGNOSTICS","DISPATCH","DOCUMENT","DOMAIN","DYNAMIC_FUNCTION","DYNAMIC_FUNCTION_CODE","EMPTY","ENCODING","ENFORCED","EXCLUDE","EXCLUDING","EXPRESSION","FILE","FINAL","FIRST","FLAG","FOLLOWING","FORTRAN","FOUND","FS","G","GENERAL","GENERATED","GO","GOTO","GRANTED","HEX","HIERARCHY","ID","IGNORE","IMMEDIATE","IMMEDIATELY","IMPLEMENTATION","INCLUDING","INCREMENT","INDENT","INITIALLY","INPUT","INSTANCE","INSTANTIABLE","INSTEAD","INTEGRITY","INVOKER","ISOLATION","K","KEY","KEY_MEMBER","KEY_TYPE","LAST","LENGTH","LEVEL","LIBRARY","LIMIT","LINK","LOCATION","LOCATOR","M","MAP","MAPPING","MATCHED","MAXVALUE","MESSAGE_LENGTH","MESSAGE_OCTET_LENGTH","MESSAGE_TEXT","MINVALUE","MORE","MUMPS","NAME","NAMES","NAMESPACE","NESTING","NEXT","NFC","NFD","NFKC","NFKD","NIL","NORMALIZED","NULLABLE","NULLS","NUMBER","OBJECT","OCTETS","OFF","OPTION","OPTIONS","ORDERING","ORDINALITY","OTHERS","OUTPUT","OVERRIDING","P","PAD","PARAMETER_MODE","PARAMETER_NAME","PARAMETER_ORDINAL_POSITION","PARAMETER_SPECIFIC_CATALOG","PARAMETER_SPECIFIC_NAME","PARAMETER_SPECIFIC_SCHEMA","PARTIAL","PASCAL","PASSING","PASSTHROUGH","PATH","PERMISSION","PLACING","PLI","PRECEDING","PRESERVE","PRIOR","PRIVILEGES","PUBLIC","READ","RECOVERY","RELATIVE","REPEATABLE","REQUIRING","RESPECT","RESTART","RESTORE","RESTRICT","RETURNED_CARDINALITY","RETURNED_LENGTH","RETURNED_OCTET_LENGTH","RETURNED_SQLSTATE","RETURNING","ROLE","ROUTINE","ROUTINE_CATALOG","ROUTINE_NAME","ROUTINE_SCHEMA","ROW_COUNT","SCALE","SCHEMA","SCHEMA_NAME","SCOPE_CATALOG","SCOPE_NAME","SCOPE_SCHEMA","SECTION","SECURITY","SELECTIVE","SELF","SEQUENCE","SERIALIZABLE","SERVER","SERVER_NAME","SESSION","SETS","SIMPLE","SIZE","SOURCE","SPACE","SPECIFIC_NAME","STANDALONE","STATE","STATEMENT","STRIP","STRUCTURE","STYLE","SUBCLASS_ORIGIN","T","TABLE_NAME","TEMPORARY","TIES","TOKEN","TOP_LEVEL_COUNT","TRANSACTION","TRANSACTIONS_COMMITTED","TRANSACTIONS_ROLLED_BACK","TRANSACTION_ACTIVE","TRANSFORM","TRANSFORMS","TRIGGER_CATALOG","TRIGGER_NAME","TRIGGER_SCHEMA","TYPE","UNBOUNDED","UNCOMMITTED","UNDER","UNLINK","UNNAMED","UNTYPED","URI","USAGE","USER_DEFINED_TYPE_CATALOG","USER_DEFINED_TYPE_CODE","USER_DEFINED_TYPE_NAME","USER_DEFINED_TYPE_SCHEMA","VALID","VERSION","VIEW","WHITESPACE","WORK","WRAPPER","WRITE","XMLDECLARATION","XMLSCHEMA","YES","ZONE"]

parser.parseError = function(str, hash) {
	if (hash.expected && hash.expected.indexOf("'LITERAL'") > -1 && /[a-zA-Z_][a-zA-Z_0-9]*/.test(hash.token) && nonReserved.indexOf(hash.token) > -1) {
		return
	}
	throw new SyntaxError(str)
}
/* generated by jison-lex 0.3.4 */
var lexer = (function(){
var lexer = ({

EOF:1,

parseError:function parseError(str, hash) {
        if (this.yy.parser) {
            this.yy.parser.parseError(str, hash);
        } else {
            throw new Error(str);
        }
    },

// resets the lexer, sets new input
setInput:function (input, yy) {
        this.yy = yy || this.yy || {};
        this._input = input;
        this._more = this._backtrack = this.done = false;
        this.yylineno = this.yyleng = 0;
        this.yytext = this.matched = this.match = '';
        this.conditionStack = ['INITIAL'];
        this.yylloc = {
            first_line: 1,
            first_column: 0,
            last_line: 1,
            last_column: 0
        };
        if (this.options.ranges) {
            this.yylloc.range = [0,0];
        }
        this.offset = 0;
        return this;
    },

// consumes and returns one char from the input
input:function () {
        var ch = this._input[0];
        this.yytext += ch;
        this.yyleng++;
        this.offset++;
        this.match += ch;
        this.matched += ch;
        var lines = ch.match(/(?:\r\n?|\n).*/g);
        if (lines) {
            this.yylineno++;
            this.yylloc.last_line++;
        } else {
            this.yylloc.last_column++;
        }
        if (this.options.ranges) {
            this.yylloc.range[1]++;
        }

        this._input = this._input.slice(1);
        return ch;
    },

// unshifts one char (or a string) into the input
unput:function (ch) {
        var len = ch.length;
        var lines = ch.split(/(?:\r\n?|\n)/g);

        this._input = ch + this._input;
        this.yytext = this.yytext.substr(0, this.yytext.length - len);
        //this.yyleng -= len;
        this.offset -= len;
        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
        this.match = this.match.substr(0, this.match.length - 1);
        this.matched = this.matched.substr(0, this.matched.length - 1);

        if (lines.length - 1) {
            this.yylineno -= lines.length - 1;
        }
        var r = this.yylloc.range;

        this.yylloc = {
            first_line: this.yylloc.first_line,
            last_line: this.yylineno + 1,
            first_column: this.yylloc.first_column,
            last_column: lines ?
                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
              this.yylloc.first_column - len
        };

        if (this.options.ranges) {
            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
        }
        this.yyleng = this.yytext.length;
        return this;
    },

// When called from action, caches matched text and appends it on next action
more:function () {
        this._more = true;
        return this;
    },

// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
reject:function () {
        if (this.options.backtrack_lexer) {
            this._backtrack = true;
        } else {
            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
                text: "",
                token: null,
                line: this.yylineno
            });

        }
        return this;
    },

// retain first n characters of the match
less:function (n) {
        this.unput(this.match.slice(n));
    },

// displays already matched input, i.e. for error messages
pastInput:function () {
        var past = this.matched.substr(0, this.matched.length - this.match.length);
        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
    },

// displays upcoming input, i.e. for error messages
upcomingInput:function () {
        var next = this.match;
        if (next.length < 20) {
            next += this._input.substr(0, 20-next.length);
        }
        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
    },

// displays the character position where the lexing error occurred, i.e. for error messages
showPosition:function () {
        var pre = this.pastInput();
        var c = new Array(pre.length + 1).join("-");
        return pre + this.upcomingInput() + "\n" + c + "^";
    },

// test the lexed token: return FALSE when not a match, otherwise return token
test_match:function(match, indexed_rule) {
        var token,
            lines,
            backup;

        if (this.options.backtrack_lexer) {
            // save context
            backup = {
                yylineno: this.yylineno,
                yylloc: {
                    first_line: this.yylloc.first_line,
                    last_line: this.last_line,
                    first_column: this.yylloc.first_column,
                    last_column: this.yylloc.last_column
                },
                yytext: this.yytext,
                match: this.match,
                matches: this.matches,
                matched: this.matched,
                yyleng: this.yyleng,
                offset: this.offset,
                _more: this._more,
                _input: this._input,
                yy: this.yy,
                conditionStack: this.conditionStack.slice(0),
                done: this.done
            };
            if (this.options.ranges) {
                backup.yylloc.range = this.yylloc.range.slice(0);
            }
        }

        lines = match[0].match(/(?:\r\n?|\n).*/g);
        if (lines) {
            this.yylineno += lines.length;
        }
        this.yylloc = {
            first_line: this.yylloc.last_line,
            last_line: this.yylineno + 1,
            first_column: this.yylloc.last_column,
            last_column: lines ?
                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
                         this.yylloc.last_column + match[0].length
        };
        this.yytext += match[0];
        this.match += match[0];
        this.matches = match;
        this.yyleng = this.yytext.length;
        if (this.options.ranges) {
            this.yylloc.range = [this.offset, this.offset += this.yyleng];
        }
        this._more = false;
        this._backtrack = false;
        this._input = this._input.slice(match[0].length);
        this.matched += match[0];
        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
        if (this.done && this._input) {
            this.done = false;
        }
        if (token) {
            return token;
        } else if (this._backtrack) {
            // recover context
            for (var k in backup) {
                this[k] = backup[k];
            }
            return false; // rule action called reject() implying the next rule should be tested instead.
        }
        return false;
    },

// return next match in input
next:function () {
        if (this.done) {
            return this.EOF;
        }
        if (!this._input) {
            this.done = true;
        }

        var token,
            match,
            tempMatch,
            index;
        if (!this._more) {
            this.yytext = '';
            this.match = '';
        }
        var rules = this._currentRules();
        for (var i = 0; i < rules.length; i++) {
            tempMatch = this._input.match(this.rules[rules[i]]);
            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
                match = tempMatch;
                index = i;
                if (this.options.backtrack_lexer) {
                    token = this.test_match(tempMatch, rules[i]);
                    if (token !== false) {
                        return token;
                    } else if (this._backtrack) {
                        match = false;
                        continue; // rule action called reject() implying a rule MISmatch.
                    } else {
                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
                        return false;
                    }
                } else if (!this.options.flex) {
                    break;
                }
            }
        }
        if (match) {
            token = this.test_match(match, rules[index]);
            if (token !== false) {
                return token;
            }
            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
            return false;
        }
        if (this._input === "") {
            return this.EOF;
        } else {
            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
                text: "",
                token: null,
                line: this.yylineno
            });
        }
    },

// return next match that has a token
lex:function lex () {
        var r = this.next();
        if (r) {
            return r;
        } else {
            return this.lex();
        }
    },

// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
begin:function begin (condition) {
        this.conditionStack.push(condition);
    },

// pop the previously active lexer condition state off the condition stack
popState:function popState () {
        var n = this.conditionStack.length - 1;
        if (n > 0) {
            return this.conditionStack.pop();
        } else {
            return this.conditionStack[0];
        }
    },

// produce the lexer rule set which is active for the currently active lexer condition state
_currentRules:function _currentRules () {
        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
        } else {
            return this.conditions["INITIAL"].rules;
        }
    },

// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
topState:function topState (n) {
        n = this.conditionStack.length - 1 - Math.abs(n || 0);
        if (n >= 0) {
            return this.conditionStack[n];
        } else {
            return "INITIAL";
        }
    },

// alias for begin(condition)
pushState:function pushState (condition) {
        this.begin(condition);
    },

// return the number of states currently on the stack
stateStackSize:function stateStackSize() {
        return this.conditionStack.length;
    },
options: {"case-insensitive":true},
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
var YYSTATE=YY_START;
switch($avoiding_name_collisions) {
case 0:return 271
break;
case 1:return 307
break;
case 2:return 425
break;
case 3:return 304
break;
case 4:return 5
break;
case 5:return 5
break;
case 6:return 301
break;
case 7:return 301
break;
case 8:return 132
break;
case 9:return 132
break;
case 10:return /* its a COMMENT */
break;
case 11:/* skip whitespace */
break;
case 12:return 321
break;
case 13:return 324
break;
case 14:yy_.yytext = 'VALUE';return 89
break;
case 15:yy_.yytext = 'VALUE';return 189
break;
case 16:yy_.yytext = 'ROW';return 189
break;
case 17:yy_.yytext = 'COLUMN';return 189
break;
case 18:yy_.yytext = 'MATRIX';return 189
break;
case 19:yy_.yytext = 'INDEX';return 189
break;
case 20:yy_.yytext = 'RECORDSET';return 189
break;
case 21:yy_.yytext = 'TEXT';return 189
break;
case 22:yy_.yytext = 'SELECT';return 189
break;
case 23:return 525
break;
case 24:return 386
break;
case 25:return 407
break;
case 26:return 520
break;
case 27:return 291
break;
case 28:return 274
break;
case 29:return 274
break;
case 30:return 164
break;
case 31:return 405
break;
case 32:return 170
break;
case 33:return 229
break;
case 34:return 166
break;
case 35:return 207
break;
case 36:return 292
break;
case 37:return 76
break;
case 38:return 423
break;
case 39:return 246
break;
case 40:return 409
break;
case 41:return 361
break;
case 42:return 290
break;
case 43:return 519
break;
case 44:return 442
break;
case 45:return 335
break;
case 46:return 446
break;
case 47:return 336
break;
case 48:return 320
break;
case 49:return 119
break;
case 50:return 112
break;
case 51:return 320
break;
case 52:return 112
break;
case 53:return 320
break;
case 54:return 112
break;
case 55:return 320
break;
case 56:return 513
break;
case 57:return 308
break;
case 58:return 276
break;
case 59:return 373
break;
case 60:return 130
break;
case 61:return 'CLOSE'
break;
case 62:return 247
break;
case 63:return 190
break;
case 64:return 190
break;
case 65:return 439
break;
case 66:return 372
break;
case 67:return 475
break;
case 68:return 445
break;
case 69:return 278
break;
case 70:return 240
break;
case 71:return 287
break;
case 72:return 272
break;
case 73:return 206
break;
case 74:return 238
break;
case 75:return 269
break;
case 76:return 270
break;
case 77:return 270
break;
case 78:return 'CURSOR'
break;
case 79:return 410
break;
case 80:return 295
break;
case 81:return 296
break;
case 82:return 297
break;
case 83:return 453
break;
case 84:return 348
break;
case 85:return 343
break;
case 86:return 'DELETED'
break;
case 87:return 246
break;
case 88:return 411
break;
case 89:return 185
break;
case 90:return 401
break;
case 91:return 452
break;
case 92:return 135
break;
case 93:return 311
break;
case 94:return 394
break;
case 95:return 315
break;
case 96:return 319
break;
case 97:return 169
break;
case 98:return 513
break;
case 99:return 513
break;
case 100:return 303
break;
case 101:return 14
break;
case 102:return 300
break;
case 103:return 253
break;
case 104:return 244
break;
case 105:return 95
break;
case 106:return 378
break;
case 107:return 183
break;
case 108:return 227
break;
case 109:return 273
break;
case 110:return 318
break;
case 111:return 607
break;
case 112:return 477
break;
case 113:return 232
break;
case 114:return 236
break;
case 115:return 239
break;
case 116:return 156
break;
case 117:return 361
break;
case 118:return 337
break;
case 119:return 99
break;
case 120:return 193
break;
case 121:return 212
break;
case 122:return 224
break;
case 123:return 521
break;
case 124:return 344
break;
case 125:return 213
break;
case 126:return 168
break;
case 127:return 298
break;
case 128:return 198
break;
case 129:return 223
break;
case 130:return 375
break;
case 131:return 245
break;
case 132:return 'LET'
break;
case 133:return 225
break;
case 134:return 112
break;
case 135:return 249
break;
case 136:return 465
break;
case 137:return 191
break;
case 138:return 289
break;
case 139:return 395
break;
case 140:return 288
break;
case 141:return 457
break;
case 142:return 169
break;
case 143:return 408
break;
case 144:return 222
break;
case 145:return 650
break;
case 146:return 275
break;
case 147:return 248
break;
case 148:return 385
break;
case 149:return 154
break;
case 150:return 302
break;
case 151:return 243
break;
case 152:return 438
break;
case 153:return 230
break;
case 154:return 420
break;
case 155:return 129
break;
case 156:return 251
break;
case 157:return 'OPEN'
break;
case 158:return 421
break;
case 159:return 171
break;
case 160:return 118
break;
case 161:return 208
break;
case 162:return 281
break;
case 163:return 172
break;
case 164:return 284
break;
case 165:return 769
break;
case 166:return 93
break;
case 167:return 16
break;
case 168:return 374
break;
case 169:return 447
break;
case 170:return 682
break;
case 171:return 15
break;
case 172:return 419
break;
case 173:return 194
break;
case 174:return 'REDUCE'
break;
case 175:return 379
break;
case 176:return 316
break;
case 177:return 522
break;
case 178:return 686
break;
case 179:return 107
break;
case 180:return 406
break;
case 181:return 175
break;
case 182:return 294
break;
case 183:return 448
break;
case 184:return 691
break;
case 185:return 173
break;
case 186:return 173
break;
case 187:return 226
break;
case 188:return 441
break;
case 189:return 237
break;
case 190:return 150
break;
case 191:return 770
break;
case 192:return 410
break;
case 193:return 89
break;
case 194:return 228
break;
case 195:return 146
break;
case 196:return 146
break;
case 197:return 414
break;
case 198:return 339
break;
case 199:return 422
break;
case 200:return 'STRATEGY'
break;
case 201:return 'STORE'
break;
case 202:return 285
break;
case 203:return 286
break;
case 204:return 358
break;
case 205:return 358
break;
case 206:return 468
break;
case 207:return 362
break;
case 208:return 362
break;
case 209:return 192
break;
case 210:return 314
break;
case 211:return 'TIMEOUT'
break;
case 212:return 148
break;
case 213:return 195
break;
case 214:return 440
break;
case 215:return 440
break;
case 216:return 514
break;
case 217:return 299
break;
case 218:return 456
break;
case 219:return 162
break;
case 220:return 187
break;
case 221:return 98
break;
case 222:return 340
break;
case 223:return 413
break;
case 224:return 231
break;
case 225:return 149
break;
case 226:return 349
break;
case 227:return 134
break;
case 228:return 415
break;
case 229:return 313
break;
case 230:return 128
break;
case 231:return 444
break;
case 232:return 72
break;
case 233:return 440  /* Is this keyword required? */
break;
case 234:return 131
break;
case 235:return 115
break;
case 236:return 137
break;
case 237:return 179
break;
case 238:return 322
break;
case 239:return 180
break;
case 240:return 133
break;
case 241:return 138
break;
case 242:return 331
break;
case 243:return 328
break;
case 244:return 330
break;
case 245:return 327
break;
case 246:return 325
break;
case 247:return 323
break;
case 248:return 324
break;
case 249:return 142
break;
case 250:return 141
break;
case 251:return 139
break;
case 252:return 326
break;
case 253:return 329
break;
case 254:return 140
break;
case 255:return 124
break;
case 256:return 329
break;
case 257:return 77
break;
case 258:return 78
break;
case 259:return 145
break;
case 260:return 429
break;
case 261:return 431
break;
case 262:return 305
break;
case 263:return 510
break;
case 264:return 512
break;
case 265:return 122
break;
case 266:return 116
break;
case 267:return 74
break;
case 268:return 338
break;
case 269:return 152
break;
case 270:return 768
break;
case 271:return 143
break;
case 272:return 181
break;
case 273:return 136
break;
case 274:return 123
break;
case 275:return 317
break;
case 276:return 4
break;
case 277:return 10
break;
case 278:return 'INVALID'
break;
}
},
rules: [/^(?:``([^\`])+``)/i,/^(?:\[\?\])/i,/^(?:@\[)/i,/^(?:ARRAY\[)/i,/^(?:\[([^\]'])*?\])/i,/^(?:`([^\`'])*?`)/i,/^(?:N(['](\\.|[^']|\\')*?['])+)/i,/^(?:X(['](\\.|[^']|\\')*?['])+)/i,/^(?:(['](\\.|[^']|\\')*?['])+)/i,/^(?:(["](\\.|[^"]|\\")*?["])+)/i,/^(?:--(.*?)($|\r\n|\r|\n))/i,/^(?:\s+)/i,/^(?:\|\|)/i,/^(?:\|)/i,/^(?:VALUE\s+OF\s+SEARCH\b)/i,/^(?:VALUE\s+OF\s+SELECT\b)/i,/^(?:ROW\s+OF\s+SELECT\b)/i,/^(?:COLUMN\s+OF\s+SELECT\b)/i,/^(?:MATRIX\s+OF\s+SELECT\b)/i,/^(?:INDEX\s+OF\s+SELECT\b)/i,/^(?:RECORDSET\s+OF\s+SELECT\b)/i,/^(?:TEXT\s+OF\s+SELECT\b)/i,/^(?:SELECT\b)/i,/^(?:ABSOLUTE\b)/i,/^(?:ACTION\b)/i,/^(?:ADD\b)/i,/^(?:AFTER\b)/i,/^(?:AGGR\b)/i,/^(?:AGGREGATE\b)/i,/^(?:AGGREGATOR\b)/i,/^(?:ALL\b)/i,/^(?:ALTER\b)/i,/^(?:AND\b)/i,/^(?:ANTI\b)/i,/^(?:ANY\b)/i,/^(?:APPLY\b)/i,/^(?:ARRAY\b)/i,/^(?:AS\b)/i,/^(?:ASSERT\b)/i,/^(?:ASC\b)/i,/^(?:ATTACH\b)/i,/^(?:AUTO(_)?INCREMENT\b)/i,/^(?:AVG\b)/i,/^(?:BEFORE\b)/i,/^(?:BEGIN\b)/i,/^(?:BETWEEN\b)/i,/^(?:BREAK\b)/i,/^(?:NOT\s+BETWEEN\b)/i,/^(?:NOT\s+LIKE\b)/i,/^(?:BY\b)/i,/^(?:~~\*)/i,/^(?:!~~\*)/i,/^(?:~~)/i,/^(?:!~~)/i,/^(?:ILIKE\b)/i,/^(?:NOT\s+ILIKE\b)/i,/^(?:CALL\b)/i,/^(?:CASE\b)/i,/^(?:CAST\b)/i,/^(?:CHECK\b)/i,/^(?:CLASS\b)/i,/^(?:CLOSE\b)/i,/^(?:COLLATE\b)/i,/^(?:COLUMN\b)/i,/^(?:COLUMNS\b)/i,/^(?:COMMIT\b)/i,/^(?:CONSTRAINT\b)/i,/^(?:CONTENT\b)/i,/^(?:CONTINUE\b)/i,/^(?:CONVERT\b)/i,/^(?:CORRESPONDING\b)/i,/^(?:COUNT\b)/i,/^(?:CREATE\b)/i,/^(?:CROSS\b)/i,/^(?:CUBE\b)/i,/^(?:CURRENT_TIMESTAMP\b)/i,/^(?:CURRENT_DATE\b)/i,/^(?:CURDATE\b)/i,/^(?:CURSOR\b)/i,/^(?:DATABASE(S)?)/i,/^(?:DATEADD\b)/i,/^(?:DATEDIFF\b)/i,/^(?:TIMESTAMPDIFF\b)/i,/^(?:DECLARE\b)/i,/^(?:DEFAULT\b)/i,/^(?:DELETE\b)/i,/^(?:DELETED\b)/i,/^(?:DESC\b)/i,/^(?:DETACH\b)/i,/^(?:DISTINCT\b)/i,/^(?:DROP\b)/i,/^(?:ECHO\b)/i,/^(?:EDGE\b)/i,/^(?:END\b)/i,/^(?:ENUM\b)/i,/^(?:ELSE\b)/i,/^(?:ESCAPE\b)/i,/^(?:EXCEPT\b)/i,/^(?:EXEC\b)/i,/^(?:EXECUTE\b)/i,/^(?:EXISTS\b)/i,/^(?:EXPLAIN\b)/i,/^(?:FALSE\b)/i,/^(?:FETCH\b)/i,/^(?:FIRST\b)/i,/^(?:FOR\b)/i,/^(?:FOREIGN\b)/i,/^(?:FROM\b)/i,/^(?:FULL\b)/i,/^(?:FUNCTION\b)/i,/^(?:GLOB\b)/i,/^(?:GO\b)/i,/^(?:GRAPH\b)/i,/^(?:GROUP\b)/i,/^(?:GROUPING\b)/i,/^(?:HAVING\b)/i,/^(?:IF\b)/i,/^(?:IDENTITY\b)/i,/^(?:IS\b)/i,/^(?:IN\b)/i,/^(?:INDEX\b)/i,/^(?:INDEXED\b)/i,/^(?:INNER\b)/i,/^(?:INSTEAD\b)/i,/^(?:INSERT\b)/i,/^(?:INSERTED\b)/i,/^(?:INTERSECT\b)/i,/^(?:INTERVAL\b)/i,/^(?:INTO\b)/i,/^(?:JOIN\b)/i,/^(?:KEY\b)/i,/^(?:LAST\b)/i,/^(?:LET\b)/i,/^(?:LEFT\b)/i,/^(?:LIKE\b)/i,/^(?:LIMIT\b)/i,/^(?:MATCHED\b)/i,/^(?:MATRIX\b)/i,/^(?:MAX\s*(?=\())/i,/^(?:MAX\s*(?=(,|\))))/i,/^(?:MIN\s*(?=\())/i,/^(?:MERGE\b)/i,/^(?:MINUS\b)/i,/^(?:MODIFY\b)/i,/^(?:NATURAL\b)/i,/^(?:NEXT\b)/i,/^(?:NEW\b)/i,/^(?:NOCASE\b)/i,/^(?:NO\b)/i,/^(?:NOT\b)/i,/^(?:NULL\b)/i,/^(?:NULLS\b)/i,/^(?:OFF\b)/i,/^(?:ON\b)/i,/^(?:ONLY\b)/i,/^(?:OF\b)/i,/^(?:OFFSET\b)/i,/^(?:OPEN\b)/i,/^(?:OPTION\b)/i,/^(?:OR\b)/i,/^(?:ORDER\b)/i,/^(?:OUTER\b)/i,/^(?:OVER\b)/i,/^(?:PATH\b)/i,/^(?:PARTITION\b)/i,/^(?:PERCENT\b)/i,/^(?:PIVOT\b)/i,/^(?:PLAN\b)/i,/^(?:PRIMARY\b)/i,/^(?:PRINT\b)/i,/^(?:PRIOR\b)/i,/^(?:QUERY\b)/i,/^(?:READ\b)/i,/^(?:RECORDSET\b)/i,/^(?:REDUCE\b)/i,/^(?:REFERENCES\b)/i,/^(?:REGEXP\b)/i,/^(?:REINDEX\b)/i,/^(?:RELATIVE\b)/i,/^(?:REMOVE\b)/i,/^(?:RENAME\b)/i,/^(?:REPEAT\b)/i,/^(?:REPLACE\b)/i,/^(?:REQUIRE\b)/i,/^(?:RESTORE\b)/i,/^(?:RETURN\b)/i,/^(?:RETURNS\b)/i,/^(?:RIGHT\b)/i,/^(?:ROLLBACK\b)/i,/^(?:ROLLUP\b)/i,/^(?:ROW\b)/i,/^(?:ROWS\b)/i,/^(?:SCHEMA(S)?)/i,/^(?:SEARCH\b)/i,/^(?:SEMI\b)/i,/^(?:SET\b)/i,/^(?:SETS\b)/i,/^(?:SHOW\b)/i,/^(?:SOME\b)/i,/^(?:SOURCE\b)/i,/^(?:STRATEGY\b)/i,/^(?:STORE\b)/i,/^(?:SUM\b)/i,/^(?:TOTAL\b)/i,/^(?:TABLE\b)/i,/^(?:TABLES\b)/i,/^(?:TARGET\b)/i,/^(?:TEMP\b)/i,/^(?:TEMPORARY\b)/i,/^(?:TEXTSTRING\b)/i,/^(?:THEN\b)/i,/^(?:TIMEOUT\b)/i,/^(?:TO\b)/i,/^(?:TOP\b)/i,/^(?:TRAN\b)/i,/^(?:TRANSACTION\b)/i,/^(?:TRIGGER\b)/i,/^(?:TRUE\b)/i,/^(?:TRUNCATE\b)/i,/^(?:UNION\b)/i,/^(?:UNIQUE\b)/i,/^(?:UNPIVOT\b)/i,/^(?:UPDATE\b)/i,/^(?:USE\b)/i,/^(?:USING\b)/i,/^(?:VALUE\b)/i,/^(?:VALUES\b)/i,/^(?:VERTEX\b)/i,/^(?:VIEW\b)/i,/^(?:WHEN\b)/i,/^(?:WHERE\b)/i,/^(?:WHILE\b)/i,/^(?:WITH\b)/i,/^(?:WORK\b)/i,/^(?:(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?)/i,/^(?:->)/i,/^(?:#)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:\*)/i,/^(?:\/)/i,/^(?:%)/i,/^(?:!===)/i,/^(?:===)/i,/^(?:!==)/i,/^(?:==)/i,/^(?:>=)/i,/^(?:&)/i,/^(?:\|)/i,/^(?:<<)/i,/^(?:>>)/i,/^(?:>)/i,/^(?:<=)/i,/^(?:<>)/i,/^(?:<)/i,/^(?:=)/i,/^(?:!=)/i,/^(?:\()/i,/^(?:\))/i,/^(?:@)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:\])/i,/^(?::-)/i,/^(?:\?-)/i,/^(?:\.\.)/i,/^(?:\.)/i,/^(?:,)/i,/^(?:::)/i,/^(?::)/i,/^(?:;)/i,/^(?:\$)/i,/^(?:\?)/i,/^(?:!)/i,/^(?:\^)/i,/^(?:~)/i,/^(?:[0-9]*[a-zA-Z_]+[a-zA-Z_0-9]*)/i,/^(?:$)/i,/^(?:.)/i],
conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,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,159,160,161,162,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],"inclusive":true}}
});
return lexer;
})();
parser.lexer = lexer;
function Parser () {
  this.yy = {};
}
Parser.prototype = parser;parser.Parser = Parser;
return new Parser;
})();

if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
exports.parser = alasqlparser;
exports.Parser = alasqlparser.Parser;
exports.parse = function () { return alasqlparser.parse.apply(alasqlparser, arguments); };
exports.main = function commonjsMain (args) {
    if (!args[1]) {
        console.log('Usage: '+args[0]+' FILE');
        process.exit(1);
    }
    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
    return exports.parser.parse(source);
};
if (typeof module !== 'undefined' && require.main === module) {
  exports.main(process.argv.slice(1));
}
}/**
   12prettyflag.js - prettify
   @todo move this functionality to plugin
*/

/**
	  Pretty flag - nice HTML output or standard text without any tags
	@type {boolean}
*/

alasql.prettyflag = false;

/**
	Pretty output of SQL functions
	@function
	@param {string} sql SQL statement
	@param {boolean} flag value
	@return {string} HTML or text string with pretty output
*/

alasql.pretty = function (sql, flag) {
	var pf = alasql.prettyflag;
	alasql.prettyflag = !flag;
	var s = alasql.parse(sql).toString();
	alasql.prettyflag = pf;
	return s;
};
/*jshint unused:false*/
/*
	Utilities for Alasql.js

	@todo Review the list of utilities
	@todo Find more effective utilities
*/

/**
 Alasql utility functions
 @type {object}
 */
var utils = (alasql.utils = {});

/**
  Convert NaN to undefined
  @function
  @param {string} s JavaScript string to be modified
  @return {string} Covered expression

  @example

  123         => 123
  undefined   => undefined
  NaN         => undefined

  */
function n2u(s) {
	return '(y=' + s + ',y===y?y:undefined)';
}

/**
  Return undefined if s undefined
  @param {string} s JavaScript string to be modified
  @return {string} Covered expression

  @example

  123,a       => a
  undefined,a => undefined
  NaN,a       => undefined

  */
function und(s, r) {
	return '(y=' + s + ',typeof y=="undefined"?undefined:' + r + ')';
}

/**
  Return always true. Stub for non-ecisting WHERE clause, because is faster then if(whenrfn) whenfn()
  @function
  @return {boolean} Always true
  */
function returnTrue() {
	return true;
}

/**
  Return undefined. Stub for non-ecisting WHERE clause, because is faster then if(whenrfn) whenfn()
  @function
  @return {undefined} Always undefined
  */
function returnUndefined() {}

/**
  Escape string
  @function
  @param {string} s Source string
  @return {string} Escaped string
  @example

  Pit\er's => Pit\\er\'s

  */
// based on joliss/js-string-escape
var escapeq = (utils.escapeq = function (s) {

	return ('' + s).replace(/["'\\\n\r\u2028\u2029]/g, function (character) {
		// Escape all characters not included in SingleStringCharacters and
		// DoubleStringCharacters on
		// http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4
		switch (character) {
			case '"':
			case "'":
			case '\\':
				return '\\' + character;
			// Four possible LineTerminator characters need to be escaped:
			case '\n':
				return '\\n';
			case '\r':
				return '\\r';
			case '\u2028':
				return '\\u2028';
			case '\u2029':
				return '\\u2029';
		}
	});
});

/**
  Double quotes for SQL statements
  @param {string} s Source string
  @return {string} Escaped string

  @example

  Piter's => Piter''s

  */
var escapeqq = (utils.undoubleq = function (s) {
	return s.replace(/(\')/g, "''");
});

/**
  Replace double quotes with single quote
  @param {string} s Source string
  @return {string} Replaced string
  @example

  Piter''s => Piter's

  */
var doubleq = (utils.doubleq = function (s) {
	return s.replace(/(\'\')/g, "\\'");
});

/**
  Replace single quote with escaped single quote
  @param {string} s Source string
  @return {string} Replaced string

  @todo Check this function
*/
var doubleqq = (utils.doubleqq = function (s) {
	return s.replace(/'/g, "\\'");
});

/**
  Cut BOM first character for UTF-8 files (for merging two files)
  @param {string} s Source string
  @return {string} Replaced string
  */

var cutbom = function (s) {
	if (s[0] === String.fromCharCode(65279)) {
		s = s.substr(1);
	}
	return s;
};

/**
  Get the global scope
  Inspired by System.global
  @return {object} The global scope
  */
utils.global = (function () {
	if (typeof self !== 'undefined') {
		return self;
	}
	if (typeof window !== 'undefined') {
		return window;
	}
	if (typeof global !== 'undefined') {
		return global;
	}
	return Function('return this')();
})();

/**
  Find out if a function is native to the enviroment
  @param {function} Function to check
  @return {boolean} True if function is native
  */
var isNativeFunction = (utils.isNativeFunction = function (fn) {
	return typeof fn === 'function' && !!~fn.toString().indexOf('[native code]');
});

/**
  Find out if code is running in a web worker enviroment
  @return {boolean} True if code is running in a web worker enviroment
  */
utils.isWebWorker = (function () {
	try {
		var importScripts = utils.global.importScripts;
		return utils.isNativeFunction(importScripts);
	} catch (e) {
		return false;
	}
})();

/**
  Find out if code is running in a node enviroment
  @return {boolean} True if code is running in a node enviroment
  */
utils.isNode = (function () {
	try {
		if (typeof process === 'undefined' || !process.versions || !process.versions.node) {
			return false;
		}
		return true;
	} catch (e) {
		return false;
	}
})();

/**
  Find out if code is running in a browser enviroment
  @return {boolean} True if code is running in a browser enviroment
  */
utils.isBrowser = (function () {
	try {
		return utils.isNativeFunction(utils.global.location.reload);
	} catch (e) {
		return false;
	}
})();

/**
  Find out if code is running in a browser with a browserify setup
  @return {boolean} True if code is running in a browser with a browserify setup
  */
utils.isBrowserify = (function () {
	return utils.isBrowser && typeof process !== 'undefined' && process.browser;
})();

/**
  Find out if code is running in a browser with a requireJS setup
  @return {boolean} True if code is running in a browser with a requireJS setup
  */
utils.isRequireJS = (function () {
	return (
		utils.isBrowser && typeof require === 'function' && typeof require.specified === 'function'
	);
})();

/**
  Find out if code is running with Meteor in the enviroment
  @return {boolean} True if code is running with Meteor in the enviroment

  @todo Find out if this is the best way to do this
  */
utils.isMeteor = (function () {
	return typeof Meteor !== 'undefined' && Meteor.release;
})();

/**
  Find out if code is running on a Meteor client
  @return {boolean} True if code is running on a Meteor client
  */
utils.isMeteorClient = utils.isMeteorClient = (function () {
	return utils.isMeteor && Meteor.isClient;
})();

/**
  Find out if code is running on a Meteor server
  @return {boolean} True if code is running on a Meteor server
  */
utils.isMeteorServer = (function () {
	return utils.isMeteor && Meteor.isServer;
})();

/**
  Find out code is running in a cordovar enviroment
  @return {boolean} True if code is running in a web worker enviroment

  @todo Find out if this is the best way to do this
  */
utils.isCordova = (function () {
	return typeof cordova === 'object';
})();

utils.isReactNative = (function () {
	var isReact = false;
	/*not-for-browser/*
	try {
		if (typeof require('react-native') === 'object') {
			isReact = true;
		}
	} catch (e) {
		void 0;
	}
	//*/
	return isReact;
})();

utils.hasIndexedDB = (function () {
	return !!utils.global.indexedDB;
})();

utils.isArray = function (obj) {
	return '[object Array]' === Object.prototype.toString.call(obj);
};

/**
  Load text file from anywhere
  @param {string|object} path File path or HTML event
  @param {boolean} asy True - async call, false - sync call
  @param {function} success Success function
  @param {function} error Error function
  @return {string} Read data

  @todo Define Event type
  @todo Smaller if-else structures.
  */

const protocolRegex = /^[a-z]+:\/\//i;
let loadFile = (utils.loadFile = function (path, asy, success, error) {
	var data, fs;
	if (utils.isNode || utils.isMeteorServer) {
		/*not-for-browser/*
		fs = require('fs');

		// If path is empty, than read data from stdin (for Node)
		if (typeof path === 'undefined') {
			var buff = '';
			process.stdin.setEncoding('utf8');
			process.stdin.on('readable', function () {
				var chunk = process.stdin.read();
				if (chunk !== null) {
					buff += chunk.toString();
				}
			});
			process.stdin.on('end', function () {
				success(cutbom(buff));
			});
			return;
		}

		if (protocolRegex.test(path)) {
			fetchData(path, x => success(cutbom(x)), error, asy);
			return;
		}

		//If async callthen call async
		if (asy) {
			fs.readFile(path, function (err, data) {
				if (err) {
					return error(err, null);
				}
				success(cutbom(data.toString()));
			});
			return;
		}

		// Call sync version
		try {
			data = fs.readFileSync(path);
		} catch (e) {
			error(err, null);
			return;
		}

		success(cutbom(data.toString()));
		return;
	}

	if (utils.isReactNative) {
		// If ReactNative
		var RNFS = require('react-native-fs');
		RNFS.readFile(path, 'utf8')
			.then(function (contents) {
				success(cutbom(contents));
			})
			.catch(function (err) {
				return error(err, null);
			});
		//*/
		return;
	}

	if (utils.isCordova) {
		/* If Cordova */
		utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
			fileSystem.root.getFile(path, {create: false}, function (fileEntry) {
				fileEntry.file(function (file) {
					var fileReader = new FileReader();
					fileReader.onloadend = function (e) {
						success(cutbom(this.result));
					};
					fileReader.readAsText(file);
				});
			});
		});

		return;
	}

	/* For string */
	if (typeof path === 'string') {
		// For browser read from tag
		/*
			 SELECT * FROM TXT('#one') -- read data from HTML element with id="one"
		 */
		if (path.substr(0, 1) === '#' && typeof document !== 'undefined') {
			data = document.querySelector(path).textContent;
			success(data);
			return;
		}

		/*
			 Simply read file from HTTP request, like:
			 SELECT * FROM TXT('http://alasql.org/README.md');
		 */
		fetchData(path, x => success(cutbom(x)), error, asy);
		return;
	}

	if (path instanceof Event) {
		/*
			 For browser read from files input element
			 <input type="files" onchange="readFile(event)">
			 <script>
				 function readFile(event) {
					 alasql('SELECT * FROM TXT(?)',[event])
				 }
			 </script>
		 */
		/** @type {array} List of files from <input> element */
		var files = path.target.files;
		/** type {object} */
		var reader = new FileReader();
		/** type {string} */
		var name = files[0].name;
		reader.onload = function (e) {
			var data = e.target.result;
			success(cutbom(data));
		};
		reader.readAsText(files[0]);
	}
	fetchData(path, x => success(cutbom(x)), error, asy);
});

let _fetch = typeof fetch !== 'undefined' ? fetch : null;
/*not-for-browser/*
_fetch = typeof fetch !== 'undefined' ? fetch : require('cross-fetch');
//*/

async function fetchData(path, success, error, async) {
	if (async) {
		return getData(path, success, error);
	}
	return await getData(path, success, error);
}

function getData(path, success, error) {
	return _fetch(path)
		.then(response => response.arrayBuffer())
		.then(buf => {
			var a = new Uint8Array(buf);
			var b = [...a].map(e => String.fromCharCode(e)).join('');
			success(b);
		})
		.catch(e => {
			if (error) return error(e);
			console.error(e);
			throw e;
		});
}

/**
  @function Load binary file from anywhere
  @param {string} path File path
  @param {boolean} asy True - async call, false - sync call
  @param {function} success Success function
  @param {function} error Error function
  @return 1 for Async, data - for sync version

  @todo merge functionality from loadFile and LoadBinaryFile
  */

var loadBinaryFile = (utils.loadBinaryFile = function (
	path,
	runAsync,
	success,
	error = x => {
		throw x;
	}
) {
	var fs;
	if (utils.isNode || utils.isMeteorServer) {
		/*not-for-browser/*
		fs = require('fs');

		if (/^[a-z]+:\/\//i.test(path)) {
			fetchData(path, success, error, runAsync);
		} else {
			if (runAsync) {
				fs.readFile(path, function (err, data) {
					if (err) {
						return error(err);
					}
					var arr = [];
					for (var i = 0; i < data.length; ++i) {
						arr[i] = String.fromCharCode(data[i]);
					}
					success(arr.join(''));
				});
			} else {
				var data;
				try {
					data = fs.readFileSync(path);
				} catch (e) {
					return error(e);
				}
				var arr = [];
				for (var i = 0; i < data.length; ++i) {
					arr[i] = String.fromCharCode(data[i]);
				}
				success(arr.join(''));
			}
		}
	} else if (utils.isReactNative) {
		// If ReactNative
		//var RNFS = require('react-native-fs');
		var RNFetchBlob = require('react-native-fetch-blob').default;
		var dirs = RNFetchBlob.fs.dirs;
		//should use readStream instead if the file is large
		RNFetchBlob.fs
			.readFile(path, 'base64')
			.then(function (data) {
				success(data);
			})
			.catch(error);
		//*/
	} else {
		if (typeof path === 'string') {
			// For browser
			var xhr = new XMLHttpRequest();
			xhr.open('GET', path, runAsync); // Async
			xhr.responseType = 'arraybuffer';
			xhr.onload = function () {
				var data = new Uint8Array(xhr.response);
				var arr = [];
				for (var i = 0; i < data.length; ++i) {
					arr[i] = String.fromCharCode(data[i]);
				}
				success(arr.join(''));
			};
			xhr.onerror = error;
			xhr.send();
		} else if (path instanceof Event) {

			var files = path.target.files;
			var reader = new FileReader();
			var name = files[0].name;
			reader.onload = function (e) {
				var data = e.target.result;
				success(data);
			};
			reader.onerror = error;
			reader.readAsArrayBuffer(files[0]);
		} else if (path instanceof Blob) {
			success(path);
		}
	}
});

var removeFile = (utils.removeFile = function (path, cb) {
	if (utils.isNode) {
		/*not-for-browser/*
		var fs = require('fs');
		fs.remove(path, cb);
	} else if (utils.isCordova) {
		utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
			fileSystem.root.getFile(
				path,
				{create: false},
				function (fileEntry) {
					fileEntry.remove(cb);
					cb && cb(); // jshint ignore:line
				},
				function () {
					cb && cb(); // jshint ignore:line
				}
			);
		});
	} else if (utils.isReactNative) {
		// If ReactNative
		var RNFS = require('react-native-fs');
		RNFS.unlink(path)
			.then(function () {
				cb && cb();
			})
			.catch(function (err) {
				throw err;
			});
		//*/
	} else {
		throw new Error('You can remove files only in Node.js and Apache Cordova');
	}
});

// Todo: check if it makes sense to support cordova and Meteor server
var deleteFile = (utils.deleteFile = function (path, cb) {
	/*not-for-browser/*
	if (utils.isNode) {
		var fs = require('fs');
		fs.unlink(path, cb);
	} else if (utils.isReactNative) {
		// If ReactNative
		var RNFS = require('react-native-fs');
		RNFS.unlink(path)
			.then(function () {
				cb && cb();
			})
			.catch(function (err) {
				throw err;
			});
	}
	//*/
});

utils.autoExtFilename = function (filename, ext, config) {
	config = config || {};
	if (
		typeof filename !== 'string' ||
		filename.match(/^[A-Z]+:\/\/|\n|\..{2,6}$/i) ||
		config.autoExt === 0 ||
		config.autoExt === false
	) {
		return filename;
	}
	return filename + '.' + ext;
};

var fileExists = (utils.fileExists = function (path, cb) {
	if (utils.isNode) {
		/*not-for-browser/*
		var fs = require('fs');
		fs.exists(path, cb);
	} else if (utils.isCordova) {
		utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
			fileSystem.root.getFile(
				path,
				{create: false},
				function (fileEntry) {
					cb(true);
				},
				function () {
					cb(false);
				}
			);
		});
	} else if (utils.isReactNative) {
		// If ReactNative
		var RNFS = require('react-native-fs');
		RNFS.exists(path)
			.then(function (yes) {
				cb && cb(yes);
			})
			.catch(function (err) {
				throw err;
			});
		//*/
	} else {
		// TODO Cordova, etc.
		throw new Error('You can use exists() only in Node.js or Apach Cordova');
	}
});

/**
  Save text file from anywhere
  @param {string} path File path
  @param {array} data Data object
  @param {function} cb Callback
  @param {object=} opts
  */

var saveFile = (utils.saveFile = function (path, data, cb, opts) {
	var res = 1;
	if (path === undefined) {
		//
		// Return data into result variable
		// like: alasql('SELECT * INTO TXT() FROM ?',[data]);
		//
		res = data;
		if (cb) {
			res = cb(res);
		}
	} else {
		if (utils.isNode) {
			/*not-for-browser/*
			var fs = require('fs');
			data = fs.writeFileSync(path, data);
			if (cb) {
				res = cb(res);
			}
		} else if (utils.isReactNative) {
			var RNFS = require('react-native-fs');
			RNFS.writeFile(path, data)
				.then(function (success) {
					//, 'utf8'
					if (cb) res = cb(res);
				})
				.catch(function (err) {
					console.error(err.message);
				});
		} else if (utils.isCordova) {
			utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
				//                alasql.utils.removeFile(path,function(){
				fileSystem.root.getFile(path, {create: true}, function (fileEntry) {
					fileEntry.createWriter(function (fileWriter) {
						fileWriter.onwriteend = function () {
							if (cb) {
								res = cb(res);
							}
						};
						fileWriter.write(data);
					});
				});
			});
			//*/

			//                     });
			//                });
			//            });
		} else {
			var opt = {
				disableAutoBom: false,
			};
			alasql.utils.extend(opt, opts);
			var blob = new Blob([data], {type: 'text/plain;charset=utf-8'});
			saveAs(blob, path, opt.disableAutoBom);
			if (cb) {
				res = cb(res);
			}
		}
	}

	return res;
});

/**
  @function Hash a string to signed integer
  @param {string} source string
  @return {integer} hash number
  */

// FNV-1a inspired hashing
var hash = (utils.hash = function (str) {
	var hash = 0x811c9dc5,
		i = str.length;
	while (i) {
		hash ^= str.charCodeAt(--i);
		hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);
	}
	return hash;
});

/**
  Union arrays
  @function
  @param {array} a
  @param {array} b
  @return {array}
  */
var arrayUnion = (utils.arrayUnion = function (a, b) {
	var r = b.slice(0);
	a.forEach(function (i) {
		if (r.indexOf(i) < 0) {
			r.push(i);
		}
	});
	return r;
});

/**
  Array Difference
  */
var arrayDiff = (utils.arrayDiff = function (a, b) {
	return a.filter(function (i) {
		return b.indexOf(i) < 0;
	});
});

/**
  Arrays deep intersect (with records)
  */
var arrayIntersect = (utils.arrayIntersect = function (a, b) {
	var r = [];
	a.forEach(function (ai) {
		var found = false;

		b.forEach(function (bi) {
			found = found || ai === bi;
		});

		if (found) {
			r.push(ai);
		}
	});
	return r;
});

/**
  Arrays deep union (with records)
  */
var arrayUnionDeep = (utils.arrayUnionDeep = function (a, b) {
	var r = b.slice(0);
	a.forEach(function (ai) {
		var found = false;

		r.forEach(function (ri) {
			//            found = found || equalDeep(ai, ri, true);
			found = found || deepEqual(ai, ri);
		});

		if (!found) {
			r.push(ai);
		}
	});
	return r;
});

/**
  Arrays deep union (with records)
  */
var arrayExceptDeep = (utils.arrayExceptDeep = function (a, b) {
	var r = [];
	a.forEach(function (ai) {
		var found = false;

		b.forEach(function (bi) {
			//            found = found || equalDeep(ai, bi, true);
			found = found || deepEqual(ai, bi);
		});

		if (!found) {
			r.push(ai);
		}
	});
	return r;
});

/**
  Arrays deep intersect (with records)
  */
var arrayIntersectDeep = (utils.arrayIntersectDeep = function (a, b) {
	var r = [];
	a.forEach(function (ai) {
		var found = false;

		b.forEach(function (bi) {
			//            found = found || equalDeep(ai, bi, true);
			found = found || deepEqual(ai, bi, true);
		});

		if (found) {
			r.push(ai);
		}
	});
	return r;
});

/**
  Deep clone objects
  */
var cloneDeep = (utils.cloneDeep = function cloneDeep(obj) {
	if (null === obj || typeof obj !== 'object') {
		return obj;
	}

	if (obj instanceof Date) {
		return new Date(obj);
	}

	if (obj instanceof String) {
		return obj.toString();
	}

	if (obj instanceof Number) {
		return +obj;
	}

	var temp = new obj.constructor(); // changed

	for (var key in obj) {
		if (obj.hasOwnProperty(key)) {
			temp[key] = cloneDeep(obj[key]);
		}
	}
	return temp;
});

/**
  Check equality of objects
  */

/**
  Compare two objects in deep
  */
var deepEqual = (utils.deepEqual = function (x, y) {
	if (x === y) {
		return true;
	}

	if (typeof x === 'object' && null !== x && typeof y === 'object' && null !== y) {
		if (Object.keys(x).length !== Object.keys(y).length) {
			return false;
		}
		for (var prop in x) {
			if (!deepEqual(x[prop], y[prop])) {
				return false;
			}
		}
		return true;
	}

	return false;
});
/**
  Array with distinct records
  @param {array} data
  @return {array}
  */
var distinctArray = (utils.distinctArray = function (data) {
	var uniq = {};
	// TODO: Speedup, because Object.keys is slow
	for (var i = 0, ilen = data.length; i < ilen; i++) {
		var uix;
		if (typeof data[i] === 'object') {
			uix = Object.keys(data[i])
				.sort()
				.map(function (k) {
					return k + '`' + data[i][k];
				})
				.join('`');
		} else {
			uix = data[i];
		}
		uniq[uix] = data[i];
	}
	var res = [];
	for (var key in uniq) {
		res.push(uniq[key]);
	}
	return res;
});

/**
  Extend object a with properties of b
  @function
  @param {object} a
  @param {object} b
  @return {object}
  */
var extend = (utils.extend = function extend(a, b) {
	a = a || {};
	for (var key in b) {
		if (b.hasOwnProperty(key)) {
			a[key] = b[key];
		}
	}
	return a;
});

/**
 * Extracts the primitive data
 */
var getValueOf = (utils.getValueOf = function (val) {
	return typeof val === 'object' && (val instanceof String || val instanceof Number)
		? val.valueOf()
		: val;
});

/**
  Flat array by first row
  */
var flatArray = (utils.flatArray = function (a) {

	if (!a || 0 === a.length) {
		return [];
	}

	// For recordsets
	if (typeof a === 'object' && a instanceof alasql.Recordset) {
		return a.data.map(function (ai) {
			return getValueOf(ai[a.columns[0].columnid]);
		});
	}
	// Else for other arrays
	var key = Object.keys(a[0])[0];
	if (key === undefined) {
		return [];
	}
	return a.map(function (ai) {
		return ai[key];
	});
});

/**
  Convert array of objects to array of arrays
  */
var arrayOfArrays = (utils.arrayOfArrays = function (a) {
	return a.map(function (aa) {
		var ar = [];
		for (var key in aa) {
			ar.push(aa[key]);
		}
		return ar;
	});
});

if (!Array.isArray) {
	Array.isArray = function (arg) {
		return Object.prototype.toString.call(arg) === '[object Array]';
	};
}

/**
  Excel:convert number to Excel column, like 1 => 'A'
  @param {integer} i Column number, starting with 0
  @return {string} Column name, starting with 'A'
  */

var xlsnc = (utils.xlsnc = function (i) {
	var first = '';
	if (i > 701) {
		let x = (((i - 26) / (26 * 26)) | 0) - 1;
		first = String.fromCharCode(65 + (x % 26));
		i = i % (26 * 26);
	}
	var addr = String.fromCharCode(65 + (i % 26));
	if (i >= 26) {
		i = ((i / 26) | 0) - 1;
		addr = String.fromCharCode(65 + (i % 26)) + addr;
		if (i > 26) {
			i = ((i / 26) | 0) - 1;
			addr = String.fromCharCode(65 + (i % 26)) + addr;
		}
	}
	return first + addr;
});

/**
  Excel:conver Excel column name to number
  @param {string} s Column number, like 'A' or 'BE'
  @return {string} Column name, starting with 0
  */
var xlscn = (utils.xlscn = function (s) {
	var n = s.charCodeAt(0) - 65;
	if (s.length > 1) {
		n = (n + 1) * 26 + s.charCodeAt(1) - 65;

		if (s.length > 2) {
			n = (n + 1) * 26 + s.charCodeAt(2) - 65;
		}
	}
	return n;
});

var domEmptyChildren = (utils.domEmptyChildren = function (container) {
	var len = container.childNodes.length;
	while (len--) {
		container.removeChild(container.lastChild);
	}
});

/**
  SQL LIKE emulation
  @parameter {string} pattern Search pattern
  @parameter {string} value Searched value
  @parameter {string} escape Escape character (optional)
  @return {boolean} If value LIKE pattern ESCAPE escape
  */
var patternCache = {};
var like = (utils.like = function (pattern, value, escape) {
	if (!patternCache[pattern]) {
		// Verify escape character
		if (!escape) escape = '';

		var i = 0;
		var s = '^';

		while (i < pattern.length) {
			var c = pattern[i],
				c1 = '';
			if (i < pattern.length - 1) c1 = pattern[i + 1];

			if (c === escape) {
				s += '\\' + c1;
				i++;
			} else if (c === '[' && c1 === '^') {
				s += '[^';
				i++;
			} else if (c === '[' || c === ']') {
				s += c;
			} else if (c === '%') {
				s += '[\\s\\S]*';
			} else if (c === '_') {
				s += '.';
			} else if ('/.*+?|(){}'.indexOf(c) > -1) {
				s += '\\' + c;
			} else {
				s += c;
			}
			i++;
		}

		s += '$';
		//    if(value == undefined) return false;

		patternCache[pattern] = RegExp(s, 'i');
	}
	return ('' + (value ?? '')).search(patternCache[pattern]) > -1;
});

utils.glob = function (value, pattern) {
	var i = 0;
	var s = '^';

	while (i < pattern.length) {
		var c = pattern[i],
			c1 = '';
		if (i < pattern.length - 1) c1 = pattern[i + 1];

		if (c === '[' && c1 === '^') {
			s += '[^';
			i++;
		} else if (c === '[' || c === ']') {
			s += c;
		} else if (c === '*') {
			s += '.*';
		} else if (c === '?') {
			s += '.';
		} else if ('/.*+?|(){}'.indexOf(c) > -1) {
			s += '\\' + c;
		} else {
			s += c;
		}
		i++;
	}

	s += '$';
	return ('' + (value || '')).toUpperCase().search(RegExp(s.toUpperCase())) > -1;
};

/**
  Get path of alasql.js
  @todo Rewrite and simplify the code. Review, is this function is required separately
  */
utils.findAlaSQLPath = function () {
	/** type {string} Path to alasql library and plugins */

	if (utils.isWebWorker) {
		return '';
		/** @todo Check how to get path in worker */
	} else if (utils.isMeteorClient) {
		return '/packages/dist/';
	} else if (utils.isMeteorServer) {
		return 'assets/packages/dist/';
	} else if (utils.isNode) {
		return __dirname;
	} else if (utils.isBrowser) {
		var sc = document.getElementsByTagName('script');

		for (var i = 0; i < sc.length; i++) {
			if (sc[i].src.substr(-16).toLowerCase() === 'alasql-worker.js') {
				return sc[i].src.substr(0, sc[i].src.length - 16);
			} else if (sc[i].src.substr(-20).toLowerCase() === 'alasql-worker.min.js') {
				return sc[i].src.substr(0, sc[i].src.length - 20);
			} else if (sc[i].src.substr(-9).toLowerCase() === 'alasql.js') {
				return sc[i].src.substr(0, sc[i].src.length - 9);
			} else if (sc[i].src.substr(-13).toLowerCase() === 'alasql.min.js') {
				return sc[i].src.substr(0, sc[i].src.length - 13);
			}
		}
	}
	return '';
};

var getXLSX = function () {
	var XLSX = alasql.private.externalXlsxLib || utils.global.XLSX || null;

	if (XLSX) {
		return XLSX;
	}

	if (utils.isNode || utils.isBrowserify || utils.isMeteorServer) {
		/*not-for-browser/*
		XLSX = require('../modules/xlsx/xlsx') || null;
		alasql.private.externalXlsxLib = XLSX;
		//*/
	}

	if (!XLSX) {
		throw new Error('Please include the xlsx.js library');
	}

	return XLSX;
};

// set AlaSQl path
alasql.path = alasql.utils.findAlaSQLPath();
/**
	  Strip all comments.
	  @function
	  @param {string} str
	  @return {string}
	  Based om the https://github.com/lehni/uncomment.js/blob/master/uncomment.js
	  I just replaced JavaScript's '//' to SQL's '--' and remove other stuff

	  @todo Fixed [aaa/*bbb] for column names
	  @todo Bug if -- comments in the last line
	@todo Check if it possible to model it with Jison parser
	@todo Remove unused code
 */

/* global alasql */

alasql.utils.uncomment = function (str) {
	// Add some padding so we can always look ahead and behind by two chars
	str = ('__' + str + '__').split('');
	var quote = false,
		quoteSign,
		// regularExpression = false,
		// characterClass = false,
		blockComment = false,
		lineComment = false;
	// preserveComment = false;

	for (var i = 0, l = str.length; i < l; i++) {
		// When checking for quote escaping, we also need to check that the
		// escape sign itself is not escaped, as otherwise '\\' would cause
		// the wrong impression of an unclosed string:
		var unescaped = str[i - 1] !== '\\' || str[i - 2] === '\\';

		if (quote) {
			if (str[i] === quoteSign && unescaped) {
				quote = false;
			}
		} else if (blockComment) {
			// Is the block comment closing?
			if (str[i] === '*' && str[i + 1] === '/') {
				// if (!preserveComment)
				str[i] = str[i + 1] = '';
				blockComment /* = preserveComment*/ = false;
				// Increase by 1 to skip closing '/', as it would be mistaken
				// for a regexp otherwise
				i++;
			} else {
				//if (!preserveComment) {
				str[i] = '';
			}
		} else if (lineComment) {
			// One-line comments end with the line-break
			if (str[i + 1] === '\n' || str[i + 1] === '\r' || str.length - 2 === i) {
				lineComment = false;
			}
			str[i] = '';
		} else {
			if (str[i] === '"' || str[i] === "'") {
				quote = true;
				quoteSign = str[i];
			} else if (str[i] === '[' && str[i - 1] !== '@') {
				quote = true;
				quoteSign = ']';
			} else if (str[i] === '-' && str[i + 1] === '-') {
				str[i] = '';
				lineComment = true;
			} else if (str[i] === '/' && str[i + 1] === '*') {
				// Do not filter out conditional comments /*@ ... */
				// and comments marked as protected /*! ... */
				//					preserveComment = /[@!]/.test(str[i + 2]);
				//					if (!preserveComment)
				str[i] = '';
				blockComment = true;
			}
		}
	}
	// Remove padding again.
	str = str.join('').slice(2, -2);

	return str;
};
/**
	Database class for Alasql.js
*/

// Initial parameters

/**
	Jison parser
*/
alasql.parser = alasqlparser;

alasql.parser.parseError = function (str, hash) {
	throw new Error('Have you used a reserved keyword without `escaping` it?\n' + str);
};

/**
	  Jison parser
	  @param {string} sql SQL statement
	  @return {object} AST (Abstract Syntax Tree)

	  @todo Create class AST
	  @todo Add other parsers

	  @example
	  alasql.parse = function(sql) {
		// My own parser here
	  }
 */
alasql.parse = function (sql) {
	return alasqlparser.parse(alasql.utils.uncomment(sql));
};

/**
	  List of engines of external databases
	  @type {object}
	  @todo Create collection type
 */
alasql.engines = {};

/**
	  List of databases
	  @type {object}
 */
alasql.databases = {};

/**
	Number of databases
	@type {number}
*/
alasql.databasenum = 0;

/**
	  Alasql options object
 */
alasql.options = {
	/** Log or throw error */
	errorlog: false,

	/** Use valueof in orderfn */
	valueof: true,

	/** DROP database in any case */
	dropifnotexists: false,

	/** How to handle DATE and DATETIME types */
	datetimeformat: 'sql',

	/** Table and column names are case sensitive and converted to lower-case */
	casesensitive: true,

	/** target for log. Values: 'console', 'output', 'id' of html tag */
	logtarget: 'output',

	/** Print SQL at log */
	logprompt: true,

	/** Callback for async queries progress */
	progress: false,

	/**
	 * Default modifier
	 * values: RECORDSET, VALUE, ROW, COLUMN, MATRIX, TEXTSTRING, INDEX
	 * @type {'RECORDSET'|'VALUE'|'ROW'|'COLUMN'|'MATRIX'|'TEXTSTRING'|'INDEX'|undefined}
	 */
	modifier: undefined,

	/** How many rows to lookup to define columns */
	columnlookup: 10,

	/** Create vertex if not found */
	autovertex: true,

	/** Use dbo as current database (for partial T-SQL comaptibility) */
	usedbo: true,

	/** AUTOCOMMIT ON | OFF */
	autocommit: true,

	/** Use cache */
	cache: true,

	/** Compatibility flags */
	tsql: true,

	mysql: true,

	postgres: true,

	oracle: true,

	sqlite: true,

	orientdb: true,

	/** for SET NOCOUNT OFF */
	nocount: false,

	/** Check for NaN and convert it to undefined */
	nan: false,

	excel: {cellDates: true},

	/** Option for SELECT * FROM a,b */
	joinstar: 'overwrite',

	loopbreak: 100000,

	/** Whether GETDATE() and NOW() return dates as string. If false, then a Date object is returned */
	dateAsString: true,
};

//alasql.options.worker = false;

// Variables
alasql.vars = {};

alasql.declares = {};

alasql.prompthistory = [];

alasql.plugins = {}; // If plugin already loaded

alasql.from = {}; // FROM functions

alasql.into = {}; // INTO functions

alasql.fn = {};

alasql.aggr = {};

alasql.busy = 0;

// Cache
alasql.MAXSQLCACHESIZE = 10000;
alasql.DEFAULTDATABASEID = 'alasql';

/* WebWorker */
alasql.lastid = 0;

alasql.buffer = {};

alasql.private = {
	externalXlsxLib: null,
};

alasql.setXLSX = function (XLSX) {
	alasql.private.externalXlsxLib = XLSX;
};

/**
  Select current database
  @param {string} databaseid Selected database identificator
 */
alasql.use = function (databaseid) {
	if (!databaseid) {
		databaseid = alasql.DEFAULTDATABASEID;
	}

	if (alasql.useid === databaseid) {
		return;
	}

	if (alasql.databases[databaseid] !== undefined) {
		alasql.useid = databaseid;
		let db = alasql.databases[alasql.useid];
		alasql.tables = db.tables;
		db.resetSqlCache();
		if (alasql.options.usedbo) {
			alasql.databases.dbo = db;
		}
	} else {
		throw Error('Database does not exist: ' + databaseid);
	}
};

alasql.autoval = function (tablename, colname, getNext, databaseid) {
	var db = databaseid ? alasql.databases[databaseid] : alasql.databases[alasql.useid];

	if (!db.tables[tablename]) {
		throw new Error('Tablename not found: ' + tablename);
	}

	if (!db.tables[tablename].identities[colname]) {
		throw new Error('Colname not found: ' + colname);
	}

	if (getNext) {
		return db.tables[tablename].identities[colname].value || null;
	}

	return (
		db.tables[tablename].identities[colname].value -
			db.tables[tablename].identities[colname].step || null
	);
};

/**
 Run single SQL statement on current database
 */
alasql.exec = function (sql, params, cb, scope) {
	// Avoid setting params if not needed even with callback
	if (typeof params === 'function') {
		scope = cb;
		cb = params;
		params = {};
	}

	delete alasql.error;

	params = params || {};

	if (alasql.options.errorlog) {
		try {
			return alasql.dexec(alasql.useid, sql, params, cb, scope);
		} catch (err) {
			alasql.error = err;
			if (cb) {
				cb(null, alasql.error);
			}
		}
	} else {
		return alasql.dexec(alasql.useid, sql, params, cb, scope);
	}
};

/**
 * Clears any unneeded properties from a given AST statement closure used for caching
 * @param {Object} statement the statement to cleanup
 */
function cleanupCache(statement) {
	if (!statement) {
		return;
	}
	if (!alasql.options.cache) {
		return;
	}
	// cleanup the table data to prevent storing this information in the SQL cache
	if (statement && statement.query && statement.query.data) {
		statement.query.data = [];
	}
}

/**
 Run SQL statement on specific database
 */
alasql.dexec = function (databaseid, sql, params, cb, scope) {
	var db = alasql.databases[databaseid];
	//	if(db.databaseid != databaseid) console.trace('got!');

	var hh = hash(sql);

	// Create hash
	if (alasql.options.cache) {
		let statement = db.sqlCache[hh];
		// If database structure was not changed since last time return cache
		if (statement && db.dbversion === statement.dbversion) {
			var res = statement(params, cb);
			cleanupCache(statement);
			return res;
		}
	}

	let ast = db.astCache[hh];
	if (alasql.options.cache && !ast) {
		// Create AST cache
		ast = alasql.parse(sql);
		if (ast) {
			// add to AST cache
			db.astCache[hh] = ast;
		}
	} else {
		ast = alasql.parse(sql);
	}

	if (!ast.statements) {
		return;
	}

	if (0 === ast.statements.length) {
		return 0;
	}

	if (1 === ast.statements.length) {
		if (ast.statements[0].compile) {
			// Compile and Execute
			var statement = ast.statements[0].compile(databaseid, params);
			if (!statement) {
				return;
			}
			statement.sql = sql;
			statement.dbversion = db.dbversion;

			if (alasql.options.cache) {
				// Secure sqlCache size
				if (db.sqlCacheSize > alasql.MAXSQLCACHESIZE) {
					db.resetSqlCache();
				}
				db.sqlCacheSize++;
				db.sqlCache[hh] = statement;
			}
			var res = (alasql.res = statement(params, cb, scope));
			cleanupCache(statement);
			return res;
		}
		alasql.precompile(ast.statements[0], alasql.useid, params);
		var res = (alasql.res = ast.statements[0].execute(databaseid, params, cb, scope));
		return res;
	}

	if (cb) {
		alasql.adrun(databaseid, ast, params, cb, scope);
		return;
	}

	return alasql.drun(databaseid, ast, params, cb, scope);
};

/**
  Run multiple statements and return array of results sync
 */
alasql.drun = function (databaseid, ast, params, cb, scope) {
	var useid = alasql.useid;

	if (useid !== databaseid) {
		alasql.use(databaseid);
	}

	var res = [];
	for (var i = 0, ilen = ast.statements.length; i < ilen; i++) {
		if (ast.statements[i]) {
			if (ast.statements[i].compile) {
				var statement = ast.statements[i].compile(alasql.useid);
				res.push((alasql.res = statement(params, null, scope)));
			} else {
				alasql.precompile(ast.statements[i], alasql.useid, params);
				res.push((alasql.res = ast.statements[i].execute(alasql.useid, params)));
			}
		}
	}
	if (useid !== databaseid) {
		alasql.use(useid);
	}

	if (cb) {
		cb(res);
	}

	alasql.res = res;

	return res;
};

/**
  Run multiple statements and return array of results async
 */
alasql.adrun = function (databaseid, ast, params, cb, scope) {
	var idx = 0;
	var noqueries = ast.statements.length;
	if (alasql.options.progress !== false) {
		alasql.options.progress(noqueries, idx++);
	}

	//	alasql.busy++;
	var useid = alasql.useid;
	if (useid !== databaseid) {
		alasql.use(databaseid);
	}
	var res = [];

	function adrunone(data) {
		if (data !== undefined) {
			res.push(data);
		}

		var astatement = ast.statements.shift();
		if (!astatement) {
			if (useid !== databaseid) {
				alasql.use(useid);
			}
			cb(res);
			return;
		}

		if (astatement.compile) {
			var statement = astatement.compile(alasql.useid);
			statement(params, adrunone, scope);
			if (alasql.options.progress !== false) {
				alasql.options.progress(noqueries, idx++);
			}
			return;
		}

		alasql.precompile(ast.statements[0], alasql.useid, params);
		astatement.execute(alasql.useid, params, adrunone);

		if (alasql.options.progress !== false) {
			alasql.options.progress(noqueries, idx++);
		}
	}

	adrunone(); /** @todo Check, why data is empty here */
};

/**
 Compile statement to JavaScript function
 @param {string} sql SQL statement
 @param {string} databaseid Database identificator
 @return {functions} Compiled statement functions
*/
alasql.compile = function (sql, databaseid) {
	databaseid = databaseid || alasql.useid;

	let ast = alasql.parse(sql); // Create AST

	if (1 !== ast.statements.length)
		throw new Error('Cannot compile, because number of statements in SQL is not equal to 1');

	var statement = ast.statements[0].compile(databaseid);

	statement.promise = function (params) {
		return new Promise(function (resolve, reject) {
			statement(params, function (data, err) {
				if (err) {
					reject(err);
				} else {
					resolve(data);
				}
			});
		});
	};

	return statement;
};
//
// Promises for AlaSQL
//

if (!utils.global.Promise) {
	utils.global.Promise = Promise;
}

var promiseExec = function (sql, params, counterStep, counterTotal) {
	return new utils.global.Promise(function (resolve, reject) {
		alasql(sql, params, function (data, err) {
			if (err) {
				reject(err);
			} else {
				if (counterStep && counterTotal && alasql.options.progress !== false) {
					alasql.options.progress(counterStep, counterTotal);
				}
				resolve(data);
			}
		});
	});
};

const sequentialPromiseResolver = (promiseData, Promise) => {
	var startingPoint = Promise.resolve([]);

	promiseData.forEach(p => {
		startingPoint = startingPoint.then(previousResult =>
			promiseExec(p.sql, p.params, p.i, p.length).then(result => [...previousResult, result])
		);
	});

	return startingPoint;
};

var promiseAll = function (sqlParamsArray) {
	if (sqlParamsArray.length < 1) {
		return;
	}

	var active, sql, params;

	var execArray = [];

	for (var i = 0; i < sqlParamsArray.length; i++) {
		active = sqlParamsArray[i];

		if (typeof active === 'string') {
			active = [active];
		}

		if (!utils.isArray(active) || active.length < 1 || 2 < active.length) {
			throw new Error('Error in .promise parameter');
		}

		sql = active[0];
		params = active[1] || undefined;

		execArray.push({
			sql,
			params,
			i,
			length: sqlParamsArray.length,
		});
	}

	// in case of indexdb the version does not update
	// if create table queries are run in parallel
	// this causes certain DML queries to not execute
	// running them sequentially fixes this issue
	return sequentialPromiseResolver(execArray, utils.global.Promise);
};

alasql.promise = function (sql, params) {
	if (typeof Promise === 'undefined') {
		throw new Error('Please include a Promise/A+ library');
	}

	if (typeof sql === 'string') {
		return promiseExec(sql, params);
	}

	if (!utils.isArray(sql) || sql.length < 1 || typeof params !== 'undefined') {
		throw new Error('Error in .promise parameters');
	}
	return promiseAll(sql);
};
/*
//
// Database class for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// Main Database class

/**
    @class Database
 */

var Database = (alasql.Database = function (databaseid) {
	var self = this;

	//		self.prototype = this;

	if (self === alasql) {
		if (databaseid) {
			//			if(alasql.databases[databaseid]) {
			self = alasql.databases[databaseid];
			//			} else {
			alasql.databases[databaseid] = self;
			//			}
			if (!self) {
				throw new Error(`Database ${databaseid} not found`);
			}
		} else {
			// Create new database (or get alasql?)
			self = alasql.databases.alasql;
			// For SQL Server examples, USE tempdb
			if (alasql.options.tsql) {
				alasql.databases.tempdb = alasql.databases.alasql;
			}
			//			self = new Database(databaseid); // to call without new
		}
	}
	if (!databaseid) {
		databaseid = 'db' + alasql.databasenum++; // Random name
	}

	// Step 1
	self.databaseid = databaseid;
	alasql.databases[databaseid] = self;
	self.dbversion = 0;

	//Steps 2-5
	self.tables = {};
	self.views = {};
	self.triggers = {};
	self.indices = {};

	// Step 6: Objects storage
	self.objects = {};
	self.counter = 0;

	self.resetSqlCache();
	return self;
});

/**
    Reset SQL statements cache
 */

Database.prototype.resetSqlCache = function () {
	this.sqlCache = {}; // Cache for compiled SQL statements
	this.sqlCacheSize = 0;
	this.astCache = {}; // Cache for AST objects
};

// Main SQL function

/**
    Run SQL statement on database
    @param {string} sql SQL statement
    @param [object] params Parameters
    @param {function} cb callback
 */

Database.prototype.exec = function (sql, params, cb) {
	return alasql.dexec(this.databaseid, sql, params, cb);
};

Database.prototype.autoval = function (tablename, colname, getNext) {
	return alasql.autoval(tablename, colname, getNext, this.databaseid);
};

Database.prototype.transaction = function (cb) {
	var tx = new alasql.Transaction(this.databaseid);
	var res = cb(tx);
	return res;
};

// Aliases like MS SQL

/*
//
// Transaction class for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

class Transaction {
	transactionid = Date.now();

	committed = false;

	/** @type {string | undefined} */
	bank;

	constructor(databaseid) {
		this.databaseid = databaseid;
		this.dbversion = alasql.databases[databaseid].dbversion;
		// this.bank = structuredClone(alasql.databases[databaseid]);
		this.bank = JSON.stringify(alasql.databases[databaseid]);
		// TODO CLone Tables with insertfns
	}

	/** Commit transaction */
	commit() {
		this.committed = true;
		alasql.databases[this.databaseid].dbversion = Date.now();
		delete this.bank;
	}

	/** Rollback transaction */
	rollback() {
		if (!this.committed) {
			alasql.databases[this.databaseid] = JSON.parse(this.bank);
			// alasql.databases[this.databaseid].tables = this.bank;
			// alasql.databases[this.databaseid].dbversion = this.dbversion;
			delete this.bank;
		} else {
			throw new Error('Transaction already commited');
		}
	}

	/**
	 * Execute SQL statement
	 * @param {string} sql SQL statement
	 * @param {object} params Parameters
	 * @param {function} cb Callback function
	 * @return result
	 */
	exec(sql, params, cb) {
		return alasql.dexec(this.databaseid, sql, params, cb);
	}

	/*
	queryArray (sql, params, cb) {
		return flatArray(this.exec(sql, params, cb));
	}

	queryArrayOfArrays (sql, params, cb) {
		return arrayOfArrays(this.exec(sql, params, cb));
	}

	querySingle (sql, params, cb) {
		return this.exec(sql, params, cb)[0];
	}

	queryValue (sql, params, cb) {
		var res = this.querySingle(sql, params, cb);
		return res[Object.keys(res)[0]];
	}
	*/
}

Transaction.prototype.executeSQL = Transaction.prototype.exec;

// Transaction.prototype.query = Database.prototype.exec;
// Transaction.prototype.run = Database.prototype.exec;

alasql.Transaction = Transaction;
/*
//
// Table class for Alasql.js
// Date: 14.11.2014
// (c) 2014, Andrey Gershun
//
*/

// Table class
var Table = (alasql.Table = function (params) {
	// Step 1: Data array
	this.data = [];

	// Step 2: Columns
	this.columns = [];
	this.xcolumns = {};

	// Step 3: indices
	this.inddefs = {};
	this.indices = {};
	this.uniqs = {};
	this.uniqdefs = {};

	// Step 4: identities
	this.identities = {};

	// Step 5: checkfn...
	this.checks = [];
	this.checkfns = []; // For restore... to be done...

	// Step 6: INSERT/DELETE/UPDATE

	// Step 7: Triggers...
	// Create trigger hubs
	this.beforeinsert = {};
	this.afterinsert = {};
	this.insteadofinsert = {};

	this.beforedelete = {};
	this.afterdelete = {};
	this.insteadofdelete = {};

	this.beforeupdate = {};
	this.afterupdate = {};
	this.insteadofupdate = {};

	// Done
	Object.assign(this, params);
});

Table.prototype.indexColumns = function () {
	var self = this;
	self.xcolumns = {};
	self.columns.forEach(function (col) {
		self.xcolumns[col.columnid] = col;
	});
};
/*
//
// View class for Alasql.js
// Date: 14.11.2014
// (c) 2014, Andrey Gershun
//
*/

// Table class
class View {
	constructor(params) {
		// Columns
		this.columns = [];
		this.xcolumns = {};
		// Data array
		this.query = [];

		Object.assign(this, params);
	}
}

alasql.View = View;

/*
//
// Query class for Alasql.js
// Date: 14.11.2014
// (c) 2014, Andrey Gershun
//
*/

// Table class

/**
 @class Query Main query class
 */
class Query {
	constructor(params) {
		this.alasql = alasql;

		// Columns
		this.columns = [];
		this.xcolumns = {};
		this.selectGroup = [];
		this.groupColumns = {};
		// Data array
		Object.assign(this, params);
	}
}

/**
 @class Recordset data object
 */
class Recordset {
	constructor(params) {
		// Data array
		Object.assign(this, params);
	}
}

alasql.Recordset = Recordset;
alasql.Query = Query;
/*
//
// Parser helper for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// Base class for all yy classes
class Base {
	constructor(params) {
		Object.assign(this, params);
	}
	toString() {}
	toType() {}
	toJS() {}
	exec() {}
	compile() {}
}

var yy = {
	// Utility
	/** @deprecated use `Object.assign` instead */
	extend: Object.assign,

	// Option for case sensitive
	casesensitive: alasql.options.casesensitive,
	Base,
};

alasqlparser.yy = alasql.yy = yy;
/*
//
// Statements class for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Statements = class Statements {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		return this.statements.map(st => st.toString()).join('; ');
	}

	// Compile array of statements into single statement
	compile(db) {
		const statements = this.statements.map(st => st.compile(db));
		return statements.length === 1
			? statements[0]
			: (params, cb) => {
					const res = statements.map(st => st(params));
					if (cb) cb(res);
					return res;
				};
	}
};
/* global alasql */
/* global yy */
/*
//
// SEARCH for Alasql.js
// Date: 04.05.2015
// (c) 2015, Andrey Gershun
//
*/

/**
	Search class
	@example
	SEARCH SUM(/a) FROM ? -- search over parameter object
*/

yy.Search = class Search {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		let s = 'SEARCH ';
		if (this.selectors) s += this.selectors.toString();
		if (this.from) s += 'FROM ' + this.from.toString();
		return s;
	}

	toJS(context) {
		const s = `this.queriesfn[${this.queriesidx - 1}](this.params,null,${context})`;
		return s;
	}

	compile(databaseid) {
		var dbid = databaseid;

		var statement = (params, cb) => {
			var res;
			this.#doSearch(dbid, params, function (data) {
				res = modify(statement.query, data);
				if (cb) res = cb(res);
			});
			// if(cb) res = cb(res);
			return res;
		};
		statement.query = {};
		return statement;
	}

	#doSearch(databaseid, params, cb) {
		var res;
		var stope = {};
		var fromdata;
		var selectors = cloneDeep(this.selectors);

		function processSelector(selectors, sidx, value) {
			//		var val;

			var val, // temp values use many places
				nest, // temp value used many places
				r, // temp value used many places
				sel = selectors[sidx];

			var INFINITE_LOOP_BREAK = alasql.options.loopbreak || 100000;

			if (sel.selid) {
				// TODO Process Selector
				if (sel.selid === 'PATH') {
					var queue = [{node: value, stack: []}];
					var visited = {};
					//var path = [];
					var objects = alasql.databases[alasql.useid].objects;
					while (queue.length > 0) {
						var q = queue.shift();
						var node = q.node;
						var stack = q.stack;
						var r = processSelector(sel.args, 0, node);
						if (r.length > 0) {
							if (sidx + 1 + 1 > selectors.length) {
								return stack;
							} else {
								var rv = [];
								if (stack && stack.length > 0) {
									stack.forEach(function (stv) {
										rv = rv.concat(processSelector(selectors, sidx + 1, stv));
									});
								}
								return rv;
								//							return processSelector(selectors,sidx+1,stack);
							}
						} else {
							if (typeof visited[node.$id] !== 'undefined') {
								continue;
							} else {

								visited[node.$id] = true;
								if (node.$out && node.$out.length > 0) {
									node.$out.forEach(function (edgeid) {
										var edge = objects[edgeid];
										var stack2 = stack.concat(edge);
										stack2.push(objects[edge.$out[0]]);
										queue.push({
											node: objects[edge.$out[0]],
											stack: stack2,
										});
									});
								}
							}
						}
					}
					// Else return fail
					return [];
				}
				if (sel.selid === 'NOT') {
					var nest = processSelector(sel.args, 0, value);

					if (nest.length > 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return [value];
						} else {
							return processSelector(selectors, sidx + 1, value);
						}
					}
				} else if (sel.selid === 'DISTINCT') {
					var nest;
					if (typeof sel.args === 'undefined' || sel.args.length === 0) {
						nest = distinctArray(value);
					} else {
						nest = processSelector(sel.args, 0, value);
					}
					if (nest.length === 0) {
						return [];
					} else {
						var res = distinctArray(nest);
						if (sidx + 1 + 1 > selectors.length) {
							return res;
						} else {
							return processSelector(selectors, sidx + 1, res);
						}
					}
				} else if (sel.selid === 'AND') {
					var res = true;
					sel.args.forEach(function (se) {
						res = res && processSelector(se, 0, value).length > 0;
					});
					if (!res) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return [value];
						} else {
							return processSelector(selectors, sidx + 1, value);
						}
					}
				} else if (sel.selid === 'OR') {
					var res = false;
					sel.args.forEach(function (se) {
						res = res || processSelector(se, 0, value).length > 0;
					});
					if (!res) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return [value];
						} else {
							return processSelector(selectors, sidx + 1, value);
						}
					}
				} else if (sel.selid === 'ALL') {
					var nest = processSelector(sel.args[0], 0, value);
					if (nest.length === 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return nest;
						} else {
							return processSelector(selectors, sidx + 1, nest);
						}
					}
				} else if (sel.selid === 'ANY') {
					var nest = processSelector(sel.args[0], 0, value);
					if (nest.length === 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return [nest[0]];
						} else {
							return processSelector(selectors, sidx + 1, [nest[0]]);
						}
					}
				} else if (sel.selid === 'UNIONALL') {
					var nest = [];
					sel.args.forEach(function (se) {
						nest = nest.concat(processSelector(se, 0, value));
					});
					if (nest.length === 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return nest;
						} else {
							return processSelector(selectors, sidx + 1, nest);
						}
					}
				} else if (sel.selid === 'UNION') {
					var nest = [];
					sel.args.forEach(function (se) {
						nest = nest.concat(processSelector(se, 0, value));
					});
					var nest = distinctArray(nest);
					if (nest.length === 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return nest;
						} else {
							return processSelector(selectors, sidx + 1, nest);
						}
					}
				} else if (sel.selid === 'IF') {
					var nest = processSelector(sel.args, 0, value);

					if (nest.length === 0) {
						return [];
					} else {
						if (sidx + 1 + 1 > selectors.length) {
							return [value];
						} else {
							return processSelector(selectors, sidx + 1, value);
						}
					}
				} else if (sel.selid === 'REPEAT') {

					var lvar,
						lmax,
						lmin = sel.args[0].value;
					if (!sel.args[1]) {
						lmax = lmin; // Add security break
					} else {
						lmax = sel.args[1].value;
					}
					if (sel.args[2]) {
						lvar = sel.args[2].variable;
					}
					//var lsel = sel.sels;

					var retval = [];

					if (lmin === 0) {
						if (sidx + 1 + 1 > selectors.length) {
							retval = [value];
						} else {
							if (lvar) {
								alasql.vars[lvar] = 0;
							}
							retval = retval.concat(processSelector(selectors, sidx + 1, value));
						}
					}

					// var nests = processSelector(sel.sels,0,value).slice();
					if (lmax > 0) {
						var nests = [{value: value, lvl: 1}];

						var i = 0;
						while (nests.length > 0) {
							var nest = nests[0];

							nests.shift();
							if (nest.lvl <= lmax) {
								if (lvar) {
									alasql.vars[lvar] = nest.lvl;
								}

								var nest1 = processSelector(sel.sels, 0, nest.value);

								nest1.forEach(function (n) {
									nests.push({value: n, lvl: nest.lvl + 1});
								});
								if (nest.lvl >= lmin) {
									if (sidx + 1 + 1 > selectors.length) {
										retval = retval.concat(nest1);
										//return nests;
									} else {
										nest1.forEach(function (n) {
											retval = retval.concat(processSelector(selectors, sidx + 1, n));
										});
									}
								}
							}
							// Security brake
							i++;
							if (i > INFINITE_LOOP_BREAK) {
								throw new Error('Infinite loop brake. Number of iterations = ' + i);
							}
						}
					}
					return retval;
				} else if (sel.selid === 'OF') {
					if (sidx + 1 + 1 > selectors.length) {
						return [value];
					} else {
						var r1 = [];
						Object.keys(value).forEach(function (keyv) {
							alasql.vars[sel.args[0].variable] = keyv;
							r1 = r1.concat(processSelector(selectors, sidx + 1, value[keyv]));
						});
						return r1;
					}
				} else if (sel.selid === 'TO') {

					var oldv = alasql.vars[sel.args[0]];
					var newv = [];
					if (oldv !== undefined) {

						newv = oldv.slice(0);

					} else {
						newv = [];
					}
					newv.push(value);

					if (sidx + 1 + 1 > selectors.length) {
						return [value];
					} else {
						alasql.vars[sel.args[0]] = newv;
						var r1 = processSelector(selectors, sidx + 1, value);

						alasql.vars[sel.args[0]] = oldv;
						return r1;
					}
				} else if (sel.selid === 'ARRAY') {
					var nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						val = nest;
					} else {
						return [];
					}
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'SUM') {
					var nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						var val = nest.reduce(function (sum, current) {
							return sum + current;
						}, 0);
					} else {
						return [];
					}
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'AVG') {
					nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						val =
							nest.reduce(function (sum, current) {
								return sum + current;
							}, 0) / nest.length;
					} else {
						return [];
					}
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'COUNT') {
					nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						val = nest.length;
					} else {
						return [];
					}
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'FIRST') {
					nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						val = nest[0];
					} else {
						return [];
					}

					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'LAST') {
					nest = processSelector(sel.args, 0, value);
					if (nest.length > 0) {
						val = nest[nest.length - 1];
					} else {
						return [];
					}

					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'MIN') {
					nest = processSelector(sel.args, 0, value);
					if (nest.length === 0) {
						return [];
					}
					var val = nest.reduce(function (min, current) {
						return Math.min(min, current);
					}, Infinity);
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'MAX') {
					var nest = processSelector(sel.args, 0, value);
					if (nest.length === 0) {
						return [];
					}
					var val = nest.reduce(function (max, current) {
						return Math.max(max, current);
					}, -Infinity);
					if (sidx + 1 + 1 > selectors.length) {
						return [val];
					} else {
						return processSelector(selectors, sidx + 1, val);
					}
				} else if (sel.selid === 'PLUS') {
					var retval = [];
					//				retval = retval.concat(processSelector(selectors,sidx+1,n))
					var nests = processSelector(sel.args, 0, value).slice();
					if (sidx + 1 + 1 > selectors.length) {
						retval = retval.concat(nests);
					} else {
						nests.forEach(function (n) {
							retval = retval.concat(processSelector(selectors, sidx + 1, n));
						});
					}

					var i = 0;
					while (nests.length > 0) {
						//					nest = nests[0];
						//					nests.shift();
						var nest = nests.shift();

						nest = processSelector(sel.args, 0, nest);

						nests = nests.concat(nest);

						if (sidx + 1 + 1 > selectors.length) {
							retval = retval.concat(nest);
							//return retval;
						} else {
							nest.forEach(function (n) {

								var rn = processSelector(selectors, sidx + 1, n);

								retval = retval.concat(rn);
							});
						}

						// Security brake
						i++;
						if (i > INFINITE_LOOP_BREAK) {
							throw new Error('Infinite loop brake. Number of iterations = ' + i);
						}
					}
					return retval;

				} else if (sel.selid === 'STAR') {
					var retval = [];
					retval = processSelector(selectors, sidx + 1, value);
					var nests = processSelector(sel.args, 0, value).slice();
					if (sidx + 1 + 1 > selectors.length) {
						retval = retval.concat(nests);
						//return nests;
					} else {
						nests.forEach(function (n) {
							retval = retval.concat(processSelector(selectors, sidx + 1, n));
						});
					}
					var i = 0;
					while (nests.length > 0) {
						var nest = nests[0];
						nests.shift();

						nest = processSelector(sel.args, 0, nest);

						nests = nests.concat(nest);

						if (sidx + 1 + 1 <= selectors.length) {
							nest.forEach(function (n) {
								retval = retval.concat(processSelector(selectors, sidx + 1, n));
							});
						}

						// Security brake
						i++;
						if (i > INFINITE_LOOP_BREAK) {
							throw new Error('Infinite loop brake. Number of iterations = ' + i);
						}
					}

					return retval;
				} else if (sel.selid === 'QUESTION') {
					var retval = [];
					retval = retval.concat(processSelector(selectors, sidx + 1, value));
					var nest = processSelector(sel.args, 0, value);
					if (sidx + 1 + 1 <= selectors.length) {
						nest.forEach(function (n) {
							retval = retval.concat(processSelector(selectors, sidx + 1, n));
						});
					}
					return retval;
				} else if (sel.selid === 'WITH') {
					var nest = processSelector(sel.args, 0, value);

					if (nest.length === 0) {
						return [];
					} else {

						var r = {status: 1, values: nest};
					}
				} else if (sel.selid === 'ROOT') {
					if (sidx + 1 + 1 > selectors.length) {
						return [value];
					} else {
						return processSelector(selectors, sidx + 1, fromdata);
					}
				} else {
					throw new Error('Wrong selector ' + sel.selid);
				}
			} else if (sel.srchid) {
				var r = alasql.srch[sel.srchid.toUpperCase()](value, sel.args, stope, params);

			} else {
				throw new Error('Selector not found');
			}

			if (typeof r === 'undefined') {
				r = {status: 1, values: [value]};
			}

			var res = [];
			if (r.status === 1) {
				var arr = r.values;

				if (sidx + 1 + 1 > selectors.length) {
					//			if(sidx+1+1 > selectors.length) {
					res = arr;

				} else {
					for (var i = 0; i < r.values.length; i++) {
						res = res.concat(processSelector(selectors, sidx + 1, arr[i]));
					}
				}
			}
			return res;
		}

		if (selectors !== undefined && selectors.length > 0) {

			if (
				selectors &&
				selectors[0] &&
				selectors[0].srchid === 'PROP' &&
				selectors[0].args &&
				selectors[0].args[0]
			) {

				if (selectors[0].args[0].toUpperCase() === 'XML') {
					stope.mode = 'XML';
					selectors.shift();
				} else if (selectors[0].args[0].toUpperCase() === 'HTML') {
					stope.mode = 'HTML';
					selectors.shift();
				} else if (selectors[0].args[0].toUpperCase() === 'JSON') {
					stope.mode = 'JSON';
					selectors.shift();
				}
			}
			if (selectors.length > 0 && selectors[0].srchid === 'VALUE') {
				stope.value = true;
				selectors.shift();
			}
		}

		if (this.from instanceof yy.Column) {
			var dbid = this.from.databaseid || databaseid;
			fromdata = alasql.databases[dbid].tables[this.from.columnid].data;
			//selectors.unshift({srchid:'CHILD'});
		} else if (this.from instanceof yy.FuncValue && alasql.from[this.from.funcid.toUpperCase()]) {
			var args = this.from.args.map(function (arg) {
				var as = arg.toJS();

				var fn = new Function('params,alasql', 'var y;return ' + as).bind(this);
				return fn(params, alasql);
			});

			fromdata = alasql.from[this.from.funcid.toUpperCase()].apply(this, args);

		} else if (typeof this.from === 'undefined') {
			fromdata = alasql.databases[databaseid].objects;
		} else {
			var fromfn = new Function('params,alasql', 'var y;return ' + this.from.toJS());
			fromdata = fromfn(params, alasql);
			// Check for Mogo Collections
			if (
				typeof Mongo === 'object' &&
				typeof Mongo.Collection !== 'object' &&
				fromdata instanceof Mongo.Collection
			) {
				fromdata = fromdata.find().fetch();
			}
		}

		// If source data is array than first step is to run over array
		//	var selidx = 0;
		//	var selvalue = fromdata;

		if (selectors !== undefined && selectors.length > 0) {
			// Init variables for TO() selectors

			if (false) {
				selectors.forEach(function (selector) {
					if (selector.srchid === 'TO') {
						//* @todo move to TO selector
						alasql.vars[selector.args[0]] = [];
						// TODO - process nested selectors
					}
				});
			}

			res = processSelector(selectors, 0, fromdata);
		} else {
			res = fromdata;
		}

		if (this.into) {
			var a1, a2;
			if (typeof this.into.args[0] !== 'undefined') {
				a1 = new Function('params,alasql', 'var y;return ' + this.into.args[0].toJS())(
					params,
					alasql
				);
			}
			if (typeof this.into.args[1] !== 'undefined') {
				a2 = new Function('params,alasql', 'var y;return ' + this.into.args[1].toJS())(
					params,
					alasql
				);
			}
			res = alasql.into[this.into.funcid.toUpperCase()](a1, a2, res, [], cb);
		} else {
			if (stope.value && res.length > 0) {
				res = res[0];
			}
			if (cb) {
				res = cb(res);
			}
		}
		return res;
	}
};

// List of search functions
alasql.srch = {
	PROP(val, args, stope) {

		if (stope.mode === 'XML') {
			const values = val.children.filter(v => v.name.toUpperCase() === args[0].toUpperCase());

			return {
				status: values.length ? 1 : -1,
				values,
			};
		} else {
			if (
				typeof val !== 'object' ||
				val === null ||
				typeof args !== 'object' ||
				typeof val[args[0]] === 'undefined'
			) {
				return {status: -1, values: []};
			} else {
				return {status: 1, values: [val[args[0]]]};
			}
		}
	},

	APROP(val, args) {
		if (
			typeof val !== 'object' ||
			val === null ||
			typeof args !== 'object' ||
			typeof val[args[0]] === 'undefined'
		) {
			return {status: 1, values: [undefined]};
		} else {
			return {status: 1, values: [val[args[0]]]};
		}
	},

	EQ(val, args, stope, params) {
		var exprs = args[0].toJS('x', '');
		var exprfn = new Function('x,alasql,params', 'return ' + exprs);
		if (val === exprfn(val, alasql, params)) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	// Test expression
	LIKE(val, args, stope, params) {
		var exprs = args[0].toJS('x', '');
		var exprfn = new Function('x,alasql,params', 'return ' + exprs);
		if (
			val
				.toUpperCase()
				.match(
					new RegExp(
						'^' +
							exprfn(val, alasql, params).toUpperCase().replace(/%/g, '.*').replace(/\?|_/g, '.') +
							'$'
					),
					'g'
				)
		) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	ATTR(val, args, stope) {
		if (stope.mode === 'XML') {
			if (typeof args === 'undefined') {
				return {status: 1, values: [val.attributes]};
			} else {
				if (
					typeof val === 'object' &&
					typeof val.attributes === 'object' &&
					typeof val.attributes[args[0]] !== 'undefined'
				) {
					return {status: 1, values: [val.attributes[args[0]]]};
				} else {
					return {status: -1, values: []};
				}
			}
		} else {
			throw new Error('ATTR is not using in usual mode');
		}
	},

	CONTENT(val, args, stope) {
		if (stope.mode !== 'XML') {
			throw new Error('ATTR is not using in usual mode');
		}
		return {status: 1, values: [val.content]};
	},

	SHARP(val, args) {
		const obj = alasql.databases[alasql.useid].objects[args[0]];
		if (val !== undefined && val === obj) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	PARENT(/*val,args,stope*/) {
		// TODO: implement
		console.error('PARENT not implemented', arguments);

		return {status: -1, values: []};
	},

	CHILD(val, args, stope) {

		if (typeof val === 'object') {
			if (Array.isArray(val)) {
				return {status: 1, values: val};
			} else {
				if (stope.mode === 'XML') {
					return {
						status: 1,
						values: Object.keys(val.children).map(function (key) {
							return val.children[key];
						}),
					};
				} else {
					return {
						status: 1,
						values: Object.keys(val).map(function (key) {
							return val[key];
						}),
					};
				}
			}
		} else {
			// If primitive value
			return {status: 1, values: []};
		}
	},

	// Return all keys
	KEYS(val) {
		if (typeof val === 'object' && val !== null) {
			return {status: 1, values: Object.keys(val)};
		} else {
			// If primitive value
			return {status: 1, values: []};
		}
	},

	// Test expression
	WHERE(val, args, stope, params) {
		var exprs = args[0].toJS('x', '');
		var exprfn = new Function('x,alasql,params', 'return ' + exprs);
		if (exprfn(val, alasql, params)) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	NAME(val, args) {
		if (val.name === args[0]) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	CLASS(val, args) {

		// Please avoid `===` here
		if (val.$class == args) {
			// jshint ignore:line
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	VERTEX(val) {
		if (val.$node === 'VERTEX') {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	INSTANCEOF(val, args) {
		if (val instanceof alasql.fn[args[0]]) {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	EDGE(val) {
		if (val.$node === 'EDGE') {
			return {status: 1, values: [val]};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	EX(val, args, stope, params) {
		var exprs = args[0].toJS('x', '');
		var exprfn = new Function('x,alasql,params', 'return ' + exprs);
		return {status: 1, values: [exprfn(val, alasql, params)]};
	},

	// Transform expression
	RETURN(val, args, stope, params) {
		var res = {};
		if (args && args.length > 0) {
			args.forEach(function (arg) {
				var exprs = arg.toJS('x', '');
				var exprfn = new Function('x,alasql,params', 'return ' + exprs);
				if (typeof arg.as === 'undefined') {
					arg.as = arg.toString();
				}
				res[arg.as] = exprfn(val, alasql, params);
			});
		}
		return {status: 1, values: [res]};
	},

	// Transform expression
	REF(val) {
		return {status: 1, values: [alasql.databases[alasql.useid].objects[val]]};
	},

	// Transform expression
	OUT(val) {
		if (val.$out && val.$out.length > 0) {
			var res = val.$out.map(function (v) {
				return alasql.databases[alasql.useid].objects[v];
			});
			return {status: 1, values: res};
		} else {
			return {status: -1, values: []};
		}
	},

	OUTOUT(val) {
		if (val.$out && val.$out.length > 0) {
			var res = [];
			val.$out.forEach(function (v) {
				var av = alasql.databases[alasql.useid].objects[v];
				if (av && av.$out && av.$out.length > 0) {
					av.$out.forEach(function (vv) {
						res = res.concat(alasql.databases[alasql.useid].objects[vv]);
					});
				}
			});
			return {status: 1, values: res};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	IN(val) {
		if (val.$in && val.$in.length > 0) {
			var res = val.$in.map(function (v) {
				return alasql.databases[alasql.useid].objects[v];
			});
			return {status: 1, values: res};
		} else {
			return {status: -1, values: []};
		}
	},

	ININ(val) {
		if (val.$in && val.$in.length > 0) {
			var res = [];
			val.$in.forEach(function (v) {
				var av = alasql.databases[alasql.useid].objects[v];
				if (av && av.$in && av.$in.length > 0) {
					av.$in.forEach(function (vv) {
						res = res.concat(alasql.databases[alasql.useid].objects[vv]);
					});
				}
			});
			return {status: 1, values: res};
		} else {
			return {status: -1, values: []};
		}
	},

	// Transform expression
	AS(val, args) {
		alasql.vars[args[0]] = val;
		return {status: 1, values: [val]};
	},

	// Transform expression
	AT(val, args) {
		var v = alasql.vars[args[0]];
		return {status: 1, values: [v]};
	},

	// Transform expression
	CLONEDEEP(val) {
		// TODO something wrong
		var z = cloneDeep(val);
		return {status: 1, values: [z]};
	},

	// // Transform expression
	// DELETE (val,args) {
	// 	// TODO something wrong
	// 	delete val;
	//   return {status: 1, values: []};
	// },

	// Transform expression
	SET(val, args, stope, params) {

		var s = args
			.map(function (st) {
				if (st.method === '@') {
					return `alasql.vars[${JSON.stringify(st.variable)}]=` + st.expression.toJS('x', '');
				} else if (st.method === '$') {
					return `params[${JSON.stringify(st.variable)}]=` + st.expression.toJS('x', '');
				} else {
					return `x[${JSON.stringify(st.column.columnid)}]=` + st.expression.toJS('x', '');
				}
			})
			.join(';');
		var setfn = new Function('x,params,alasql', s);

		setfn(val, params, alasql);

		return {status: 1, values: [val]};
	},

	ROW(val, args, stope, params) {
		var s = 'var y;return [';
		s += args.map(arg => arg.toJS('x', '')).join(',');
		s += ']';
		var setfn = new Function('x,params,alasql', s);
		var rv = setfn(val, params, alasql);

		return {status: 1, values: [rv]};
	},

	D3(val) {
		if (val.$node !== 'VERTEX' && val.$node === 'EDGE') {
			val.source = val.$in[0];
			val.target = val.$out[0];
		}

		return {status: 1, values: [val]};
	},

	ORDERBY(val, args /*, stope */) {
		var res = val.sort(compileSearchOrder(args));
		return {status: 1, values: res};
	},
};

var compileSearchOrder = function (order) {
	if (order) {
		if (typeof order?.[0]?.expression === 'function') {
			var func = order[0].expression;
			return function (a, b) {
				var ra = func(a),
					rb = func(b);
				if (ra > rb) {
					return 1;
				}
				if (ra === rb) {
					return 0;
				}
				return -1;
			};
		}

		var s = '';
		var sk = '';
		order.forEach(function (ord) {

			// Date conversion
			var dg = '';

			if (ord.expression instanceof yy.NumValue) {
				ord.expression = self.columns[ord.expression.value - 1];
			}

			if (ord.expression instanceof yy.Column) {
				var columnid = ord.expression.columnid;

				if (alasql.options.valueof) {
					dg = '.valueOf()'; // TODO Check
				}
				// COLLATE NOCASE
				if (ord.nocase) {
					dg += '.toUpperCase()';
				}

				if (columnid === '_') {
					s += 'if(a' + dg + (ord.direction === 'ASC' ? '>' : '<') + 'b' + dg + ')return 1;';
					s += 'if(a' + dg + '==b' + dg + '){';
				} else {
					s += `if (
							(a[${JSON.stringify(columnid)}]||'')${dg}
							${ord.direction === 'ASC' ? '>' : '<'}
							(b[${JSON.stringify(columnid)}]||'')${dg}
						) return 1;

						if(
							(a[${JSON.stringify(columnid)}]||'')${dg}
							==
							(b[${JSON.stringify(columnid)}]||'')${dg}
						){
						`;
				}
			} else {
				dg = '.valueOf()';
				// COLLATE NOCASE
				if (ord.nocase) {
					dg += '.toUpperCase()';
				}
				s += `
					if (
						(${ord.toJS('a', '')} || '')${dg}
						${ord.direction === 'ASC' ? '>' : '<'}
						(${ord.toJS('b', '')} || '')${dg}
					) return 1;

					if (
						(${ord.toJS('a', '')} || '')${dg} ==
						(${ord.toJS('b', '')} || '')${dg}
					) {`;
			}

			// TODO Add date comparision
			// s += 'if(a[\''+columnid+"']"+dg+(ord.direction == 'ASC'?'>':'<')+'b[\''+columnid+"']"+dg+')return 1;';
			// s += 'if(a[\''+columnid+"']"+dg+'==b[\''+columnid+"']"+dg+'){';
			//			}
			sk += '}';
		});
		s += 'return 0;';
		s += sk + 'return -1';

		return new Function('a,b', s);
	}
};
// Main query procedure
function queryfn(query, oldscope, cb, A, B) {
	query.sourceslen = query.sources.length;
	let slen = query.sourceslen;
	query.query = query; // TODO Remove to prevent memory leaks
	query.A = A;
	query.B = B;
	query.cb = cb;
	query.oldscope = oldscope;

	// Run all subqueries before main statement
	if (query.queriesfn) {
		query.sourceslen += query.queriesfn.length;
		slen += query.queriesfn.length;

		query.queriesdata = [];

		query.queriesfn.forEach(function (q, idx) {
			q.query.params = query.params;
			queryfn2([], -idx - 1, query);
		});
	}

	query.scope = oldscope ? cloneDeep(oldscope) : {};

	// First - refresh data sources

	let result;
	query.sources.forEach(function (source, idx) {
		source.query = query;
		var rs = source.datafn(query, query.params, queryfn2, idx, alasql);
		if (typeof rs !== 'undefined') {
			// TODO - this is a hack: check if result is array - check all cases and make it more logical
			if ((query.intofn || query.intoallfn) && Array.isArray(rs)) {
				rs = rs.length;
			}
			result = rs;
		}
		//
		// Ugly hack to use in query.wherefn and source.srcwherefns functions
		// constructions like this.queriesdata['test'].
		// We can elimite it with source.srcwherefn.bind(this)()
		// but it may be slow.
		//
		source.queriesdata = query.queriesdata;
	});

	if (query.sources.length == 0 || 0 === slen) {
		try {
			result = queryfn3(query);
		} catch (e) {
			if (cb) return cb(null, e);
			else throw e;
		}
	}

	return result;
}
function queryfn2(data, idx, query) {
	if (idx >= 0) {
		let source = query.sources[idx];
		source.data = data;
		if (typeof source.data === 'function') {
			source.getfn = source.data;
			source.dontcache = source.getfn.dontcache;
			if (['OUTER', 'RIGHT', 'ANTI'].includes(source.joinmode)) {
				source.dontcache = false;
			}
			source.data = {};
		}
	} else {
		query.queriesdata[-idx - 1] = flatArray(data);
	}

	query.sourceslen--;
	if (query.sourceslen > 0) return;

	return queryfn3(query);
}

function queryfn3(query) {
	var scope = query.scope,
		jlen;

	// Preindexation of data sources
	preIndex(query);

	// Prepare variables
	query.data = [];
	query.xgroups = {};
	query.groups = [];

	// Level of Joins
	var h = 0;

	// Start walking over data
	doJoin(query, scope, h);

	// If grouping, then filter groups with HAVING function
	if (query.groupfn) {
		query.data = [];
		if (query.groups.length === 0 && query.allgroups.length === 0) {
			var g = {};
			if (query.selectGroup.length > 0) {
				query.selectGroup.forEach(function (sg) {
					if (
						sg.aggregatorid == 'COUNT' ||
						sg.aggregatorid == 'SUM' ||
						sg.aggregatorid == 'TOTAL'
					) {
						g[sg.nick] = 0;
					} else {
						g[sg.nick] = undefined;
					}
				});
			}
			query.groups = [g];
		}

		if (query.aggrKeys.length > 0) {
			var gfns = '';
			query.aggrKeys.forEach(function (col) {
				gfns += `
				g[${JSON.stringify(col.nick)}] = alasql.aggr[${JSON.stringify(
					col.funcid
				)}](undefined,g[${JSON.stringify(col.nick)}],3); `;
			});
			var gfn = new Function('g,params,alasql', 'var y;' + gfns);
		}

		for (var i = 0, ilen = query.groups.length; i < ilen; i++) {
			var g = query.groups[i];

			if (gfn) gfn(g, query.params, alasql);

			if (!query.havingfn || query.havingfn(g, query.params, alasql)) {
				var d = query.selectgfn(g, query.params, alasql);

				for (const key in query.groupColumns) {
					// ony remove columns where the alias is also not a column in the result
					if (
						query.groupColumns[key] !== key &&
						d[query.groupColumns[key]] &&
						!query.groupColumns[query.groupColumns[key]]
					) {
						delete d[query.groupColumns[key]];
					}
				}
				query.data.push(d);
			}
		}
	}
	// Remove distinct values
	doDistinct(query);

	// UNION / UNION ALL
	if (query.unionallfn) {
		// TODO Simplify this part of program
		var ud, nd;
		if (query.corresponding) {
			if (!query.unionallfn.query.modifier) query.unionallfn.query.modifier = undefined;
			ud = query.unionallfn(query.params);
		} else {
			if (!query.unionallfn.query.modifier) query.unionallfn.query.modifier = 'RECORDSET';
			nd = query.unionallfn(query.params);
			ud = [];
			ilen = nd.data.length;
			for (var i = 0; i < ilen; i++) {
				var r = {};
				if (query.columns.length) {
					jlen = Math.min(query.columns.length, nd.columns.length);
					for (var j = 0; j < jlen; j++) {
						r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
					}
				} else {
					jlen = nd.columns.length;
					for (var j = 0; j < jlen; j++) {
						r[nd.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
					}
				}
				ud.push(r);
			}
		}
		query.data = query.data.concat(ud);
	} else if (query.unionfn) {
		if (query.corresponding) {
			if (!query.unionfn.query.modifier) query.unionfn.query.modifier = 'ARRAY';
			ud = query.unionfn(query.params);
		} else {
			if (!query.unionfn.query.modifier) query.unionfn.query.modifier = 'RECORDSET';
			nd = query.unionfn(query.params);
			ud = [];
			ilen = nd.data.length;
			for (var i = 0; i < ilen; i++) {
				r = {};
				if (query.columns.length) {
					jlen = Math.min(query.columns.length, nd.columns.length);
					for (var j = 0; j < jlen; j++) {
						r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
					}
				} else {
					jlen = nd.columns.length;
					for (var j = 0; j < jlen; j++) {
						r[nd.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
					}
				}
				ud.push(r);
			}
		}

		query.data = arrayUnionDeep(query.data, ud);
	} else if (query.exceptfn) {
		if (query.corresponding) {
			if (!query.exceptfn.query.modifier) query.exceptfn.query.modifier = 'ARRAY';
			var ud = query.exceptfn(query.params);
		} else {
			if (!query.exceptfn.query.modifier) query.exceptfn.query.modifier = 'RECORDSET';
			var nd = query.exceptfn(query.params);
			var ud = [];
			for (var i = 0, ilen = nd.data.length; i < ilen; i++) {
				var r = {};
				for (var j = Math.min(query.columns.length, nd.columns.length) - 1; 0 <= j; j--) {
					r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
				}
				ud.push(r);
			}
		}

		query.data = arrayExceptDeep(query.data, ud);
	} else if (query.intersectfn) {
		if (query.corresponding) {
			if (!query.intersectfn.query.modifier) query.intersectfn.query.modifier = undefined;
			ud = query.intersectfn(query.params);
		} else {
			if (!query.intersectfn.query.modifier) query.intersectfn.query.modifier = 'RECORDSET';
			nd = query.intersectfn(query.params);
			ud = [];
			ilen = nd.data.length;
			for (i = 0; i < ilen; i++) {
				r = {};
				jlen = Math.min(query.columns.length, nd.columns.length);
				for (j = 0; j < jlen; j++) {
					r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
				}
				ud.push(r);
			}
		}

		query.data = arrayIntersectDeep(query.data, ud);
	}

	// Ordering
	if (query.orderfn) {
		if (query.explain) var ms = Date.now();
		query.data = query.data.sort(query.orderfn);
		if (query.explain) {
			query.explaination.push({
				explid: query.explid++,
				description: 'QUERY BY',
				ms: Date.now() - ms,
			});
		}
	}

	// Reduce to limit and offset
	doLimit(query);

	// TODO: Check what artefacts rest from Angular.js
	if (typeof angular != 'undefined') {
		query.removeKeys.push('$$hashKey');
	}

	if (query.removeKeys.length > 0) {
		var removeKeys = query.removeKeys;

		// Remove from data
		jlen = removeKeys.length;
		if (jlen > 0) {
			ilen = query.data.length;
			for (i = 0; i < ilen; i++) {
				for (j = 0; j < jlen; j++) {
					delete query.data[i][removeKeys[j]];
				}
			}
		}

		// Remove from columns list
		if (query.columns.length > 0) {
			query.columns = query.columns.filter(function (column) {
				var found = false;
				removeKeys.forEach(function (key) {
					if (column.columnid == key) found = true;
				});
				return !found;
			});
		}
	}

	if (typeof query.removeLikeKeys != 'undefined' && query.removeLikeKeys.length > 0) {
		var removeLikeKeys = query.removeLikeKeys;

		// Remove unused columns
		// SELECT * REMOVE COLUMNS LIKE "%b"
		for (var i = 0, ilen = query.data.length; i < ilen; i++) {
			r = query.data[i];
			for (var k in r) {
				for (j = 0; j < query.removeLikeKeys.length; j++) {
					if (alasql.utils.like(query.removeLikeKeys[j], k)) {
						delete r[k];
					}
				}
			}
		}

		if (query.columns.length > 0) {
			query.columns = query.columns.filter(function (column) {
				var found = false;
				removeLikeKeys.forEach(function (key) {
					if (alasql.utils.like(key, column.columnid)) {
						found = true;
					}
				});
				return !found;
			});
		}
	}

	if (query.pivotfn) query.pivotfn();

	if (query.unpivotfn) query.unpivotfn();

	if (query.intoallfn) {
		var res = query.intoallfn(query.columns, query.cb, query.params, query.alasql);
		return res;
	}

	if (query.intofn) {
		ilen = query.data.length;
		for (i = 0; i < ilen; i++) {
			query.intofn(query.data[i], i, query.params, query.alasql);
		}
		if (query.cb) query.cb(query.data.length, query.A, query.B);
		return query.data.length;
	}
	res = query.data;
	if (query.cb) res = query.cb(query.data, query.A, query.B);
	return res;
}

// Limiting
function doLimit(query) {

	if (query.limit) {
		var offset = 0;
		if (query.offset) {
			offset = query.offset | 0 || 0;
			offset = offset < 0 ? 0 : offset;
		}
		var limit;
		if (query.percent) {
			limit = (((query.data.length * query.limit) / 100) | 0) + offset;
		} else {
			limit = (query.limit | 0) + offset;
		}
		query.data = query.data.slice(offset, limit);
	}
}

// Distinct
function doDistinct(query) {
	if (query.distinct) {
		var uniq = {};
		// TODO: Speedup, because Object.keys is slow**
		// TODO: Problem with DISTINCT on objects
		var keys = Object.keys(query.data[0] || []);
		for (var i = 0, ilen = query.data.length; i < ilen; i++) {
			var uix = keys
				.map(function (k) {
					return query.data[i][k];
				})
				.join('`');
			uniq[uix] = query.data[i];
		}
		query.data = [];
		for (var key in uniq) {
			query.data.push(uniq[key]);
		}
	}
}

// Optimization: preliminary indexation of joins
var preIndex = function (query) {

	// Loop over all sources
	// Todo: make this loop smaller and more graspable
	for (var k = 0, klen = query.sources.length; k < klen; k++) {
		var source = query.sources[k];
		delete source.ix;
		// If there is indexation rule
		if (k > 0 && source.optimization == 'ix' && source.onleftfn && source.onrightfn) {
			// If there is no table.indices - create it
			if (source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]) {
				if (!alasql.databases[source.databaseid].tables[source.tableid].indices)
					query.database.tables[source.tableid].indices = {};
				// Check if index already exists
				let ixx =
					alasql.databases[source.databaseid].tables[source.tableid].indices[
						hash(source.onrightfns + '`' + source.srcwherefns)
					];
				if (!alasql.databases[source.databaseid].tables[source.tableid].dirty && ixx) {
					source.ix = ixx;
				}
			}

			if (!source.ix) {
				source.ix = {};
				// Walking over source data
				let scope = {};
				let i = 0;
				let ilen = source.data.length;
				let dataw;
				//				while(source.getfn i<ilen) {

				while (
					(dataw = source.data[i]) ||
					(source.getfn && (dataw = source.getfn(i))) ||
					i < ilen
				) {
					if (source.getfn && !source.dontcache) source.data[i] = dataw;

					// Prepare scope for indexation
					scope[source.alias || source.tableid] = dataw;

					// Check if it apply to where function
					if (source.srcwherefn(scope, query.params, alasql)) {
						// Create index entry for each address
						var addr = source.onrightfn(scope, query.params, alasql);
						var group = source.ix[addr];
						if (!group) {
							group = source.ix[addr] = [];
						}
						group.push(dataw);
					}
					i++;
				}

				if (source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]) {
					// Save index to original table
					alasql.databases[source.databaseid].tables[source.tableid].indices[
						hash(source.onrightfns + '`' + source.srcwherefns)
					] = source.ix;
				}
			}

			// Optimization for WHERE column = expression
		} else if (source.wxleftfn) {
			if (!alasql.databases[source.databaseid].engineid) {
				// Check if index exists
				ixx =
					alasql.databases[source.databaseid].tables[source.tableid].indices[
						hash(source.wxleftfns + '`')
					];
			}
			if (!alasql.databases[source.databaseid].tables[source.tableid].dirty && ixx) {
				// Use old index if exists
				source.ix = ixx;
				// Reduce data (apply filter)
				source.data = source.ix[source.wxrightfn(null, query.params, alasql)];
			} else {
				// Create new index
				source.ix = {};
				// Prepare scope
				scope = {};
				// Walking on each source line
				i = 0;
				ilen = source.data.length;
				dataw;
				//				while(source.getfn i<ilen) {

				while (
					(dataw = source.data[i]) ||
					(source.getfn && (dataw = source.getfn(i))) ||
					i < ilen
				) {
					if (source.getfn && !source.dontcache) source.data[i] = dataw;
					//					for(var i=0, ilen=source.data.length; i<ilen; i++) {
					scope[source.alias || source.tableid] = source.data[i];
					// Create index entry
					addr = source.wxleftfn(scope, query.params, alasql);
					group = source.ix[addr];
					if (!group) {
						group = source.ix[addr] = [];
					}
					group.push(source.data[i]);
					i++;
				}
				if (!alasql.databases[source.databaseid].engineid) {
					alasql.databases[source.databaseid].tables[source.tableid].indices[
						hash(source.wxleftfns + '`')
					] = source.ix;
				}
			}
			// Apply where filter to reduces rows
			if (source.srcwherefns) {
				if (source.data) {
					scope = {};
					source.data = source.data.filter(function (r) {
						scope[source.alias] = r;
						return source.srcwherefn(scope, query.params, alasql);
					});
				} else {
					source.data = [];
				}
			}
			// If there is no any optimization than apply srcwhere filter
		} else if (source.srcwherefns && !source.dontcache) {
			if (source.data) {
				var scope = {};
				// TODO!!!!! Data as Function

				source.data = source.data.filter(function (r) {
					scope[source.alias] = r;
					return source.srcwherefn(scope, query.params, alasql);
				});

				scope = {};
				i = 0;
				ilen = source.data.length;
				let res = [];

				while (
					(dataw = source.data[i]) ||
					(source.getfn && (dataw = source.getfn(i))) ||
					i < ilen
				) {
					if (source.getfn && !source.dontcache) source.data[i] = dataw;
					scope[source.alias] = dataw;
					if (source.srcwherefn(scope, query.params, alasql)) res.push(dataw);
					i++;
				}
				source.data = res;
			} else {
				source.data = [];
			}
		}
		// Change this to another place (this is a wrong)
		if (source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]) {
		} else {
			// this is a subquery?
		}
	}
};
//
// Join all lines over sources
//

function doJoin(query, scope, h) {
	// Check, if this is a last join?
	if (h >= query.sources.length) {
		// Todo: check if this runs once too many
		// Then apply where and select
		if (query.wherefn(scope, query.params, alasql)) {
			// If there is a GROUP BY then pipe to grouping function
			if (query.groupfn) {
				query.groupfn(scope, query.params, alasql);
			} else {
				query.data.push(query.selectfn(scope, query.params, alasql));
			}
		}
	} else if (query.sources[h].applyselect) {
		var source = query.sources[h];
		source.applyselect(
			query.params,
			function (data) {
				if (data.length > 0) {
					for (var i = 0; i < data.length; i++) {
						scope[source.alias] = data[i];
						doJoin(query, scope, h + 1);
					}
				} else {
					if (source.applymode == 'OUTER') {
						scope[source.alias] = {};
						doJoin(query, scope, h + 1);
					}
				}
			},
			scope
		);
	} else {
		// STEP 1

		let source = query.sources[h];
		let nextsource = query.sources[h + 1];

		let tableid = source.alias || source.tableid;
		let pass = false; // For LEFT JOIN
		let data = source.data;
		let opt = false;

		// Reduce data for looping if there is optimization hint
		if (!source.getfn || (source.getfn && !source.dontcache)) {
			if (
				source.joinmode != 'RIGHT' &&
				source.joinmode != 'OUTER' &&
				source.joinmode != 'ANTI' &&
				source.optimization == 'ix'
			) {
				data = source.ix[source.onleftfn(scope, query.params, alasql)] || [];
				opt = true;
			}
		}

		// Main cycle
		let i = 0;
		if (typeof data == 'undefined') {
			throw new Error('Data source number ' + h + ' in undefined');
		}
		let ilen = data.length;
		let dataw;

		while ((dataw = data[i]) || (!opt && source.getfn && (dataw = source.getfn(i))) || i < ilen) {
			if (!opt && source.getfn && !source.dontcache) data[i] = dataw;
			scope[tableid] = dataw;

			// Reduce with ON and USING clause
			var usingPassed = !source.onleftfn;
			if (!usingPassed) {
				var left = source.onleftfn(scope, query.params, alasql);
				var right = source.onrightfn(scope, query.params, alasql);
				if (left instanceof String || left instanceof Number) left = left.valueOf();
				if (right instanceof String || right instanceof Number) right = left.valueOf();
				usingPassed = left == right;
			}

			if (usingPassed) {
				// For all non-standard JOINs like a-b=0
				if (source.onmiddlefn(scope, query.params, alasql)) {
					// Recursively call new join
					if (source.joinmode != 'SEMI' && source.joinmode != 'ANTI') {
						doJoin(query, scope, h + 1);
					}
					if (source.joinmode != 'LEFT' && source.joinmode != 'INNER') {
						dataw._rightjoin = true;
					}

					// for LEFT JOIN
					pass = true;
				}
			}
			i++;
		}

		// Additional join for LEFT JOINS
		if (
			(source.joinmode == 'LEFT' || source.joinmode == 'OUTER' || source.joinmode == 'SEMI') &&
			!pass
		) {
			// Clear the scope after the loop
			scope[tableid] = {};
			doJoin(query, scope, h + 1);
		}

		// STEP 2

		if (h == 0) {
			for (var nh = h + 1; nh < query.sources.length; nh++) {
				if (
					nextsource.joinmode == 'OUTER' ||
					nextsource.joinmode == 'RIGHT' ||
					nextsource.joinmode == 'ANTI'
				) {
					scope[source.alias] = {};

					let j = 0;
					let jlen = nextsource.data.length;
					let dataw;

					while (
						(dataw = nextsource.data[j]) ||
						(nextsource.getfn && (dataw = nextsource.getfn(j))) ||
						j < jlen
					) {
						if (nextsource.getfn && !nextsource.dontcache) {
							nextsource.data[j] = dataw;
						}

						if (dataw._rightjoin) {
							delete dataw._rightjoin;
						} else {
							//						delete dataw._rightjoin;

							scope[nextsource.alias] = dataw;
							doJoin(query, scope, nh + 1);
						}
						j++;
					}
					//				debugger;
				} else {

				}
				source = query.sources[nh];
				nextsource = query.sources[nh + 1];
			}
		}

		scope[tableid] = undefined;
	}
}

function swapSources(query, h) {
	var source = query.sources[h];
	var nextsource = query.sources[h + 1];

	let onleftfn = source.onleftfn;
	let onleftfns = source.onleftfns;
	let onrightfn = source.onrightfn;
	let onrightfns = source.onrightfns;
	let optimization = source.optimization;

	source.onleftfn = nextsource.onrightfn;
	source.onleftfns = nextsource.onrightfns;
	source.onrightfn = nextsource.onleftfn;
	source.onrightfns = nextsource.onleftfns;
	source.optimization = nextsource.optimization;

	nextsource.onleftfn = onleftfn;
	nextsource.onleftfns = onleftfns;
	nextsource.onrightfn = onrightfn;
	nextsource.onrightfns = onrightfns;
	nextsource.optimization = optimization;

	query.sources[h] = nextsource;
	query.sources[h + 1] = source;
}
/*
//
// Select run-time part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

//
// Main part of SELECT procedure
//

/* global yy */

yy.Select = class Select {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		var s;
		s = '';
		if (this.explain) {
			s += 'EXPLAIN ';
		}
		s += 'SELECT ';
		if (this.modifier) {
			s += this.modifier + ' ';
		}
		if (this.distinct) {
			s += 'DISTINCT ';
		}
		if (this.top) {
			s += 'TOP ' + this.top.value + ' ';
			if (this.percent) {
				s += 'PERCENT ';
			}
		}
		s += this.columns
			.map(function (col) {
				var s;
				s = col.toString();
				if (typeof col.as !== 'undefined') {
					s += ' AS ' + col.as;
				}
				return s;
			})
			.join(', ');
		if (this.from) {
			s +=
				' FROM ' +
				this.from
					.map(function (f) {
						var ss;
						ss = f.toString();
						if (f.as) {
							ss += ' AS ' + f.as;
						}
						return ss;
					})
					.join(',');
		}
		if (this.joins) {
			s += this.joins
				.map(function (jn) {
					var ss;
					ss = ' ';
					if (jn.joinmode) {
						ss += jn.joinmode + ' ';
					}
					if (jn.table) {
						ss += 'JOIN ' + jn.table.toString();
					} else if (jn.select) {
						ss += 'JOIN (' + jn.select.toString() + ')';
					} else if (jn instanceof alasql.yy.Apply) {
						ss += jn.toString();
					} else {
						throw new Error('Wrong type in JOIN mode');
					}
					if (jn.as) {
						ss += ' AS ' + jn.as;
					}
					if (jn.using) {
						ss += ' USING ' + jn.using.toString();
					}
					if (jn.on) {
						ss += ' ON ' + jn.on.toString();
					}
					return ss;
				})
				.join('');
		}
		if (this.where) {
			s += ' WHERE ' + this.where.toString();
		}
		if (this.group && this.group.length > 0) {
			s +=
				' GROUP BY ' +
				this.group
					.map(function (grp) {
						return grp.toString();
					})
					.join(', ');
		}
		if (this.having) {
			s += ' HAVING ' + this.having.toString();
		}
		if (this.order && this.order.length > 0) {
			s +=
				' ORDER BY ' +
				this.order
					.map(function (ord) {
						return ord.toString();
					})
					.join(', ');
		}
		if (this.limit) {
			s += ' LIMIT ' + this.limit.value;
		}
		if (this.offset) {
			s += ' OFFSET ' + this.offset.value;
		}
		if (this.union) {
			s += ' UNION ' + (this.corresponding ? 'CORRESPONDING ' : '') + this.union.toString();
		}
		if (this.unionall) {
			s += ' UNION ALL ' + (this.corresponding ? 'CORRESPONDING ' : '') + this.unionall.toString();
		}
		if (this.except) {
			s += ' EXCEPT ' + (this.corresponding ? 'CORRESPONDING ' : '') + this.except.toString();
		}
		if (this.intersect) {
			s += ' INTERSECT ' + (this.corresponding ? 'CORRESPONDING ' : '') + this.intersect.toString();
		}
		return s;
	}

	/**
	 Select statement in expression
	 */
	toJS(context) {

		//	if(this.expression.reduced) return 'true';
		//	return this.expression.toJS(context, tableid, defcols);

		//	var s = 'this.queriesdata['+(this.queriesidx-1)+'][0]';
		var s =
			'alasql.utils.flatArray(this.queriesfn[' +
			(this.queriesidx - 1) +
			'](this.params,null,' +
			context +
			'))[0]';

		return s;
	}

	// Compile SELECT statement
	compile(databaseid, params) {
		var db = alasql.databases[databaseid];
		// Create variable for query
		var query = new Query();

		// Array with columns to be removed
		query.removeKeys = [];
		query.aggrKeys = [];

		query.explain = this.explain; // Explain
		query.explaination = [];
		query.explid = 1;
		query.modifier = this.modifier;

		query.database = db;
		// 0. Precompile whereexists
		this.compileWhereExists(query);

		// 0. Precompile queries for IN, NOT IN, ANY and ALL operators
		this.compileQueries(query);

		query.defcols = this.compileDefCols(query, databaseid);

		// 1. Compile FROM clause
		query.fromfn = this.compileFrom(query);

		// 2. Compile JOIN clauses
		if (this.joins) {
			this.compileJoins(query);
		}

		// todo?: 3. Compile SELECT clause
		// For ROWNUM()
		query.rownums = [];

		this.compileSelectGroup0(query);

		if (this.group || query.selectGroup.length > 0) {
			query.selectgfns = this.compileSelectGroup1(query);
		} else {
			query.selectfns = this.compileSelect1(query, params);
		}

		// Remove columns clause
		this.compileRemoveColumns(query);

		// 5. Optimize WHERE and JOINS
		if (this.where) {
			this.compileWhereJoins(query);
		}

		// 4. Compile WHERE clause
		query.wherefn = this.compileWhere(query);

		// 6. Compile GROUP BY
		if (this.group || query.selectGroup.length > 0) {
			query.groupfn = this.compileGroup(query);
		}

		// 6. Compile HAVING
		if (this.having) {
			query.havingfn = this.compileHaving(query);
		}

		// 8. Compile ORDER BY clause
		if (this.order) {
			query.orderfn = this.compileOrder(query, params);
		}

		if (this.group || query.selectGroup.length > 0) {
			query.selectgfn = this.compileSelectGroup2(query);
		} else {
			query.selectfn = this.compileSelect2(query, params);
		}

		// 7. Compile DISTINCT, LIMIT and OFFSET
		query.distinct = this.distinct;

		// 9. Compile PIVOT clause
		if (this.pivot) query.pivotfn = this.compilePivot(query);
		if (this.unpivot) query.pivotfn = this.compileUnpivot(query);

		// 10. Compile TOP/LIMIT/OFFSET/FETCH clause
		if (this.top) {
			query.limit = this.top.value;
		} else if (this.limit) {
			query.limit = this.limit.value;
			if (this.offset) {
				query.offset = this.offset.value;
			}
		}

		query.percent = this.percent;

		// 9. Compile ordering function for UNION and UNIONALL
		query.corresponding = this.corresponding; // If CORRESPONDING flag exists
		if (this.union) {
			query.unionfn = this.union.compile(databaseid);
			query.orderfn = this.union.order ? this.union.compileOrder(query, params) : null;
		} else if (this.unionall) {
			query.unionallfn = this.unionall.compile(databaseid);
			query.orderfn = this.unionall.order ? this.unionall.compileOrder(query, params) : null;
		} else if (this.except) {
			query.exceptfn = this.except.compile(databaseid);
			query.orderfn = this.except.order ? this.except.compileOrder(query, params) : null;
		} else if (this.intersect) {
			query.intersectfn = this.intersect.compile(databaseid);
			query.orderfn = this.intersect.order ? this.intersect.compileOrder(query, params) : null;
		}

		// SELECT INTO
		if (this.into) {
			if (this.into instanceof yy.Table) {
				// Save into the table in database
				if (
					alasql.options.autocommit &&
					alasql.databases[this.into.databaseid || databaseid].engineid
				) {
					// For external database when AUTOCOMMIT is ONs
					query.intoallfns = `return alasql
								.engines[${JSON.stringify(alasql.databases[this.into.databaseid || databaseid].engineid)}]
								.intoTable(
									${JSON.stringify(this.into.databaseid || databaseid)},
									${JSON.stringify(this.into.tableid)},
									this.data,
									columns,
									cb
								);`;
				} else {
					// Into AlaSQL tables
					query.intofns = `alasql
							.databases[${JSON.stringify(this.into.databaseid || databaseid)}]
							.tables[${JSON.stringify(this.into.tableid)}]
							.data.push(r);
						`;
				}
			} else if (this.into instanceof yy.VarValue) {
				//
				// Save into local variable
				// SELECT * INTO @VAR1 FROM ?
				//
				query.intoallfns = `
					alasql.vars[${JSON.stringify(this.into.variable)}]=this.data;
					res=this.data.length;
					if(cb) res = cb(res);
					return res;
				`;
			} else if (this.into instanceof yy.FuncValue) {
				//
				// If this is INTO() function, then call it
				// with one or two parameters
				//
				var qs = 'return alasql.into[' + JSON.stringify(this.into.funcid.toUpperCase()) + '](';
				if (this.into.args && this.into.args.length > 0) {
					qs += this.into.args[0].toJS() + ',';
					if (this.into.args.length > 1) {
						qs += this.into.args[1].toJS() + ',';
					} else {
						qs += 'undefined,';
					}
				} else {
					qs += 'undefined, undefined,';
				}
				query.intoallfns = qs + 'this.data,columns,cb)';
			} else if (this.into instanceof yy.ParamValue) {
				//
				// Save data into parameters array
				// like alasql('SELECT * INTO ? FROM ?',[outdata,srcdata]);
				//
				query.intofns = `params[${JSON.stringify(this.into.param)}].push(r)`;
			}

			if (query.intofns) {
				// Create intofn function
				query.intofn = new Function('r,i,params,alasql', 'var y;' + query.intofns);
			} else if (query.intoallfns) {
				// Create intoallfn function
				query.intoallfn = new Function('columns,cb,params,alasql', 'var y;' + query.intoallfns);
			}
		}
		// Now, compile all togeather into one function with query object in scope
		var statement = function (params, cb, oldscope) {
			query.params = params;
			// Note the callback function has the data and error reversed due to existing code in promiseExec which has the
			// err and data swapped.  This trickles down into alasql.exec and further. Rather than risk breaking the whole thing,
			// the (data, err) standard is maintained here.
			var res1 = queryfn(query, oldscope, function (res, err) {
				if (err) {
					if (cb) {
						return cb(null, err);
					}
					throw err;
				}
				if (query.rownums.length > 0) {
					for (var i = 0, ilen = res.length; i < ilen; i++) {
						for (var j = 0, jlen = query.rownums.length; j < jlen; j++) {
							res[i][query.rownums[j]] = i + 1;
						}
					}
				}

				var res2 = modify(query, res);

				if (cb) {
					cb(res2);
				}
				return res2;
			});
			return res1;
		};

		statement.query = query;
		return statement;
	}

	execute(databaseid, params, cb) {
		return this.compile(databaseid)(params, cb);
		//	throw new Error('Insert statement is should be compiled')
	}

	compileWhereExists(query) {
		if (!this.exists) return;
		query.existsfn = this.exists.map(function (ex) {
			var nq = ex.compile(query.database.databaseid);
			nq.query.modifier = 'RECORDSET';
			return nq;
		});
	}

	compileQueries(query) {
		if (!this.queries) return;
		query.queriesfn = this.queries.map(function (q) {
			var nq = q.compile(query.database.databaseid);
			nq.query.modifier = 'RECORDSET';
			return nq;
		});
	}
};

/**
 Modify res according modifier
 @function
 @param {object} query Query object
 @param res {object|number|string|boolean} res Data to be converted
 */
function modify(query, res) {
	// jshint ignore:line

	/* If source is a primitive value then return it */
	if (
		typeof res === 'undefined' ||
		typeof res === 'number' ||
		typeof res === 'string' ||
		typeof res === 'boolean'
	) {
		return res;
	}

	var modifier = query.modifier || alasql.options.modifier;
	var columns = query.columns;
	if (typeof columns === 'undefined' || columns.length == 0) {
		// Try to create columns
		if (res.length > 0) {
			var allcol = {};
			for (var i = Math.min(res.length, alasql.options.columnlookup || 10) - 1; 0 <= i; i--) {
				for (var key in res[i]) {
					allcol[key] = true;
				}
			}

			columns = Object.keys(allcol).map(function (columnid) {
				return {columnid: columnid};
			});
		} else {
			// Cannot recognize columns
			columns = [];
		}
	}

	switch (modifier) {
		case 'VALUE':
			if (res.length === 0) return undefined;
			const keyValue = columns && columns.length > 0 ? columns[0].columnid : Object.keys(res[0])[0];
			return res[0][keyValue];

		case 'ROW':
			if (res.length === 0) return undefined;
			return Object.values(res[0]);

		case 'COLUMN':
			if (res.length === 0) return [];

			let key;
			if (columns && columns.length > 0) {
				key = columns[0].columnid;
			} else {
				key = Object.keys(res[0])[0];
			}

			let ar = [];
			for (var i = 0, ilen = res.length; i < ilen; i++) {
				ar.push(res[i][key]);
			}

			return ar;

		case 'MATRIX':
			if (res.length === 0) return undefined;
			return res.map(row => columns.map(col => row[col.columnid]));

		case 'INDEX':
			if (res.length === 0) return undefined;
			const keyIndex = columns && columns.length > 0 ? columns[0].columnid : Object.keys(res[0])[0];
			const valIndex = columns && columns.length > 1 ? columns[1].columnid : Object.keys(res[0])[1];
			return res.reduce((acc, row) => ({...acc, [row[keyIndex]]: row[valIndex]}), {});

		case 'RECORDSET':
			// Assuming alasql.Recordset is available in the scope
			return new alasql.Recordset({columns: columns, data: res});

		case 'TEXTSTRING':
			if (res.length === 0) return undefined;
			const keyTextString =
				columns && columns.length > 0 ? columns[0].columnid : Object.keys(res[0])[0];
			return res.map(row => row[keyTextString]).join('\n');
	}
	return res;
}
/*
//
// EXISTS and other subqueries functions for AlaSQL.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
// Modified by: Midwayne
//
*/

yy.ExistsValue = class ExistsValue {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		return 'EXISTS(' + this.value.toString() + ')';
	}

	toType() {
		return 'boolean';
	}

	toJS(context, tableid, defcols) {
		// Updated to return a boolean value correctly
		return `!!this.existsfn[${this.existsidx}](params, null, ${context}).data.length`;
	}
};

//
// Prepare subqueries and EXISTS
//
alasql.precompile = function (statement, databaseid, params) {
	if (!statement) return;
	statement.params = params;
	if (statement.queries) {
		statement.queriesfn = statement.queries.map(function (q) {
			var nq = q.compile(databaseid || statement.database.databaseid);
			nq.query.modifier = 'RECORDSET';
			return nq;
		});
	}
	if (statement.exists) {
		statement.existsfn = statement.exists.map(function (ex) {
			var nq = ex.compile(databaseid || statement.database.databaseid);
			nq.query.modifier = 'RECORDSET';
			return nq;
		});
	}
};
/*
//
// Select compiler part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global yy, alasql, Mongo, returnTrue */

yy.Select.prototype.compileFrom = function (query) {
	const self = this;
	query.sources = [];
	query.aliases = {};

	if (!self.from) return;

	self.from.forEach(tq => {
		const alias = tq.as || tq.tableid;
		if (tq instanceof yy.Table) {
			query.aliases[alias] = {
				tableid: tq.tableid,
				databaseid: tq.databaseid || query.database.databaseid,
				type: 'table',
			};
		} else if (tq instanceof yy.Select) {
			query.aliases[alias] = {type: 'subquery'};
		} else if (tq instanceof yy.Search) {
			query.aliases[alias] = {type: 'subsearch'};
		} else if (tq instanceof yy.ParamValue) {
			query.aliases[alias] = {type: 'paramvalue'};
		} else if (tq instanceof yy.FuncValue) {
			query.aliases[alias] = {type: 'funcvalue'};
		} else if (tq instanceof yy.VarValue) {
			query.aliases[alias] = {type: 'varvalue'};
		} else if (tq instanceof yy.FromData) {
			query.aliases[alias] = {type: 'fromdata'};
		} else if (tq instanceof yy.Json) {
			query.aliases[alias] = {type: 'json'};
		} else if (tq.inserted) {
			query.aliases[alias] = {type: 'inserted'};
		} else {
			throw new Error('Wrong table at FROM');
		}

		const source = {
			alias: alias,
			databaseid: tq.databaseid || query.database.databaseid,
			tableid: tq.tableid,
			joinmode: 'INNER',
			onmiddlefn: returnTrue,
			srcwherefns: '', // for optimization
			srcwherefn: returnTrue,
		};

		if (tq instanceof yy.Table) {
			source.columns = alasql.databases[source.databaseid].tables[source.tableid].columns;
			if (
				alasql.options.autocommit &&
				alasql.databases[source.databaseid].engineid &&
				!alasql.databases[source.databaseid].tables[source.tableid].view
			) {
				source.datafn = (query, params, cb, idx, alasql) => {
					return alasql.engines[alasql.databases[source.databaseid].engineid].fromTable(
						source.databaseid,
						source.tableid,
						cb,
						idx,
						query
					);
				};
			} else if (alasql.databases[source.databaseid].tables[source.tableid].view) {
				source.datafn = (query, params, cb, idx, alasql) => {
					let res = alasql.databases[source.databaseid].tables[source.tableid].select(params);
					if (cb) res = cb(res, idx, query);
					return res;
				};
			} else {
				source.datafn = (query, params, cb, idx, alasql) => {
					let res = alasql.databases[source.databaseid].tables[source.tableid].data;
					if (cb) res = cb(res, idx, query);
					return res;
				};
			}
		} else if (tq instanceof yy.Select) {
			source.subquery = tq.compile(query.database.databaseid);
			if (typeof source.subquery.query.modifier === 'undefined') {
				source.subquery.query.modifier = 'RECORDSET';
			}
			source.columns = source.subquery.query.columns;

			source.datafn = (query, params, cb, idx, alasql) => {
				let res;
				source.subquery(query.params, data => {
					res = data.data;
					if (cb) res = cb(res, idx, query);
				});
				return res;
			};
		} else if (tq instanceof yy.Search) {
			source.subsearch = tq;
			source.columns = [];
			source.datafn = (query, params, cb, idx, alasql) => {
				let res;
				source.subsearch.execute(query.database.databaseid, query.params, data => {
					res = data;
					if (cb) res = cb(res, idx, query);
				});
				return res;
			};
		} else if (tq instanceof yy.ParamValue) {
			let ps = `var res = alasql.prepareFromData(params['${tq.param}']`;
			if (tq.array) ps += ',true';
			ps += ');if(cb)res=cb(res,idx,query);return res';
			source.datafn = new Function('query,params,cb,idx,alasql', ps);
		} else if (tq.inserted) {
			let ps = 'var res = alasql.prepareFromData(alasql.inserted';
			if (tq.array) ps += ',true';
			ps += ');if(cb)res=cb(res,idx,query);return res';
			source.datafn = new Function('query,params,cb,idx,alasql', ps);
		} else if (tq instanceof yy.Json) {
			let ps = 'var res = alasql.prepareFromData(' + tq.toJS();
			if (tq.array) ps += ',true';
			ps += ');if(cb)res=cb(res,idx,query);return res';
			source.datafn = new Function('query,params,cb,idx,alasql', ps);
		} else if (tq instanceof yy.VarValue) {
			let ps = `var res = alasql.prepareFromData(alasql.vars['${tq.variable}']`;
			if (tq.array) ps += ',true';
			ps += ');if(cb)res=cb(res,idx,query);return res';
			source.datafn = new Function('query,params,cb,idx,alasql', ps);
		} else if (tq instanceof yy.FuncValue) {
			let ps = 'var res=alasql.from[' + JSON.stringify(tq.funcid.toUpperCase()) + '](';

			if (tq.args && tq.args.length > 0) {
				if (tq.args[0]) {
					ps += tq.args[0].toJS('query.oldscope') + ',';
				} else {
					ps += 'null,';
				}

				if (tq.args[1]) {
					ps += tq.args[1].toJS('query.oldscope') + ',';
				} else {
					ps += 'null,';
				}
			} else {
				ps += 'null,null,';
			}
			ps += 'cb,idx,query); return res';
			source.datafn = new Function('query,params,cb,idx,alasql', ps);
		} else if (tq instanceof yy.FromData) {
			source.datafn = (query, params, cb, idx, alasql) => {
				let res = tq.data;
				if (cb) res = cb(res, idx, query);
				return res;
			};
		} else {
			throw new Error('Wrong table at FROM');
		}
		query.sources.push(source);
	});
	query.defaultTableid = query.sources[0].alias;
};

alasql.prepareFromData = function (data, array) {
	let res = data;
	if (typeof data === 'string') {
		res = data.split(/\r?\n/);
		if (array) {
			res = res.map(item => [item]);
		}
	} else if (array) {
		res = data.map(item => [item]);
	} else if (typeof data === 'object' && !Array.isArray(data)) {
		if (
			typeof Mongo !== 'undefined' &&
			typeof Mongo.Collection !== 'undefined' &&
			data instanceof Mongo.Collection
		) {
			res = data.find().fetch();
		} else {
			res = [];
			for (const key in data) {
				if (data.hasOwnProperty(key)) res.push([key, data[key]]);
			}
		}
	}
	return res;
};
/*
//
// Select compiler part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// SELECT Compile functions

/* global yy, alasql, returnTrue, arrayIntersect */

yy.Select.prototype.compileJoins = function (query) {
	const self = this;

	this.joins.forEach(jn => {
		let tq, ps, source;
		// Test CROSS-JOIN
		if (jn.joinmode === 'CROSS') {
			if (jn.using || jn.on) {
				throw new Error('CROSS JOIN cannot have USING or ON clauses');
			} else {
				jn.joinmode = 'INNER';
			}
		}

		if (jn instanceof yy.Apply) {
			source = {
				alias: jn.as,
				applymode: jn.applymode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
				columns: [], // TODO check this
			};
			source.applyselect = jn.select.compile(query.database.databaseid);
			source.columns = source.applyselect.query.columns;

			source.datafn = function (query, params, cb, idx, alasql) {
				let res;
				if (cb) res = cb(res, idx, query);
				return res;
			};

			query.sources.push(source);

			return;
		}

		if (jn.table) {
			tq = jn.table;
			source = {
				alias: jn.as || tq.tableid,
				databaseid: tq.databaseid || query.database.databaseid,
				tableid: tq.tableid,
				joinmode: jn.joinmode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
				columns: [],
			};

			if (!alasql.databases[source.databaseid].tables[source.tableid]) {
				throw new Error(
					"Table '" + source.tableid + "' is not exists in database '" + source.databaseid + "'"
				);
			}

			source.columns = alasql.databases[source.databaseid].tables[source.tableid].columns;

			if (alasql.options.autocommit && alasql.databases[source.databaseid].engineid) {
				source.datafn = function (query, params, cb, idx, alasql) {
					return alasql.engines[alasql.databases[source.databaseid].engineid].fromTable(
						source.databaseid,
						source.tableid,
						cb,
						idx,
						query
					);
				};
			} else if (alasql.databases[source.databaseid].tables[source.tableid].view) {
				source.datafn = function (query, params, cb, idx, alasql) {
					let res = alasql.databases[source.databaseid].tables[source.tableid].select(params);
					if (cb) res = cb(res, idx, query);
					return res;
				};
			} else {
				source.datafn = function (query, params, cb, idx, alasql) {
					let res = alasql.databases[source.databaseid].tables[source.tableid].data;
					if (cb) res = cb(res, idx, query);
					return res;
				};
			}

			query.aliases[source.alias] = {
				tableid: tq.tableid,
				databaseid: tq.databaseid || query.database.databaseid,
			};
		} else if (jn.select) {
			tq = jn.select;
			source = {
				alias: jn.as,
				joinmode: jn.joinmode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
				columns: [],
			};

			source.subquery = tq.compile(query.database.databaseid);
			if (typeof source.subquery.query.modifier === 'undefined') {
				source.subquery.query.modifier = 'RECORDSET'; // Subqueries always return recordsets
			}
			source.columns = source.subquery.query.columns;

			source.datafn = function (query, params, cb, idx, alasql) {
				source.data = source.subquery(query.params, null, cb, idx).data;
				let res = source.data;
				// Propogate subquery result
				if (cb) res = cb(res, idx, query);
				return res;
			};
			query.aliases[source.alias] = {type: 'subquery'};
		} else if (jn.param) {
			source = {
				alias: jn.as,
				joinmode: jn.joinmode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
			};
			const jnparam = jn.param.param;
			ps = "let res=alasql.prepareFromData(params['" + jnparam + "']";
			if (jn.array) ps += ',true';
			ps += '); if(cb) res=cb(res, idx, query); return res';

			source.datafn = new Function('query,params,cb,idx, alasql', ps);
			query.aliases[source.alias] = {type: 'paramvalue'};
		} else if (jn.variable) {
			source = {
				alias: jn.as,
				joinmode: jn.joinmode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
			};
			ps = "let res=alasql.prepareFromData(alasql.vars['" + jn.variable + "']";
			if (jn.array) ps += ', true';
			ps += '); if(cb)res=cb(res, idx, query);return res';

			source.datafn = new Function('query,params,cb,idx, alasql', ps);
			query.aliases[source.alias] = {type: 'varvalue'};
		} else if (jn.func) {
			source = {
				alias: jn.as,
				joinmode: jn.joinmode,
				onmiddlefn: returnTrue,
				srcwherefns: '', // for optimization
				srcwherefn: returnTrue,
			};

			let s = 'let res=alasql.from[' + JSON.stringify(jn.func.funcid.toUpperCase()) + '](';

			const args = jn.func.args;
			if (args && args.length > 0) {
				if (args[0]) {
					s += args[0].toJS('query.oldscope') + ', ';
				} else {
					s += 'null, ';
				}
				if (args[1]) {
					s += args[1].toJS('query.oldscope') + ', ';
				} else {
					s += 'null, ';
				}
			} else {
				s += 'null, null, ';
			}
			s += 'cb, idx, query); return res';
			source.datafn = new Function('query, params, cb, idx, alasql', s);

			query.aliases[source.alias] = {type: 'funcvalue'};
		}

		const alias = source.alias;

		// Test NATURAL-JOIN
		if (jn.natural) {
			if (jn.using || jn.on) {
				throw new Error('NATURAL JOIN cannot have USING or ON clauses');
			} else {
				// source.joinmode == "INNER";
				if (query.sources.length > 0) {
					const prevSource = query.sources[query.sources.length - 1];
					const prevTable = alasql.databases[prevSource.databaseid].tables[prevSource.tableid];
					const table = alasql.databases[source.databaseid].tables[source.tableid];

					if (prevTable && table) {
						const c1 = prevTable.columns.map(col => col.columnid);
						const c2 = table.columns.map(col => col.columnid);
						jn.using = arrayIntersect(c1, c2).map(colid => ({columnid: colid}));
					} else {
						throw new Error(
							'In this version of Alasql NATURAL JOIN ' +
								'works for tables with predefined columns only'
						);
					}
				}
			}
		}

		if (jn.using) {
			const prevSource = query.sources[query.sources.length - 1];
			source.onleftfns = jn.using
				.map(col => "p['" + (prevSource.alias || prevSource.tableid) + "']['" + col.columnid + "']")
				.join('+"`"+');

			source.onleftfn = new Function('p,params,alasql', 'let y;return ' + source.onleftfns);

			source.onrightfns = jn.using
				.map(col => "p['" + (source.alias || source.tableid) + "']['" + col.columnid + "']")
				.join('+"`"+');
			source.onrightfn = new Function('p,params,alasql', 'let y;return ' + source.onrightfns);
			source.optimization = 'ix';
		} else if (jn.on) {
			if (jn.on instanceof yy.Op && jn.on.op === '=' && !jn.on.allsome) {
				source.optimization = 'ix';
				let lefts = '';
				let rights = '';
				let middles = '';
				let middlef = false;
				// Test right and left sides
				const ls = jn.on.left.toJS('p', query.defaultTableid, query.defcols);
				const rs = jn.on.right.toJS('p', query.defaultTableid, query.defcols);

				if (ls.indexOf("p['" + alias + "']") > -1 && !(rs.indexOf("p['" + alias + "']") > -1)) {
					if ((ls.match(/p\['.*?'\]/g) || []).every(s => s === "p['" + alias + "']")) {
						rights = ls;
					} else {
						middlef = true;
					}
				} else if (
					!(ls.indexOf("p['" + alias + "']") > -1) &&
					rs.indexOf("p['" + alias + "']") > -1
				) {
					if ((rs.match(/p\['.*?'\]/g) || []).every(s => s === "p['" + alias + "']")) {
						lefts = ls;
					} else {
						middlef = true;
					}
				} else {
					middlef = true;
				}

				if (rs.indexOf("p['" + alias + "']") > -1 && !(ls.indexOf("p['" + alias + "']") > -1)) {
					if ((rs.match(/p\['.*?'\]/g) || []).every(s => s === "p['" + alias + "']")) {
						rights = rs;
					} else {
						middlef = true;
					}
				} else if (
					!(rs.indexOf("p['" + alias + "']") > -1) &&
					ls.indexOf("p['" + alias + "']") > -1
				) {
					if ((ls.match(/p\['.*?'\]/g) || []).every(s => s === "p['" + alias + "']")) {
						lefts = rs;
					} else {
						middlef = true;
					}
				} else {
					middlef = true;
				}

				if (middlef) {
					rights = '';
					lefts = '';
					middles = jn.on.toJS('p', query.defaultTableid, query.defcols);
					source.optimization = 'no';
				}

				source.onleftfns = lefts;
				source.onrightfns = rights;
				source.onmiddlefns = middles || 'true';

				source.onleftfn = new Function('p,params,alasql', 'let y;return ' + source.onleftfns);
				source.onrightfn = new Function('p,params,alasql', 'let y;return ' + source.onrightfns);
				source.onmiddlefn = new Function('p,params,alasql', 'let y;return ' + source.onmiddlefns);
			} else {
				source.optimization = 'no';
				source.onmiddlefns = jn.on.toJS('p', query.defaultTableid, query.defcols);
				source.onmiddlefn = new Function(
					'p,params,alasql',
					'let y;return ' + jn.on.toJS('p', query.defaultTableid, query.defcols)
				);
			}
		}

		query.sources.push(source);
	});
};
yy.Select.prototype.compileWhere = function (query) {
	if (this.where) {
		if (typeof this.where == 'function') {
			return this.where;
		} else {
			var s = this.where.toJS('p', query.defaultTableid, query.defcols);
			query.wherefns = s;

			return new Function('p,params,alasql', 'var y;return ' + s);
		}
	} else
		return function () {
			return true;
		};
};

yy.Select.prototype.compileWhereJoins = function (query) {
	return;

	// TODO Fix Where optimization

	optimizeWhereJoin(query, this.where.expression);

	//for sources compile wherefs
	query.sources.forEach(function (source) {
		if (source.srcwherefns) {
			source.srcwherefn = new Function('p,params,alasql', 'var y;return ' + source.srcwherefns);
		}
		if (source.wxleftfns) {
			source.wxleftfn = new Function('p,params,alasql', 'var y;return ' + source.wxleftfns);
		}
		if (source.wxrightfns) {
			source.wxrightfn = new Function('p,params,alasql', 'var y;return ' + source.wxrightfns);
		}

	});
};

function optimizeWhereJoin(query, ast) {
	if (!ast) return false;
	if (!(ast instanceof yy.Op)) return;
	if (ast.op != '=' && ast.op != 'AND') return;
	if (ast.allsome) return;

	var s = ast.toJS('p', query.defaultTableid, query.defcols);
	var fsrc = [];
	query.sources.forEach(function (source, idx) {
		// Optimization allowed only for tables only
		if (source.tableid) {
			// This is a good place to remove all unnecessary optimizations
			if (s.indexOf("p['" + source.alias + "']") > -1) fsrc.push(source);
		}
	});

	//	if(fsrc.length < query.sources.length) return;

	if (fsrc.length == 0) {

		return;
	} else if (fsrc.length == 1) {
		if (
			!(s.match(/p\[\'.*?\'\]/g) || []).every(function (s) {
				return s == "p['" + fsrc[0].alias + "']";
			})
		) {
			return;
			// This is means, that we have column from parent query
			// So we return without optimization
		}

		var src = fsrc[0]; // optmiization source
		src.srcwherefns = src.srcwherefns ? src.srcwherefns + '&&' + s : s;

		if (ast instanceof yy.Op && ast.op == '=' && !ast.allsome) {
			if (ast.left instanceof yy.Column) {
				var ls = ast.left.toJS('p', query.defaultTableid, query.defcols);
				var rs = ast.right.toJS('p', query.defaultTableid, query.defcols);
				if (rs.indexOf("p['" + fsrc[0].alias + "']") == -1) {
					fsrc[0].wxleftfns = ls;
					fsrc[0].wxrightfns = rs;
				}
			}
			if (ast.right instanceof yy.Column) {
				var ls = ast.left.toJS('p', query.defaultTableid, query.defcols);
				var rs = ast.right.toJS('p', query.defaultTableid, query.defcols);
				if (ls.indexOf("p['" + fsrc[0].alias + "']") == -1) {
					fsrc[0].wxleftfns = rs;
					fsrc[0].wxrightfns = ls;
				}
			}
		}
		ast.reduced = true; // To do not duplicate wherefn and srcwherefn
		return;
	} else {
		if ((ast.op = 'AND')) {
			optimizeWhereJoin(query, ast.left);
			optimizeWhereJoin(query, ast.right);
		}
	}
}
/*
//
// Select compiler part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/**
 Compile group of statements
 */
yy.Select.prototype.compileGroup = function (query) {

	if (query.sources.length > 0) {
		var tableid = query.sources[0].alias;
	} else {
		// If SELECT contains group aggregators without source tables
		var tableid = '';
	}
	var defcols = query.defcols;
	var allgroup = [[]];
	if (this.group) {
		allgroup = decartes(this.group, query);
	}
	// Union all arrays to get a maximum
	var allgroups = [];
	allgroup.forEach(function (a) {
		allgroups = arrayUnion(allgroups, a);
	});

	query.allgroups = allgroups;

	query.ingroup = [];
	var s = '';
	allgroup.forEach(function (agroup) {
		// Start of group function
		s += 'var g=this.xgroups[';

		// Array with group columns from record
		var rg = agroup.map(function (col2) {
			var columnid = col2.split('\t')[0];
			var coljs = col2.split('\t')[1];
			// Check, if aggregator exists but GROUP BY is not exists
			if (columnid === '') {
				return '1'; // Create fictive grouping column for fictive GROUP BY
			}
			query.ingroup.push(columnid);
			return coljs;
		});

		if (rg.length === 0) {
			rg = ["''"];
		}

		s += rg.join('+"`"+');
		s += '];if(!g) {this.groups.push((g=this.xgroups[';
		s += rg.join('+"`"+');
		s += '] = {';
		s += agroup
			.map(function (col2) {
				var columnid = col2.split('\t')[0];
				var coljs = col2.split('\t')[1];

				if (columnid === '') {
					return '';
				}
				return "'" + columnid + "':" + coljs + ',';
			})
			.join('');
		var neggroup = arrayDiff(allgroups, agroup);

		s += neggroup
			.map(function (col2) {
				var columnid = col2.split('\t')[0];
				return "'" + columnid + "':null,";
			})
			.join('');
		var aft = '',
			aft2 = '';

		if (typeof query.groupStar !== 'undefined') {
			aft2 += "for(var f in p['" + query.groupStar + "']) {g[f]=p['" + query.groupStar + "'][f];};";
		}

		s += query.selectGroup
			.map(function (col) {
				var colexp = col.expression.toJS('p', tableid, defcols);
				var colas = col.nick;
				let colExpIfFunIdExists = expression => {
					let colexpression = expression.args[0];
					return colexpression.toJS('p', tableid, defcols);
				};
				if (col instanceof yy.AggrValue) {
					if (col.distinct) {
						aft +=
							",g['$$_VALUES_" + colas + "']={},g['$$_VALUES_" + colas + "'][" + colexp + ']=true';
					}
					if (col.aggregatorid === 'SUM') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return `'${colas}':(${colexp1})|| typeof ${colexp1} == 'number' ? ${colexp} : null,`;
						}
						return `'${colas}':(${colexp})|| typeof ${colexp} == 'number' ? ${colexp} : null,`;
					} else if (col.aggregatorid === 'TOTAL') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return `'${colas}':(${colexp1}) || typeof ${colexp1} == 'number' ?
							${colexp1} : ${colexp1} == 'string' && typeof Number(${colexp1}) == 'number' ? Number(${colexp1}) :
							typeof ${colexp1} == 'boolean' ?  Number(${colexp1}) : 0,`;
						}
						return `'${colas}':(${colexp})|| typeof ${colexp} == 'number' ?
							${colexp} : ${colexp} == 'string' && typeof Number(${colexp}) == 'number' ? Number(${colexp}) :
							typeof ${colexp} === 'boolean' ?  Number(${colexp}) : 0,`;
					} else if (col.aggregatorid === 'FIRST' || col.aggregatorid === 'LAST') {
						return "'" + colas + "':" + colexp + ','; //f.field.arguments[0].toJS();
					} else if (col.aggregatorid === 'MIN') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);

							return `'${colas}': (typeof ${colexp1} == 'number' || typeof ${colexp1} == 'bigint' ? ${colexp} : typeof ${colexp1} == 'object' ?
							typeof Number(${colexp1}) == 'number' && ${colexp1}!== null? ${colexp} : null : null),`;
						}
						return `'${colas}': (typeof ${colexp} == 'number' || typeof ${colexp} == 'bigint' ? ${colexp} : typeof ${colexp} == 'object' ?
							typeof Number(${colexp}) == 'number' && ${colexp}!== null? ${colexp} : null : null),`;
					} else if (col.aggregatorid === 'MAX') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return `'${colas}' : (typeof ${colexp1} == 'number' || typeof ${colexp1} == 'bigint' ? ${colexp} : typeof ${colexp1} == 'object' ?
							typeof Number(${colexp1}) == 'number' ? ${colexp} : null : null),`;
						}
						return `'${colas}' : (typeof ${colexp} == 'number' || typeof ${colexp} == 'bigint' ? ${colexp} : typeof ${colexp} == 'object' ?
							typeof Number(${colexp}) == 'number' ? ${colexp} : null : null),`;
					} else if (col.aggregatorid === 'ARRAY') {
						return `'${colas}':[${colexp}],`;
					} else if (col.aggregatorid === 'COUNT') {
						if (col.expression.columnid === '*') {
							return `'${colas}':1,`;
						} else {
							return `'${colas}':(typeof ${colexp} == "undefined" || ${colexp} === null) ? 0 : 1,`;
						}
					} else if (col.aggregatorid === 'AVG') {
						query.removeKeys.push(`_SUM_${colas}`);
						query.removeKeys.push(`_COUNT_${colas}`);

						return `'${colas}':${colexp},'_SUM_${colas}':(${colexp})||0,'_COUNT_${colas}':(typeof ${colexp} == "undefined" || ${colexp} === null) ? 0 : 1,`;
					} else if (col.aggregatorid === 'AGGR') {
						aft += `,g['${colas}']=${col.expression.toJS('g', -1)}`;
						return '';
					} else if (col.aggregatorid === 'REDUCE') {
						query.aggrKeys.push(col);
						return `'${colas}':alasql.aggr['${col.funcid}'](${colexp},undefined,1),`;
					}
					return '';
				}

				return '';
			})
			.join('');

		s += '}' + aft + ',g));' + aft2 + '} else {';
		s += query.selectGroup
			.map(function (col) {
				var colas = col.nick;
				var colexp = col.expression.toJS('p', tableid, defcols);
				let colExpIfFunIdExists = expression => {
					let colexpression = expression.args[0];
					return colexpression.toJS('p', tableid, defcols);
				};
				if (col instanceof yy.AggrValue) {
					var pre = '',
						post = '';
					if (col.distinct) {
						pre = `if(typeof ${colexp}!="undefined" && (!g['$$_VALUES_${colas}'][${colexp}])) {`;
						post = `g['$$_VALUES_${colas}'][${colexp}]=true;}`;
					}

					if (col.aggregatorid === 'SUM') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return (
								pre +
								`
								{
									const __g_colas = g['${colas}'];
									const __typeof_colexp1 = typeof ${colexp1};
									const __colexp1 = ${colexp1};

									if (__g_colas == null && ${colexp1} == null) {
										g['${colas}'] = null;
									} else if (typeof __g_colas === 'bigint' || typeof __colexp1 === 'bigint') {
            					    	g['${colas}'] = BigInt(__g_colas) + BigInt(__colexp);
            						} else if ((typeof __g_colas !== 'object' && typeof __g_colas !== 'number' && __typeof_colexp1 !== 'object' && __typeof_colexp1 !== 'number') ||
											   (__g_colas == null || (typeof __g_colas !== 'number' && typeof __g_colas !== 'object')) && (${colexp1} == null || (__typeof_colexp1 !== 'number' && __typeof_colexp1 !== 'object'))) {
										g['${colas}'] = null;
									} else if ((typeof __g_colas !== 'object' && typeof __g_colas !== 'number' && __typeof_colexp1 == 'number') ||
											   (__g_colas == null && __typeof_colexp1 == 'number')) {
										g['${colas}'] = ${colexp};
									} else if (typeof __g_colas == 'number' && ${colexp1} == null) {
										g['${colas}'] = __g_colas;
									} else {
										g['${colas}'] += ${colexp} || 0;
									}
								}
								` +
								post
							);
						}
						return (
							pre +
							`
							{
								const __g_colas = g['${colas}'];
								const __typeof_colexp = typeof ${colexp};
								const __colexp = ${colexp};

								if (__g_colas == null && ${colexp} == null) {
									g['${colas}'] = null;
								} else if (typeof __g_colas === 'bigint' || typeof __colexp === 'bigint') {
            					    g['${colas}'] = BigInt(__g_colas) + BigInt(__colexp);
            					} else if ((typeof __g_colas !== 'object' && typeof __g_colas !== 'number' && __typeof_colexp !== 'object' && __typeof_colexp !== 'number') ||
										   (__g_colas == null || (typeof __g_colas !== 'number' && typeof __g_colas !== 'object')) && (${colexp} == null || (__typeof_colexp !== 'number' && __typeof_colexp !== 'object'))) {
									g['${colas}'] = null;
								} else if (typeof __g_colas !== 'object' && typeof __g_colas !== 'number' && __typeof_colexp == 'number') {
									g['${colas}'] = ${colexp};
								} else if (typeof __g_colas == 'number' && ${colexp} == null) {
									g['${colas}'] = __g_colas;
								} else if (__g_colas == null && __typeof_colexp == 'number') {
									g['${colas}'] = ${colexp};
								} else {
									g['${colas}'] += ${colexp} || 0;
								}
							}
							` +
							post
						);
					} else if (col.aggregatorid === 'TOTAL') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return (
								pre +
								`{
									const __g_colas = g['${colas}'];
									const __colexp1 = ${colexp1};
									const __typeof_g_colas = typeof __g_colas;
									const __typeof_colexp1 = typeof __colexp1;

									if (__typeof_g_colas == 'string' && !isNaN(__g_colas) && typeof Number(__g_colas) == 'number' &&
										__typeof_colexp1 == 'string' && !isNaN(__colexp1) && typeof Number(__colexp1) == 'number') {
										g['${colas}'] = Number(__g_colas) + Number(__colexp1);
									} else if (__typeof_g_colas === 'bigint' || __typeof_colexp1 === 'bigint') {
       							    	g['${colas}'] = BigInt(__g_colas || 0) + BigInt(__colexp1 || 0);
       								} else if (__typeof_g_colas == 'string' && __typeof_colexp1 == 'string') {
										g['${colas}'] = 0;
									} else if (__typeof_g_colas == 'string' && __typeof_colexp1 == 'number') {
										g['${colas}'] = __colexp1;
									} else if (__typeof_colexp1 == 'string' && __typeof_g_colas == 'number') {
										g['${colas}'] = __g_colas;
									} else {
										g['${colas}'] += __colexp1 || 0;
									}
								}` +
								post
							);
						}
						return (
							pre +
							`{
								const __g_colas = g['${colas}'];
								const __colexp = ${colexp};
								const __typeof_g_colas = typeof __g_colas;
								const __typeof_colexp = typeof __colexp;

								if (__typeof_g_colas === 'string' && !isNaN(__g_colas) && typeof Number(__g_colas) === 'number' &&
									__typeof_colexp === 'string' && !isNaN(__colexp) && typeof Number(__colexp) === 'number') {
									g['${colas}'] = Number(__g_colas) + Number(__colexp);
								} else if (__typeof_g_colas === 'bigint' || __typeof_colexp === 'bigint') {
       							    g['${colas}'] = BigInt(__g_colas || 0) + BigInt(__colexp || 0);
       							} else if (__typeof_g_colas === 'string' && __typeof_colexp === 'string') {
									g['${colas}'] = 0;
								} else if (__typeof_g_colas === 'string' && __typeof_colexp === 'number') {
									g['${colas}'] = __colexp;
								} else if (__typeof_colexp === 'string' && __typeof_g_colas === 'number') {
									g['${colas}'] = __g_colas;
								} else {
									g['${colas}'] += __colexp || 0;
								}
							}

							` +
							post
						);
					} else if (col.aggregatorid === 'COUNT') {
						if (col.expression.columnid === '*') {
							return `${pre}
								g['${colas}']++;
								${post}`;
						} else {
							return `${pre}
							if(typeof ${colexp}!="undefined" && ${colexp} !== null) g['${colas}']++;
							${post}`;
						}
					} else if (col.aggregatorid === 'ARRAY') {
						return pre + "g['" + colas + "'].push(" + colexp + ');' + post;
					} else if (col.aggregatorid === 'MIN') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);
							return (
								pre +
								`if ((g['${colas}'] == null && ${colexp1} !== null) ? y = ${colexp} : 
									(g['${colas}'] !== null && ${colexp1} == null) ? y = g['${colas}'] : 
									((y = ${colexp}) < g['${colas}'])) {
									if (typeof y == 'number' || typeof y == 'bigint') {
									  g['${colas}'] = y;
									} else if (typeof y == 'object' && y instanceof Date) {
									  g['${colas}'] = y;
									} else if (typeof y == 'object' && typeof Number(y) == 'number') {
									  g['${colas}'] = Number(y);
									}
								} else if (g['${colas}'] !== null && typeof g['${colas}'] == 'object' && y instanceof Date) {
									g['${colas}'] = g['${colas}'];
								} else if (g['${colas}'] !== null && typeof g['${colas}'] == 'object') {
									g['${colas}'] = Number(g['${colas}']);
								}` +
								post
							);
						}
						return (
							pre +
							`if((g['${colas}'] == null && ${colexp}!== null) ? y = ${colexp} : 
								(g['${colas}']!== null && ${colexp} == null) ? y = g['${colas}'] : 
								((y=${colexp}) < g['${colas}'])) { 
								if(typeof y == 'number' || typeof y == 'bigint') {
									g['${colas}'] = y;
								} else if(typeof y == 'object' && y instanceof Date) {
									g['${colas}'] = y;
								} else if(typeof y == 'object' && typeof Number(y) == 'number') {
									g['${colas}'] = Number(y);
								}
							} else if(g['${colas}']!== null && typeof g['${colas}'] == 'object' && y instanceof Date) {
								g['${colas}'] = g['${colas}'];
							} else if(g['${colas}']!== null && typeof g['${colas}'] == 'object') {
								g['${colas}'] = Number(g['${colas}']);
							}` +
							post
						);
					} else if (col.aggregatorid === 'MAX') {
						if ('funcid' in col.expression) {
							let colexp1 = colExpIfFunIdExists(col.expression);

							return (
								pre +
								`if ((g['${colas}'] == null && ${colexp1} !== null) ? y = ${colexp} : 
									(g['${colas}'] !== null && ${colexp1} == null) ? y = g['${colas}'] : 
									((y = ${colexp}) > g['${colas}'])) {
									if (typeof y == 'number' || typeof y == 'bigint') {
									  g['${colas}'] = y;
									} else if (typeof y == 'object' && y instanceof Date) {
									  g['${colas}'] = y;
									} else if (typeof y == 'object' && typeof Number(y) == 'number') {
									  g['${colas}'] = Number(y);
									}
								} else if (g['${colas}'] !== null && typeof g['${colas}'] == 'object' && y instanceof Date) {
									g['${colas}'] = g['${colas}'];
								} else if (g['${colas}'] !== null && typeof g['${colas}'] == 'object') {
									g['${colas}'] = Number(g['${colas}']);
								}` +
								post
							);
						}
						return (
							pre +
							`if((g['${colas}'] == null && ${colexp}!== null) ? y = ${colexp} : 
								(g['${colas}']!== null && ${colexp} == null) ? y = g['${colas}'] : 
								((y=${colexp}) > g['${colas}'])) { 
								if(typeof y == 'number' || typeof y == 'bigint') {
									g['${colas}'] = y;
								} else if(typeof y == 'object' && y instanceof Date) {
									g['${colas}'] = y;
								} else if(typeof y == 'object' && typeof Number(y) == 'number') {
									g['${colas}'] = Number(y);
								}
							} else if(g['${colas}']!== null && typeof g['${colas}'] == 'object' && y instanceof Date) {
								g['${colas}'] = g['${colas}'];
							} else if(g['${colas}']!== null && typeof g['${colas}'] == 'object') {
								g['${colas}'] = Number(g['${colas}']);
							}` +
							post
						);
					} else if (col.aggregatorid === 'FIRST') {
						return '';
					} else if (col.aggregatorid === 'LAST') {
						return `${pre}g['${colas}']=${colexp};${post}`;
					} else if (col.aggregatorid === 'AVG') {
						return `${pre}
							y= (${colexp});
							g['_COUNT_${colas}'] += (typeof y == "undefined" || y === null) ? 0 : 1;
							if (typeof g['_SUM_${colas}'] === 'bigint' || typeof y === 'bigint') {
								g['_SUM_${colas}'] = BigInt(g['_SUM_${colas}']);
								g['_SUM_${colas}'] += BigInt(y || 0);
    							g['${colas}'] = BigInt(g['_SUM_${colas}']) / BigInt(g['_COUNT_${colas}']); 
    						} else {
								g['_SUM_${colas}'] += (y || 0);
    							g['${colas}'] = g['_SUM_${colas}'] / g['_COUNT_${colas}']; 
    						}
							${post}`;
					} else if (col.aggregatorid === 'AGGR') {
						return `${pre}
							g['${colas}']=${col.expression.toJS('g', -1)};
							${post}`;
					} else if (col.aggregatorid === 'REDUCE') {
						return `${pre}
							g['${colas}'] = alasql.aggr.${col.funcid}(${colexp},g['${colas}'],2);
							${post}`;
					}

					return '';
				}

				return '';
			})
			.join('');

		s += '}';
	});
	return new Function('p,params,alasql', 'var y;' + s);
};
/*
//
// Select compiler part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// yy.Select.prototype.compileSources = function(query) {

// };

function compileSelectStar(query, aliases, joinstar) {
	var sp = '',
		ss = [],
		columnIds = {};

	aliases.forEach(function (alias) {

		//	if(!alias) {
		//		sp += 'for(var k1 in p) var w=p[k1];for(var k2 in w){r[k2]=w[k2]};';
		//	} else 	{

		// TODO move this out of this function
		query.ixsources = {};
		query.sources.forEach(function (source) {
			query.ixsources[source.alias] = source;
		});

		// Fixed
		var columns;
		if (query.ixsources[alias]) {
			var columns = query.ixsources[alias].columns;
		}

		//		if(columns.length == 0 && query.aliases[alias].tableid) {
		//			var columns = alasql.databases[query.aliases[alias].databaseid].tables[query.aliases[alias].tableid].columns;
		//		};

		// Check if this is a Table or other
		if (joinstar && alasql.options.joinstar == 'json') {
			sp += "r['" + alias + "']={};";
		}

		if (columns && columns.length > 0) {
			columns.forEach(function (tcol) {
				const escapedColumnId = escapeq(tcol.columnid);
				if (joinstar && alasql.options.joinstar == 'underscore') {
					ss.push(
						"'" + alias + '_' + escapedColumnId + "':p['" + alias + "']['" + escapedColumnId + "']"
					);
				} else if (joinstar && alasql.options.joinstar == 'json') {
					//				ss.push('\''+alias+'_'+tcol.columnid+'\':p[\''+alias+'\'][\''+tcol.columnid+'\']');
					sp +=
						"r['" +
						alias +
						"']['" +
						escapedColumnId +
						"']=p['" +
						alias +
						"']['" +
						escapedColumnId +
						"'];";
				} else {
					var value = "p['" + alias + "']['" + escapedColumnId + "']";
					if (!columnIds[tcol.columnid]) {
						var key = "'" + escapedColumnId + "':";
						ss.push(key + value);
						columnIds[tcol.columnid] = {
							id: ss.length - 1,
							value: value,
							key: key,
						};
					} else {
						var newValue =
							value + ' !== undefined ? ' + value + ' : ' + columnIds[tcol.columnid].value;
						ss[columnIds[tcol.columnid].id] = columnIds[tcol.columnid].key + newValue;
						columnIds[tcol.columnid].value = newValue;
					}
				}

				query.selectColumns[escapedColumnId] = true;

				var coldef = {
					columnid: tcol.columnid,
					dbtypeid: tcol.dbtypeid,
					dbsize: tcol.dbsize,
					dbprecision: tcol.dbprecision,
					dbenum: tcol.dbenum,
				};
				query.columns.push(coldef);
				query.xcolumns[coldef.columnid] = coldef;
			});

		} else {

			// if column not exist, then copy all
			sp += 'var w=p["' + alias + '"];for(var k in w){r[k]=w[k]};';

			query.dirtyColumns = true;
		}
		//	}

	});

	return {s: ss.join(','), sp: sp};
}

yy.Select.prototype.compileSelect1 = function (query, params) {
	var self = this;
	query.columns = [];
	query.xcolumns = {};
	query.selectColumns = {};
	query.dirtyColumns = false;
	var s = 'var r={';
	var sp = '';
	var ss = [];

	this.columns.forEach(function (col) {
		if (col instanceof yy.Column) {
			if (col.columnid === '*') {
				if (col.func) {
					sp +=
						"r=params['" + col.param + "'](p['" + query.sources[0].alias + "'],p,params,alasql);";
				} else if (col.tableid) {
					//Copy all
					var ret = compileSelectStar(query, [col.tableid], false);
					if (ret.s) {
						ss = ss.concat(ret.s);
					}
					sp += ret.sp;
				} else {

					var ret = compileSelectStar(query, Object.keys(query.aliases), true); //query.aliases[alias].tableid);
					if (ret.s) {
						ss = ss.concat(ret.s);
					}
					sp += ret.sp;

					// TODO Remove these lines
					// In case of no information
					// sp += 'for(var k1 in p){var w=p[k1];'+
					// 			'for(k2 in w) {r[k2]=w[k2]}}'
				}
			} else {
				// If field, otherwise - expression
				var tbid = col.tableid;

				var dbid = col.databaseid || query.sources[0].databaseid || query.database.databaseid;
				if (!tbid) tbid = query.defcols[col.columnid];
				if (!tbid) tbid = query.defaultTableid;
				if (col.columnid !== '_') {
					if (false && tbid && !query.defcols['.'][col.tableid] && !query.defcols[col.columnid]) {
						ss.push(
							"'" +
								escapeq(col.as || col.columnid) +
								"':p['" +
								query.defaultTableid +
								"']['" +
								col.tableid +
								"']['" +
								col.columnid +
								"']"
						);
					} else {
						// workaround for multisheet xlsx export with custom COLUMNS
						var isMultisheetParam =
							params &&
							params.length > 1 &&
							Array.isArray(params[0]) &&
							params[0].length >= 1 &&
							params[0][0].hasOwnProperty('sheetid');
						if (isMultisheetParam) {
							sp =
								'var r={};var w=p["' +
								tbid +
								'"];' +
								'var cols=[' +
								self.columns
									.map(function (col) {
										return "'" + col.columnid + "'";
									})
									.join(',') +
								'];var colas=[' +
								self.columns
									.map(function (col) {
										return "'" + (col.as || col.columnid) + "'";
									})
									.join(',') +
								'];' +
								"for (var i=0;i<Object.keys(p['" +
								tbid +
								"']).length;i++)" +
								' for(var k=0;k<cols.length;k++){if (!r.hasOwnProperty(i)) r[i]={}; r[i][colas[k]]=w[i][cols[k]];}';
						} else {
							ss.push(
								"'" +
									escapeq(col.as || col.columnid) +
									"':p['" +
									tbid +
									"']['" +
									col.columnid +
									"']"
							);
						}
					}
				} else {
					ss.push("'" + escapeq(col.as || col.columnid) + "':p['" + tbid + "']");
				}
				query.selectColumns[escapeq(col.as || col.columnid)] = true;

				if (query.aliases[tbid] && query.aliases[tbid].type === 'table') {
					if (!alasql.databases[dbid].tables[query.aliases[tbid].tableid]) {

						throw new Error("Table '" + tbid + "' does not exist in database");
					}
					var columns = alasql.databases[dbid].tables[query.aliases[tbid].tableid].columns;
					var xcolumns = alasql.databases[dbid].tables[query.aliases[tbid].tableid].xcolumns;

					if (xcolumns && columns.length > 0) {

						var tcol = xcolumns[col.columnid];

						if (undefined === tcol) {
							throw new Error('Column does not exist: ' + col.columnid);
						}

						var coldef = {
							columnid: col.as || col.columnid,
							dbtypeid: tcol.dbtypeid,
							dbsize: tcol.dbsize,
							dbpecision: tcol.dbprecision,
							dbenum: tcol.dbenum,
						};

						query.columns.push(coldef);
						query.xcolumns[coldef.columnid] = coldef;
					} else {
						var coldef = {
							columnid: col.as || col.columnid,
							//							dbtypeid:tcol.dbtypeid,
							//							dbsize:tcol.dbsize,
							//							dbpecision:tcol.dbprecision,
							//							dbenum: tcol.dbenum,
						};

						query.columns.push(coldef);
						query.xcolumns[coldef.columnid] = coldef;

						query.dirtyColumns = true;
					}
				} else {
					var coldef = {
						columnid: col.as || col.columnid,
						//							dbtypeid:tcol.dbtypeid,
						//							dbsize:tcol.dbsize,
						//							dbpecision:tcol.dbprecision,
						//							dbenum: tcol.dbenum,
					};

					query.columns.push(coldef);
					query.xcolumns[coldef.columnid] = coldef;
					// This is a subquery?
					// throw new Error('There is now such table \''+col.tableid+'\'');
				}
			}
		} else if (col instanceof yy.AggrValue) {
			if (!self.group) {
				//				self.group=[new yy.Column({columnid:'q',as:'q'	})];
				self.group = [''];
			}
			if (!col.as) {
				col.as = escapeq(col.toString());
			}

			if (
				col.aggregatorid === 'SUM' ||
				col.aggregatorid === 'MAX' ||
				col.aggregatorid === 'MIN' ||
				col.aggregatorid === 'FIRST' ||
				col.aggregatorid === 'LAST' ||
				col.aggregatorid === 'AVG' ||
				col.aggregatorid === 'ARRAY' ||
				col.aggregatorid === 'REDUCE' ||
				col.aggregatorid === 'TOTAL'
			) {
				ss.push(
					"'" +
						escapeq(col.as) +
						"':" +
						n2u(col.expression.toJS('p', query.defaultTableid, query.defcols))
				);
			} else if (col.aggregatorid === 'COUNT') {
				ss.push("'" + escapeq(col.as) + "':1");
				// Nothing
			}
			// todo: confirm that no default action must be implemented

			//			query.selectColumns[col.aggregatorid+'('+escapeq(col.expression.toString())+')'] = thtd;

			var coldef = {
				columnid: col.as || col.columnid || col.toString(),
				//							dbtypeid:tcol.dbtypeid,
				//							dbsize:tcol.dbsize,
				//							dbpecision:tcol.dbprecision,
				//							dbenum: tcol.dbenum,
			};

			query.columns.push(coldef);
			query.xcolumns[coldef.columnid] = coldef;

			//			else if (col.aggregatorid == 'MAX') {
			//				ss.push((col.as || col.columnid)+':'+col.toJS("p.",query.defaultTableid))
			//			} else if (col.aggregatorid == 'MIN') {
			//				ss.push((col.as || col.columnid)+':'+col.toJS("p.",query.defaultTableid))
			//			}
		} else {

			ss.push(
				"'" +
					escapeq(col.as || col.columnid || col.toString()) +
					"':" +
					n2u(col.toJS('p', query.defaultTableid, query.defcols))
			);
			//			ss.push('\''+escapeq(col.toString())+'\':'+col.toJS("p",query.defaultTableid));
			//if(col instanceof yy.Expression) {
			query.selectColumns[escapeq(col.as || col.columnid || col.toString())] = true;

			var coldef = {
				columnid: col.as || col.columnid || col.toString(),
				//							dbtypeid:tcol.dbtypeid,
				//							dbsize:tcol.dbsize,
				//							dbpecision:tcol.dbprecision,
				//							dbenum: tcol.dbenum,
			};

			query.columns.push(coldef);
			query.xcolumns[coldef.columnid] = coldef;
		}
	});
	s += ss.join(',') + '};' + sp;
	return s;

};
yy.Select.prototype.compileSelect2 = function (query, params) {
	var s = query.selectfns;
	if (this.orderColumns && this.orderColumns.length > 0) {
		this.orderColumns.forEach(function (v, idx) {
			var key = '$$$' + idx;
			if (v instanceof yy.Column && query.xcolumns[v.columnid]) {
				s += "r['" + key + "']=r['" + v.columnid + "'];";
			} else if (v instanceof yy.ParamValue && query.xcolumns[params[v.param]]) {
				s += "r['" + key + "']=r['" + params[v.param] + "'];";
			} else {
				s += "r['" + key + "']=" + v.toJS('p', query.defaultTableid, query.defcols) + ';';
			}
			query.removeKeys.push(key);
		});
	}
	return new Function('p,params,alasql', 'var y;' + s + 'return r');
};

yy.Select.prototype.compileSelectGroup0 = function (query) {
	var self = this;
	self.columns.forEach(function (col, idx) {
		if (!(col instanceof yy.Column && col.columnid === '*')) {
			var colas;
			//  = col.as;
			if (col instanceof yy.Column) {
				colas = escapeq(col.columnid);
			} else {
				colas = escapeq(col.toString(true));

			}
			for (var i = 0; i < idx; i++) {
				if (colas === self.columns[i].nick) {
					colas = self.columns[i].nick + ':' + idx;
					break;
				}
			}
			// }
			col.nick = colas;

			if (self.group) {
				var groupIdx = self.group.findIndex(function (gp) {
					return gp.columnid === col.columnid && gp.tableid === col.tableid;
				});
				if (groupIdx > -1) {
					self.group[groupIdx].nick = colas;
				}
			}

			if (
				col.funcid &&
				(col.funcid.toUpperCase() === 'ROWNUM' || col.funcid.toUpperCase() === 'ROW_NUMBER')
			) {
				query.rownums.push(col.as);
			}

			// }
		} else {
			query.groupStar = col.tableid || 'default';
		}
	});

	this.columns.forEach(function (col) {
		if (col.findAggregator) {
			col.findAggregator(query);
		}
	});

	if (this.having) {
		if (this.having.findAggregator) {
			this.having.findAggregator(query);
		}
	}
};

yy.Select.prototype.compileSelectGroup1 = function (query) {
	var self = this;
	var s = 'var r = {};';

	self.columns.forEach(function (col) {

		if (col instanceof yy.Column && col.columnid === '*') {
			//			s += 'for(var k in g){r[k]=g[k]};';
			//			s += 'for(var k in this.query.groupColumns){r[k]=g[this.query.groupColumns[k]]};';

			s += 'for(var k in g) {r[k]=g[k]};';
			return '';

		} else {
			// var colas = col.as;
			var colas = col.as;
			if (colas === undefined) {
				if (col instanceof yy.Column) {
					colas = escapeq(col.columnid);
				} else {
					colas = col.nick;
				}
			}
			query.groupColumns[colas] = col.nick;

			//			if(col.as) {
			s += "r['" + colas + "']=";
			//			// } else {
			//			// 	s += 'r[\''+escapeq()+'\']=';
			//			// };
			//			// s += ';';

			s += n2u(col.toJS('g', '')) + ';';

			for (var i = 0; i < query.removeKeys.length; i++) {
				// THis part should be intellectual
				if (query.removeKeys[i] === colas) {
					query.removeKeys.splice(i, 1);
					break;
				}
			}
		}
	});
	// return new Function('g,params,alasql',s+'return r');
	return s;
};

yy.Select.prototype.compileSelectGroup2 = function (query) {
	var self = this;
	var s = query.selectgfns;
	self.columns.forEach(function (col) {

		if (query.ingroup.indexOf(col.nick) > -1) {
			s += "r['" + (col.as || col.nick) + "']=g['" + col.nick + "'];";
		}
	});

	if (this.orderColumns && this.orderColumns.length > 0) {
		this.orderColumns.forEach(function (v, idx) {

			var key = '$$$' + idx;

			if (v instanceof yy.Column && query.groupColumns[v.columnid]) {
				s += "r['" + key + "']=r['" + v.columnid + "'];";
			} else {
				s += "r['" + key + "']=" + v.toJS('g', '') + ';';
			}
			query.removeKeys.push(key);
		});
	}

	return new Function('g,params,alasql', 'var y;' + s + 'return r');
};

// SELECY * REMOVE [COLUMNS] col-list, LIKE ''
yy.Select.prototype.compileRemoveColumns = function (query) {
	var self = this;
	if (typeof this.removecolumns !== 'undefined') {
		query.removeKeys = query.removeKeys.concat(
			this.removecolumns
				.filter(function (column) {
					return typeof column.like === 'undefined';
				})
				.map(function (column) {
					return column.columnid;
				})
		);

		query.removeLikeKeys = this.removecolumns
			.filter(function (column) {
				return typeof column.like !== 'undefined';
			})
			.map(function (column) {
				//				return new RegExp((column.like.value||'').replace(/\%/g,'.*').replace(/\?|_/g,'.'),'g');
				return column.like.value;
			});
	}
};
/* global yy */

yy.Select.prototype.compileHaving = function (query) {
	if (this.having) {
		var s = this.having.toJS('g', -1);
		query.havingfns = s;

		return new Function('g,params,alasql', 'var y;return ' + s);
	}

	return function () {
		return true;
	};
};
yy.Select.prototype.compileOrder = function (query, params) {
	var self = this;
	self.orderColumns = [];
	if (this.order) {

		if (
			this.order &&
			this.order.length == 1 &&
			this.order[0].expression &&
			typeof this.order[0].expression == 'function'
		) {

			var func = this.order[0].expression;

			var nullsOrder =
				this.order[0].nullsOrder == 'FIRST' ? -1 : this.order[0].nullsOrder == 'LAST' ? +1 : 0;
			return function (a, b) {
				var ra = func(a),
					rb = func(b);
				if (nullsOrder) {
					if (ra == null) return rb == null ? 0 : nullsOrder;
					if (rb == null) return -nullsOrder;
				}
				if (ra > rb) return 1;
				if (ra == rb) return 0;
				return -1;
			};
		}

		var s = '';
		var sk = '';
		this.order.forEach(function (ord, idx) {

			if (ord.expression instanceof yy.NumValue) {
				if (ord.expression.value > self.columns.length) {
					throw new Error(
						`You are trying to order by column number ${ord.expression.value} but you have only selected ${self.columns.length} columns.`
					);
				}
				var v = self.columns[ord.expression.value - 1];
			} else {
				var v = ord.expression;
			}
			self.orderColumns.push(v);

			var key = '$$$' + idx;

			// Date conversion
			var dg = '';
			//if(alasql.options.valueof)
			if (ord.expression instanceof yy.Column) {
				var columnid = ord.expression.columnid;
				if (alasql.options.valueof) {
					dg = '.valueOf()';
				} else if (query.xcolumns[columnid]) {
					var dbtypeid = query.xcolumns[columnid].dbtypeid;
					if (
						dbtypeid == 'DATE' ||
						dbtypeid == 'DATETIME' ||
						dbtypeid == 'DATETIME2' ||
						dbtypeid == 'STRING' ||
						dbtypeid == 'NUMBER'
					)
						dg = '.valueOf()';
					// TODO Add other types mapping
				}
			}
			if (ord.expression instanceof yy.ParamValue) {
				var columnid = params[ord.expression.param];
				if (alasql.options.valueof) {
					dg = '.valueOf()';
				} else if (query.xcolumns[columnid]) {
					var dbtypeid = query.xcolumns[columnid].dbtypeid;
					if (
						dbtypeid == 'DATE' ||
						dbtypeid == 'DATETIME' ||
						dbtypeid == 'DATETIME2' ||
						dbtypeid == 'STRING' ||
						dbtypeid == 'NUMBER'
					)
						dg = '.valueOf()';
					// TODO Add other types mapping
				}
			}
			// COLLATE NOCASE
			if (ord.nocase) dg += '.toUpperCase()';

			if (ord.nullsOrder) {
				if (ord.nullsOrder == 'FIRST') {
					s += "if((a['" + key + "'] != null) && (b['" + key + "'] == null)) return 1;";
				} else if (ord.nullsOrder == 'LAST') {
					s += "if((a['" + key + "'] == null) && (b['" + key + "'] != null)) return 1;";
				}
				s += "if((a['" + key + "'] == null) == (b['" + key + "'] == null)) {";
				sk += '}';
			}

			s +=
				"if((a['" +
				key +
				"']||'')" +
				dg +
				(ord.direction == 'ASC' ? '>' : '<') +
				"(b['" +
				key +
				"']||'')" +
				dg +
				')return 1;';
			s += "if((a['" + key + "']||'')" + dg + "==(b['" + key + "']||'')" + dg + '){';

			/*
if(false) {

			if(ord.expression instanceof yy.NumValue) {
				ord.expression = self.columns[ord.expression.value-1];

				ord.expression = new yy.Column({columnid:ord.expression.nick});
			};

			if(ord.expression instanceof yy.Column) {
				var columnid = ord.expression.columnid;
				if(query.xcolumns[columnid]) {
					var dbtypeid = query.xcolumns[columnid].dbtypeid;
					if( dbtypeid == 'DATE' || dbtypeid == 'DATETIME' || dbtypeid == 'DATETIME2') dg = '.valueOf()';
					// TODO Add other types mapping
				} else {
					if(alasql.options.valueof) dg = '.valueOf()'; // TODO Check
				}
				// COLLATE NOCASE
				if(ord.nocase) dg += '.toUpperCase()';

				s += 'if((a[\''+columnid+"']||'')"+dg+(ord.direction == 'ASC'?'>':'<')+'(b[\''+columnid+"']||'')"+dg+')return 1;';
				s += 'if((a[\''+columnid+"']||'')"+dg+'==(b[\''+columnid+"']||'')"+dg+'){';

			} else {
				dg = '.valueOf()';
				// COLLATE NOCASE
				if(ord.nocase) dg += '.toUpperCase()';
				s += 'if(('+ord.toJS('a','')+"||'')"+dg+(ord.direction == 'ASC'?'>(':'<(')+ord.toJS('b','')+"||'')"+dg+')return 1;';
				s += 'if(('+ord.toJS('a','')+"||'')"+dg+'==('+ord.toJS('b','')+"||'')"+dg+'){';
			}

			// TODO Add date comparision

}
*/
			sk += '}';
		});
		s += 'return 0;';
		s += sk + 'return -1';
		query.orderfns = s;

		return new Function('a,b', 'var y;' + s);
	}
};
// Pivot functions
/**
	Compile Pivot functions
	@param {object} query Source query
	@return {function} Pivoting functions
*/
yy.Select.prototype.compilePivot = function (query) {
	var self = this;
	/** @type {string} Main pivoting column */

	var columnid = self.pivot.columnid;
	var aggr = self.pivot.expr.aggregatorid;
	var inlist = self.pivot.inlist;

	var exprcolid = null;

	if (self.pivot.expr.expression.hasOwnProperty('columnid')) {
		exprcolid = self.pivot.expr.expression.columnid;
	} else {
		exprcolid = self.pivot.expr.expression.expression.columnid;
	}

	if (null == exprcolid) {
		throw 'columnid not found';
	}

	if (inlist) {
		inlist = inlist.map(function (l) {
			return l.expr.columnid;
		});
	}

	// Function for PIVOT post production
	return function () {
		var query = this;
		var cols = query.columns
			.filter(function (col) {
				return col.columnid != columnid && col.columnid != exprcolid;
			})
			.map(function (col) {
				return col.columnid;
			});

		var newcols = [];
		var gnewcols = {};
		var gr = {};
		var ga = {};
		var data = [];
		query.data.forEach(function (d) {
			if (!inlist || inlist.indexOf(d[columnid]) > -1) {
				var gx = cols
					.map(function (colid) {
						return d[colid];
					})
					.join('`');
				var g = gr[gx];
				if (!g) {
					g = {};
					gr[gx] = g;
					data.push(g);
					cols.forEach(function (colid) {
						g[colid] = d[colid];
					});
				}

				if (!ga[gx]) {
					ga[gx] = {};
				}

				if (ga[gx][d[columnid]]) {
					ga[gx][d[columnid]]++;
				} else {
					ga[gx][d[columnid]] = 1;
				}

				if (!gnewcols[d[columnid]]) {
					gnewcols[d[columnid]] = true;
					newcols.push(d[columnid]);
				}

				if (aggr == 'SUM' || aggr == 'AVG' || aggr == 'TOTAL') {
					if (typeof g[d[columnid]] == 'undefined') g[d[columnid]] = 0;
					g[d[columnid]] += +d[exprcolid];
				} else if (aggr == 'COUNT') {
					if (typeof g[d[columnid]] == 'undefined') g[d[columnid]] = 0;
					g[d[columnid]]++;
				} else if (aggr == 'MIN') {
					if (typeof g[d[columnid]] == 'undefined') g[d[columnid]] = d[exprcolid];
					if (d[exprcolid] < g[d[columnid]]) g[d[columnid]] = d[exprcolid];
				} else if (aggr == 'MAX') {
					if (typeof g[d[columnid]] == 'undefined') g[d[columnid]] = d[exprcolid];
					if (d[exprcolid] > g[d[columnid]]) g[d[columnid]] = d[exprcolid];
				} else if (aggr == 'FIRST') {
					if (typeof g[d[columnid]] == 'undefined') g[d[columnid]] = d[exprcolid];
				} else if (aggr == 'LAST') {
					g[d[columnid]] = d[exprcolid];
				} else if (alasql.aggr[aggr]) {
					// Custom aggregator
					alasql.aggr[aggr](g[d[columnid]], d[exprcolid]);
				} else {
					throw new Error('Wrong aggregator in PIVOT clause');
				}
			}
		});

		if (aggr == 'AVG') {
			for (var gx in gr) {
				var d = gr[gx];
				for (var colid in d) {
					if (cols.indexOf(colid) == -1 && colid != exprcolid) {
						d[colid] = d[colid] / ga[gx][colid];
					}
				}
			}
		}

		// columns
		query.data = data;

		if (inlist) newcols = inlist;

		var ncol = query.columns.filter(function (col) {
			return col.columnid == exprcolid;
		})[0];
		query.columns = query.columns.filter(function (col) {
			return !(col.columnid == columnid || col.columnid == exprcolid);
		});
		newcols.forEach(function (colid) {
			var nc = cloneDeep(ncol);
			nc.columnid = colid;
			query.columns.push(nc);
		});
	};
};

// var columnid = this.pivot.columnid;

// return function(data){

// if(false) {

// }

// if(false) {

// }
// };

/**
	Compile UNPIVOT clause
	@param {object} query Query object
	@return {function} Function for unpivoting
*/
yy.Select.prototype.compileUnpivot = function (query) {
	var self = this;
	var tocolumnid = self.unpivot.tocolumnid;
	var forcolumnid = self.unpivot.forcolumnid;
	var inlist = self.unpivot.inlist.map(function (l) {
		return l.columnid;
	});

	return function () {
		var data = [];

		var xcols = query.columns
			.map(function (col) {
				return col.columnid;
			})
			.filter(function (colid) {
				return inlist.indexOf(colid) == -1 && colid != forcolumnid && colid != tocolumnid;
			});

		query.data.forEach(function (d) {
			inlist.forEach(function (colid) {
				var nd = {};
				xcols.forEach(function (xcolid) {
					nd[xcolid] = d[xcolid];
				});
				nd[forcolumnid] = colid;
				nd[tocolumnid] = d[colid];
				data.push(nd);
			});
		});

		query.data = data;

		//		});
	};
};
/*
//
// ROLLUP(), CUBE(), GROUPING SETS() for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/**
 Calculate ROLLUP() combination
 */

const rollup = (a, query) => {
	const rr = [];
	let mask = 0;
	const glen = a.length;

	for (let g = 0; g < glen + 1; g++) {
		const ss = [];
		for (let i = 0; i < glen; i++) {
			let aaa;
			if (a[i] instanceof yy.Column) {
				a[i].nick = escapeq(a[i].columnid);
				query.groupColumns[escapeq(a[i].columnid)] = a[i].nick;
				aaa = `${a[i].nick}\t${a[i].toJS('p', query.sources[0].alias, query.defcols)}`;
			} else {
				query.groupColumns[escapeq(a[i].toString())] = escapeq(a[i].toString());
				aaa = `${escapeq(a[i].toString())}\t${a[i].toJS('p', query.sources[0].alias, query.defcols)}`;
			}

			if (mask & (1 << i)) ss.push(aaa);
		}
		rr.push(ss);
		mask = (mask << 1) + 1;
	}
	return rr;
};

/**
 Calculate CUBE()
 */
const cube = (a, query) => {
	const rr = [];
	const glen = a.length;
	const glenCube = 1 << glen;

	for (let g = 0; g < glenCube; g++) {
		let ss = [];
		for (let i = 0; i < glen; i++) {
			if (g & (1 << i)) {
				ss = ss.concat(decartes(a[i], query));
			}
		}
		rr.push(ss);
	}
	return rr;
};

/**
 * GROUPING SETS()
 */
const groupingsets = (a, query) =>
	a.reduce((acc, d) => {
		acc = acc.concat(decartes(d, query));
		return acc;
	}, []);

/**
 * Cartesian production
 */
const cartes = (a1, a2) => {
	const rrr = [];
	for (let i1 = 0; i1 < a1.length; i1++) {
		for (let i2 = 0; i2 < a2.length; i2++) {
			rrr.push(a1[i1].concat(a2[i2]));
		}
	}
	return rrr;
};

/**
 Prepare groups function
 */ function decartes(gv, query) {
	if (Array.isArray(gv)) {
		let res = [[]];
		for (let t = 0; t < gv.length; t++) {
			if (gv[t] instanceof yy.Column) {
				gv[t].nick = gv[t].nick ? escapeq(gv[t].nick) : escapeq(gv[t].columnid);
				query.groupColumns[gv[t].nick] = gv[t].nick;
				res = res.map(r =>
					r.concat(`${gv[t].nick}\t${gv[t].toJS('p', query.sources[0].alias, query.defcols)}`)
				);
			} else if (gv[t] instanceof yy.FuncValue) {
				query.groupColumns[escapeq(gv[t].toString())] = escapeq(gv[t].toString());
				res = res.map(r =>
					r.concat(
						`${escapeq(gv[t].toString())}\t${gv[t].toJS('p', query.sources[0].alias, query.defcols)}`
					)
				);
			} else if (gv[t] instanceof yy.GroupExpression) {
				if (gv[t].type == 'ROLLUP') res = cartes(res, rollup(gv[t].group, query));
				else if (gv[t].type == 'CUBE') res = cartes(res, cube(gv[t].group, query));
				else if (gv[t].type == 'GROUPING SETS') res = cartes(res, groupingsets(gv[t].group, query));
				else throw new Error('Unknown grouping function');
			} else if (gv[t] === '') {
				res = [['1\t1']];
			} else {
				res = res.map(r =>
					r.concat(
						`${escapeq(gv[t].toString())}\t${gv[t].toJS('p', query.sources[0].alias, query.defcols)}`
					)
				);
			}
		}
		return res;
	}

	if (gv instanceof yy.FuncValue) {
		query.groupColumns[escapeq(gv.toString())] = escapeq(gv.toString());
		return [`${gv.toString()}\t${gv.toJS('p', query.sources[0].alias, query.defcols)}`];
	}

	if (gv instanceof yy.Column) {
		gv.nick = escapeq(gv.columnid);
		query.groupColumns[gv.nick] = gv.nick;
		return [`${gv.nick}\t${gv.toJS('p', query.sources[0].alias, query.defcols)}`];
	}

	query.groupColumns[escapeq(gv.toString())] = escapeq(gv.toString());
	return [`${escapeq(gv.toString())}\t${gv.toJS('p', query.sources[0].alias, query.defcols)}`];
}
/*
//
// Select run-time part for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Select.prototype.compileDefCols = function (query, databaseid) {

	var defcols = {'.': {}};
	if (this.from) {
		this.from.forEach(function (fr) {
			defcols['.'][fr.as || fr.tableid] = true;
			if (fr instanceof yy.Table) {
				var alias = fr.as || fr.tableid;

				var table = alasql.databases[fr.databaseid || databaseid].tables[fr.tableid];

				if (undefined === table) {
					throw new Error('Table does not exist: ' + fr.tableid);
				}

				if (table.columns) {
					table.columns.forEach(function (col) {
						if (defcols[col.columnid]) {
							defcols[col.columnid] = '-'; // Ambigous
						} else {
							defcols[col.columnid] = alias;
						}
					});
				}
			} else if (fr instanceof yy.Select) {
			} else if (fr instanceof yy.Search) {
			} else if (fr instanceof yy.ParamValue) {
			} else if (fr instanceof yy.VarValue) {
			} else if (fr instanceof yy.FuncValue) {
			} else if (fr instanceof yy.FromData) {
			} else if (fr instanceof yy.Json) {
			} else if (fr.inserted) {
			} else {

				throw new Error('Unknown type of FROM clause');
			}
		});
	}

	if (this.joins) {
		this.joins.forEach(function (jn) {
			defcols['.'][jn.as || jn.table.tableid] = true;

			if (jn.table) {
				var alias = jn.as || jn.table.tableid;
				var databaseId = jn.table.databaseid || databaseid;
				var database = alasql.databases[databaseId];

				if (database === undefined) {
					throw new Error('Database does not exist: ' + databaseId);
				}

				var table = database.tables[jn.table.tableid];

				if (table === undefined) {
					throw new Error('Table does not exist: ' + jn.table.tableid);
				}

				if (table.columns) {
					table.columns.forEach(function (col) {
						if (defcols[col.columnid]) {
							defcols[col.columnid] = '-'; // Ambigous
						} else {
							defcols[col.columnid] = alias;
						}
					});
				}
			} else if (jn.select) {
			} else if (jn.param) {
			} else if (jn.func) {
			} else {
				throw new Error('Unknown type of FROM clause');
			}
		});
	}
	// for(var k in defcols) {
	// 	if(defcols[k] == '-') defcols[k] = undefined;
	// }

	return defcols;
};
/*
//
// UNION for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// SELECT UNION statement

yy.Union = class Union {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		return 'UNION';
	}

	compile(tableid) {
		return null;
	}
};
/*
//
// CROSS AND OUTER APPLY for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Apply = class Apply {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		let s = `${this.applymode} APPLY (${this.select.toString()})`;

		if (this.as) {
			s += ` AS ${this.as}`;
		}

		return s;
	}
};
/*
//
// CROSS AND OUTER APPLY for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Over = class Over {
	constructor(params) {
		Object.assign(this, params);
	}

	toString() {
		let s = 'OVER (';
		if (this.partition) {
			s += `PARTITION BY ${this.partition.toString()}`;
			if (this.order) s += ' ';
		}
		if (this.order) {
			s += `ORDER BY ${this.order.toString()}`;
		}
		s += ')';
		return s;
	}
};
{
	const assign = Object.assign;

	class ExpressionStatement {
		/** @param {object} params Initial parameters */
		constructor(params) {
			assign(this, params);
		}

		/**
			Convert AST to string
			@return {string}
		*/
		toString() {
			return this.expression.toString();
		}

		/**
			Execute statement
			@param {string} databaseid Database identificatro
			@param {object} params Statement parameters
			@param {statement-callback} cb Callback
			@return {object} Result value
		*/
		execute(databaseid, params, cb) {
			if (this.expression) {
				alasql.precompile(this, databaseid, params); // Precompile queries
				var exprfn = new Function(
					'params,alasql,p',
					'var y;return ' + this.expression.toJS('({})', '', null)
				).bind(this);
				var res = exprfn(params, alasql);
				if (cb) {
					res = cb(res);
				}
				return res;
			}
		}
	}

	class Expression {
		constructor(params) {
			assign(this, params);
		}

		/**
			Convert AST to string
			@return {string}
		*/
		toString() {
			var s = this.expression.toString();
			if (this.order) {
				s += ' ' + this.order.toString();
			}
			if (this.nocase) {
				s += ' COLLATE NOCASE';
			}
			if (this.direction) {
				s += ' ' + this.direction;
			}
			return s;
		}

		/**
			Find aggregator in AST subtree
			@param {object} query Query object
		*/
		findAggregator(query) {
			if (this.expression.findAggregator) {
				this.expression.findAggregator(query);
			}
		}

		/**
			Convert AST to JavaScript expression
			@param {string} context Context string, e.g. 'p','g', or 'x'
			@param {string} tableid Default table name
			@param {object} defcols Default columns dictionary
			@return {string} JavaScript expression
		*/
		toJS(context, tableid, defcols) {

			if (this.expression.reduced) {
				return 'true';
			}
			return this.expression.toJS(context, tableid, defcols);
		}

		/**
			Compile AST to JavaScript expression
			@param {string} context Context string, e.g. 'p','g', or 'x'
			@param {string} tableid Default table name
			@param {object} defcols Default columns dictionary
			@return {string} JavaScript expression
		*/
		compile(context, tableid, defcols) {

			if (this.reduced) {
				return returnTrue();
			}
			return new Function('p', 'var y;return ' + this.toJS(context, tableid, defcols));
		}
	}

	class JavaScript {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			var s = '``' + this.value + '``';
			return s;
		}

		toJS() {
			return '(' + this.value + ')';
		}

		execute(databaseid, params, cb) {
			var res = 1;
			var expr = new Function('params,alasql,p', this.value);
			expr(params, alasql);
			if (cb) {
				res = cb(res);
			}
			return res;
		}
	}

	class Literal {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			var s = this.value;
			if (this.value1) {
				s = this.value1 + '.' + s;
			}
			//	else s = tableid+'.'+s;
			return s;
		}
	}

	class Join {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			var s = ' ';
			if (this.joinmode) {
				s += this.joinmode + ' ';
			}
			s += 'JOIN ' + this.table.toString();
			return s;
		}
	}

	class Table {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			var s = this.tableid;
			//	if(this.joinmode)
			if (this.databaseid) {
				s = this.databaseid + '.' + s;
			}
			return s;
		}
	}

	class View {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			var s = this.viewid;
			//	if(this.joinmode)
			if (this.databaseid) {
				s = this.databaseid + '.' + s;
			}
			return s;
		}
	}

	const toTypeNumberOps = new Set(['-', '*', '/', '%', '^']);
	const toTypeStringOps = new Set(['||']);
	const toTypeBoolOps = new Set([
		'AND',
		'OR',
		'NOT',
		'=',
		'==',
		'===',
		'!=',
		'!==',
		'!===',
		'>',
		'>=',
		'<',
		'<=',
		'IN',
		'NOT IN',
		'LIKE',
		'NOT LIKE',
		'REGEXP',
		'GLOB',
		'BETWEEN',
		'NOT BETWEEN',
		'IS NULL',
		'IS NOT NULL',
	]);
	class Op {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			const leftStr = this.left.toString();
			let s;

			if (this.op === 'IN' || this.op === 'NOT IN') {
				return `${leftStr} ${this.op} (${this.right.toString()})`;
			}

			if (this.allsome) {
				return `${leftStr} ${this.op} ${this.allsome} (${this.right.toString()})`;
			}

			if (this.op === '->' || this.op === '!') {
				s = `${leftStr}${this.op}`;
				if (typeof this.right !== 'string' && typeof this.right !== 'number')
					return s + `(${this.right.toString()})`;
				return s + this.right.toString();
			}

			if (this.op === 'BETWEEN' || this.op === 'NOT BETWEEN') {
				return `${leftStr} ${this.op} ${this.right1.toString()} AND ${this.right2.toString()}`;
			}

			return `${leftStr} ${this.op} ${this.allsome ? this.allsome + ' ' : ''}${this.right.toString()}`;
		}

		findAggregator(query) {
			if (this.left && this.left.findAggregator) {
				this.left.findAggregator(query);
			}
			// Do not go in > ALL
			if (this.right && this.right.findAggregator && !this.allsome) {
				this.right.findAggregator(query);
			}
		}

		toType(tableid) {
			if (toTypeNumberOps.has(this.op)) return 'number';

			if (toTypeStringOps.has(this.op)) return 'string';

			if (this.op === '+') {
				const leftType = this.left.toType(tableid);
				const rightType = this.right.toType(tableid);

				if (leftType === 'string' || rightType === 'string') {
					return 'string';
				}
				if (leftType === 'number' || rightType === 'number') {
					return 'number';
				}
			}

			if (toTypeBoolOps.has(this.op) || this.allsome) return 'boolean';

			if (!this.op) return this.left.toType(tableid);

			return 'unknown';
		}

		toJS(context, tableid, defcols) {
			var s;
			let refs = [];
			let op = this.op;
			let _this = this;
			let ref = function (expr) {
				if (expr.toJS) {
					expr = expr.toJS(context, tableid, defcols);
				}
				let i = refs.push(expr) - 1;
				return 'y[' + i + ']';
			};
			var leftJS = function () {
				return ref(_this.left);
			};
			var rightJS = function () {
				return ref(_this.right);
			};

			if (this.op === '=') {
				op = '===';
			} else if (this.op === '<>') {
				op = '!=';
			} else if (this.op === 'OR') {
				op = '||';
			} else if (this.op === '->') {
				// Expression to prevent error if object is empty (#344)
				const ljs = `(${leftJS()} || {})`;

				if (typeof this.right === 'string') {
					s = `${ljs}["${escapeq(this.right)}"]`;
				} else if (typeof this.right === 'number') {
					s = `${ljs}[${this.right}]`;
				} else if (this.right instanceof yy.FuncValue) {
					let ss = [];
					if (this.right.args && this.right.args.length > 0) {
						ss = this.right.args.map(ref);
					}
					s = `${ljs}[${JSON.stringify(this.right.funcid)}](${ss.join(',')})`;
				} else {
					s = `${ljs}[${rightJS()}]`;
				}
			} else if (this.op === '!') {
				if (typeof this.right === 'string') {
					s = `alasql.databases[alasql.useid].objects[${leftJS()}]["${this.right}"]`;
				}
				// TODO - add other cases
			} else if (this.op === 'IS') {
				const leftOperand = leftJS();
				const rightOperand = rightJS();
				if (
					this.right instanceof yy.NullValue ||
					(this.right.op === 'NOT' && this.right.right instanceof yy.NullValue)
				) {
					s = `((${leftOperand} == null) === (${rightOperand} == null))`; // == null can't be ===
				} else {
					s = `((${leftOperand} == ${rightOperand}) || (${leftOperand} < 0 && true == ${rightOperand}))`;
				}
			} else if (this.op === '==') {
				s = `alasql.utils.deepEqual(${leftJS()}, ${rightJS()})`;
			} else if (this.op === '===' || this.op === '!===') {
				s = `(${this.op === '!===' ? '!' : ''}((${leftJS()}).valueOf() === (${rightJS()}).valueOf()))`;
			} else if (this.op === '!==') {
				s = `(!alasql.utils.deepEqual(${leftJS()}, ${rightJS()}))`;
			} else if (this.op === '||') {
				s = `(''+(${leftJS()} || '') + (${rightJS()} || ''))`;
			} else if (this.op === 'LIKE' || this.op === 'NOT LIKE') {
				s = `(${this.op === 'NOT LIKE' ? '!' : ''}alasql.utils.like(${rightJS()}, ${leftJS()}${this.escape ? `, ${ref(this.escape)}` : ''}))`;
			} else if (this.op === 'REGEXP') {
				s = `alasql.stdfn.REGEXP_LIKE(${leftJS()}, ${rightJS()})`;
			} else if (this.op === 'GLOB') {
				s = `alasql.utils.glob(${leftJS()}, ${rightJS()})`;
			} else if (this.op === 'BETWEEN' || this.op === 'NOT BETWEEN') {
				const left = leftJS();
				s = `(${this.op === 'NOT BETWEEN' ? '!' : ''}((${ref(this.right1)} <= ${left}) && (${left} <= ${ref(this.right2)})))`;
			} else if (this.op === 'IN') {
				if (this.right instanceof yy.Select) {
					s = `alasql.utils.flatArray(this.queriesfn[${this.queriesidx}](params, null, ${context})).indexOf(alasql.utils.getValueOf(${leftJS()})) > -1`;
				} else if (Array.isArray(this.right)) {
					if (!alasql.options.cache || this.right.some(value => value instanceof yy.ParamValue)) {
						// Leverage JS Set for faster lookups than arrays
						s = `(new Set([${this.right.map(ref).join(',')}]).has(alasql.utils.getValueOf(${leftJS()})))`;
					} else {
						// Use a cache to avoid re-creating the Set on every identical query
						alasql.sets = alasql.sets || {};
						const allValues = this.right.map(value => value.value);
						const allValuesStr = allValues.join(',');
						alasql.sets[allValuesStr] = alasql.sets[allValuesStr] || new Set(allValues);
						s = `alasql.sets["${allValuesStr}"].has(alasql.utils.getValueOf(${leftJS()}))`;
					}
				} else {
					s = `(${rightJS()}.indexOf(${leftJS()}) > -1)`;
				}
			} else if (this.op === 'NOT IN') {
				if (this.right instanceof yy.Select) {
					s = `alasql.utils.flatArray(this.queriesfn[${this.queriesidx}](params, null, p)).indexOf(alasql.utils.getValueOf(${leftJS()})) < 0`;
				} else if (Array.isArray(this.right)) {
					if (!alasql.options.cache || this.right.some(value => value instanceof yy.ParamValue)) {
						// Leverage JS Set for faster lookups than arrays
						s = `(!(new Set([${this.right.map(ref).join(',')}]).has(alasql.utils.getValueOf(${leftJS()}))))`;
					} else {
						// Use a cache to avoid re-creating the Set on every identical query
						alasql.sets = alasql.sets || {};
						const allValues = this.right.map(value => value.value);
						const allValuesStr = allValues.join(',');
						alasql.sets[allValuesStr] = alasql.sets[allValuesStr] || new Set(allValues);
						s = `!alasql.sets["${allValuesStr}"].has(alasql.utils.getValueOf(${leftJS()}))`;
					}
				} else {
					s = `(${rightJS()}.indexOf(${leftJS()}) === -1)`;
				}
			}

			if (this.allsome === 'ALL') {
				var s;
				if (this.right instanceof yy.Select) {
					s =
						'alasql.utils.flatArray(this.query.queriesfn[' + this.queriesidx + '](params,null,p))';

					s += '.every(function(b){return (';
					s += leftJS() + ')' + op + 'b})';
				} else if (Array.isArray(this.right)) {
					s =
						'' +
						(this.right.length == 1
							? ref(this.right[0])
							: '[' + this.right.map(ref).join(',') + ']');
					s += '.every(function(b){return (';
					s += leftJS() + ')' + op + 'b})';
				} else {
					throw new Error('NOT IN operator without SELECT');
				}
			}

			if (this.allsome === 'SOME' || this.allsome === 'ANY') {
				var s;
				if (this.right instanceof yy.Select) {
					s =
						'alasql.utils.flatArray(this.query.queriesfn[' + this.queriesidx + '](params,null,p))';
					s += '.some(function(b){return (';
					s += leftJS() + ')' + op + 'b})';
				} else if (Array.isArray(this.right)) {
					s =
						'' +
						(this.right.length == 1
							? ref(this.right[0])
							: '[' + this.right.map(ref).join(',') + ']');
					s += '.some(function(b){return (';
					s += leftJS() + ')' + op + 'b})';
				} else {
					throw new Error('SOME/ANY operator without SELECT');
				}
			}

			// Special case for AND optimization (if reduced)
			if (this.op === 'AND') {
				if (this.left.reduced) {
					if (this.right.reduced) {
						return 'true';
					} else {
						s = rightJS();
					}
				} else if (this.right.reduced) {
					s = leftJS();
				}

				// Otherwise process as regular operation (see below)
				op = '&&';
			}

			var expr = s || '(' + leftJS() + op + rightJS() + ')';

			var declareRefs = 'y=[(' + refs.join('), (') + ')]';
			if (op === '&&' || op === '||' || op === 'IS' || op === 'IS NULL' || op === 'IS NOT NULL') {
				return '(' + declareRefs + ', ' + expr + ')';
			}

			return `(${declareRefs}, y.some(e => e == null) ? void 0 : ${expr})`;
		}
	}

	class VarValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return '@' + this.variable;
		}

		toType() {
			return 'unknown';
		}

		toJS() {
			return "alasql.vars['" + escapeq(this.variable) + "']";
		}
	}

	class NumValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return this.value.toString();
		}

		toType() {
			return 'number';
		}

		toJS() {
			return '' + this.value;
		}
	}

	class StringValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return "'" + this.value.toString() + "'";
		}

		toType() {
			return 'string';
		}

		toJS() {
			return "'" + escapeq(this.value) + "'";
		}
	}

	class DomainValueValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return 'VALUE';
		}

		toType() {
			return 'object';
		}

		toJS(context, tableid, defcols) {
			return context;
		}
	}

	class ArrayValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return 'ARRAY[]';
		}

		toType() {
			return 'object';
		}

		toJS(context, tableid, defcols) {
			return (
				'[(' +
				this.value
					.map(function (el) {
						return el.toJS(context, tableid, defcols);
					})
					.join('), (') +
				')]'
			);
		}
	}

	class LogicValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return this.value ? 'TRUE' : 'FALSE';
		}

		toType() {
			return 'boolean';
		}

		toJS() {
			return this.value ? 'true' : 'false';
		}
	}

	class NullValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return 'NULL';
		}

		toJS() {
			return 'undefined';
		}
	}

	class ParamValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return '$' + this.param;
		}

		toJS() {
			if (typeof this.param === 'string') {
				return "params['" + this.param + "']";
			}

			return 'params[' + this.param + ']';
		}
	}

	const toJsOpMapping = {
		'~': '~',
		'-': '-',
		'+': '+',
		NOT: '!',
	};

	class UniOp {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			const {op, right} = this;
			const res = right.toString();

			switch (op) {
				case '~':
				case '-':
				case '+':
				case '#':
					return op + res;
				case 'NOT':
					return op + '(' + res + ')';
				default:
					return '(' + res + ')';
			}
		}

		findAggregator(query) {
			if (this.right.findAggregator) {
				this.right.findAggregator(query);
			}
		}

		toType() {
			switch (this.op) {
				case '-':
				case '+':
					return 'number';
				case 'NOT':
					return 'boolean';
				default:
					return 'string';
			}
		}

		toJS(context, tableid, defcols) {
			if (this.right instanceof Column && this.op === '#') {
				return `(alasql.databases[alasql.useid].objects['${this.right.columnid}'])`;
			}

			const rightJS = this.right.toJS(context, tableid, defcols);

			if (toJsOpMapping.hasOwnProperty(this.op)) {
				return `(${toJsOpMapping[this.op]}(${rightJS}))`;
			}

			if (this.op == null) {
				return `(${rightJS})`;
			}

			throw new Error(`Unsupported operator: ${this.op}`);
		}
	}

	class Column {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			let s = this.columnid;

			if (this.columnid == +this.columnid) {
				s = '[' + this.columnid + ']';
			}

			if (this.tableid) {
				s = this.tableid + (this.columnid === +this.columnid ? '' : '.') + s;

				if (this.databaseid) {
					s = this.databaseid + '.' + s;
				}
			}

			return s;
		}

		toJS(context, tableid, defcols) {
			if (!this.tableid && tableid === '' && !defcols) {
				return this.columnid !== '_'
					? `${context}['${this.columnid}']`
					: context === 'g'
						? "g['_']"
						: context;
			}

			if (context === 'g') {
				return `g['${this.nick}']`;
			}

			if (this.tableid) {
				return this.columnid !== '_'
					? `${context}['${this.tableid}']['${this.columnid}']`
					: context === 'g'
						? "g['_']"
						: `${context}['${this.tableid}']`;
			}

			if (defcols) {
				const tbid = defcols[this.columnid];
				if (tbid === '-') {
					throw new Error(
						`Cannot resolve column "${this.columnid}" because it exists in two source tables`
					);
				} else if (tbid) {
					return this.columnid !== '_'
						? `${context}['${tbid}']['${this.columnid}']`
						: `${context}['${tbid}']`;
				} else {
					return this.columnid !== '_'
						? `${context}['${this.tableid || tableid}']['${this.columnid}']`
						: `${context}['${this.tableid || tableid}']`;
				}
			}

			if (tableid === -1) {
				return `${context}['${this.columnid}']`;
			}

			return this.columnid !== '_'
				? `${context}['${this.tableid || tableid}']['${this.columnid}']`
				: `${context}['${this.tableid || tableid}']`;
		}
	}

	class AggrValue {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			const funcName =
				this.aggregatorid === 'REDUCE'
					? this.funcid.replace(re_invalidFnNameChars, '')
					: this.aggregatorid;
			const distinctPart = this.distinct ? 'DISTINCT ' : '';
			const expressionPart = this.expression ? this.expression.toString() : '';
			const overPart = this.over ? ` ${this.over.toString()}` : '';

			return `${funcName}(${distinctPart}${expressionPart})${overPart}`;
		}

		findAggregator(query) {
			const colas = escapeq(this.toString()) + ':' + query.selectGroup.length;

			if (!this.nick) {
				this.nick = colas;

				if (!query.removeKeys.includes(colas)) {
					query.removeKeys.push(colas);
				}
			}

			query.selectGroup.push(this);
		}

		toType() {
			if (
				['SUM', 'COUNT', 'AVG', 'MIN', 'MAX', 'AGGR', 'VAR', 'STDDEV', 'TOTAL'].includes(
					this.aggregatorid
				)
			) {
				return 'number';
			}

			if (this.aggregatorid === 'ARRAY') {
				return 'array';
			}

			return this.expression.toType();
		}

		toJS() {
			var colas = this.nick;
			if (colas === undefined) {
				colas = escapeq(this.toString());
			}
			return "g['" + colas + "']";
		}
	}

	class OrderExpression {
		constructor(params) {
			assign(this, params);
		}
	}

	OrderExpression.prototype.toString = Expression.prototype.toString;

	class GroupExpression {
		constructor(params) {
			assign(this, params);
		}

		toString() {
			return this.type + '(' + this.group.toString() + ')';
		}
	}

	assign(yy, {
		AggrValue,
		ArrayValue,
		Column,
		DomainValueValue,
		Expression,
		ExpressionStatement,
		GroupExpression,
		JavaScript,
		Join,
		Literal,
		LogicValue,
		NullValue,
		NumValue,
		Op,
		OrderExpression,
		ParamValue,
		StringValue,
		Table,
		UniOp,
		VarValue,
		View,
	});
}
// Alasql Linq library

yy.FromData = function (params) {
	return yy.extend(this, params);
};
yy.FromData.prototype.toString = function () {
	if (this.data) return 'DATA(' + ((Math.random() * 10e15) | 0) + ')';
	else return '?';
};
yy.FromData.prototype.toJS = function () {

};

yy.Select.prototype.exec = function (params, cb) {
	if (this.preparams) params = this.preparams.concat(params);

	var databaseid = alasql.useid;
	var db = alasql.databases[databaseid];
	var sql = this.toString();
	var hh = hash(sql);

	var statement = this.compile(databaseid);
	if (!statement) return;
	statement.sql = sql;
	statement.dbversion = db.dbversion;

	// Secure sqlCache size
	if (db.sqlCacheSize > alasql.MAXSQLCACHESIZE) {
		db.resetSqlCache();
	}
	db.sqlCacheSize++;
	db.sqlCache[hh] = statement;
	var res = (alasql.res = statement(params, cb));
	return res;
};

yy.Select.prototype.Select = function () {
	var self = this;
	var args = [];
	if (arguments.length > 1) {
		args = Array.prototype.slice.call(arguments);
	} else if (arguments.length == 1) {
		if (Array.isArray(arguments[0])) {
			args = arguments[0];
		} else {
			args = [arguments[0]];
		}
	} else {
		throw new Error('Wrong number of arguments of Select() function');
	}

	self.columns = [];

	args.forEach(function (arg) {
		if (typeof arg == 'string') {
			self.columns.push(new yy.Column({columnid: arg}));
		} else if (typeof arg == 'function') {
			var pari = 0;
			if (self.preparams) {
				pari = self.preparams.length;
			} else {
				self.preparams = [];
			}
			self.preparams.push(arg);
			self.columns.push(new yy.Column({columnid: '*', func: arg, param: pari}));
		} else {
			// Unknown type
		}
	});

	return self;
};

yy.Select.prototype.From = function (tableid) {
	var self = this;
	if (!self.from) self.from = [];
	if (Array.isArray(tableid)) {
		var pari = 0;
		if (self.preparams) {
			pari = self.preparams.length;
		} else {
			self.preparams = [];
		}
		self.preparams.push(tableid);
		self.from.push(new yy.ParamValue({param: pari}));
	} else if (typeof tableid == 'string') {
		self.from.push(new yy.Table({tableid: tableid}));
	} else {
		throw new Error('Unknown arguments in From() function');
	}
	return self;
};

yy.Select.prototype.OrderBy = function () {
	var self = this;
	var args = [];

	self.order = [];

	if (arguments.length == 0) {
		//		self.order.push(new yy.OrderExpression({expression: new yy.Column({columnid:"_"}), direction:'ASC'}));
		args = ['_'];
	} else if (arguments.length > 1) {
		args = Array.prototype.slice.call(arguments);
	} else if (arguments.length == 1) {
		if (Array.isArray(arguments[0])) {
			args = arguments[0];
		} else {
			args = [arguments[0]];
		}
	} else {
		throw new Error('Wrong number of arguments of Select() function');
	}

	if (args.length > 0) {
		args.forEach(function (arg) {
			var expr = new yy.Column({columnid: arg});
			if (typeof arg == 'function') {
				expr = arg;
			}
			self.order.push(new yy.OrderExpression({expression: expr, direction: 'ASC'}));
		});
	}
	return self;
};

yy.Select.prototype.Top = function (topnum) {
	var self = this;
	self.top = new yy.NumValue({value: topnum});
	return self;
};

yy.Select.prototype.GroupBy = function () {
	var self = this;
	var args = [];

	if (arguments.length > 1) {
		args = Array.prototype.slice.call(arguments);
	} else if (arguments.length == 1) {
		if (Array.isArray(arguments[0])) {
			args = arguments[0];
		} else {
			args = [arguments[0]];
		}
	} else {
		throw new Error('Wrong number of arguments of Select() function');
	}

	self.group = [];

	args.forEach(function (arg) {
		var expr = new yy.Column({columnid: arg});
		self.group.push(expr);
	});

	return self;
};

yy.Select.prototype.Where = function (expr) {
	var self = this;
	if (typeof expr == 'function') {
		self.where = expr;
	}
	return self;
};
/*
//
// Functions for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.FuncValue = function (params) {
	return Object.assign(this, params);
};

let re_invalidFnNameChars = /[^0-9A-Z_$]+/i;
yy.FuncValue.prototype.toString = function () {
	let s = '';

	if (alasql.fn[this.funcid]) s += this.funcid;
	else if (alasql.aggr[this.funcid]) s += this.funcid;
	else if (alasql.stdlib[this.funcid.toUpperCase()] || alasql.stdfn[this.funcid.toUpperCase()])
		s += this.funcid.toUpperCase().replace(re_invalidFnNameChars, '');

	if (this.funcid !== 'CURRENT_TIMESTAMP') {
		s += '(';
		if (this.args && this.args.length > 0) {
			s += this.args
				.map(function (arg) {
					return arg.toString();
				})
				.join(',');
		}
		s += ')';
	}
	return s;
};

yy.FuncValue.prototype.execute = function (databaseid, params, cb) {
	let res = 1;
	alasql.precompile(this, databaseid, params); // Precompile queries

	let expr = new Function('params,alasql', 'var y;return ' + this.toJS('', '', null));
	expr(params, alasql);
	if (cb) res = cb(res);
	return res;
};

yy.FuncValue.prototype.findAggregator = function (query) {
	if (this.args && this.args.length > 0) {
		this.args.forEach(function (arg) {
			if (arg.findAggregator) arg.findAggregator(query);
		});
	}
};

yy.FuncValue.prototype.toJS = function (context, tableid, defcols) {
	var s = '';
	var funcid = this.funcid;
	// IF this is standard compile functions
	if (!alasql.fn[funcid] && alasql.stdlib[funcid.toUpperCase()]) {
		if (this.args && this.args.length > 0) {
			s += alasql.stdlib[funcid.toUpperCase()].apply(
				this,
				this.args.map(function (arg) {
					return arg.toJS(context, tableid);
				})
			);
		} else {
			s += alasql.stdlib[funcid.toUpperCase()]();
		}
	} else if (!alasql.fn[funcid] && alasql.stdfn[funcid.toUpperCase()]) {
		if (this.newid) s += 'new ';
		s += 'alasql.stdfn[' + JSON.stringify(this.funcid.toUpperCase()) + '](';
		if (this.args && this.args.length > 0) {
			s += this.args
				.map(function (arg) {
					return arg.toJS(context, tableid, defcols);
				})
				.join(',');
		}
		s += ')';
	} else {
		// This is user-defined run-time function
		// TODO arguments!!!
		//		var s = '';
		if (this.newid) s += 'new ';
		s += 'alasql.fn[' + JSON.stringify(this.funcid) + '](';
		if (this.args && this.args.length > 0) {
			s += this.args
				.map(function (arg) {
					return arg.toJS(context, tableid, defcols);
				})
				.join(',');
		}
		s += ')';
	}
	return s;
};
/*
//
// SQL FUNCTIONS COMPILERS
// Based on SQLite functions

// IMPORTANT: These are compiled functions

//alasql.fn = {}; // Keep for compatibility
//alasql.userlib = alasql.fn;
*/

var stdlib = (alasql.stdlib = {});
var stdfn = (alasql.stdfn = {});

stdlib.ABS = function (a) {
	return 'Math.abs(' + a + ')';
};
stdlib.CLONEDEEP = function (a) {
	return 'alasql.utils.cloneDeep(' + a + ')';
};

stdfn.CONCAT = function () {
	return Array.prototype.slice.call(arguments).join('');
};
stdlib.EXP = function (a) {
	return 'Math.pow(Math.E,' + a + ')';
};

stdlib.IIF = function (a, b, c) {
	if (arguments.length === 3) {
		return `((${a}) ? (${b}) : (${c}))`;
	} else {
		throw new Error('Number of arguments of IFF is not equals to 3');
	}
};
stdlib.IFNULL = function (a, b) {
	return `((typeof ${a} === "undefined" || ${a} === null) ? ${b} : ${a})`;
};
stdlib.INSTR = function (s, p) {
	return `((${s}).indexOf(${p}) + 1)`;
};

//stdlib.LEN = stdlib.LENGTH = function(s) {return '('+s+'+"").length';};

stdlib.LEN = stdlib.LENGTH = function (s) {
	return und(s, 'y.length');
};
//stdlib.LENGTH = function(s) {return '('+s+').length'};

stdlib.LOWER = stdlib.LCASE = function (s) {
	return und(s, 'String(y).toLowerCase()');
};
//stdlib.LCASE = function(s) {return '('+s+').toLowerCase()';}

// Returns a character expression after it removes leading blanks.
// see https://docs.microsoft.com/en-us/sql/t-sql/functions/ltrim-transact-sql
stdlib.LTRIM = function (s) {
	return und(s, 'y.replace(/^[ ]+/,"")');
};

// Returns a character string after truncating all trailing spaces.
// see https://docs.microsoft.com/en-us/sql/t-sql/functions/rtrim-transact-sql
stdlib.RTRIM = function (s) {
	return und(s, 'y.replace(/[ ]+$/,"")');
};

stdlib.MAX = stdlib.GREATEST = function () {
	return (
		'[' +
		Array.prototype.join.call(arguments, ',') +
		'].reduce(function (a, b) { return a > b ? a : b; })'
	);
};

stdlib.MIN = stdlib.LEAST = function () {
	return (
		'[' +
		Array.prototype.join.call(arguments, ',') +
		'].reduce(function (a, b) { return a < b ? a : b; })'
	);
};

stdlib.SUBSTRING =
	stdlib.SUBSTR =
	stdlib.MID =
		function (a, b, c) {
			if (arguments.length == 2) return und(a, 'y.substr(' + b + '-1)');
			else if (arguments.length == 3) return und(a, 'y.substr(' + b + '-1,' + c + ')');
		};

stdfn.REGEXP_LIKE = function (a, b, c) {

	return (a || '').search(RegExp(b, c)) > -1;
};

// Here we uses undefined instead of null
stdlib.ISNULL = stdlib.NULLIF = function (a, b) {
	return '(' + a + '==' + b + '?undefined:' + a + ')';
};

stdlib.POWER = function (a, b) {
	return 'Math.pow(' + a + ',' + b + ')';
};

stdlib.RANDOM = function (r) {
	if (arguments.length == 0) {
		return 'Math.random()';
	} else {
		return '(Math.random()*(' + r + ')|0)';
	}
};
stdlib.ROUND = function (s, d) {
	if (arguments.length == 2) {
		return 'Math.round((' + s + ')*Math.pow(10,(' + d + ')))/Math.pow(10,(' + d + '))';
	} else {
		return 'Math.round(' + s + ')';
	}
};
stdlib.CEIL = stdlib.CEILING = function (s) {
	return 'Math.ceil(' + s + ')';
};
stdlib.FLOOR = function (s) {
	return 'Math.floor(' + s + ')';
};

stdlib.ROWNUM = function () {
	return '1';
};
stdlib.ROW_NUMBER = function () {
	return '1';
};

stdlib.SQRT = function (s) {
	return 'Math.sqrt(' + s + ')';
};

stdlib.TRIM = function (s) {
	return und(s, 'y.trim()');
};

stdlib.UPPER = stdlib.UCASE = function (s) {
	return und(s, 'String(y).toUpperCase()');
};

// Concatination of strings
stdfn.CONCAT_WS = function () {
	var args = Array.prototype.slice.call(arguments);
	args = args.filter(x => !(x === null || typeof x === 'undefined'));
	return args.slice(1, args.length).join(args[0] || '');
};

//stdlib.UCASE = function(s) {return '('+s+').toUpperCase()';}
//REPLACE
// RTRIM
// SUBSTR
// TRIM
//REPLACE
// RTRIM
// SUBSTR
// TRIM

// Aggregator for joining strings
alasql.aggr.group_concat = alasql.aggr.GROUP_CONCAT = function (v, s, stage) {
	if (stage === 1) {
		return '' + v;
	} else if (stage === 2) {
		s += ',' + v;
		return s;
	}
	return s;
};

alasql.aggr.median = alasql.aggr.MEDIAN = function (v, s, stage) {
	if (stage === 2) {
		if (v !== null) {
			s.push(v);
		}
		return s;
	}

	if (stage === 1) {
		if (v === null) {
			return [];
		}
		return [v];
	}

	if (!s.length) {
		return null;
	}

	let r = s.sort((a, b) => {
		if (a > b) return 1;
		if (a < b) return -1;
		return 0;
	});

	let middle = (r.length + 1) / 2;
	let middleFloor = middle | 0;
	let el = r[middleFloor - 1];

	if (middle === middleFloor || (typeof el !== 'number' && !(el instanceof Number))) {
		return el;
	} else {
		return (el + r[middleFloor]) / 2;
	}
};

alasql.aggr.QUART = function (v, s, stage, nth) {
	//Quartile (first quartile per default or input param)
	if (stage === 2) {
		if (v !== null) {
			s.push(v);
		}
		return s;
	}

	if (stage === 1) {
		if (v === null) {
			return [];
		}
		return [v];
	}
	if (!s.length) {
		return s;
	}

	nth = !nth ? 1 : nth;
	var r = s.sort(function (a, b) {
		if (a === b) return 0;

		if (a > b) return 1;

		return -1;
	});

	let p = (nth * (r.length + 1)) / 4;

	if (Number.isInteger(p)) {
		return r[p - 1]; //Integer value
	}

	return r[Math.floor(p)]; //Math.ceil -1 or Math.floor
};

alasql.aggr.QUART2 = function (v, s, stage) {
	//Second Quartile
	return alasql.aggr.QUART(v, s, stage, 2);
};
alasql.aggr.QUART3 = function (v, s, stage) {
	//Third Quartile
	return alasql.aggr.QUART(v, s, stage, 3);
};

// Standard deviation
alasql.aggr.VAR = function (v, s, stage) {
	if (stage === 1) {
		// Initialise sum, sum of squares, and count
		return v === null ? {sum: 0, sumSq: 0, count: 0} : {sum: v, sumSq: v * v, count: 1};
	} else if (stage === 2) {
		// Update sum, sum of squares, and count
		if (v !== null) {
			s.sum += v;
			s.sumSq += v * v;
			s.count++;
		}
		return s;
	} else {
		// Calculate variance using the formula: variance = (sumSq - (sum^2 / count)) / (count - 1)
		// This avoids the need to store and iterate over all values
		if (s.count > 1) {
			return (s.sumSq - (s.sum * s.sum) / s.count) / (s.count - 1);
		} else {
			// Handling for cases with less than 2 values (variance is undefined or zero)
			return 0;
		}
	}
};

alasql.aggr.STDEV = function (v, s, stage) {
	if (stage === 1 || stage === 2) {
		return alasql.aggr.VAR(v, s, stage);
	} else {
		return Math.sqrt(alasql.aggr.VAR(v, s, stage));
	}
};

alasql.aggr.STDEV = function (v, s, stage) {
	if (stage === 1 || stage === 2) {
		return alasql.aggr.VAR(v, s, stage);
	} else {
		return Math.sqrt(alasql.aggr.VAR(v, s, stage));
	}
};

alasql.aggr.VARP = function (value, accumulator, stage) {
	if (stage === 1) {
		// Initialise accumulator with count, sum, and sum of squares
		return {count: 1, sum: value, sumSq: value * value};
	} else if (stage === 2) {
		// Update accumulator
		accumulator.count++;
		accumulator.sum += value;
		accumulator.sumSq += value * value;
		return accumulator;
	} else {
		// Final stage: Calculate variance
		if (accumulator.count > 0) {
			const mean = accumulator.sum / accumulator.count;
			const variance = accumulator.sumSq / accumulator.count - mean * mean;
			return variance;
		} else {
			return 0; // Return 0 variance if no values were aggregated
		}
	}
};

alasql.aggr.STD =
	alasql.aggr.STDDEV =
	alasql.aggr.STDEVP =
		function (v, s, stage) {
			if (stage == 1 || stage == 2) {
				return alasql.aggr.VARP(v, s, stage);
			} else {
				return Math.sqrt(alasql.aggr.VARP(v, s, stage));
			}
		};

alasql._aggrOriginal = alasql.aggr;
alasql.aggr = {};
Object.keys(alasql._aggrOriginal).forEach(function (k) {
	alasql.aggr[k] = function (v, s, stage) {
		if (stage === 3 && typeof s === 'undefined') return undefined;
		return alasql._aggrOriginal[k].apply(null, arguments);
	};
});

// String functions
stdfn.REPLACE = function (target, pattern, replacement) {
	return (target || '').split(pattern).join(replacement);
};

// This array is required for fast GUID generation
var lut = [];
for (var i = 0; i < 256; i++) {
	lut[i] = (i < 16 ? '0' : '') + i.toString(16);
}

stdfn.NEWID =
	stdfn.UUID =
	stdfn.GEN_RANDOM_UUID =
		function () {
			var d0 = (Math.random() * 0xffffffff) | 0;
			var d1 = (Math.random() * 0xffffffff) | 0;
			var d2 = (Math.random() * 0xffffffff) | 0;
			var d3 = (Math.random() * 0xffffffff) | 0;
			return (
				lut[d0 & 0xff] +
				lut[(d0 >> 8) & 0xff] +
				lut[(d0 >> 16) & 0xff] +
				lut[(d0 >> 24) & 0xff] +
				'-' +
				lut[d1 & 0xff] +
				lut[(d1 >> 8) & 0xff] +
				'-' +
				lut[((d1 >> 16) & 0x0f) | 0x40] +
				lut[(d1 >> 24) & 0xff] +
				'-' +
				lut[(d2 & 0x3f) | 0x80] +
				lut[(d2 >> 8) & 0xff] +
				'-' +
				lut[(d2 >> 16) & 0xff] +
				lut[(d2 >> 24) & 0xff] +
				lut[d3 & 0xff] +
				lut[(d3 >> 8) & 0xff] +
				lut[(d3 >> 16) & 0xff] +
				lut[(d3 >> 24) & 0xff]
			);
		};
/*
//
// CASE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.CaseValue = function (params) {
	return Object.assign(this, params);
};
yy.CaseValue.prototype.toString = function () {
	var s = 'CASE ';
	if (this.expression) s += this.expression.toString();
	if (this.whens) {
		s += this.whens
			.map(function (w) {
				return ' WHEN ' + w.when.toString() + ' THEN ' + w.then.toString();
			})
			.join();
	}
	s += ' END';
	return s;
};

yy.CaseValue.prototype.findAggregator = function (query) {

	if (this.expression && this.expression.findAggregator) this.expression.findAggregator(query);
	if (this.whens && this.whens.length > 0) {
		this.whens.forEach(function (w) {
			if (w.when.findAggregator) w.when.findAggregator(query);
			if (w.then.findAggregator) w.then.findAggregator(query);
		});
	}
	if (this.elses && this.elses.findAggregator) this.elses.findAggregator(query);
};

yy.CaseValue.prototype.toJS = function (context, tableid, defcols) {
	let s = `(((${context}, params, alasql) => {
        let y, r;`;

	if (this.expression) {
		// If there's an expression, evaluate it and store in `v`, then compare in `when` clauses
		s += `let v = ${this.expression.toJS(context, tableid, defcols)};`;
		this.whens.forEach((w, index) => {
			const condition = `v === ${w.when.toJS(context, tableid, defcols)}`;
			const assignment = `r = ${w.then.toJS(context, tableid, defcols)}`;
			s += `${index === 0 ? 'if' : ' else if'} (${condition}) { ${assignment}; }`;
		});
	} else {
		// Directly evaluate `when` conditions without an initial expression
		this.whens.forEach((w, index) => {
			const condition = w.when.toJS(context, tableid, defcols);
			const assignment = `r = ${w.then.toJS(context, tableid, defcols)}`;
			s += `${index === 0 ? 'if' : ' else if'} (${condition}) { ${assignment}; }`;
		});
	}

	// Handle the `else` case
	if (this.elses) {
		s += ` else { r = ${this.elses.toJS(context, tableid, defcols)}; }`;
	}

	s += '; return r; }))(' + context + ', params, alasql)';

	return s;
};
/*
//
// JSON for Alasql.js
// Date: 19.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Json = function (params) {
	return Object.assign(this, params);
};
yy.Json.prototype.toString = function () {
	var s = ''; // '@'
	s += JSONtoString(this.value);
	s += '';
	return s;
};

const JSONtoString = (alasql.utils.JSONtoString = function (obj) {
	if (typeof obj === 'string') return `"${obj}"`;
	if (typeof obj === 'number' || typeof obj === 'boolean') return String(obj);
	if (typeof obj === 'bigint') return `${obj.toString()}n`;

	if (Array.isArray(obj)) {
		return `[${obj.map(b => JSONtoString(b)).join(',')}]`;
	}

	if (typeof obj === 'object') {
		if (!obj.toJS || obj instanceof yy.Json) {
			const ss = [];
			for (const k in obj) {
				const keyStr = typeof k === 'string' ? `"${k}"` : String(k);
				const valueStr = JSONtoString(obj[k]);
				ss.push(`${keyStr}:${valueStr}`);
			}
			return `{${ss.join(',')}}`;
		} else if (obj.toString) {
			return obj.toString();
		} else {
			throw new Error(`1: Cannot show JSON object ${JSON.stringify(obj)}`);
		}
	} else {
		throw new Error(`2: Cannot show JSON object ${JSON.stringify(obj)}`);
	}
});

function JSONtoJS(obj, context, tableid, defcols) {
	var s = '';
	if (typeof obj == 'string') s = '"' + obj + '"';
	else if (typeof obj == 'number') s = '(' + obj + ')';
	else if (typeof obj == 'boolean') s = obj;
	else if (typeof obj === 'bigint') s = obj.toString() + 'n';
	else if (typeof obj === 'object') {
		if (Array.isArray(obj)) {
			s += `[${obj.map(b => JSONtoJS(b, context, tableid, defcols)).join(',')}]`;
		} else if (!obj.toJS || obj instanceof yy.Json) {
			let ss = [];
			for (const k in obj) {
				let keyStr = typeof k === 'string' ? `"${k}"` : k.toString();
				let valueStr = JSONtoJS(obj[k], context, tableid, defcols);
				ss.push(`${keyStr}:${valueStr}`);
			}
			s = `{${ss.join(',')}}`;
		} else if (obj.toJS) {
			s = obj.toJS(context, tableid, defcols);
		} else {
			throw new Error(`Cannot parse JSON object ${JSON.stringify(obj)}`);
		}
	} else {
		throw new Error('2Can not parse JSON object ' + JSON.stringify(obj));
	}

	return s;
}

yy.Json.prototype.toJS = function (context, tableid, defcols) {
	// TODO redo
	return JSONtoJS(this.value, context, tableid, defcols);
};
/*
//
// CAST and CONVERT functions
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Convert = function (params) {
	return Object.assign(this, params);
};
yy.Convert.prototype.toString = function () {
	var s = 'CONVERT(';
	s += this.dbtypeid;
	if (typeof this.dbsize != 'undefined') {
		s += '(' + this.dbsize;
		if (this.dbprecision) s += ',' + this.dbprecision;
		s += ')';
	}
	s += ',' + this.expression.toString();
	if (this.style) s += ',' + this.style;
	s += ')';
	return s;
};
yy.Convert.prototype.toJS = function (context, tableid, defcols) {
	return `alasql.stdfn.CONVERT(${this.expression.toJS(context, tableid, defcols)}, {
        dbtypeid: "${this.dbtypeid}",
        dbsize: ${this.dbsize},
        dbprecision: ${this.dbprecision},
        style: ${this.style}
    })`;
};

function structuredDate(unFormattedDate) {
	var month = unFormattedDate.getMonth() + 1;
	var year = unFormattedDate.getYear();
	var fullYear = unFormattedDate.getFullYear();
	var date = unFormattedDate.getDate();
	var day = unFormattedDate.toString().substr(4, 3);
	var formattedDate = ('0' + date).substr(-2);
	var formattedMonth = ('0' + month).substr(-2);
	var formattedYear = ('0' + year).substr(-2);
	var formattedHour = ('0' + unFormattedDate.getHours()).substr(-2);
	var formattedMinutes = ('0' + unFormattedDate.getMinutes()).substr(-2);
	var formattedSeconds = ('0' + unFormattedDate.getSeconds()).substr(-2);
	var formattedMilliseconds = ('00' + unFormattedDate.getMilliseconds()).substr(-3);
	return {
		month,
		year,
		fullYear,
		date,
		day,
		formattedDate,
		formattedMonth,
		formattedYear,
		formattedHour,
		formattedMinutes,
		formattedSeconds,
		formattedMilliseconds,
	};
}

/**
 Convert one type to another
 */
alasql.stdfn.CONVERT = function (value, args) {
	var val = value;
	var udbtypeid = args.dbtypeid?.toUpperCase();

	var t;
	var s;
	if (
		args.style ||
		args.dbtypeid == 'Date' ||
		['DATE', 'DATETIME', 'DATETIME2'].indexOf(udbtypeid) > -1
	) {
		if (/\d{8}/.test(val)) {
			t = new Date(+val.substr(0, 4), +val.substr(4, 2) - 1, +val.substr(6, 2));
		} else {
			t = newDate(val);
		}
		s = structuredDate(t);
	}

	if (args.style) {
		// TODO 9,109, 20,120,21,121,126,130,131 conversions
		switch (args.style) {
			case 1: // mm/dd/yy
				val = s.formattedMonth + '/' + s.formattedDate + '/' + s.formattedYear;
				break;
			case 2: // yy.mm.dd
				val = s.formattedYear + '.' + s.formattedMonth + '.' + s.formattedDate;
				break;
			case 3: // dd/mm/yy
				val = s.formattedDate + '/' + s.formattedMonth + '/' + s.formattedYear;
				break;
			case 4: // dd.mm.yy
				val = s.formattedDate + '.' + s.formattedMonth + '.' + s.formattedYear;
				break;
			case 5: // dd-mm-yy
				val = s.formattedDate + '-' + s.formattedMonth + '-' + s.formattedYear;
				break;
			case 6: // dd mon yy
				val = s.formattedDate + ' ' + s.day.toLowerCase() + ' ' + s.formattedYear;
				break;
			case 7: // Mon dd,yy
				val = s.day + ' ' + s.formattedDate + ',' + s.formattedYear;
				break;
			case 8: // hh:mm:ss
			case 108: // hh:mm:ss
				val = s.formattedHour + ':' + s.formattedMinutes + ':' + s.formattedSeconds;
				break;
			case 10: // mm-dd-yy
				val = s.formattedMonth + '-' + s.formattedDate + '-' + s.formattedYear;
				break;
			case 11: // yy/mm/dd
				val = s.formattedYear + '/' + s.formattedMonth + '/' + s.formattedDate;
				break;
			case 12: // yymmdd
				val = s.formattedYear + s.formattedMonth + s.formattedDate;
				break;
			case 101: // mm/dd/yyyy
				val = s.formattedMonth + '/' + s.formattedDate + '/' + s.fullYear;
				break;
			case 102: // yyyy.mm.dd
				val = s.fullYear + '.' + s.formattedMonth + '.' + s.formattedDate;
				break;
			case 103: // dd/mm/yyyy
				val = s.formattedDate + '/' + s.formattedMonth + '/' + s.fullYear;
				break;
			case 104: // dd.mm.yyyy
				val = s.formattedDate + '.' + s.formattedMonth + '.' + s.fullYear;
				break;
			case 105: // dd-mm-yyyy
				val = s.formattedDate + '-' + s.formattedMonth + '-' + s.fullYear;
				break;
			case 106: // dd mon yyyy
				val = s.formattedDate + ' ' + s.day.toLowerCase() + ' ' + s.fullYear;
				break;
			case 107: // Mon dd,yyyy
				val = s.day + ' ' + s.formattedDate + ',' + s.fullYear;
				break;
			case 110: // mm-dd-yyyy
				val = s.formattedMonth + '-' + s.formattedDate + '-' + s.fullYear;
				break;
			case 111: // yyyy/mm/dd
				val = s.fullYear + '/' + s.formattedMonth + '/' + s.formattedDate;
				break;

			case 112: // yyyymmdd
				val = s.fullYear + s.formattedMonth + s.formattedDate;
				break;
			default:
				throw new Error('The CONVERT style ' + args.style + ' is not realized yet.');
		}
	}

	switch (udbtypeid) {
		case 'DATE':
			return `${s.formattedYear}.${s.formattedMonth}.${s.formattedDate}`;
		case 'DATETIME':
		case 'DATETIME2':
			return `${s.fullYear}.${s.formattedMonth}.${s.formattedDate} ${s.formattedHour}:${s.formattedMinutes}:${s.formattedSeconds}.${s.formattedMilliseconds}`;
		case 'MONEY':
			var m = +val;
			return (m | 0) + ((m * 100) % 100) / 100;
		case 'BOOLEAN':
			return !!val;
		case 'INT':
		case 'INTEGER':
		case 'SMALLINT':
		case 'BIGINT':
		case 'SERIAL':
		case 'SMALLSERIAL':
		case 'BIGSERIAL':
			return val | 0;
		case 'STRING':
		case 'VARCHAR':
		case 'NVARCHAR':
		case 'CHARACTER VARIABLE':
			return args.dbsize ? String(val).substr(0, args.dbsize) : String(val);
		case 'CHAR':
		case 'CHARACTER':
		case 'NCHAR':
			return (val + ' '.repeat(args.dbsize)).substr(0, args.dbsize);
		case 'NUMBER':
		case 'FLOAT':
		case 'DECIMAL':
		case 'NUMERIC':
			var m = +val;
			if (args.dbsize !== undefined) {
				m = parseFloat(m.toPrecision(args.dbsize));
			}
			if (args.dbprecision !== undefined) {
				m = parseFloat(m.toFixed(args.dbprecision));
			}
			return m;
		case 'JSON':
			if (typeof val === 'object') {
				return val;
			}
			try {
				return JSON.parse(val);
			} catch (err) {
				throw new Error('Cannot convert string to JSON');
			}
		case 'Date':
			return val;
		default:
			return val;
	}
};
/*
//
// CREATE TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global alasql, yy, hash */

yy.ColumnDef = function (params) {
	return Object.assign(this, params);
};
yy.ColumnDef.prototype.toString = function () {
	let s = this.columnid;
	if (this.dbtypeid) {
		s += ' ' + this.dbtypeid;
	}

	if (this.dbsize) {
		s += '(' + this.dbsize;
		if (this.dbprecision) {
			s += ',' + this.dbprecision;
		}
		s += ')';
	}

	if (this.primarykey) {
		s += ' PRIMARY KEY';
	}

	if (this.notnull) {
		s += ' NOT NULL';
	}

	return s;
};

yy.CreateTable = function (params) {
	return Object.assign(this, params);
};
yy.CreateTable.prototype.toString = function () {
	let s = `CREATE${this.temporary ? ' TEMPORARY' : ''}${this.view ? ' VIEW' : ` ${this.class ? 'CLASS' : 'TABLE'}`}${this.ifnotexists ? ' IF NOT EXISTS' : ''} ${this.table.toString()}`;

	if (this.viewcolumns) {
		s += `(${this.viewcolumns.map(vcol => vcol.toString()).join(',')})`;
	}

	if (this.as) {
		s += ` AS ${this.as}`;
	} else {
		s += ` (${this.columns.map(col => col.toString()).join(',')})`;
	}

	if (this.view && this.select) {
		s += ` AS ${this.select.toString()}`;
	}

	return s;
};

// CREATE TABLE
//yy.CreateTable.prototype.compile = returnUndefined;
yy.CreateTable.prototype.execute = function (databaseid, params, cb) {
	//	var self = this;
	var db = alasql.databases[this.table.databaseid || databaseid];

	var tableid = this.table.tableid;
	if (!tableid) {
		throw new Error('Table name is not defined');
	}

	var columns = this.columns;
	var constraints = this.constraints || [];

	// IF NOT EXISTS
	if (this.ifnotexists && db.tables[tableid]) {
		return cb ? cb(0) : 0;
	}

	if (db.tables[tableid]) {
		throw new Error(
			"Can not create table '" +
				tableid +
				"', because it already exists in the database '" +
				db.databaseid +
				"'"
		);
	}

	var table = (db.tables[tableid] = new alasql.Table()); // TODO Can use special object?
	// If this is a class
	if (this.class) {
		table.isclass = true;
	}

	var ss = []; // DEFAULT function components
	var uss = []; // ON UPDATE function components
	if (columns) {
		columns.forEach(function (col) {
			var dbtypeid = col.dbtypeid;
			if (!alasql.fn[dbtypeid]) {
				dbtypeid = dbtypeid.toUpperCase();
			}

			// Process SERIAL data type like Postgress
			if (['SERIAL', 'SMALLSERIAL', 'BIGSERIAL'].indexOf(dbtypeid) > -1) {
				col.identity = {value: 1, step: 1};
			}

			var newcol = {
				columnid: col.columnid,
				dbtypeid: dbtypeid,
				dbsize: col.dbsize, // Fixed issue #150
				dbprecision: col.dbprecision, // Fixed issue #150
				notnull: col.notnull,
				identity: col.identity,
			};
			if (col.identity) {
				table.identities[col.columnid] = {
					value: +col.identity.value,
					step: +col.identity.step,
				};
			}
			if (col.check) {
				table.checks.push({
					id: col.check.constrantid,
					fn: new Function('r', 'var y;return ' + col.check.expression.toJS('r', '')),
				});
			}

			if (col.default) {
				ss.push(JSON.stringify('' + col.columnid) + ':' + col.default.toJS('r', ''));
			}

			// Check for primary key
			if (col.primarykey) {
				var pk = (table.pk = {});
				pk.columns = [col.columnid];
				pk.onrightfns = `r[${JSON.stringify(col.columnid)}]`;
				pk.onrightfn = new Function('r', 'var y;return ' + pk.onrightfns);
				pk.hh = hash(pk.onrightfns);
				table.uniqs[pk.hh] = {};
			}

			// UNIQUE clause
			if (col.unique) {
				var uk = {};
				table.uk = table.uk || [];
				table.uk.push(uk);
				uk.columns = [col.columnid];
				uk.onrightfns = `r[${JSON.stringify(col.columnid)}]`;
				uk.onrightfn = new Function('r', 'var y;return ' + uk.onrightfns);
				uk.hh = hash(uk.onrightfns);
				table.uniqs[uk.hh] = {};
			}

			// UNIQUE clause
			if (col.foreignkey) {
				var fk = col.foreignkey.table;
				var fktable = alasql.databases[fk.databaseid || databaseid].tables[fk.tableid];
				if (typeof fk.columnid === 'undefined') {
					if (fktable.pk.columns && fktable.pk.columns.length > 0) {
						fk.columnid = fktable.pk.columns[0];
					} else {
						throw new Error('FOREIGN KEY allowed only to tables with PRIMARY KEYs');
					}
				}
				var fkfn = function (r) {
					var rr = {};
					if (typeof r[col.columnid] === 'undefined') {
						return true;
					}
					rr[fk.columnid] = r[col.columnid];
					var addr = fktable.pk.onrightfn(rr);
					if (!fktable.uniqs[fktable.pk.hh][addr]) {
						throw new Error(
							'Foreign key violation' //changed error message
						);
					}
					return true;
				};
				table.checks.push({fn: fkfn});
			}

			if (col.onupdate) {
				uss.push(`r[${JSON.stringify(col.columnid)}]=` + col.onupdate.toJS('r', ''));
			}

			table.columns.push(newcol);
			table.xcolumns[newcol.columnid] = newcol;
		});
	}
	table.defaultfns = ss.join(',');
	table.onupdatefns = uss.join(';');

	constraints.forEach(function (con) {
		var checkfn;

		if (con.type === 'PRIMARY KEY') {
			if (table.pk) {
				throw new Error('Primary key already exists');
			}
			var pk = (table.pk = {});
			pk.columns = con.columns;
			pk.onrightfns = pk.columns
				.map(function (columnid) {
					return `r[${JSON.stringify(columnid)}]`;
				})
				.join("+'`'+");
			pk.onrightfn = new Function('r', 'var y;return ' + pk.onrightfns);
			pk.hh = hash(pk.onrightfns);
			table.uniqs[pk.hh] = {};
		} else if (con.type === 'CHECK') {
			checkfn = new Function('r', 'var y;return ' + con.expression.toJS('r', ''));
		} else if (con.type === 'UNIQUE') {
			var uk = {};
			table.uk = table.uk || [];
			table.uk.push(uk);
			uk.columns = con.columns;
			uk.onrightfns = uk.columns
				.map(function (columnid) {
					return `r[${JSON.stringify(columnid)}]`;
				})
				.join("+'`'+");
			uk.onrightfn = new Function('r', 'var y;return ' + uk.onrightfns);
			uk.hh = hash(uk.onrightfns);
			table.uniqs[uk.hh] = {};
		} else if (con.type === 'FOREIGN KEY') {
			var fk = con.fktable;
			if (con.fkcolumns && con.fkcolumns.length > 0) {
				//Composite foreign keys
				fk.fkcolumns = con.fkcolumns;
			}
			var fktable = alasql.databases[fk.databaseid || databaseid].tables[fk.tableid];
			if (typeof fk.fkcolumns === 'undefined') {
				//Composite foreign keys
				fk.fkcolumns = fktable.pk.columns;
			}
			fk.columns = con.columns;

			if (fk.fkcolumns.length > fk.columns.length) {
				throw new Error('Invalid foreign key on table ' + table.tableid);
			}

			checkfn = function (r) {
				var rr = {};

				//Composite foreign keys
				fk.fkcolumns.forEach(function (colFk, i) {
					if (r[fk.columns[i]] != null) {
						rr[colFk] = r[fk.columns[i]];
					}
				});

				if (Object.keys(rr).length === 0) {
					//all values of foreign key was null
					return true;
				}
				if (Object.keys(rr).length !== fk.columns.length) {
					throw new Error('Invalid foreign key on table ' + table.tableid);
				}
				//reset fkTable as we need an up to date uniqs
				var fktable = alasql.databases[fk.databaseid || databaseid].tables[fk.tableid];
				var addr = fktable.pk.onrightfn(rr);

				if (!fktable.uniqs[fktable.pk.hh][addr]) {
					throw new Error(
						'Foreign key violation' //changed error message
					);
				}
				return true;
			};
		}
		if (checkfn) {
			table.checks.push({
				fn: checkfn,
				id: con.constraintid,
				fk: con.type === 'FOREIGN KEY',
			});
		}
	});

	if (this.view && this.viewcolumns) {
		var self = this;
		this.viewcolumns.forEach(function (vcol, idx) {
			self.select.columns[idx].as = vcol.columnid;
		});
	}

	//Used in 420from queryfn when table.view = true!
	if (this.view && this.select) {
		table.view = true;
		table.select = this.select.compile(this.table.databaseid || databaseid);
	}

	if (db.engineid) {
		return alasql.engines[db.engineid].createTable(
			this.table.databaseid || databaseid,
			tableid,
			this.ifnotexists,
			cb
		);
	}

	table.insert = function (r, orreplace) {
		var oldinserted = alasql.inserted;
		alasql.inserted = [r];

		var table = this;

		var toreplace = false; // For INSERT OR REPLACE

		/*
		// IDENTINY or AUTO_INCREMENT
		// if(table.identities && table.identities.length>0) {
		// 	table.identities.forEach(function(ident){
		// 		r[ident.columnid] = ident.value;
		// 	});
		// }
*/
		// Trigger prevent functionality
		var prevent = false;
		for (var tr in table.beforeinsert) {
			var trigger = table.beforeinsert[tr];
			if (trigger) {
				if (trigger.funcid) {
					if (alasql.fn[trigger.funcid](r) === false) prevent = prevent || true;
				} else if (trigger.statement) {
					if (trigger.statement.execute(databaseid) === false) prevent = prevent || true;
				}
			}
		}
		if (prevent) return;

		// Trigger prevent functionality
		var escape = false;
		for (tr in table.insteadofinsert) {
			escape = true;
			trigger = table.insteadofinsert[tr];
			if (trigger) {
				if (trigger.funcid) {
					alasql.fn[trigger.funcid](r);
				} else if (trigger.statement) {
					trigger.statement.execute(databaseid);
				}
			}
		}
		if (escape) return;

		for (var columnid in table.identities) {
			var ident = table.identities[columnid];

			r[columnid] = ident.value;

		}

		if (table.checks && table.checks.length > 0) {
			table.checks.forEach(function (check) {
				if (!check.fn(r)) {
					//					if(orreplace) toreplace=true; else
					throw new Error('Violation of CHECK constraint ' + (check.id || ''));
				}
			});
		}

		table.columns.forEach(function (column) {
			if (column.notnull && typeof r[column.columnid] === 'undefined') {
				throw new Error('Wrong NULL value in NOT NULL column ' + column.columnid);
			}
		});
		if (table.pk) {
			var pk = table.pk;
			var addr = pk.onrightfn(r);

			if (typeof table.uniqs[pk.hh][addr] !== 'undefined') {

				if (orreplace) toreplace = table.uniqs[pk.hh][addr];
				else
					throw new Error('Cannot insert record, because it already exists in primary key index');
			}
			//			table.uniqs[pk.hh][addr]=r;
		}

		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				var ukaddr = uk.onrightfn(r);
				if (typeof table.uniqs[uk.hh][ukaddr] !== 'undefined') {
					if (orreplace) toreplace = table.uniqs[uk.hh][ukaddr];
					else throw new Error('Cannot insert record, because it already exists in unique index');
				}
				//				table.uniqs[uk.hh][ukaddr]=r;
			});
		}

		if (toreplace) {
			// Do UPDATE!!!

			table.update(
				function (t) {
					for (var f in r) t[f] = r[f];
				},
				table.data.indexOf(toreplace),
				params
			);
		} else {
			table.data.push(r);

			// Final change before insert

			// Update indices

			for (var columnid in table.identities) {
				var ident = table.identities[columnid];

				ident.value += ident.step;

			}

			if (table.pk) {
				var pk = table.pk;
				var addr = pk.onrightfn(r);
				table.uniqs[pk.hh][addr] = r;
			}
			if (table.uk && table.uk.length) {
				table.uk.forEach(function (uk) {
					var ukaddr = uk.onrightfn(r);
					table.uniqs[uk.hh][ukaddr] = r;
				});
			}
		}

		// Trigger prevent functionality
		for (var tr in table.afterinsert) {
			var trigger = table.afterinsert[tr];
			if (trigger) {
				if (trigger.funcid) {
					alasql.fn[trigger.funcid](r);
				} else if (trigger.statement) {
					trigger.statement.execute(databaseid);
				}
			}
		}
		alasql.inserted = oldinserted;
	};

	table.delete = function (index) {
		var table = this;
		var r = table.data[index];

		// Prevent trigger
		var prevent = false;
		for (var tr in table.beforedelete) {
			var trigger = table.beforedelete[tr];
			if (trigger) {
				if (trigger.funcid) {
					if (alasql.fn[trigger.funcid](r) === false) prevent = prevent || true;
				} else if (trigger.statement) {
					if (trigger.statement.execute(databaseid) === false) prevent = prevent || true;
				}
			}
		}
		if (prevent) return false;

		// Trigger prevent functionality
		var escape = false;
		for (var tr in table.insteadofdelete) {
			escape = true;
			var trigger = table.insteadofdelete[tr];
			if (trigger) {
				if (trigger.funcid) {
					alasql.fn[trigger.funcid](r);
				} else if (trigger.statement) {
					trigger.statement.execute(databaseid);
				}
			}
		}
		if (escape) return;

		if (this.pk) {
			var pk = this.pk;
			var addr = pk.onrightfn(r);
			if (typeof this.uniqs[pk.hh][addr] === 'undefined') {
				throw new Error('Something wrong with primary key index on table');
			} else {
				this.uniqs[pk.hh][addr] = undefined;
			}
		}
		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				var ukaddr = uk.onrightfn(r);
				if (typeof table.uniqs[uk.hh][ukaddr] === 'undefined') {
					throw new Error('Something wrong with unique index on table');
				}
				table.uniqs[uk.hh][ukaddr] = undefined;
			});
		}
	};

	table.deleteall = function () {
		this.data.length = 0;
		if (this.pk) {
			//						var r = this.data[i];
			this.uniqs[this.pk.hh] = {};
		}
		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				table.uniqs[uk.hh] = {};
			});
		}
	};

	table.update = function (assignfn, i, params) {
		// TODO: Analyze the speed
		var r = cloneDeep(this.data[i]);

		var pk;
		// PART 1 - PRECHECK
		if (this.pk) {
			pk = this.pk;
			pk.pkaddr = pk.onrightfn(r, params);
			if (typeof this.uniqs[pk.hh][pk.pkaddr] === 'undefined') {
				throw new Error('Something wrong with index on table');
			}
		}
		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				uk.ukaddr = uk.onrightfn(r);
				if (typeof table.uniqs[uk.hh][uk.ukaddr] === 'undefined') {
					throw new Error('Something wrong with unique index on table');
				}
			});
		}

		assignfn(r, params, alasql);

		// Prevent trigger
		var prevent = false;
		for (var tr in table.beforeupdate) {
			var trigger = table.beforeupdate[tr];
			if (trigger) {
				if (trigger.funcid) {
					if (alasql.fn[trigger.funcid](this.data[i], r) === false) prevent = prevent || true;
				} else if (trigger.statement) {
					if (trigger.statement.execute(databaseid) === false) prevent = prevent || true;
				}
			}
		}
		if (prevent) return false;

		// Trigger prevent functionality
		var escape = false;
		for (var tr in table.insteadofupdate) {
			escape = true;
			var trigger = table.insteadofupdate[tr];
			if (trigger) {
				if (trigger.funcid) {
					alasql.fn[trigger.funcid](this.data[i], r);
				} else if (trigger.statement) {
					trigger.statement.execute(databaseid);
				}
			}
		}
		if (escape) return;

		// PART 2 - POST CHECK
		if (table.checks && table.checks.length > 0) {
			table.checks.forEach(function (check) {
				if (!check.fn(r)) {
					throw new Error('Violation of CHECK constraint ' + (check.id || ''));
				}
			});
		}

		table.columns.forEach(function (column) {
			if (column.notnull && typeof r[column.columnid] === 'undefined') {
				throw new Error('Wrong NULL value in NOT NULL column ' + column.columnid);
			}
		});
		if (this.pk) {
			pk.newpkaddr = pk.onrightfn(r);
			if (typeof this.uniqs[pk.hh][pk.newpkaddr] !== 'undefined' && pk.newpkaddr !== pk.pkaddr) {
				throw new Error('Record already exists');
			}
		}

		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				uk.newukaddr = uk.onrightfn(r);
				if (typeof table.uniqs[uk.hh][uk.newukaddr] !== 'undefined' && uk.newukaddr !== uk.ukaddr) {
					throw new Error('Record already exists');
				}
			});
		}

		// PART 3 UPDATE
		if (this.pk) {
			this.uniqs[pk.hh][pk.pkaddr] = undefined;
			this.uniqs[pk.hh][pk.newpkaddr] = r;
		}
		if (table.uk && table.uk.length) {
			table.uk.forEach(function (uk) {
				table.uniqs[uk.hh][uk.ukaddr] = undefined;
				table.uniqs[uk.hh][uk.newukaddr] = r;
			});
		}

		this.data[i] = r;

		// Trigger prevent functionality
		for (var tr in table.afterupdate) {
			var trigger = table.afterupdate[tr];
			if (trigger) {
				if (trigger.funcid) {
					alasql.fn[trigger.funcid](this.data[i], r);
				} else if (trigger.statement) {
					trigger.statement.execute(databaseid);
				}
			}
		}
	};

	var res;

	if (!alasql.options.nocount) {
		res = 1;
	}

	if (cb) res = cb(res);
	return res;
};
//
// Date functions
//
// (c) 2014, Andrey Gershun
//

/** Standard JavaScript data types */

alasql.fn.Date = Object;
alasql.fn.Date = Date;
alasql.fn.Number = Number;
alasql.fn.String = String;
alasql.fn.Boolean = Boolean;

/** Extend Object with properties */
stdfn.EXTEND = alasql.utils.extend;

stdfn.CHAR = String.fromCharCode.bind(String);
stdfn.ASCII = function (a) {
	return a.charCodeAt(0);
};

/**
 Return first non-null argument
 See https://msdn.microsoft.com/en-us/library/ms190349.aspx
*/
stdfn.COALESCE = function () {
	for (var i = 0; i < arguments.length; i++) {
		if (arguments[i] === null) continue;
		if (typeof arguments[i] == 'undefined') continue;
		if (typeof arguments[i] == 'number' && isNaN(arguments[i])) continue;
		return arguments[i];
	}
	return undefined;
};

stdfn.USER = function () {
	return 'alasql';
};

stdfn.OBJECT_ID = function (objid) {
	return !!alasql.tables[objid];
};

stdfn.DATE = function (d) {
	if (!isNaN(d) && d.length === 8)
		return new Date(+d.substr(0, 4), +d.substr(4, 2) - 1, +d.substr(6, 2));
	return newDate(d);
};

stdfn.NOW = function () {
	if (alasql.options.dateAsString) {
		var d = new Date();
		var s =
			d.getFullYear() +
			'-' +
			('0' + (d.getMonth() + 1)).substr(-2) +
			'-' +
			('0' + d.getDate()).substr(-2);
		s +=
			' ' +
			('0' + d.getHours()).substr(-2) +
			':' +
			('0' + d.getMinutes()).substr(-2) +
			':' +
			('0' + d.getSeconds()).substr(-2);
		s += '.' + ('00' + d.getMilliseconds()).substr(-3);
		return s;
	}
	return new Date();
};

stdfn.GETDATE = stdfn.NOW;
stdfn.CURRENT_TIMESTAMP = stdfn.NOW;

/**
 * Returns the current date, without time component.
 * @returns date object without time component
 */
stdfn.CURDATE = stdfn.CURRENT_DATE = function () {
	var date = new Date();
	date.setHours(0, 0, 0, 0);
	if (alasql.options.dateAsString) {
		var s =
			date.getFullYear() +
			'-' +
			('0' + (date.getMonth() + 1)).substr(-2) +
			'-' +
			('0' + date.getDate()).substr(-2);
		return s;
	}
	return date;
};

stdfn.SECOND = function (d) {
	var d = newDate(d);
	return d.getSeconds();
};

stdfn.MINUTE = function (d) {
	var d = newDate(d);
	return d.getMinutes();
};

stdfn.HOUR = function (d) {
	var d = newDate(d);
	return d.getHours();
};

stdfn.DAYOFWEEK = stdfn.WEEKDAY = function (d) {
	var d = newDate(d);
	return d.getDay();
};

stdfn.DAY = stdfn.DAYOFMONTH = function (d) {
	var d = newDate(d);
	return d.getDate();
};

stdfn.MONTH = function (d) {
	var d = newDate(d);
	return d.getMonth() + 1;
};

stdfn.YEAR = function (d) {
	var d = newDate(d);
	return d.getFullYear();
};

var PERIODS = {
	year: 1000 * 3600 * 24 * 365,
	quarter: (1000 * 3600 * 24 * 365) / 4,
	month: 1000 * 3600 * 24 * 30,
	week: 1000 * 3600 * 24 * 7,
	day: 1000 * 3600 * 24,
	dayofyear: 1000 * 3600 * 24,
	weekday: 1000 * 3600 * 24,
	hour: 1000 * 3600,
	minute: 1000 * 60,
	second: 1000,
	millisecond: 1,
	microsecond: 0.001,
};

alasql.stdfn.DATEDIFF = function (period, d1, d2) {
	var interval = newDate(d2).getTime() - newDate(d1).getTime();
	return (interval / PERIODS[period.toLowerCase()]) | 0;
};

alasql.stdfn.DATEADD = function (period, interval, d) {
	var nd = newDate(d);
	var period = period.toLowerCase();

	switch (period) {
		case 'year':
			nd.setFullYear(nd.getFullYear() + interval);
			break;
		case 'quarter':
			nd.setMonth(nd.getMonth() + interval * 3);
			break;
		case 'month':
			nd.setMonth(nd.getMonth() + interval);
			break;
		default:
			nd = new Date(nd.getTime() + interval * PERIODS[period]);
			break;
	}

	return nd;
};

alasql.stdfn.INTERVAL = function (interval, period) {
	return interval * PERIODS[period.toLowerCase()];
};

alasql.stdfn.DATE_ADD = alasql.stdfn.ADDDATE = function (d, interval) {
	var nd = newDate(d).getTime() + interval;
	return new Date(nd);
};

alasql.stdfn.DATE_SUB = alasql.stdfn.SUBDATE = function (d, interval) {
	var nd = newDate(d).getTime() - interval;
	return new Date(nd);
};

var dateRegexp = /^\d{4}\.\d{2}\.\d{2} \d{2}:\d{2}:\d{2}/;
function newDate(d) {
	if (typeof d === 'string') {
		if (dateRegexp.test(d)) {
			d = d.replace('.', '-').replace('.', '-');
		}
	}
	return new Date(d);
}
/*
//
// DROP TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.DropTable = function (params) {
	return Object.assign(this, params);
};
yy.DropTable.prototype.toString = function () {
	var s = 'DROP' + ' ';
	if (this.view) s += 'VIEW';
	else s += 'TABLE';
	if (this.ifexists) s += ' IF EXISTS';
	s += ' ' + this.tables.toString();
	return s;
};

// DROP TABLE
/**
	Drop tables
	@param {string} databaseid Database id
	@param {object} params Parameters
	@param {callback} cb Callback function
	@return Number of dropped tables
	@example
	DROP TABLE one;
	DROP TABLE IF NOT EXISTS two, three;
*/
yy.DropTable.prototype.execute = function (databaseid, params, cb) {
	var ifexists = this.ifexists;
	var res = 0; // No tables removed
	var count = 0;
	var tlen = this.tables.length;

	// For each table in the list
	this.tables.forEach(function (table) {
		var db = alasql.databases[table.databaseid || databaseid];
		var tableid = table.tableid;

		/** @todo Test with AUTOCOMMIT flag is ON */
		/** @todo Test with IndexedDB and multiple tables */

		if (!ifexists || (ifexists && db.tables[tableid])) {
			if (!db.tables[tableid]) {
				if (!alasql.options.dropifnotexists) {
					throw new Error(
						`Can not drop table ${JSON.stringify(
							table.tableid
						)} because it does not exist in the database.`
					);
				}
			} else {
				if (db.engineid /*&& alasql.options.autocommit*/) {
					alasql.engines[db.engineid].dropTable(
						table.databaseid || databaseid,
						tableid,
						ifexists,
						function (res1) {
							delete db.tables[tableid];
							res += res1;
							count++;
							if (count == tlen && cb) cb(res);
						}
					);
				} else {
					delete db.tables[tableid];
					res++;
					count++;
					if (count == tlen && cb) cb(res);
				}
			}
		} else {
			count++;
			if (count == tlen && cb) cb(res);
		}
	});
	// if(cb) res = cb(res);
	return res;
};

yy.TruncateTable = function (params) {
	return Object.assign(this, params);
};
yy.TruncateTable.prototype.toString = function () {
	var s = 'TRUNCATE TABLE';
	s += ' ' + this.table.toString();
	return s;
};

yy.TruncateTable.prototype.execute = function (databaseid, params, cb) {
	var db = alasql.databases[this.table.databaseid || databaseid];
	var tableid = this.table.tableid;
	if (db.engineid) {
		return alasql.engines[db.engineid].truncateTable(
			this.table.databaseid || databaseid,
			tableid,
			this.ifexists,
			cb
		);
	}
	if (db.tables[tableid]) {
		db.tables[tableid].data = [];
	} else {
		throw new Error('Cannot truncate table becaues it does not exist');
	}
	return cb ? cb(0) : 0;
};
/*
//
// CREATE VERTEX for AlaSQL
// Date: 21.04.2015
// (c) 2015, Andrey Gershun
//
*/

yy.CreateVertex = function (params) {
	return Object.assign(this, params);
};
yy.CreateVertex.prototype.toString = function () {
	var s = 'CREATE VERTEX ';
	if (this.class) {
		s += this.class + ' ';
	}
	if (this.sharp) {
		s += '#' + this.sharp + ' ';
	}
	if (this.sets) {
		s += this.sets.toString();
	} else if (this.content) {
		s += this.content.toString();
	} else if (this.select) {
		s += this.select.toString();
	}

	return s;
};

yy.CreateVertex.prototype.toJS = function (context) {

	var s = 'this.queriesfn[' + (this.queriesidx - 1) + '](this.params,null,' + context + ')';
	// var s = '';
	return s;
};

// CREATE TABLE

yy.CreateVertex.prototype.compile = function (databaseid) {
	var dbid = databaseid;

	// CREATE VERTEX #id
	var sharp = this.sharp;

	// CREATE VERTEX "Name"
	if (typeof this.name !== 'undefined') {
		var s = 'x.name=' + this.name.toJS();
		var namefn = new Function('x', s);
	}

	if (this.sets && this.sets.length > 0) {
		var s = this.sets
			.map(function (st) {
				return `x[${JSON.stringify(st.column.columnid)}]=` + st.expression.toJS('x', '');
			})
			.join(';');
		var setfn = new Function('x,params,alasql', s);
	}

	// Todo: check for content, select and default

	var statement = function (params, cb) {
		var res;

		// CREATE VERTEX without parameters
		var db = alasql.databases[dbid];
		var id;
		if (typeof sharp !== 'undefined') {
			id = sharp;
		} else {
			id = db.counter++;
		}
		var vertex = {$id: id, $node: 'VERTEX'};
		db.objects[vertex.$id] = vertex;
		res = vertex;
		if (namefn) {
			namefn(vertex);
		}
		if (setfn) {
			setfn(vertex, params, alasql);
		}

		if (cb) {
			res = cb(res);
		}
		return res;
	};
	return statement;
};

yy.CreateEdge = function (params) {
	return Object.assign(this, params);
};
yy.CreateEdge.prototype.toString = function () {

	var s = 'CREATE EDGE' + ' ';
	if (this.class) {
		s += this.class + ' ';
	}
	// todo: SET
	// todo: CONTENT
	// todo: SELECT
	return s;
};

yy.CreateEdge.prototype.toJS = function (context) {
	var s = 'this.queriesfn[' + (this.queriesidx - 1) + '](this.params,null,' + context + ')';
	return s;
};

// CREATE TABLE

yy.CreateEdge.prototype.compile = function (databaseid) {
	var dbid = databaseid;
	var fromfn = new Function('params,alasql', 'var y;return ' + this.from.toJS());
	var tofn = new Function('params,alasql', 'var y;return ' + this.to.toJS());

	// CREATE VERTEX "Name"
	if (typeof this.name !== 'undefined') {
		var s = 'x.name=' + this.name.toJS();
		var namefn = new Function('x', s);
	}

	if (this.sets && this.sets.length > 0) {
		var s = this.sets
			.map(function (st) {
				return `x[${JSON.stringify(st.column.columnid)}]=` + st.expression.toJS('x', '');
			})
			.join(';');
		var setfn = new Function('x,params,alasql', 'var y;' + s);
	}

	const statement = (params, cb) => {
		let res = 0;
		let db = alasql.databases[dbid];
		let edge = {$id: db.counter++, $node: 'EDGE'};
		let v1 = fromfn(params, alasql);
		let v2 = tofn(params, alasql);

		// Set link
		edge.$in = [v1.$id];
		edge.$out = [v2.$id];

		// Initialize and set sides
		v1.$out = v1.$out || [];
		v1.$out.push(edge.$id);

		v2.$in = v2.$in || [];
		v2.$in.push(edge.$id);

		// Save in objects
		db.objects[edge.$id] = edge;
		res = edge;

		// Optional functions
		namefn?.(edge);
		setfn?.(edge, params, alasql);

		// Callback
		return cb ? cb(res) : res;
	};
	return statement;
};

yy.CreateGraph = function (params) {
	return Object.assign(this, params);
};
yy.CreateGraph.prototype.toString = function () {
	var s = 'CREATE GRAPH' + ' ';
	if (this.class) {
		s += this.class + ' ';
	}
	return s;
};

yy.CreateGraph.prototype.execute = function (databaseid, params, cb) {
	var res = [];
	if (this.from) {
		if (alasql.from[this.from.funcid]) {
			this.graph = alasql.from[this.from.funcid.toUpperCase()];
		}
	}

	//	stop;
	this.graph.forEach(g => {
		if (!g.source) {
			createVertex(g);
		} else {
			// CREATE EDGE
			let e = {};
			if (g.as !== undefined) alasql.vars[g.as] = e;
			if (g.prop !== undefined) e.name = g.prop;
			if (g.sharp !== undefined) e.$id = g.sharp;
			if (g.name !== undefined) e.name = g.name;
			if (g.class !== undefined) e.$class = g.class;

			let db = alasql.databases[databaseid];
			e.$id = e.$id !== undefined ? e.$id : db.counter++;
			e.$node = 'EDGE';

			if (g.json !== undefined) {
				Object.assign(e, new Function('params, alasql', `return ${g.json.toJS()}`)(params, alasql));
			}

			const resolveVertex = (sourceOrTarget, isSource) => {
				let vertex, vo;
				if (sourceOrTarget.vars) {
					vo = alasql.vars[sourceOrTarget.vars];
					vertex = typeof vo === 'object' ? vo : db.objects[vo];
				} else {
					let av = sourceOrTarget.sharp || sourceOrTarget.prop;
					vertex = db.objects[av];
					if (
						vertex === undefined &&
						alasql.options.autovertex &&
						(sourceOrTarget.prop || sourceOrTarget.name)
					) {
						vertex =
							findVertex(sourceOrTarget.prop || sourceOrTarget.name) ||
							createVertex(sourceOrTarget);
					}
				}
				if (isSource && vertex && typeof vertex.$out === 'undefined') vertex.$out = [];
				if (!isSource && vertex && typeof vertex.$in === 'undefined') vertex.$in = [];
				return vertex;
			};

			let v1 = resolveVertex(g.source, true);
			let v2 = resolveVertex(g.target, false);

			// Set link and sides
			e.$in = [v1.$id];
			e.$out = [v2.$id];
			v1.$out.push(e.$id);
			v2.$in.push(e.$id);

			db.objects[e.$id] = e;

			if (e.$class !== undefined) {
				let classTable = alasql.databases[databaseid].tables[e.$class];
				if (classTable === undefined) {
					throw new Error('No such class. Please use CREATE CLASS');
				} else {
					classTable.data.push(e);
				}
			}

			res.push(e.$id);
		}
	});

	if (cb) {
		res = cb(res);
	}

	return res;

	// Find vertex by name
	function findVertex(name) {
		var objects = alasql.databases[alasql.useid].objects;
		for (var k in objects) {
			if (objects[k].name === name) {
				return objects[k];
			}
		}
		return undefined;
	}

	function createVertex(g) {
		// GREATE VERTEX
		var v = {};
		if (typeof g.as !== 'undefined') {
			alasql.vars[g.as] = v;
		}

		if (typeof g.prop !== 'undefined') {
			//				v[g.prop] = true;
			v.$id = g.prop;
			v.name = g.prop;
		}

		if (typeof g.sharp !== 'undefined') {
			v.$id = g.sharp;
		}
		if (typeof g.name !== 'undefined') {
			v.name = g.name;
		}
		if (typeof g.class !== 'undefined') {
			v.$class = g.class;
		}

		var db = alasql.databases[databaseid];
		if (typeof v.$id === 'undefined') {
			v.$id = db.counter++;
		}
		v.$node = 'VERTEX';
		if (typeof g.json !== 'undefined') {
			extend(v, new Function('params,alasql', 'var y;return ' + g.json.toJS())(params, alasql));
		}
		db.objects[v.$id] = v;
		if (typeof v.$class !== 'undefined') {
			if (typeof alasql.databases[databaseid].tables[v.$class] === 'undefined') {
				throw new Error('No such class. Pleace use CREATE CLASS');
			} else {
				// TODO - add insert()
				alasql.databases[databaseid].tables[v.$class].data.push(v);
			}
		}

		res.push(v.$id);
		return v;
	}
};
yy.CreateGraph.prototype.compile1 = function (databaseid) {
	const dbid = databaseid;
	const fromfn = new Function('params, alasql', `return ${this.from.toJS()}`);
	const tofn = new Function('params, alasql', `return ${this.to.toJS()}`);

	let namefn, setfn;

	// CREATE VERTEX "Name"
	if (this.name !== undefined) {
		const s = `x.name = ${this.name.toJS()}`;
		namefn = new Function('x', s);
	}

	if (this.sets && this.sets.length > 0) {
		const s = this.sets
			.map(st => `x[${JSON.stringify(st.column.columnid)}] = ${st.expression.toJS('x', '')}`)
			.join(';');
		setfn = new Function('x, params, alasql', `var y; ${s}`);
	}

	// Todo: handle content, select and default

	const statement = (params, cb) => {
		let res = 0;
		const db = alasql.databases[dbid];
		const edge = {$id: db.counter++, $node: 'EDGE'};
		const v1 = fromfn(params, alasql);
		const v2 = tofn(params, alasql);

		// Set link
		edge.$in = [v1.$id];
		edge.$out = [v2.$id];

		// Set sides
		v1.$out = v1.$out || [];
		v1.$out.push(edge.$id);

		v2.$in = v2.$in || [];
		v2.$in.push(edge.$id);

		// Save in objects
		db.objects[edge.$id] = edge;
		res = edge;

		if (namefn) {
			namefn(edge);
		}
		if (setfn) {
			setfn(edge, params, alasql);
		}

		if (cb) {
			res = cb(res);
		}
		return res;
	};
	return statement;
};
/*
//
// ALTER TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/
/* global alasql yy */

// ALTER TABLE table1 RENAME TO table2
yy.AlterTable = function (params) {
	return Object.assign(this, params);
};
yy.AlterTable.prototype.toString = function () {
	let s = 'ALTER TABLE ' + this.table.toString();
	if (this.renameto) s += ' RENAME TO ' + this.renameto;
	return s;
};

yy.AlterTable.prototype.execute = function (databaseid, params, cb) {
	let db = alasql.databases[databaseid];
	db.dbversion = Date.now();

	if (this.renameto) {
		var oldtableid = this.table.tableid;
		var newtableid = this.renameto;
		var res = 1;
		if (db.tables[newtableid]) {
			throw new Error(
				`Can not rename a table "${oldtableid}" to "${newtableid}" because the table with this name already exists`
			);
		} else if (newtableid === oldtableid) {
			throw new Error(`Can not rename a table "${oldtableid}" to itself`);
		} else {
			db.tables[newtableid] = db.tables[oldtableid];
			delete db.tables[oldtableid];
			res = 1;
		}
		if (cb) cb(res);
		return res;
	}

	if (this.addcolumn) {
		db = alasql.databases[this.table.databaseid || databaseid];
		db.dbversion++;
		var tableid = this.table.tableid;
		var table = db.tables[tableid];
		var columnid = this.addcolumn.columnid;
		if (table.xcolumns[columnid]) {
			throw new Error(
				`Cannot add column "${columnid}" because it already exists in table "${tableid}"`
			);
		}

		var col = {
			columnid: columnid,
			dbtypeid: this.addcolumn.dbtypeid,
			dbsize: this.dbsize,
			dbprecision: this.dbprecision,
			dbenum: this.dbenum,
			defaultfns: null, // TODO defaultfns!!!
		};

		var defaultfn = function () {};

		table.columns.push(col);
		table.xcolumns[columnid] = col;

		for (let i = 0, ilen = table.data.length; i < ilen; i++) {
			table.data[i][columnid] = defaultfn();
		}

		return cb ? cb(1) : 1;
	}

	if (this.modifycolumn) {
		let db = alasql.databases[this.table.databaseid || databaseid];
		db.dbversion++;
		var tableid = this.table.tableid;
		var table = db.tables[tableid];
		var columnid = this.modifycolumn.columnid;

		if (!table.xcolumns[columnid]) {
			throw new Error(
				`Cannot modify column "${columnid}" because it was not found in table "${tableid}"`
			);
		}

		col = table.xcolumns[columnid];
		col.dbtypeid = this.dbtypeid;
		col.dbsize = this.dbsize;
		col.dbprecision = this.dbprecision;
		col.dbenum = this.dbenum;

		return cb ? cb(1) : 1;
	}

	if (this.renamecolumn) {
		let db = alasql.databases[this.table.databaseid || databaseid];
		db.dbversion++;

		var tableid = this.table.tableid;
		var table = db.tables[tableid];
		var columnid = this.renamecolumn;
		var tocolumnid = this.to;

		var col;
		if (!table.xcolumns[columnid]) {
			throw new Error('Column "' + columnid + '" is not found in the table "' + tableid + '"');
		}
		if (table.xcolumns[tocolumnid]) {
			throw new Error('Column "' + tocolumnid + '" already exists in the table "' + tableid + '"');
		}

		if (columnid != tocolumnid) {
			for (var j = 0; j < table.columns.length; j++) {
				if (table.columns[j].columnid == columnid) {
					table.columns[j].columnid = tocolumnid;
				}
			}

			table.xcolumns[tocolumnid] = table.xcolumns[columnid];
			delete table.xcolumns[columnid];

			for (var i = 0, ilen = table.data.length; i < ilen; i++) {
				table.data[i][tocolumnid] = table.data[i][columnid];
				delete table.data[i][columnid];
			}
			return table.data.length;
		}
		return cb ? cb(0) : 0;
	}

	if (this.dropcolumn) {
		let db = alasql.databases[this.table.databaseid || databaseid];
		db.dbversion++;
		var tableid = this.table.tableid;
		var table = db.tables[tableid];
		var columnid = this.dropcolumn;

		var found = false;
		for (var j = 0; j < table.columns.length; j++) {
			if (table.columns[j].columnid == columnid) {
				found = true;
				table.columns.splice(j, 1);
				break;
			}
		}

		if (!found) {
			throw new Error(
				`Cannot drop column "${columnid}" because it was not found in the table ${tableid}"`
			);
		}

		delete table.xcolumns[columnid];

		for (i = 0, ilen = table.data.length; i < ilen; i++) {
			delete table.data[i][columnid];
		}

		return cb ? cb(table.data.length) : table.data.length;
	}

	throw Error('Unknown ALTER TABLE method');
};
/*
//
// CREATE TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.CreateIndex = function (params) {
	return Object.assign(this, params);
};
yy.CreateIndex.prototype.toString = function () {
	var s = 'CREATE';
	if (this.unique) s += ' UNIQUE';
	s += ' INDEX ' + this.indexid + ' ON ' + this.table.toString();
	s += '(' + this.columns.toString() + ')';
	return s;
};

// CREATE TABLE
yy.CreateIndex.prototype.execute = function (databaseid, params, cb) {
	//	var self = this;
	var db = alasql.databases[databaseid];
	var tableid = this.table.tableid;
	var table = db.tables[tableid];
	var indexid = this.indexid;
	db.indices[indexid] = tableid;

	var rightfns = this.columns
		.map(function (expr) {
			return expr.expression.toJS('r', '');
		})
		.join("+'`'+");

	var rightfn = new Function('r,params,alasql', 'return ' + rightfns);

	if (this.unique) {
		table.uniqdefs[indexid] = {
			rightfns: rightfns,
		};
		var ux = (table.uniqs[indexid] = {});
		if (table.data.length > 0) {
			for (var i = 0, ilen = table.data.length; i < ilen; i++) {
				var addr = rightfns(table.data[i]);
				if (!ux[addr]) {
					ux[addr] = {num: 0};
				}
				ux[addr].num++;
			}
		}
	} else {
		var hh = hash(rightfns);
		table.inddefs[indexid] = {rightfns: rightfns, hh: hh};
		table.indices[hh] = {};

		var ix = (table.indices[hh] = {});
		if (table.data.length > 0) {
			for (var i = 0, ilen = table.data.length; i < ilen; i++) {
				var addr = rightfn(table.data[i], params, alasql);
				if (!ix[addr]) {
					ix[addr] = [];
				}
				ix[addr].push(table.data[i]);
			}
		}
	}
	var res = 1;
	if (cb) res = cb(res);
	return res;
};

yy.Reindex = function (params) {
	return Object.assign(this, params);
};
yy.Reindex.prototype.toString = function () {
	var s = 'REINDEX ' + this.indexid;
	return s;
};

// CREATE TABLE
yy.Reindex.prototype.execute = function (databaseid, params, cb) {
	//	var self = this;
	var db = alasql.databases[databaseid];
	var indexid = this.indexid;

	var tableid = db.indices[indexid];
	var table = db.tables[tableid];
	table.indexColumns();
	var res = 1;
	if (cb) res = cb(res);
	return res;
};
/*
//
// DROP TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.DropIndex = function (params) {
	return Object.assign(this, params);
};
yy.DropIndex.prototype.toString = function () {
	return 'DROP INDEX' + this.indexid;
};

// DROP TABLE
yy.DropIndex.prototype.compile = function (db) {
	var indexid = this.indexid;
	return function () {
		return 1;
	};
};
/*
//
// WITH SELECT for Alasql.js
// Date: 11.01.2015
// (c) 2015, Andrey Gershun
//
*/

yy.WithSelect = function (params) {
	return Object.assign(this, params);
};
yy.WithSelect.prototype.toString = function () {
	var s = 'WITH ';
	s +=
		this.withs
			.map(function (w) {
				return w.name + ' AS (' + w.select.toString() + ')';
			})
			.join(',') + ' ';
	s += this.select.toString();
	return s;
};

yy.WithSelect.prototype.execute = function (databaseid, params, cb) {
	var self = this;
	// Create temporary tables
	var savedTables = [];
	self.withs.forEach(function (w) {
		savedTables.push(alasql.databases[databaseid].tables[w.name]);
		var tb = (alasql.databases[databaseid].tables[w.name] = new Table({
			tableid: w.name,
		}));
		tb.data = w.select.execute(databaseid, params);
	});

	var res = 1;
	res = this.select.execute(databaseid, params, function (data) {
		// Clear temporary tables
		//		setTimeout(function(){
		self.withs.forEach(function (w, idx) {
			if (savedTables[idx]) alasql.databases[databaseid].tables[w.name] = savedTables[idx];
			else delete alasql.databases[databaseid].tables[w.name];
		});
		//		},0);

		if (cb) data = cb(data);
		return data;
	});
	return res;
};

/*
//
// IF for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.If = function (params) {
	return Object.assign(this, params);
};
yy.If.prototype.toString = function () {
	var s = 'IF' + ' ';
	s += this.expression.toString();
	s += ' ' + this.thenstat.toString();
	if (this.elsestat) s += ' ELSE ' + this.thenstat.toString();
	return s;
};

// CREATE TABLE

yy.If.prototype.execute = function (databaseid, params, cb) {
	var res;

	var fn = new Function(
		'params,alasql,p',
		'var y;return ' + this.expression.toJS('({})', '', null)
	).bind(this);

	if (fn(params, alasql)) res = this.thenstat.execute(databaseid, params, cb);
	else {
		if (this.elsestat) res = this.elsestat.execute(databaseid, params, cb);
		else {
			if (cb) res = cb(res);
		}
	}
	//	 else res = this.elsestat.execute(databaseid,params,cb,scope);
	return res;
};
/*
//
// CREATE VIEW for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.While = function (params) {
	return Object.assign(this, params);
};
yy.While.prototype.toString = function () {
	var s = 'WHILE ';
	s += this.expression.toString();
	s += ' ' + this.loopstat.toString();
	return s;
};

yy.While.prototype.execute = function (databaseid, params, cb) {
	var self = this;
	var res = [];

	var fn = new Function('params,alasql,p', 'var y;return ' + this.expression.toJS());

	if (cb) {
		var first = false;
		var loop = function (data) {
			if (first) {
				res.push(data);
			} else {
				first = true;
			}
			setTimeout(function () {
				if (fn(params, alasql)) {
					self.loopstat.execute(databaseid, params, loop);
				} else {
					res = cb(res);
				}
			}, 0);
		};
		loop();
	} else {
		while (fn(params, alasql)) {
			var res1 = self.loopstat.execute(databaseid, params);
			res.push(res1);
		}
	}
	return res;
};

yy.Break = function (params) {
	return Object.assign(this, params);
};
yy.Break.prototype.toString = function () {
	var s = 'BREAK';
	return s;
};

yy.Break.prototype.execute = function (databaseid, params, cb, scope) {
	var res = 1;
	if (cb) res = cb(res);
	return res;
};

yy.Continue = function (params) {
	return Object.assign(this, params);
};
yy.Continue.prototype.toString = function () {
	var s = 'CONTINUE';
	return s;
};

yy.Continue.prototype.execute = function (databaseid, params, cb, scope) {
	var res = 1;
	if (cb) res = cb(res);
	return res;
};

yy.BeginEnd = function (params) {
	return Object.assign(this, params);
};
yy.BeginEnd.prototype.toString = function () {
	var s = 'BEGIN ' + this.statements.toString() + ' END';
	return s;
};

yy.BeginEnd.prototype.execute = function (databaseid, params, cb, scope) {
	var self = this;
	var res = [];

	var idx = 0;
	runone();
	function runone() {
		self.statements[idx].execute(databaseid, params, function (data) {
			res.push(data);
			idx++;
			if (idx < self.statements.length) return runone();
			if (cb) res = cb(res);
		});
	}
	return res;
};
/*
//
// INSERT for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global yy alasql*/
yy.Insert = function (params) {
	return Object.assign(this, params);
};
yy.Insert.prototype.toString = function () {
	var s = 'INSERT ';
	if (this.orreplace) s += 'OR REPLACE ';
	if (this.replaceonly) s = 'REPLACE ';
	s += 'INTO ' + this.into.toString();
	if (this.columns) s += '(' + this.columns.toString() + ')';
	if (this.values) {
		var values = this.values.map(function (value) {
			return '(' + value.toString() + ')';
		});
		s += ' VALUES ' + values.join(',');
	}
	if (this.select) s += ' ' + this.select.toString();
	return s;
};

yy.Insert.prototype.toJS = function (context, tableid, defcols) {

	//	if(this.expression.reduced) return 'true';
	//	return this.expression.toJS(context, tableid, defcols);

	//	var s = 'this.queriesdata['+(this.queriesidx-1)+'][0]';

	var s = 'this.queriesfn[' + (this.queriesidx - 1) + '](this.params,null,' + context + ')';

	return s;
};

yy.Insert.prototype.compile = function (databaseid) {
	var self = this;
	databaseid = self.into.databaseid || databaseid;
	var db = alasql.databases[databaseid];

	var tableid = self.into.tableid;
	var table = db.tables[tableid];

	if (!table) {
		throw "Table '" + tableid + "' could not be found";
	}

	// Check, if this dirty flag is required
	var s = '';
	var sw = '';
	var s = "db.tables['" + tableid + "'].dirty=true;";
	var s3 = 'var a,aa=[],x;';

	var s33;

	// INSERT INTO table VALUES
	if (this.values) {
		if (this.exists) {
			this.existsfn = this.exists.map(function (ex) {
				var nq = ex.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}
		if (this.queries) {
			this.queriesfn = this.queries.map(function (q) {
				var nq = q.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}

		self.values.forEach(function (values) {
			var ss = [];

			//			s += 'db.tables[\''+tableid+'\'].data.push({';

			//			s += '';
			if (self.columns) {
				self.columns.forEach(function (col, idx) {

					//			ss.push(col.columnid +':'+ self.values[idx].value.toString());

					//			if(rec[f.name.value] == "NULL") rec[f.name.value] = undefined;

					//			if(table.xflds[f.name.value].dbtypeid == "INT") rec[f.name.value] = +rec[f.name.value]|0;
					//			else if(table.xflds[f.name.value].dbtypeid == "FLOAT") rec[f.name.value] = +rec[f.name.value];
					var q = "'" + col.columnid + "':";
					if (table.xcolumns && table.xcolumns[col.columnid]) {
						if (
							['INT', 'FLOAT', 'NUMBER', 'MONEY'].indexOf(table.xcolumns[col.columnid].dbtypeid) >=
							0
						) {
							//q += ''
							q += '(x=' + values[idx].toJS() + ',x==undefined?undefined:+x)';
						} else if (alasql.fn[table.xcolumns[col.columnid].dbtypeid]) {
							q += '(new ' + table.xcolumns[col.columnid].dbtypeid + '(';
							q += values[idx].toJS();
							q += '))';
						} else {
							q += values[idx].toJS();
						}
					} else {
						q += values[idx].toJS();
					}
					ss.push(q);
				});
			} else {
				//				var table = db.tables[tableid];

				if (Array.isArray(values) && table.columns && table.columns.length > 0) {
					table.columns.forEach(function (col, idx) {
						var q = "'" + col.columnid + "':";
						//						var val = values[idx].toJS();

						if (['INT', 'FLOAT', 'NUMBER', 'MONEY'].indexOf(col.dbtypeid) >= 0) {
							q += '+' + values[idx].toJS();
						} else if (alasql.fn[col.dbtypeid]) {
							q += '(new ' + col.dbtypeid + '(';
							q += values[idx].toJS();
							q += '))';
						} else {
							q += values[idx].toJS();
						}

						ss.push(q);

					});
				} else {

					//					sw = 'var w='+JSONtoJS(values)+';for(var k in w){r[k]=w[k]};';
					sw = JSONtoJS(values);
				}
			}

			if (db.tables[tableid].defaultfns) {
				ss.unshift(db.tables[tableid].defaultfns);
			}
			if (sw) {
				s += 'a=' + sw + ';';
			} else {
				s += 'a={' + ss.join(',') + '};';
			}

			// If this is a class
			if (db.tables[tableid].isclass) {
				s += "var db=alasql.databases['" + databaseid + "'];";
				s += 'a.$class="' + tableid + '";';
				s += 'a.$id=db.counter++;';
				s += 'db.objects[a.$id]=a;';
			}
			//			s += 'db.tables[\''+tableid+'\'].insert(r);';
			if (db.tables[tableid].insert) {
				s += "var db=alasql.databases['" + databaseid + "'];";
				s += "db.tables['" + tableid + "'].insert(a," + (self.orreplace ? 'true' : 'false') + ');';
			} else {
				s += 'aa.push(a);';
			}
		});

		s33 = s3 + s;

		if (db.tables[tableid].insert) {
			//			s += 'alasql.databases[\''+databaseid+'\'].tables[\''+tableid+'\'].insert(r);';
		} else {
			s +=
				"alasql.databases['" +
				databaseid +
				"'].tables['" +
				tableid +
				"'].data=" +
				"alasql.databases['" +
				databaseid +
				"'].tables['" +
				tableid +
				"'].data.concat(aa);";
		}

		if (db.tables[tableid].insert) {
			if (db.tables[tableid].isclass) {
				s += 'return a.$id;';
			} else {
				s += 'return ' + self.values.length;
			}
		} else {
			s += 'return ' + self.values.length;
		}

		var insertfn = new Function('db, params, alasql', 'var y;' + s3 + s).bind(this);

		// INSERT INTO table SELECT
	} else if (this.select) {
		this.select.modifier = 'RECORDSET';
		if (this.queries) {
			this.select.queries = this.queries;
		}
		var selectfn = this.select.compile(databaseid);
		if (db.engineid && alasql.engines[db.engineid].intoTable) {
			var statement = function (params, cb) {
				var aa = selectfn(params);
				var res = alasql.engines[db.engineid].intoTable(db.databaseid, tableid, aa.data, null, cb);
				return res;
			};
			return statement;
		} else {

			var defaultfns = 'return alasql.utils.extend(r,{' + table.defaultfns + '})';
			var defaultfn = new Function('r,db,params,alasql', defaultfns);
			var insertfn = function (db, params, alasql) {
				var res = selectfn(params).data;
				if (db.tables[tableid].insert) {
					// If insert() function exists (issue #92)
					for (var i = 0, ilen = res.length; i < ilen; i++) {
						var r = cloneDeep(res[i]);
						defaultfn(r, db, params, alasql);
						db.tables[tableid].insert(r, self.orreplace);
					}
				} else {
					db.tables[tableid].data = db.tables[tableid].data.concat(res);
				}
				if (alasql.options.nocount) return;
				else return res.length;
			};
		}
	} else if (this.default) {
		var insertfns = "db.tables['" + tableid + "'].data.push({" + table.defaultfns + '});return 1;';
		var insertfn = new Function('db,params,alasql', insertfns);
	} else {
		throw new Error('Wrong INSERT parameters');
	}

	if (db.engineid && alasql.engines[db.engineid].intoTable && alasql.options.autocommit) {
		var statement = function (params, cb) {
			var aa = new Function('db,params', 'var y;' + s33 + 'return aa;')(db, params);

			var res = alasql.engines[db.engineid].intoTable(db.databaseid, tableid, aa, null, cb);
			//			if(cb) cb(res);
			return res;
		};
	} else {
		var statement = function (params, cb) {

			var db = alasql.databases[databaseid];

			if (alasql.options.autocommit && db.engineid) {
				alasql.engines[db.engineid].loadTableData(databaseid, tableid);
			}

			var res = insertfn(db, params, alasql);

			if (alasql.options.autocommit && db.engineid) {
				alasql.engines[db.engineid].saveTableData(databaseid, tableid);
			}
			//		var res = insertfn(db, params);
			if (alasql.options.nocount) res = undefined;
			if (cb) cb(res);
			return res;
		};
	}

	return statement;
};

yy.Insert.prototype.execute = function (databaseid, params, cb) {
	return this.compile(databaseid)(params, cb);
	//	throw new Error('Insert statement is should be compiled')
};
/*
//
// TRIGGER for Alasql.js
// Date: 29.12.2015
//
*/

yy.CreateTrigger = function (params) {
	return Object.assign(this, params);
};
yy.CreateTrigger.prototype.toString = function () {
	var s = 'CREATE TRIGGER ' + this.trigger + ' ';
	if (this.when) s += this.when + ' ';
	s += this.action + ' ON ';
	if (this.table.databaseid) s += this.table.databaseid + '.';
	s += this.table.tableid + ' ';
	s += this.statement.toString();
	return s;
};

const validTriggers = [
	'beforeinsert',
	'afterinsert',
	'insteadofinsert',
	'beforedelete',
	'afterdelete',
	'insteadofdelete',
	'beforeupdate',
	'afterupdate',
	'insteadofupdate',
];

yy.CreateTrigger.prototype.execute = function (databaseid, params, cb) {
	let res = 1; // No tables removed
	const triggerid = this.trigger;
	databaseid = this.table.databaseid || databaseid;
	const db = alasql.databases[databaseid];
	const {tableid} = this.table;

	const trigger = {
		action: this.action,
		when: this.when,
		statement: this.statement,
		funcid: this.funcid,
		tableid,
	};

	db.triggers[triggerid] = trigger;
	const actionKey = `${this.when}${this.action}`.toLowerCase();

	if (validTriggers.includes(actionKey)) {
		// Ensure the existence of db.tables[tableid] and db.tables[tableid][actionKey]
		db.tables[tableid] = db.tables[tableid] || {};
		db.tables[tableid][actionKey] = db.tables[tableid][actionKey] || {};
		db.tables[tableid][actionKey][triggerid] = trigger;
	}

	if (cb) res = cb(res);
	return res;
};

yy.DropTrigger = function (params) {
	return Object.assign(this, params);
};
yy.DropTrigger.prototype.toString = function () {
	var s = 'DROP TRIGGER ' + this.trigger;
	return s;
};

/**
	Drop trigger
	@param {string} databaseid Database id
	@param {object} params Parameters
	@param {callback} cb Callback function
	@return Number of dropped triggers
	@example
	DROP TRIGGER one;
*/
yy.DropTrigger.prototype.execute = function (databaseid, params, cb) {
	let res = 0; // No tables removed
	const db = alasql.databases[databaseid];
	const triggerid = this.trigger;

	// Get the trigger
	const trigger = db.triggers[triggerid];

	// If the trigger exists
	if (trigger) {
		const {tableid} = trigger;

		if (tableid) {
			res = 1;

			// Delete the trigger from all trigger points
			validTriggers.forEach(point => {
				delete db.tables[tableid][point][triggerid];
			});

			// Finally, delete the trigger itself
			delete db.triggers[triggerid];
		} else {
			throw new Error('Trigger Table not found');
		}
	} else {
		throw new Error('Trigger not found');
	}

	if (cb) res = cb(res);
	return res;
};
/*
//
// DELETE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Delete = function (params) {
	return Object.assign(this, params);
};
yy.Delete.prototype.toString = function () {
	var s = 'DELETE FROM ' + this.table.toString();
	if (this.where) s += ' WHERE ' + this.where.toString();
	return s;
};

yy.Delete.prototype.compile = function (databaseid) {
	databaseid = this.table.databaseid || databaseid;
	var tableid = this.table.tableid;
	var statement;
	var db = alasql.databases[databaseid];

	if (this.where) {
		if (this.exists) {
			this.existsfn = this.exists.map(function (ex) {
				var nq = ex.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}

		if (this.queries) {
			this.queriesfn = this.queries.map(function (q) {
				var nq = q.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}

		var wherefn = new Function(
			'r,params,alasql',
			'var y;return (' + this.where.toJS('r', '') + ')'
		).bind(this);

		statement = function (params, cb) {
			if (db.engineid && alasql.engines[db.engineid].deleteFromTable) {
				return alasql.engines[db.engineid].deleteFromTable(
					databaseid,
					tableid,
					wherefn,
					params,
					cb
				);
			}

			if (
				alasql.options.autocommit &&
				db.engineid &&
				(db.engineid == 'LOCALSTORAGE' || db.engineid == 'FILESTORAGE')
			) {
				alasql.engines[db.engineid].loadTableData(databaseid, tableid);
			}

			var table = db.tables[tableid];
			var orignum = table.data.length;

			var newtable = [];
			for (var i = 0, ilen = table.data.length; i < ilen; i++) {
				if (wherefn(table.data[i], params, alasql)) {
					// Check for transaction - if it is not possible then return all back
					if (table.delete) {
						table.delete(i, params, alasql);
					} else {
						// Simply do not push
					}
				} else {
					newtable.push(table.data[i]);
				}
			}
			table.data = newtable;

			// Trigger prevent functionality
			for (var tr in table.afterdelete) {
				var trigger = table.afterdelete[tr];
				if (trigger) {
					if (trigger.funcid) {
						alasql.fn[trigger.funcid]();
					} else if (trigger.statement) {
						trigger.statement.execute(databaseid);
					}
				}
			}

			var res = orignum - table.data.length;
			if (
				alasql.options.autocommit &&
				db.engineid &&
				(db.engineid == 'LOCALSTORAGE' || db.engineid == 'FILESTORAGE')
			) {
				alasql.engines[db.engineid].saveTableData(databaseid, tableid);
			}

			if (cb) res = cb(res);

			return res;
		};
	} else {
		statement = function (params, cb) {
			if (alasql.options.autocommit && db.engineid) {
				alasql.engines[db.engineid].loadTableData(databaseid, tableid);
			}

			var table = db.tables[tableid];
			table.dirty = true;
			var orignum = db.tables[tableid].data.length;
			// Delete all records from the array
			db.tables[tableid].data.length = 0;

			// Reset PRIMARY KEY and indexes
			for (var ix in db.tables[tableid].uniqs) {
				db.tables[tableid].uniqs[ix] = {};
			}

			for (var ix in db.tables[tableid].indices) {
				db.tables[tableid].indices[ix] = {};
			}

			if (alasql.options.autocommit && db.engineid) {
				alasql.engines[db.engineid].saveTableData(databaseid, tableid);
			}

			if (cb) cb(orignum);
			return orignum;
		};
	}

	return statement;
};

yy.Delete.prototype.execute = function (databaseid, params, cb) {
	return this.compile(databaseid)(params, cb);
};
/*
//
// UPDATE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global yy alasql */

yy.Update = function (params) {
	return Object.assign(this, params);
};
yy.Update.prototype.toString = function () {
	var s = 'UPDATE ' + this.table.toString();
	if (this.columns) s += ' SET ' + this.columns.toString();
	if (this.where) s += ' WHERE ' + this.where.toString();
	return s;
};

yy.SetColumn = function (params) {
	return Object.assign(this, params);
};
yy.SetColumn.prototype.toString = function () {
	return this.column.toString() + '=' + this.expression.toString();
};

yy.Update.prototype.compile = function (databaseid) {

	databaseid = this.table.databaseid || databaseid;
	var tableid = this.table.tableid;

	if (this.where) {
		if (this.exists) {
			this.existsfn = this.exists.map(function (ex) {
				var nq = ex.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}
		if (this.queries) {
			this.queriesfn = this.queries.map(function (q) {
				var nq = q.compile(databaseid);
				nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}

		var wherefn = new Function('r,params,alasql', 'var y;return ' + this.where.toJS('r', '')).bind(
			this
		);
	}

	// Construct update function
	var s = alasql.databases[databaseid].tables[tableid].onupdatefns || '';
	s += ';';
	this.columns.forEach(function (col) {
		s += "r['" + col.column.columnid + "']=" + col.expression.toJS('r', '') + ';';
	});

	var assignfn = new Function('r,params,alasql', 'var y;' + s);

	var statement = function (params, cb) {
		var db = alasql.databases[databaseid];

		if (db.engineid && alasql.engines[db.engineid].updateTable) {

			return alasql.engines[db.engineid].updateTable(
				databaseid,
				tableid,
				assignfn,
				wherefn,
				params,
				cb
			);
		}

		if (alasql.options.autocommit && db.engineid) {
			alasql.engines[db.engineid].loadTableData(databaseid, tableid);
		}

		var table = db.tables[tableid];
		if (!table) {
			throw new Error("Table '" + tableid + "' not exists");
		}
		//		table.dirty = true;
		var numrows = 0;
		for (var i = 0, ilen = table.data.length; i < ilen; i++) {
			if (!wherefn || wherefn(table.data[i], params, alasql)) {
				if (table.update) {
					table.update(assignfn, i, params);
				} else {
					assignfn(table.data[i], params, alasql);
				}
				numrows++;
			}
		}

		if (alasql.options.autocommit && db.engineid) {
			alasql.engines[db.engineid].saveTableData(databaseid, tableid);
		}

		if (cb) cb(numrows);
		return numrows;
	};
	return statement;
};

yy.Update.prototype.execute = function (databaseid, params, cb) {
	return this.compile(databaseid)(params, cb);
};
/*
//
// SET for Alasql.js
// Date: 01.12.2014
// (c) 2014, Andrey Gershun
//
*/

/* global alasql, yy */

yy.Merge = function (params) {
	return Object.assign(this, params);
};
yy.Merge.prototype.toString = function () {
	let s = `MERGE ${this.into.tableid} `;
	if (this.into.as) s += `AS ${this.into.as} `;
	s += `USING ${this.using.tableid} `;
	if (this.using.as) s += `AS ${this.using.as} `;
	s += `ON ${this.on.toString()} `;

	this.matches.forEach(m => {
		s += 'WHEN ';
		if (!m.matched) s += 'NOT ';
		s += 'MATCHED ';
		if (m.bytarget) s += 'BY TARGET ';
		if (m.bysource) s += 'BY SOURCE ';
		if (m.expr) s += `AND ${m.expr.toString()} `;
		s += 'THEN ';
		if (m.action.delete) s += 'DELETE ';
		if (m.action.insert) {
			s += 'INSERT ';
			if (m.action.columns) s += `(${m.action.columns.toString()}) `;
			if (m.action.values) s += `VALUES (${m.action.values.toString()}) `;
			if (m.action.defaultvalues) s += 'DEFAULT VALUES ';
		}
		if (m.action.update) {
			s += 'UPDATE ';
			s += m.action.update.map(u => u.toString()).join(', ') + ' ';
		}
	});

	return s;
};

yy.Merge.prototype.execute = function (databaseid, params, cb) {
	var res = 1;

	if (cb) res = cb(res);
	return res;
};
/*
//
// UPDATE for Alasql.js
// Date: 03.11.2014
// Modified: 16.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global yy alasql */

// CREATE DATABASE databaseid
yy.CreateDatabase = function (params) {
	return Object.assign(this, params);
};
yy.CreateDatabase.prototype.toString = function () {
	let s = 'CREATE '; // Ensure there's a space after CREATE
	if (this.engineid) s += `${this.engineid} `;
	s += 'DATABASE ';
	if (this.ifnotexists) s += 'IF NOT EXISTS ';
	s += `${this.databaseid} `;

	if (this.args && this.args.length > 0) {
		s += `(${this.args.map(arg => arg.toString()).join(', ')}) `;
	}
	if (this.as) s += `AS ${this.as}`;
	return s;
};

yy.CreateDatabase.prototype.execute = function (databaseid, params, cb) {
	var args;
	if (this.args && this.args.length > 0) {
		args = this.args.map(function (arg) {

			return new Function('params,alasql', 'var y;return ' + arg.toJS())(params, alasql);
		});
	}
	if (this.engineid) {
		var res = alasql.engines[this.engineid].createDatabase(
			this.databaseid,
			this.args,
			this.ifnotexists,
			this.as,
			cb
		);
		return res;
	} else {
		var dbid = this.databaseid;
		if (alasql.databases[dbid]) {
			throw new Error("Database '" + dbid + "' already exists");
		}
		var a = new alasql.Database(dbid);
		var res = 1;
		if (cb) return cb(res);
		return res;
	}
};

// CREATE DATABASE databaseid
yy.AttachDatabase = function (params) {
	return Object.assign(this, params);
};
yy.AttachDatabase.prototype.toString = function (args) {
	let s = 'ATTACH';
	if (this.engineid) s += ` ${this.engineid}`;
	s += ` DATABASE ${this.databaseid}`;
	// TODO add params
	if (args) {
		s += '(';
		if (args.length > 0) {
			s += args.map(arg => arg.toString()).join(', ');
		}
		s += ')';
	}
	if (this.as) s += ` AS ${this.as}`;
	return s;
};

yy.AttachDatabase.prototype.execute = function (databaseid, params, cb) {
	if (!alasql.engines[this.engineid]) {
		throw new Error('Engine "' + this.engineid + '" is not defined.');
	}
	var res = alasql.engines[this.engineid].attachDatabase(
		this.databaseid,
		this.as,
		this.args,
		params,
		cb
	);
	return res;
};

// CREATE DATABASE databaseid
yy.DetachDatabase = function (params) {
	return Object.assign(this, params);
};
yy.DetachDatabase.prototype.toString = function () {
	var s = 'DETACH';
	s += ' DATABASE' + ' ' + this.databaseid;
	return s;
};
//yy.CreateDatabase.prototype.compile = returnUndefined;
yy.DetachDatabase.prototype.execute = function (databaseid, params, cb) {
	if (!alasql.databases[this.databaseid].engineid) {
		throw new Error('Cannot detach database "' + this.engineid + '", because it was not attached.');
	}
	var res;

	var dbid = this.databaseid;

	if (dbid === alasql.DEFAULTDATABASEID) {
		throw new Error('Drop of default database is prohibited');
	}

	if (!alasql.databases[dbid]) {
		if (!this.ifexists) {
			throw new Error("Database '" + dbid + "' does not exist");
		} else {
			res = 0;
		}
	} else {
		// Usually databases are detached and then dropped. Detaching will delete
		// the database object from memory. While this is OK for in-memory and
		// other persistent databases, for FileStorage DBs, we will
		// not be able to delete the DB file (.json) since we would have lost
		// the filename by deleting the in-memory database object here.
		// For this reason, to delete the associated JSON file,
		// keeping the name of the file alone as a property inside the db object
		// until it gets DROPped subsequently (only for FileStorage DBs)
		var isFS = alasql.databases[dbid].engineid && alasql.databases[dbid].engineid == 'FILESTORAGE',
			filename = alasql.databases[dbid].filename || '';

		delete alasql.databases[dbid];

		if (isFS) {
			// Create a detached FS database
			alasql.databases[dbid] = {};
			alasql.databases[dbid].isDetached = true;
			alasql.databases[dbid].filename = filename;
		}

		if (dbid === alasql.useid) {
			alasql.use();
		}
		res = 1;
	}
	if (cb) cb(res);
	return res;
};

// USE DATABSE databaseid
// USE databaseid
yy.UseDatabase = function (params) {
	return Object.assign(this, params);
};
yy.UseDatabase.prototype.toString = function () {
	return 'USE' + ' ' + 'DATABASE' + ' ' + this.databaseid;
};
//yy.UseDatabase.prototype.compile = returnUndefined;
yy.UseDatabase.prototype.execute = function (databaseid, params, cb) {
	var dbid = this.databaseid;
	if (!alasql.databases[dbid]) {
		throw new Error("Database '" + dbid + "' does not exist");
	}
	alasql.use(dbid);
	var res = 1;
	if (cb) cb(res);
	return res;
};

// DROP DATABASE databaseid
yy.DropDatabase = function (params) {
	return Object.assign(this, params);
};
yy.DropDatabase.prototype.toString = function () {
	var s = 'DROP';
	if (this.ifexists) s += ' IF EXISTS';
	s += ' DATABASE ' + this.databaseid;
	return s;
};
//yy.DropDatabase.prototype.compile = returnUndefined;
yy.DropDatabase.prototype.execute = function (databaseid, params, cb) {
	if (this.engineid) {
		return alasql.engines[this.engineid].dropDatabase(this.databaseid, this.ifexists, cb);
	}
	let res;

	const dbid = this.databaseid;

	if (dbid === alasql.DEFAULTDATABASEID) {
		throw new Error('Drop of default database is prohibited');
	}
	if (!alasql.databases[dbid]) {
		if (!this.ifexists) {
			throw new Error(`Database '${dbid}' does not exist`);
		} else {
			res = 0;
		}
	} else {
		if (alasql.databases[dbid].engineid) {
			throw new Error(`Cannot drop database '${dbid}', because it is attached. Detach it.`);
		}

		delete alasql.databases[dbid];
		if (dbid === alasql.useid) {
			alasql.use();
		}
		res = 1;
	}
	if (cb) cb(res);
	return res;
};
/*
//
// SET for Alasql.js
// Date: 01.12.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Declare = function (params) {
	return Object.assign(this, params);
};
yy.Declare.prototype.toString = function () {
	let s = 'DECLARE ';
	if (this.declares && this.declares.length > 0) {
		s += this.declares
			.map(declare => {
				let declareStr = `@${declare.variable} ${declare.dbtypeid}`;
				if (declare.dbsize) {
					declareStr += `(${declare.dbsize}`;
					if (declare.dbprecision) {
						declareStr += `,${declare.dbprecision}`;
					}
					declareStr += ')';
				}
				if (declare.expression) {
					declareStr += ` = ${declare.expression.toString()}`;
				}
				return declareStr;
			})
			.join(',');
	}
	return s;
};

yy.Declare.prototype.execute = function (databaseid, params, cb) {
	var res = 1;
	var that = this; // without this assigned to a variable, inside the forEach, the reference to `this` is lost. It is needed for the Function statement for binding
	if (that.declares && that.declares.length > 0) {
		that.declares.forEach(function (declare) {
			var dbtypeid = declare.dbtypeid;
			if (!alasql.fn[dbtypeid]) {
				dbtypeid = dbtypeid.toUpperCase();
			}
			alasql.declares[declare.variable] = {
				dbtypeid: dbtypeid,
				dbsize: declare.dbsize,
				dbprecision: declare.dbprecision,
			};

			// Set value
			if (declare.expression) {

				alasql.vars[declare.variable] = new Function(
					'params,alasql',
					'return ' + declare.expression.toJS('({})', '', null)
				).bind(that)(params, alasql);
				if (alasql.declares[declare.variable]) {
					alasql.vars[declare.variable] = alasql.stdfn.CONVERT(
						alasql.vars[declare.variable],
						alasql.declares[declare.variable]
					);
				}
			}
		});
	}
	if (cb) {
		res = cb(res);
	}
	return res;
};
/*
//
// SHOW for Alasql.js
// Date: 19.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.ShowDatabases = function (params) {
	return Object.assign(this, params);
};
yy.ShowDatabases.prototype.toString = function () {
	var s = 'SHOW DATABASES';
	if (this.like) s += 'LIKE ' + this.like.toString();
	return s;
};
yy.ShowDatabases.prototype.execute = function (databaseid, params, cb) {
	if (this.engineid) {
		return alasql.engines[this.engineid].showDatabases(this.like, cb);
	} else {
		var self = this;
		var res = [];
		for (var dbid in alasql.databases) {
			res.push({databaseid: dbid});
		}
		if (self.like && res && res.length > 0) {
			res = res.filter(function (d) {
				//				return d.databaseid.match(new RegExp((self.like.value||'').replace(/\%/g,'.*').replace(/\?|_/g,'.'),'g'));
				return alasql.utils.like(self.like.value, d.databaseid);
			});
		}
		if (cb) cb(res);
		return res;
	}
};

yy.ShowTables = function (params) {
	return Object.assign(this, params);
};
yy.ShowTables.prototype.toString = function () {
	var s = 'SHOW TABLES';
	if (this.databaseid) s += ' FROM ' + this.databaseid;
	if (this.like) s += ' LIKE ' + this.like.toString();
	return s;
};
yy.ShowTables.prototype.execute = function (databaseid, params, cb) {
	var db = alasql.databases[this.databaseid || databaseid];

	var self = this;
	var res = [];
	for (var tableid in db.tables) {
		res.push({tableid: tableid});
	}
	if (self.like && res && res.length > 0) {
		res = res.filter(function (d) {
			//return d.tableid.match(new RegExp((self.like.value||'').replace(/\%/g,'.*').replace(/\?|_/g,'.'),'g'));
			return alasql.utils.like(self.like.value, d.tableid);
		});
	}
	if (cb) cb(res);
	return res;
};

yy.ShowColumns = function (params) {
	return Object.assign(this, params);
};
yy.ShowColumns.prototype.toString = function () {
	var s = 'SHOW COLUMNS';
	if (this.table.tableid) s += ' FROM ' + this.table.tableid;
	if (this.databaseid) s += ' FROM ' + this.databaseid;
	return s;
};

yy.ShowColumns.prototype.execute = function (databaseid, params, cb) {
	var db = alasql.databases[this.databaseid || databaseid];
	var table = db.tables[this.table.tableid];

	if (table && table.columns) {
		var res = table.columns.map(function (col) {
			return {
				columnid: col.columnid,
				dbtypeid: col.dbtypeid,
				dbsize: col.dbsize,
			};
		});
		if (cb) cb(res);
		return res;
	} else {
		if (cb) cb([]);
		return [];
	}
};

yy.ShowIndex = function (params) {
	return Object.assign(this, params);
};
yy.ShowIndex.prototype.toString = function () {
	var s = 'SHOW INDEX';
	if (this.table.tableid) s += ' FROM ' + this.table.tableid;
	if (this.databaseid) s += ' FROM ' + this.databaseid;
	return s;
};
yy.ShowIndex.prototype.execute = function (databaseid, params, cb) {
	var db = alasql.databases[this.databaseid || databaseid];
	var table = db.tables[this.table.tableid];
	var res = [];
	if (table && table.indices) {
		for (var ind in table.indices) {
			res.push({hh: ind, len: Object.keys(table.indices[ind]).length});
		}
	}

	if (cb) cb(res);
	return res;
};

yy.ShowCreateTable = function (params) {
	return Object.assign(this, params);
};
yy.ShowCreateTable.prototype.toString = function () {
	var s = 'SHOW CREATE TABLE ' + this.table.tableid;
	if (this.databaseid) s += ' FROM ' + this.databaseid;
	return s;
};
yy.ShowCreateTable.prototype.execute = function (databaseid) {
	var db = alasql.databases[this.databaseid || databaseid];
	var table = db.tables[this.table.tableid];
	if (table) {
		var s = 'CREATE TABLE ' + this.table.tableid + ' (';
		var ss = [];
		if (table.columns) {
			table.columns.forEach(function (col) {
				var a = col.columnid + ' ' + col.dbtypeid;
				if (col.dbsize) a += '(' + col.dbsize + ')';
				if (col.primarykey) a += ' PRIMARY KEY';
				// TODO extend
				ss.push(a);
			});
			s += ss.join(', ');
		}
		s += ')';
		return s;
	} else {
		throw new Error('There is no such table "' + this.table.tableid + '"');
	}
};
/*
//
// SET for Alasql.js
// Date: 01.12.2014
// (c) 2014, Andrey Gershun
//
*/

yy.SetVariable = function (params) {
	return Object.assign(this, params);
};
yy.SetVariable.prototype.toString = function () {
	var s = 'SET ';
	if (typeof this.value != 'undefined')
		s += this.variable.toUpperCase() + ' ' + (this.value ? 'ON' : 'OFF');
	if (this.expression) s += this.method + this.variable + ' = ' + this.expression.toString();
	return s;
};

yy.SetVariable.prototype.execute = function (databaseid, params, cb) {
	if (typeof this.value !== 'undefined') {
		let val = this.value;
		if (val === 'ON') val = true;
		else if (val === 'OFF') val = false;
		alasql.options[this.variable] = val;
	} else if (this.expression) {
		if (this.exists) {
			this.existsfn = this.exists.map(ex => {
				let nq = ex.compile(databaseid);
				if (nq.query && !nq.query.modifier) nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}
		if (this.queries) {
			this.queriesfn = this.queries.map(q => {
				let nq = q.compile(databaseid);
				if (nq.query && !nq.query.modifier) nq.query.modifier = 'RECORDSET';
				return nq;
			});
		}

		let res = new Function(
			'params, alasql',
			'return ' + this.expression.toJS('({})', '', null)
		).bind(this)(params, alasql);

		if (alasql.declares[this.variable]) {
			res = alasql.stdfn.CONVERT(res, alasql.declares[this.variable]);
		}

		if (this.props && this.props.length > 0) {
			let fs;
			if (this.method === '@') {
				fs = `alasql.vars['${this.variable}']`;
			} else {
				fs = `params['${this.variable}']`;
			}
			this.props.forEach(prop => {
				if (typeof prop === 'string') {
					fs += `['${prop}']`;
				} else if (typeof prop === 'number') {
					fs += `[${prop}]`;
				} else {
					// Assuming prop.toJS() is a method that converts prop to a JavaScript expression.
					fs += `[${prop.toJS()}]`;
				}
			});

			new Function('value, params, alasql', `${fs} = value`)(res, params, alasql);
		} else {
			if (this.method === '@') {
				alasql.vars[this.variable] = res;
			} else {
				params[this.variable] = res;
			}
		}
	}

	let result = 1;
	if (cb) result = cb(result);
	return result;
};
alasql.test = function (name, times, fn) {
	if (arguments.length === 0) {
		alasql.log(alasql.con.results);
		return;
	}

	var tm = Date.now();

	if (arguments.length === 1) {
		fn();
		alasql.con.log(Date.now() - tm);
		return;
	}

	if (arguments.length === 2) {
		fn = times;
		times = 1;
	}

	for (var i = 0; i < times; i++) {
		fn();
	}
	alasql.con.results[name] = Date.now() - tm;
};

// Console
// alasql.log = function(sql, params) {

// };

/* global alasql, yy, utils */

// Console
alasql.log = function (sql, params) {
	var olduseid = alasql.useid;
	var target = alasql.options.logtarget;
	// For node other
	if (utils.isNode) {
		target = 'console';
	}

	var res;
	if (typeof sql === 'string') {
		res = alasql(sql, params);
	} else {
		res = sql;
	}

	// For Node and console.output
	if (target === 'console' || utils.isNode) {
		if (typeof sql === 'string' && alasql.options.logprompt) {
			console.log(olduseid + '>', sql);
		}

		if (Array.isArray(res)) {
			if (console.table) {
				// For Chrome and other consoles
				console.table(res);
			} else {
				// Add print procedure
				console.log(JSONtoString(res));
			}
		} else {
			console.log(JSONtoString(res));
		}
	} else {
		var el;
		if (target === 'output') {
			el = document.getElementsByTagName('output')[0];
		} else {
			if (typeof target === 'string') {
				el = document.getElementById(target);
			} else {
				// in case of DOM
				el = target;
			}
		}

		var s = '';

		if (typeof sql === 'string' && alasql.options.logprompt) {
			//			s += '<p>'+olduseid+'&gt;&nbsp;'+alasql.pretty(sql)+'</p>';
			s += '<pre><code>' + alasql.pretty(sql) + '</code></pre>';
		}

		if (Array.isArray(res)) {
			if (res.length === 0) {
				s += '<p>[ ]</p>';
			} else if (typeof res[0] !== 'object' || Array.isArray(res[0])) {
				for (var i = 0, ilen = res.length; i < ilen; i++) {
					s += '<p>' + loghtml(res[i]) + '</p>';
				}
			} else {
				s += loghtml(res);
			}
		} else {
			s += loghtml(res);
		}
		el.innerHTML += s;
	}
};

alasql.clear = function () {
	var target = alasql.options.logtarget;
	// For node other

	if (utils.isNode || utils.isMeteorServer) {
		if (console.clear) {
			console.clear();
		}
	} else {
		var el;
		if (target === 'output') {
			el = document.getElementsByTagName('output')[0];
		} else {
			if (typeof target === 'string') {
				el = document.getElementById(target);
			} else {
				// in case of DOM
				el = target;
			}
		}
		el.innerHTML = '';
	}
};

alasql.write = function (s) {

	var target = alasql.options.logtarget;
	// For node other
	if (utils.isNode || utils.isMeteorServer) {
		if (console.log) {
			console.log(s);
		}
	} else {
		var el;
		if (target === 'output') {
			el = document.getElementsByTagName('output')[0];
		} else {
			if (typeof target === 'string') {
				el = document.getElementById(target);
			} else {
				// in case of DOM
				el = target;
			}
		}
		el.innerHTML += s;
	}
};

function loghtml(res) {

	var s = '';
	if (res === undefined) {
		s += 'undefined';
	} else if (Array.isArray(res)) {
		s += '<style>';
		s += 'table {border:1px black solid; border-collapse: collapse; border-spacing: 0px;}';
		s += 'td,th {border:1px black solid; padding-left:5px; padding-right:5px}';
		s += 'th {background-color: #EEE}';
		s += '</style>';
		s += '<table>';
		var cols = [];
		for (var colid in res[0]) {
			cols.push(colid);
		}
		s += '<tr><th>#';
		cols.forEach(function (colid) {
			s += '<th>' + colid;
		});
		for (var i = 0, ilen = res.length; i < ilen; i++) {
			s += '<tr><th>' + (i + 1);
			cols.forEach(function (colid) {
				s += '<td> ';
				if (res[i][colid] == +res[i][colid]) {
					// jshint ignore:line
					s += '<div style="text-align:right">';
					if (typeof res[i][colid] === 'undefined') {
						s += 'NULL';
					} else {
						s += res[i][colid];
					}
					s += '</div>';
				} else {
					if (typeof res[i][colid] === 'undefined') {
						s += 'NULL';
					} else if (typeof res[i][colid] === 'string') {
						s += res[i][colid];
					} else {
						s += JSONtoString(res[i][colid]);
					}
					//					s += res[i][colid];
				}
			});
		}

		s += '</table>';
	} else {
		s += '<p>' + JSONtoString(res) + '</p>';
	}
	// if() {}

	// 		if(typeof res == 'object') {
	// 			s += '<p>'+JSON.stringify(res)+'</p>';
	// 		} else {
	// 		}
	return s;
}

function scrollTo(element, to, duration) {
	if (duration <= 0) {
		return;
	}
	var difference = to - element.scrollTop;
	var perTick = (difference / duration) * 10;

	setTimeout(function () {
		if (element.scrollTop === to) {
			return;
		}
		element.scrollTop = element.scrollTop + perTick;
		scrollTo(element, to, duration - 10);
	}, 10);
}

alasql.prompt = function (el, useidel, firstsql) {
	if (utils.isNode) {
		throw new Error('The prompt not realized for Node.js');
	}

	var prompti = 0;

	if (typeof el === 'string') {
		el = document.getElementById(el);
	}

	if (typeof useidel === 'string') {
		useidel = document.getElementById(useidel);
	}

	useidel.textContent = alasql.useid;

	if (firstsql) {
		alasql.prompthistory.push(firstsql);
		prompti = alasql.prompthistory.length;
		try {
			var tm = Date.now();
			alasql.log(firstsql);
			alasql.write('<p style="color:blue">' + (Date.now() - tm) + ' ms</p>');
		} catch (err) {
			alasql.write('<p>' + alasql.useid + '&gt;&nbsp;<b>' + firstsql + '</b></p>');
			alasql.write('<p style="color:red">' + err + '<p>');
		}
	}

	var y = el.getBoundingClientRect().top + document.getElementsByTagName('body')[0].scrollTop;
	scrollTo(document.getElementsByTagName('body')[0], y, 500);

	el.onkeydown = function (event) {
		if (event.which === 13) {
			var sql = el.value;
			var olduseid = alasql.useid;
			el.value = '';
			alasql.prompthistory.push(sql);
			prompti = alasql.prompthistory.length;
			try {
				var tm = Date.now();
				alasql.log(sql);
				alasql.write('<p style="color:blue">' + (Date.now() - tm) + ' ms</p>');
			} catch (err) {
				alasql.write('<p>' + olduseid + '&gt;&nbsp;' + alasql.pretty(sql, false) + '</p>');
				alasql.write('<p style="color:red">' + err + '<p>');
			}
			el.focus();

			useidel.textContent = alasql.useid;
			var y = el.getBoundingClientRect().top + document.getElementsByTagName('body')[0].scrollTop;
			scrollTo(document.getElementsByTagName('body')[0], y, 500);
		} else if (event.which === 38) {
			prompti--;
			if (prompti < 0) {
				prompti = 0;
			}
			if (alasql.prompthistory[prompti]) {
				el.value = alasql.prompthistory[prompti];
				event.preventDefault();
			}
		} else if (event.which === 40) {
			prompti++;
			if (prompti >= alasql.prompthistory.length) {
				prompti = alasql.prompthistory.length;
				el.value = '';
			} else if (alasql.prompthistory[prompti]) {
				el.value = alasql.prompthistory[prompti];
				event.preventDefault();
			}
		}
	};
};
/*
//
// Commit for Alasql.js
// Date: 01.12.2014
// (c) 2014, Andrey Gershun
//
*/
yy.BeginTransaction = function (params) {
	return Object.assign(this, params);
};
yy.BeginTransaction.prototype.toString = function () {
	return 'BEGIN TRANSACTION';
};

yy.BeginTransaction.prototype.execute = function (databaseid, params, cb) {
	var res = 1;
	if (alasql.databases[databaseid].engineid) {
		return alasql.engines[alasql.databases[alasql.useid].engineid].begin(databaseid, cb);
	} else {
		// alasql commit!!!
	}
	if (cb) res = cb(res);
	return res;
};

yy.CommitTransaction = function (params) {
	return Object.assign(this, params);
};
yy.CommitTransaction.prototype.toString = function () {
	return 'COMMIT TRANSACTION';
};

yy.CommitTransaction.prototype.execute = function (databaseid, params, cb) {
	var res = 1;
	if (alasql.databases[databaseid].engineid) {
		return alasql.engines[alasql.databases[alasql.useid].engineid].commit(databaseid, cb);
	} else {
		// alasql commit!!!
	}
	if (cb) res = cb(res);
	return res;
};

yy.RollbackTransaction = function (params) {
	return Object.assign(this, params);
};
yy.RollbackTransaction.prototype.toString = function () {
	return 'ROLLBACK TRANSACTION';
};

yy.RollbackTransaction.prototype.execute = function (databaseid, params, cb) {
	var res = 1;
	if (alasql.databases[databaseid].engineid) {
		return alasql.engines[alasql.databases[databaseid].engineid].rollback(databaseid, cb);
	} else {
		// alasql commit!!!
	}
	if (cb) res = cb(res);
	return res;
};
if (alasql.options.tsql) {
	//
	// Check tables and views
	// IF OBJECT_ID('dbo.Employees') IS NOT NULL
	//   DROP TABLE dbo.Employees;
	// IF OBJECT_ID('dbo.VSortedOrders', 'V') IS NOT NULL
	//   DROP VIEW dbo.VSortedOrders;

	alasql.stdfn.OBJECT_ID = function (name, type) {
		if (typeof type == 'undefined') type = 'T';
		type = type.toUpperCase();

		var sname = name.split('.');
		var dbid = alasql.useid;
		var objname = sname[0];
		if (sname.length == 2) {
			dbid = sname[0];
			objname = sname[1];
		}

		var tables = alasql.databases[dbid].tables;
		dbid = alasql.databases[dbid].databaseid;
		for (var tableid in tables) {
			if (tableid == objname) {
				// TODO: What OBJECT_ID actually returns

				if (tables[tableid].view && type == 'V') return dbid + '.' + tableid;
				if (!tables[tableid].view && type == 'T') return dbid + '.' + tableid;
				return undefined;
			}
		}

		return undefined;
	};
}
if (alasql.options.mysql) {
	alasql.fn.TIMESTAMPDIFF = function (unit, date1, date2) {
		return alasql.stdfn.DATEDIFF(unit, date1, date2);
	};
}

if (alasql.options.mysql || alasql.options.sqlite) {
	// Pseudo INFORMATION_SCHEMA function
	alasql.from.INFORMATION_SCHEMA = function (filename, opts, cb, idx, query) {
		if (filename == 'VIEWS' || filename == 'TABLES') {
			var res = [];
			for (var databaseid in alasql.databases) {
				var tables = alasql.databases[databaseid].tables;
				for (var tableid in tables) {
					if (
						(tables[tableid].view && filename == 'VIEWS') ||
						(!tables[tableid].view && filename == 'TABLES')
					) {
						res.push({TABLE_CATALOG: databaseid, TABLE_NAME: tableid});
					}
				}
			}
			if (cb) res = cb(res, idx, query);
			return res;
		}
		throw new Error('Unknown INFORMATION_SCHEMA table');
	};
}
if (alasql.options.postgres) {
}
if (alasql.options.oracle) {
}
if (alasql.options.sqlite) {
}
//
// into functions
//
// (c) 2014 Andrey Gershun
//

alasql.into.SQL = function (filename, opts, data, columns, cb) {
	var res;
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}
	var opt = {};
	alasql.utils.extend(opt, opts);
	if (typeof opt.tableid === 'undefined') {
		throw new Error('Table for INSERT TO is not defined.');
	}

	var s = '';
	if (columns.length === 0) {
		if (typeof data[0] === 'object') {
			columns = Object.keys(data[0]).map(function (columnid) {
				return {columnid: columnid};
			});
		} else {
			// What should I do?
			// columns = [{columnid:"_"}];
		}
	}

	for (var i = 0, ilen = data.length; i < ilen; i++) {
		s += 'INSERT INTO ' + opts.tableid + '(';
		s += columns
			.map(function (col) {
				return col.columnid;
			})
			.join(',');
		s += ') VALUES (';
		s += columns.map(function (col) {
			var val = data[i][col.columnid];
			if (col.typeid) {
				if (
					col.typeid === 'STRING' ||
					col.typeid === 'VARCHAR' ||
					col.typeid === 'NVARCHAR' ||
					col.typeid === 'CHAR' ||
					col.typeid === 'NCHAR'
				) {
					val = "'" + escapeqq(val) + "'";
				}
			} else {
				if (typeof val == 'string') {
					val = "'" + escapeqq(val) + "'";
				}
			}
			return val;
		});
		s += ');\n';
	}
	//	if(filename === '') {
	//		res = s;
	//	} else {
	//		res = data.length;
	filename = alasql.utils.autoExtFilename(filename, 'sql', opts);
	res = alasql.utils.saveFile(filename, s);
	if (cb) {
		res = cb(res);
	}
	return res;
};

alasql.into.HTML = function (selector, opts, data, columns, cb) {
	var res = 1;
	if (typeof document !== 'object') {
		var opt = {headers: true};
		alasql.utils.extend(opt, opts);

		var sel = document.querySelector(selector);
		if (!sel) {
			throw new Error('Selected HTML element is not found');
		}

		if (columns.length === 0) {
			if (typeof data[0] === 'object') {
				columns = Object.keys(data[0]).map(function (columnid) {
					return {columnid: columnid};
				});
			} else {
				// What should I do?
				// columns = [{columnid:"_"}];
			}
		}

		var tbe = document.createElement('table');
		var thead = document.createElement('thead');
		tbe.appendChild(thead);
		if (opt.headers) {
			var tre = document.createElement('tr');
			for (var i = 0; i < columns.length; i++) {
				var the = document.createElement('th');
				the.textContent = columns[i].columnid;
				tre.appendChild(the);
			}
			thead.appendChild(tre);
		}

		var tbody = document.createElement('tbody');
		tbe.appendChild(tbody);
		for (var j = 0; j < data.length; j++) {
			var tre = document.createElement('tr');
			for (var i = 0; i < columns.length; i++) {
				var the = document.createElement('td');
				the.textContent = data[j][columns[i].columnid];
				tre.appendChild(the);
			}
			tbody.appendChild(tre);
		}
		alasql.utils.domEmptyChildren(sel);

		sel.appendChild(tbe);
	}
	if (cb) {
		res = cb(res);
	}
	return res;
};

alasql.into.JSON = function (filename, opts, data, columns, cb) {
	var res = 1;
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}
	var s = JSON.stringify(data);

	filename = alasql.utils.autoExtFilename(filename, 'json', opts);
	res = alasql.utils.saveFile(filename, s);
	if (cb) {
		res = cb(res);
	}
	return res;
};

alasql.into.TXT = function (filename, opts, data, columns, cb) {
	// If columns is empty
	if (columns.length === 0 && data.length > 0) {
		columns = Object.keys(data[0]).map(function (columnid) {
			return {columnid: columnid};
		});
	}
	// If one parameter
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}

	var res = data.length;
	var s = '';
	if (data.length > 0) {
		var key = columns[0].columnid;
		s += data
			.map(function (d) {
				return d[key];
			})
			.join('\n');
	}

	//	 } else {
	//		if(utils.isNode) {
	//			process.stdout.write(s);
	//		} else {

	//		};
	//	 }
	filename = alasql.utils.autoExtFilename(filename, 'txt', opts);
	res = alasql.utils.saveFile(filename, s);
	if (cb) {
		res = cb(res);
	}
	return res;
};

alasql.into.TAB = alasql.into.TSV = function (filename, opts, data, columns, cb) {
	var opt = {};
	alasql.utils.extend(opt, opts);
	opt.separator = '\t';
	filename = alasql.utils.autoExtFilename(filename, 'tab', opts);
	opt.autoExt = false;
	return alasql.into.CSV(filename, opt, data, columns, cb);
};

alasql.into.CSV = function (filename, opts, data, columns, cb) {
	if (columns.length === 0 && data.length > 0) {
		columns = Object.keys(data[0]).map(function (columnid) {
			return {columnid: columnid};
		});
	}
	if (typeof filename === 'object') {
		opts = filename;
		filename = undefined;
	}

	var opt = {headers: true};
	//opt.separator = ',';
	opt.separator = ';';
	opt.quote = '"';

	opt.utf8Bom = true;
	if (opts && !opts.headers && typeof opts.headers !== 'undefined') {
		opt.utf8Bom = false;
	}

	alasql.utils.extend(opt, opts);
	var res = data.length;
	var s = opt.utf8Bom ? '\ufeff' : '';
	if (opt.headers) {
		s +=
			opt.quote +
			columns
				.map(function (col) {
					return col.columnid.trim();
				})
				.join(opt.quote + opt.separator + opt.quote) +
			opt.quote +
			'\r\n';
	}

	data.forEach(function (d) {
		s +=
			columns
				.map(function (col) {
					var s = d[col.columnid];
					// escape the character wherever it appears in the field
					if (opt.quote !== '') {
						s = (s + '').replace(new RegExp('\\' + opt.quote, 'g'), opt.quote + opt.quote);
					}
					//			if((s+"").indexOf(opt.separator) > -1 || (s+"").indexOf(opt.quote) > -1) s = opt.quote + s + opt.quote;

					//Excel 2013 needs quotes around strings - thanks for _not_ complying with RFC for CSV
					if (+s != s) {
						// jshint ignore:line
						s = opt.quote + s + opt.quote;
					}

					return s;
				})
				.join(opt.separator) + '\r\n';
	});

	filename = alasql.utils.autoExtFilename(filename, 'csv', opts);
	res = alasql.utils.saveFile(filename, s, null, {disableAutoBom: true});
	if (cb) {
		res = cb(res);
	}
	return res;
};
//
// 831xl.js - Coloring Excel
// 18.04.2015
// Generate XLS file with colors and styles
// with Excel

alasql.into.XLS = function (filename, opts, data, columns, cb) {
	// If filename is not defined then output to the result
	if (typeof filename == 'object') {
		opts = filename;
		filename = undefined;
	}

	// Set sheets
	var sheets = {};
	if (opts && opts.sheets) {
		sheets = opts.sheets;
	}

	// Default sheet
	var sheet = {headers: true};
	if (typeof sheets['Sheet1'] != 'undefined') {
		sheet = sheets[0];
	} else {
		if (typeof opts != 'undefined') {
			sheet = opts;
		}
	}

	// Set sheet name and default is 'Sheet1'
	if (typeof sheet.sheetid == 'undefined') {
		sheet.sheetid = 'Sheet1';
	}

	var s = toHTML();

	// File is ready to save
	filename = alasql.utils.autoExtFilename(filename, 'xls', opts);
	var res = alasql.utils.saveFile(filename, s);
	if (cb) res = cb(res);
	return res;

	function toHTML() {
		// Generate prologue
		var s =
			'<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" \
		xmlns="http://www.w3.org/TR/REC-html40"><head> \
		<meta charset="utf-8" /> \
		<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets> ';

		// Worksheets
		s +=
			' <x:ExcelWorksheet><x:Name>' +
			sheet.sheetid +
			'</x:Name><x:WorksheetOptions><x:DisplayGridlines/>     </x:WorksheetOptions> \
		</x:ExcelWorksheet>';

		s += '</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';

		// Generate body
		s += '<body';
		if (typeof sheet.style != 'undefined') {
			s += ' style="';
			if (typeof sheet.style == 'function') {
				s += sheet.style(sheet);
			} else {
				s += sheet.style;
			}
			s += '"';
		}
		s += '>';
		s += '<table>';
		if (typeof sheet.caption != 'undefined') {
			var caption = sheet.caption;
			if (typeof caption == 'string') {
				caption = {title: caption};
			}
			s += '<caption';
			if (typeof caption.style != 'undefined') {
				s += ' style="';
				if (typeof caption.style == 'function') {
					s += caption.style(sheet, caption);
				} else {
					s += caption.style;
				}
				s += '" ';
			}
			s += '>';
			s += caption.title;
			s += '</caption>';
		}

		// Columns

		//		var columns = [];

		// If columns defined in sheet, then take them
		if (typeof sheet.columns != 'undefined') {
			columns = sheet.columns;
		} else {
			// Autogenerate columns if they are passed as parameters
			if (columns.length == 0 && data.length > 0) {
				if (typeof data[0] == 'object') {
					if (Array.isArray(data[0])) {
						columns = data[0].map(function (d, columnidx) {
							return {columnid: columnidx};
						});
					} else {
						columns = Object.keys(data[0]).map(function (columnid) {
							return {columnid: columnid};
						});
					}
				}
			}
		}

		// Prepare columns
		columns.forEach(function (column, columnidx) {
			if (typeof sheet.column != 'undefined') {
				extend(column, sheet.column);
			}

			if (typeof column.width == 'undefined') {
				if (sheet.column && sheet.column.width != 'undefined') {
					column.width = sheet.column.width;
				} else {
					column.width = '120px';
				}
			}
			if (typeof column.width == 'number') column.width = column.width + 'px';
			if (typeof column.columnid == 'undefined') column.columnid = columnidx;
			if (typeof column.title == 'undefined') column.title = '' + column.columnid.trim();
			if (sheet.headers && Array.isArray(sheet.headers)) column.title = sheet.headers[columnidx];
		});

		// Set columns widths
		s += '<colgroups>';
		columns.forEach(function (column) {
			s += '<col style="width: ' + column.width + '"></col>';
		});
		s += '</colgroups>';

		// Headers
		if (sheet.headers) {
			s += '<thead>';
			s += '<tr>';

			// TODO: Skip columns to body

			// Headers
			columns.forEach(function (column, columnidx) {
				s += '<th ';
				// Column style
				if (typeof column.style != 'undefined') {
					s += ' style="';
					if (typeof column.style == 'function') {
						s += column.style(sheet, column, columnidx);
					} else {
						s += column.style;
					}
					s += '" ';
				}
				s += '>';

				// Column title
				if (typeof column.title != 'undefined') {
					if (typeof column.title == 'function') {
						s += column.title(sheet, column, columnidx);
					} else {
						s += column.title;
					}
				}
				s += '</th>';
			});

			s += '</tr>';
			s += '</thead>';
		}

		s += '<tbody>';

		// TODO: Skip lines between header and body

		if (data && data.length > 0) {
			// TODO: Skip columns to body

			// Loop over data rows
			data.forEach(function (row, rowidx) {
				// Limit number of rows on the sheet
				if (rowidx > sheet.limit) return;
				// Create row
				s += '<tr';

				var srow = {};
				extend(srow, sheet.row);
				if (sheet.rows && sheet.rows[rowidx]) {
					extend(srow, sheet.rows[rowidx]);
				}
				// Row style fromdefault sheet
				if (typeof srow != 'undefined') {
					if (typeof srow.style != 'undefined') {
						s += ' style="';
						if (typeof srow.style == 'function') {
							s += srow.style(sheet, row, rowidx);
						} else {
							s += srow.style;
						}
						s += '" ';
					}
				}
				s += '>';
				// Loop over columns
				columns.forEach(function (column, columnidx) {
					// Parameters
					var cell = {};
					extend(cell, sheet.cell);
					extend(cell, srow.cell);
					if (typeof sheet.column != 'undefined') {
						extend(cell, sheet.column.cell);
					}
					extend(cell, column.cell);
					if (sheet.cells && sheet.cells[rowidx] && sheet.cells[rowidx][columnidx]) {
						extend(cell, sheet.cells[rowidx][columnidx]);
					}

					// Create value
					var value = row[column.columnid];
					if (typeof cell.value == 'function') {
						value = cell.value(value, sheet, row, column, cell, rowidx, columnidx);
					}

					// Define cell type
					var typeid = cell.typeid;
					if (typeof typeid == 'function') {
						typeid = typeid(value, sheet, row, column, cell, rowidx, columnidx);
					}

					if (typeof typeid == 'undefined') {
						if (typeof value == 'number') typeid = 'number';
						else if (typeof value == 'string') typeid = 'string';
						else if (typeof value == 'boolean') typeid = 'boolean';
						else if (typeof value == 'object') {
							if (value instanceof Date) typeid = 'date';
						}
					}

					var typestyle = '';

					if (typeid == 'money') {
						typestyle = 'mso-number-format:"\\#\\,\\#\\#0\\\\ _р_\\.";white-space:normal;';
					} else if (typeid == 'number') {
						typestyle = ' ';
					} else if (typeid == 'date') {
						typestyle = 'mso-number-format:"Short Date";';
					} else {
						// FOr other types is saved
						if (opts.types && opts.types[typeid] && opts.types[typeid].typestyle) {
							typestyle = opts.types[typeid].typestyle;
						}
					}

					// TODO Replace with extend...
					typestyle = typestyle || 'mso-number-format:"\\@";'; // Default type style

					s += "<td style='" + typestyle + "' ";
					if (typeof cell.style != 'undefined') {
						s += ' style="';
						if (typeof cell.style == 'function') {
							s += cell.style(value, sheet, row, column, rowidx, columnidx);
						} else {
							s += cell.style;
						}
						s += '" ';
					}
					s += '>';

					// TODO Replace with extend...
					var format = cell.format;
					if (typeof value == 'undefined') {
						s += '';
					} else if (typeof format != 'undefined') {
						if (typeof format == 'function') {
							s += format(value);
						} else if (typeof format == 'string') {
							s += value; // TODO - add string format
						} else {
							throw new Error('Unknown format type. Should be function or string');
						}
					} else {
						if (typeid == 'number' || typeid == 'date') {
							s += value.toString();
						} else if (typeid == 'money') {
							s += (+value).toFixed(2);
						} else {
							s += value;
						}
					}
					s += '</td>';
				});

				s += '</tr>';
			});
		}

		s += '</tbody>';

		// Generate epilogue
		s += '</table>';
		s += '</body>';
		s += '</html>';

		return s;
	}

	// Style function
	function style(a) {
		var s = ' style="';
		if (a && typeof a.style != 'undefined') {
			s += a.style + ';';
		}
		s += '" ';
		return s;
	}
};
alasql.into.XLSXML = function (filename, opts, data, columns, cb) {
	opts = opts || {};

	// If filename is not defined then output to the result
	if (typeof filename == 'object') {
		opts = filename;
		filename = undefined;
	}

	// Set sheets
	var sheets = {};
	var sheetsdata;
	var sheetscolumns;
	if (opts && opts.sheets) {
		sheets = opts.sheets;
		// data and columns are already an array for the sheets
		sheetsdata = data;
		sheetscolumns = columns;
	} else {
		sheets.Sheet1 = opts;
		// wrapd ata and columns array for single sheet
		sheetsdata = [data];
		sheetscolumns = [columns];
	}

	// File is ready to save
	filename = alasql.utils.autoExtFilename(filename, 'xls', opts);
	var res = alasql.utils.saveFile(filename, toXML());
	if (cb) res = cb(res);
	return res;

	function toXML() {
		var s1 =
			'<?xml version="1.0"?> \
		<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" \
		 xmlns:o="urn:schemas-microsoft-com:office:office" \
		 xmlns:x="urn:schemas-microsoft-com:office:excel" \
		 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" \
		 xmlns:html="http://www.w3.org/TR/REC-html40"> \
		 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> \
		 </DocumentProperties> \
		 <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> \
		  <AllowPNG/> \
		 </OfficeDocumentSettings> \
		 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> \
		  <ActiveSheet>0</ActiveSheet> \
		 </ExcelWorkbook> \
		 <Styles> \
		  <Style ss:ID="Default" ss:Name="Normal"> \
		   <Alignment ss:Vertical="Bottom"/> \
		   <Borders/> \
		   <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/> \
		   <Interior/> \
		   <NumberFormat/> \
		   <Protection/> \
		  </Style>';

		var s2 = ''; // for styles

		var s3 = ' </Styles>';

		var styles = {}; // hash based storage for styles
		var stylesn = 62; // First style

		// Generate style
		function hstyle(st) {
			// Prepare string
			var s = '';
			for (var key in st) {
				s += '<' + key;
				for (var attr in st[key]) {
					s += ' ';
					if (attr.substr(0, 2) == 'x:') {
						s += attr;
					} else {
						s += 'ss:';
					}
					s += attr + '=' + JSON.stringify(st[key][attr]);
				}
				s += '/>';
			}

			var hh = hash(s);
			// Store in hash
			if (styles[hh]) {
			} else {
				styles[hh] = {styleid: stylesn};
				s2 += `<Style ss:ID=${JSON.stringify('s' + stylesn)}>`;
				s2 += s.replace(/<\s*\/\s*Style /gi, '<');
				s2 += '</Style>';
				stylesn++;
			}
			return 's' + styles[hh].styleid;
		}

		function values(obj) {
			try {
				return Object.values(obj);
			} catch (e) {
				// support for older runtimes
				return Object.keys(obj).map(function (e) {
					return obj[e];
				});
			}
		}

		var sheetidx = 0;
		for (var sheetid in sheets) {
			var sheet = sheets[sheetid];
			var idx = typeof sheet.dataidx != 'undefined' ? sheet.dataidx : sheetidx++;
			var data = values(sheetsdata[idx]);
			// If columns defined in sheet, then take them
			var columns = undefined;
			if (typeof sheet.columns != 'undefined') {
				columns = sheet.columns;
			} else {
				// Autogenerate columns if they are passed as parameters
				columns = sheetscolumns[idx];
				if (columns === undefined || (columns.length == 0 && data.length > 0)) {
					if (typeof data[0] == 'object') {
						if (Array.isArray(data[0])) {
							columns = data[0].map(function (d, columnidx) {
								return {columnid: columnidx};
							});
						} else {
							columns = Object.keys(data[0]).map(function (columnid) {
								return {columnid: columnid};
							});
						}
					}
				}
			}

			// Prepare columns
			columns.forEach(function (column, columnidx) {
				if (typeof sheet.column != 'undefined') {
					extend(column, sheet.column);
				}

				if (typeof column.width == 'undefined') {
					if (sheet.column && typeof sheet.column.width != 'undefined') {
						column.width = sheet.column.width;
					} else {
						column.width = 120;
					}
				}
				if (typeof column.width == 'number') column.width = column.width;
				if (typeof column.columnid == 'undefined') column.columnid = columnidx;
				if (typeof column.title == 'undefined') column.title = '' + column.columnid.trim();
				if (sheet.headers && Array.isArray(sheet.headers)) column.title = sheet.headers[columnidx];
			});

			// Header
			s3 +=
				'<Worksheet ss:Name=' +
				JSON.stringify(sheetid) +
				'> \
	  			<Table ss:ExpandedColumnCount="' +
				columns.length +
				'" ss:ExpandedRowCount="' +
				((sheet.headers ? 1 : 0) + Math.min(data.length, sheet.limit || data.length)) +
				'" x:FullColumns="1" \
	   			x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">';

			columns.forEach(function (column, columnidx) {
				s3 += `
					<Column 
						ss:Index="${columnidx + 1}" 
						ss:AutoFitWidth="0" 
						ss:Width=${JSON.stringify('' + column.width)}
					/>`;
			});

			// Headers
			if (sheet.headers) {
				s3 += '<Row ss:AutoFitHeight="0">';

				// TODO: Skip columns to body

				// Headers
				columns.forEach(function (column, columnidx) {
					s3 += '<Cell ';

					if (typeof column.style != 'undefined') {
						var st = {};
						if (typeof column.style == 'function') {
							extend(st, column.style(sheet, column, columnidx));
						} else {
							extend(st, column.style);
						}
						s3 += 'ss:StyleID=' + JSON.stringify(hstyle(st));
					}

					s3 += '><Data ss:Type="String">';

					// Column title
					if (typeof column.title != 'undefined') {
						if (typeof column.title == 'function') {
							s3 += column.title(sheet, column, columnidx);
						} else {
							s3 += column.title;
						}
					}
					s3 += '</Data></Cell>';
				});

				s3 += '</Row>';
			}

			// Data
			if (data && data.length > 0) {
				// Loop over data rows
				data.forEach(function (row, rowidx) {
					// Limit number of rows on the sheet
					if (rowidx > sheet.limit) return;

					// Extend row properties
					var srow = {};
					extend(srow, sheet.row);
					if (sheet.rows && sheet.rows[rowidx]) {
						extend(srow, sheet.rows[rowidx]);
					}

					s3 += '<Row ';

					// Row style fromdefault sheet
					if (typeof srow != 'undefined') {
						var st = {};
						if (typeof srow.style != 'undefined') {
							if (typeof srow.style == 'function') {
								extend(st, srow.style(sheet, row, rowidx));
							} else {
								extend(st, srow.style);
							}
							s3 += 'ss:StyleID=' + JSON.stringify(hstyle(st));
						}
					}

					s3 += '>'; //'ss:AutoFitHeight="0">'

					// Data
					columns.forEach(function (column, columnidx) {
						// Parameters
						var cell = {};
						extend(cell, sheet.cell);
						extend(cell, srow.cell);
						if (typeof sheet.column != 'undefined') {
							extend(cell, sheet.column.cell);
						}
						extend(cell, column.cell);
						if (sheet.cells && sheet.cells[rowidx] && sheet.cells[rowidx][columnidx]) {
							extend(cell, sheet.cells[rowidx][columnidx]);
						}

						// Create value
						var value = row[column.columnid];
						if (typeof cell.value == 'function') {
							value = cell.value(value, sheet, row, column, cell, rowidx, columnidx);
						}

						// Define cell type
						var typeid = cell.typeid;
						if (typeof typeid == 'function') {
							typeid = typeid(value, sheet, row, column, cell, rowidx, columnidx);
						}

						if (typeof typeid == 'undefined') {
							if (typeof value == 'number') typeid = 'number';
							else if (typeof value == 'string') typeid = 'string';
							else if (typeof value == 'boolean') typeid = 'boolean';
							else if (typeof value == 'object') {
								if (value instanceof Date) typeid = 'date';
							}
						}

						var Type = 'String';
						if (typeid == 'number') Type = 'Number';
						else if (typeid == 'date') Type = 'Date';
						// TODO: What else?

						// Prepare Data types styles
						var typestyle = '';

						if (typeid == 'money') {
							typestyle = 'mso-number-format:"\\#\\,\\#\\#0\\\\ _р_\\.";white-space:normal;';
						} else if (typeid == 'number') {
							typestyle = ' ';
						} else if (typeid == 'date') {
							typestyle = 'mso-number-format:"Short Date";';
						} else {
							// For other types is saved
							if (opts.types && opts.types[typeid] && opts.types[typeid].typestyle) {
								typestyle = opts.types[typeid].typestyle;
							}
						}

						// TODO Replace with extend...
						typestyle = typestyle || 'mso-number-format:"\\@";'; // Default type style

						s3 += '<Cell ';
						// Row style fromdefault sheet
						var st = {};
						if (typeof cell.style != 'undefined') {
							if (typeof cell.style == 'function') {
								extend(st, cell.style(value, sheet, row, column, rowidx, columnidx));
							} else {
								extend(st, cell.style);
							}
							s3 += 'ss:StyleID=' + JSON.stringify(hstyle(st));
						}

						s3 += '>';

						s3 += '<Data ss:Type=' + JSON.stringify(Type) + '>';

						// TODO Replace with extend...
						var format = cell.format;
						if (typeof value == 'undefined') {
							s3 += '';
						} else if (typeof format != 'undefined') {
							if (typeof format == 'function') {
								s3 += format(value);
							} else if (typeof format == 'string') {
								s3 += value; // TODO - add string format
							} else {
								throw new Error('Unknown format type. Should be function or string');
							}
						} else {
							if (typeid == 'number' || typeid == 'date') {
								s3 += value.toString();
							} else if (typeid == 'money') {
								s3 += (+value).toFixed(2);
							} else {
								s3 += value;
							}
						}

						//			    		s3 += row[column.columnid];
						s3 += '</Data></Cell>';
					});

					s3 += '</Row>';
				});
			}
			// Finish
			s3 += '</Table></Worksheet>';
		}

		s3 += '</Workbook>';

		return s1 + s2 + s3;
	}
};
/**
	Export to XLSX function
	@function
	@param {string|object} filename Filename or options
	@param {object|undefined} opts Options or undefined
	@param {array} data Data
	@param {array} columns Columns
	@parab {callback} cb Callback function
	@return {number} Number of files processed
*/

alasql.into.XLSX = function (filename, opts, data, columns, cb) {
	/** @type {number} result */
	var res = 1;
	opts = opts || {};

	if (deepEqual(columns, [{columnid: '_'}])) {
		data = data.map(function (dat) {
			return dat._;
		});
		columns = undefined;
		//		res = [{_:1}];
	} else {
		//		data = data1;
	}

	filename = alasql.utils.autoExtFilename(filename, 'xlsx', opts);

	var XLSX = getXLSX();

	/* If called without filename, use opts */
	if (typeof filename == 'object') {
		// todo: check if data, clumns and cb also should be shifted.
		opts = filename;
		filename = undefined;
	}

	/** @type {object} Workbook */
	var wb = {SheetNames: [], Sheets: {}};

	// ToDo: check if cb must be treated differently here
	if (opts.sourcefilename) {
		alasql.utils.loadBinaryFile(opts.sourcefilename, !!cb, function (data) {
			wb = XLSX.read(data, {type: 'binary', ...alasql.options.excel, ...opts});
			doExport();
		});
	} else {
		doExport();
	}

	/* Return result */
	if (cb) res = cb(res);
	return res;

	/**
		Export workbook
		@function
	*/
	function doExport() {
		/*
			If opts is array of arrays then this is a
			multisheet workboook, else it is a singlesheet
		*/
		if (typeof opts == 'object' && Array.isArray(opts)) {
			if (data && data.length > 0) {
				data.forEach(function (dat, idx) {
					prepareSheet(opts[idx], dat, undefined, idx + 1);
				});
			}
		} else {
			prepareSheet(opts, data, columns, 1);
		}

		saveWorkbook(cb);
	}

	/**
		Prepare sheet
		@params {object} opts
		@params {array|object} data
		@params {array} columns Columns
	*/
	function prepareSheet(opts, data, columns, idx) {
		/** Default options for sheet */
		var opt = {sheetid: 'Sheet ' + idx, headers: true};
		alasql.utils.extend(opt, opts);

		var dataLength = Object.keys(data).length;

		// Generate columns if they are not defined
		if (!columns || columns.length == 0) {
			if (dataLength > 0) {
				columns = Object.keys(data[0]).map(function (columnid) {
					return {columnid: columnid};
				});
			} else {
				columns = [];
			}
		}

		var cells = {};

		if (wb.SheetNames.indexOf(opt.sheetid) > -1) {
			cells = wb.Sheets[opt.sheetid];
		} else {
			wb.SheetNames.push(opt.sheetid);
			wb.Sheets[opt.sheetid] = {};
			cells = wb.Sheets[opt.sheetid];
		}

		var range = 'A1';
		if (opt.range) range = opt.range;

		var col0 = alasql.utils.xlscn(range.match(/[A-Z]+/)[0]);
		var row0 = +range.match(/[0-9]+/)[0] - 1;

		if (wb.Sheets[opt.sheetid]['!ref']) {
			var rangem = wb.Sheets[opt.sheetid]['!ref'];
			var colm = alasql.utils.xlscn(rangem.match(/[A-Z]+/)[0]);
			var rowm = +rangem.match(/[0-9]+/)[0] - 1;
		} else {
			var colm = 1,
				rowm = 1;
		}
		var zeroColumnFix = columns.length ? 0 : 1;
		var colmax = Math.max(col0 + columns.length - 1 + zeroColumnFix, colm);
		var rowmax = Math.max(row0 + dataLength + 2, rowm);

		var i = row0 + 1;

		wb.Sheets[opt.sheetid]['!ref'] = 'A1:' + alasql.utils.xlsnc(colmax) + rowmax;
		//		var i = 1;

		if (opt.headers) {
			columns.forEach(function (col, idx) {
				cells[alasql.utils.xlsnc(col0 + idx) + '' + i] = {
					v: col.columnid.trim(),
				};
			});
			i++;
		}

		for (var j = 0; j < dataLength; j++) {
			columns.forEach(function (col, idx) {
				var cell = {v: data[j][col.columnid]};
				if (typeof data[j][col.columnid] == 'number') {
					cell.t = 'n';
				} else if (typeof data[j][col.columnid] == 'string') {
					cell.t = 's';
				} else if (typeof data[j][col.columnid] == 'boolean') {
					cell.t = 'b';
				} else if (typeof data[j][col.columnid] == 'object') {
					if (data[j][col.columnid] instanceof Date) {
						cell.t = 'd';
					}
				}
				cells[alasql.utils.xlsnc(col0 + idx) + '' + i] = cell;
			});
			i++;
		}
	}

	/**
		Save Workbook
		@params {array} wb Workbook
		@params {callback} cb Callback
	*/
	function saveWorkbook(cb) {

		var XLSX;

		if (typeof filename == 'undefined') {
			res = wb;
		} else {
			XLSX = getXLSX();

			if (utils.isNode || utils.isMeteorServer) {
				XLSX.writeFile(wb, filename);
			} else {
				var wopts = {bookType: 'xlsx', bookSST: false, type: 'binary'};
				var wbout = XLSX.write(wb, wopts);

				var s2ab = function (s) {
					var buf = new ArrayBuffer(s.length);
					var view = new Uint8Array(buf);
					for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
					return buf;
				};

				saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), filename);
			}
		}

	}
};
/*
//
// FROM functions Alasql.js
// Date: 11.12.2014
// (c) 2014, Andrey Gershun
//
*/

/**
 Meteor
 */

/* global alasql Tabletop document Event */

alasql.from.METEOR = function (filename, opts, cb, idx, query) {
	var res = filename.find(opts).fetch();
	if (cb) res = cb(res, idx, query);

	return res;
};

/**
 Google Spreadsheet reader
 */
alasql.from.TABLETOP = function (key, opts, cb, idx, query) {
	var res = [];

	var opt = {headers: true, simpleSheet: true, key: key};
	alasql.utils.extend(opt, opts);
	opt.callback = function (data) {
		res = data;
		if (cb) res = cb(res, idx, query);
	};

	Tabletop.init(opt);
	return null;
};

alasql.from.HTML = function (selector, opts, cb, idx, query) {
	var opt = {};
	alasql.utils.extend(opt, opts);

	var sel = document.querySelector(selector);
	if (!sel && sel.tagName !== 'TABLE') {
		throw new Error('Selected HTML element is not a TABLE');
	}

	var res = [];
	var headers = opt.headers;

	if (headers && !Array.isArray(headers)) {
		headers = [];
		var ths = sel.querySelector('thead tr').children;
		for (var i = 0; i < ths.length; i++) {
			if (!(ths.item(i).style && ths.item(i).style.display === 'none' && opt.skipdisplaynone)) {
				headers.push(ths.item(i).textContent);
			} else {
				headers.push(undefined);
			}
		}
	}

	var trs = sel.querySelectorAll('tbody tr');

	for (var j = 0; j < trs.length; j++) {
		var tds = trs.item(j).children;
		var r = {};
		for (i = 0; i < tds.length; i++) {
			if (!(tds.item(i).style && tds.item(i).style.display === 'none' && opt.skipdisplaynone)) {
				if (headers) {
					r[headers[i]] = tds.item(i).textContent;
				} else {
					r[i] = tds.item(i).textContent;

				}
			}
		}
		res.push(r);
	}

	if (cb) {
		res = cb(res, idx, query);
	}
	return res;
};

alasql.from.RANGE = function (start, finish, cb, idx, query) {
	var res = [];
	for (var i = start; i <= finish; i++) {
		res.push(i);
	}
	//	res = new alasql.Recordset({data:res,columns:{columnid:'_'}});
	if (cb) {
		res = cb(res, idx, query);
	}
	return res;
};

// Read data from any file
alasql.from.FILE = function (filename, opts, cb, idx, query) {
	var fname;
	if (typeof filename === 'string') {
		fname = filename;
	} else if (filename instanceof Event) {
		fname = filename.target.files[0].name;
	} else {
		throw new Error('Wrong usage of FILE() function');
	}

	var parts = fname.split('.');
	var ext = parts[parts.length - 1].toUpperCase();
	if (alasql.from[ext]) {
		return alasql.from[ext](filename, opts, cb, idx, query);
	} else {
		throw new Error('Cannot recognize file type for loading');
	}
};

// Read JSON file

alasql.from.JSON = function (filename, opts, cb, idx, query) {
	var res;

	filename = alasql.utils.autoExtFilename(filename, 'json', opts);
	alasql.utils.loadFile(filename, !!cb, function (data) {

		//		res = [{a:1}];
		res = JSON.parse(data);
		if (cb) {
			res = cb(res, idx, query);
		}
	}),
		err => {
			throw new Error(err);
		};
	return res;
};

const jsonl = ext => {
	return function (filename, opts, cb, idx, query) {
		let out = [];
		filename = alasql.utils.autoExtFilename(filename, ext, opts);
		alasql.utils.loadFile(
			filename,
			!!cb,
			function (data) {
				data.split(/\r?\n/).forEach((line, ix) => {
					const trimmed = line.trim();
					if (trimmed !== '') {
						// skip empty lines, we do not use filter on an input, as we want to preserve line numbers
						try {
							out.push(JSON.parse(trimmed));
						} catch (e) {
							throw new Error(`Could not parse JSON at line ${ix}: ${e.toString()}`);
						}
					}
				});
				if (cb) {
					res = cb(out, idx, query);
				}
			},
			err => {
				throw new Error(err);
			}
		);
		return out;
	};
};

alasql.from.JSONL = jsonl('jsonl');
alasql.from.NDJSON = jsonl('ndjson');

alasql.from.TXT = function (filename, opts, cb, idx, query) {
	var res;
	filename = alasql.utils.autoExtFilename(filename, 'txt', opts);
	alasql.utils.loadFile(filename, !!cb, function (data) {
		res = data.split(/\r?\n/);

		// Remove last line if empty
		if (res[res.length - 1] === '') {
			res.pop();
		}
		for (var i = 0, ilen = res.length; i < ilen; i++) {
			// Please avoid '===' here
			if (res[i] == +res[i]) {
				// eslint:ignore
				// jshint ignore:line
				res[i] = +res[i];
			}
			res[i] = [res[i]];
		}
		if (cb) {
			res = cb(res, idx, query);
		}
	});
	return res;
};

alasql.from.TAB = alasql.from.TSV = function (filename, opts, cb, idx, query) {
	opts = opts || {};
	opts.separator = '\t';
	filename = alasql.utils.autoExtFilename(filename, 'tab', opts);
	opts.autoext = false;
	return alasql.from.CSV(filename, opts, cb, idx, query);
};

alasql.from.CSV = function (contents, opts, cb, idx, query) {
	contents = '' + contents;
	var opt = {
		separator: ',',
		quote: '"',
		headers: true,
		raw: false,
	};
	alasql.utils.extend(opt, opts);
	var res;
	var hs = [];
	function parseText(text) {
		var delimiterCode = opt.separator.charCodeAt(0);
		var quoteCode = opt.quote.charCodeAt(0);

		var EOL = {},
			EOF = {},
			rows = [],
			N = text.length,
			I = 0,
			n = 0,
			t,
			eol;
		function token() {
			if (I >= N) {
				return EOF;
			}
			if (eol) {
				return (eol = false), EOL;
			}
			var j = I;
			if (text.charCodeAt(j) === quoteCode) {
				var i = j;
				while (i++ < N) {
					if (text.charCodeAt(i) === quoteCode) {
						if (text.charCodeAt(i + 1) !== quoteCode) {
							break;
						}
						++i;
					}
				}
				I = i + 2;
				var c = text.charCodeAt(i + 1);
				if (c === 13) {
					eol = true;
					if (text.charCodeAt(i + 2) === 10) {
						++I;
					}
				} else if (c === 10) {
					eol = true;
				}
				return text.substring(j + 1, i).replace(/""/g, '"');
			}
			while (I < N) {
				var c = text.charCodeAt(I++),
					k = 1;
				if (c === 10) {
					eol = true;
				} else if (c === 13) {
					eol = true;
					if (text.charCodeAt(I) === 10) {
						++I;
						++k;
					}
				} else if (c !== delimiterCode) {
					continue;
				}
				return text.substring(j, I - k);
			}
			return text.substring(j);
		}

		while ((t = token()) !== EOF) {
			var a = [];
			while (t !== EOL && t !== EOF) {
				a.push(t.trim());
				t = token();
			}

			if (opt.headers) {
				if (n === 0) {
					if (typeof opt.headers === 'boolean') {
						hs = a;
					} else if (Array.isArray(opt.headers)) {
						hs = opt.headers;
						var r = {};
						hs.forEach(function (h, idx) {
							r[h] = a[idx];
							// Please avoid === here
							if (
								!opt.raw &&
								typeof r[h] !== 'undefined' &&
								r[h].length !== 0 &&
								r[h].trim() == +r[h]
							) {
								// jshint ignore:line
								r[h] = +r[h];
							}
						});
						rows.push(r);
					}
				} else {
					var r = {};
					hs.forEach(function (h, idx) {
						r[h] = a[idx];
						if (
							!opt.raw &&
							typeof r[h] !== 'undefined' &&
							r[h].length !== 0 &&
							r[h].trim() == +r[h]
						) {
							// jshint ignore:line
							r[h] = +r[h];
						}
					});
					rows.push(r);
				}
				n++;
			} else {
				var r = {};
				// different bug here, if headers are not defined, the numerical values will not be parsed
				a.forEach(function (v, idx) {
					r[idx] = a[idx];
					if (
						!opt.raw &&
						typeof r[idx] !== 'undefined' &&
						r[idx].length !== 0 &&
						r[idx].trim() == +r[idx]
					) {
						// jshint ignore:line
						r[idx] = +r[idx];
					}
				});
				rows.push(r);
			}
		}

		res = rows;

		if (opt.headers) {
			if (query && query.sources && query.sources[idx]) {
				var columns = (query.sources[idx].columns = []);
				hs.forEach(function (h) {
					columns.push({columnid: h});
				});
			}
		}

		if (cb) {
			res = cb(res, idx, query);
		}
	}
	if (new RegExp('\n').test(contents)) {
		parseText(contents);
	} else {
		contents = alasql.utils.autoExtFilename(contents, 'csv', opts);
		alasql.utils.loadFile(contents, !!cb, parseText, e => query.cb(null, e));
	}
	return res;
};

function XLSXLSX(X, filename, opts, cb, idx, query) {
	var opt = {};
	opts = opts || {};
	alasql.utils.extend(opt, opts);
	if (typeof opt.headers === 'undefined') {
		opt.headers = true;
	}
	var res;

	/**
	 * see https://github.com/SheetJS/js-xlsx/blob/5ae6b1965bfe3764656a96f536b356cd1586fec7/README.md
	 * for example of using readAsArrayBuffer under `Parsing Workbooks`
	 */
	function fixdata(data) {
		var o = '',
			l = 0,
			w = 10240;
		for (; l < data.byteLength / w; ++l)
			o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
		o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
		return o;
	}
	function getHeaderText(text) {
		// if casesensitive option is set to false and there is a text value return lowercase value of text
		if (text && alasql.options.casesensitive === false) {
			return text.toLowerCase();
		} else {
			return text;
		}
	}
	filename = alasql.utils.autoExtFilename(filename, 'xls', opts);
	alasql.utils.loadBinaryFile(
		filename,
		!!cb,
		function (data) {
			//	function processData(data) {
			if (data instanceof ArrayBuffer) {
				var arr = fixdata(data);
				var workbook = X.read(btoa(arr), {
					type: 'base64',
					...alasql.options.excel,
					...opts,
				});
			} else {
				var workbook = X.read(data, {
					type: 'binary',
					...alasql.options.excel,
					...opts,
				});
			}

			var sheetid;
			if (typeof opt.sheetid === 'undefined') {
				sheetid = workbook.SheetNames[0];
			} else if (typeof opt.sheetid === 'number') {
				sheetid = workbook.SheetNames[opt.sheetid];
			} else {
				sheetid = opt.sheetid;
			}
			var range;
			var res = [];
			if (typeof opt.range === 'undefined') {
				range = workbook.Sheets[sheetid]['!ref'];
			} else {
				range = opt.range;
				if (workbook.Sheets[sheetid][range]) {
					range = workbook.Sheets[sheetid][range];
				}
			}
			// if range has some value then data is present in the current sheet
			// else current sheet is empty
			if (range) {
				var rg = range.split(':');
				var col0 = rg[0].match(/[A-Z]+/)[0];
				var row0 = +rg[0].match(/[0-9]+/)[0];
				var col1 = rg[1].match(/[A-Z]+/)[0];
				var row1 = +rg[1].match(/[0-9]+/)[0];

				var hh = {};
				var xlscnCol0 = alasql.utils.xlscn(col0);
				var xlscnCol1 = alasql.utils.xlscn(col1);
				for (var j = xlscnCol0; j <= xlscnCol1; j++) {
					var col = alasql.utils.xlsnc(j);
					if (opt.headers) {
						if (workbook.Sheets[sheetid][col + '' + row0]) {
							hh[col] = getHeaderText(workbook.Sheets[sheetid][col + '' + row0].v);
						} else {
							hh[col] = getHeaderText(col);
						}
					} else {
						hh[col] = col;
					}
				}
				if (opt.headers) {
					row0++;
				}
				for (var i = row0; i <= row1; i++) {
					var row = {};
					for (var j = xlscnCol0; j <= xlscnCol1; j++) {
						var col = alasql.utils.xlsnc(j);
						if (workbook.Sheets[sheetid][col + '' + i]) {
							row[hh[col]] = workbook.Sheets[sheetid][col + '' + i].v;
						}
					}
					res.push(row);
				}
			} else {
				res.push([]);
			}

			// Remove last empty line (issue #548)
			if (res.length > 0 && res[res.length - 1] && Object.keys(res[res.length - 1]).length == 0) {
				res.pop();
			}

			if (cb) {
				res = cb(res, idx, query);
			}
		},
		function (err) {
			if(query && query.cb) {
				query.cb(null, err);
				return;
			}
			throw err;
		}
	);

	return res;
}

alasql.from.XLS = function (filename, opts, cb, idx, query) {
	opts = opts || {};
	filename = alasql.utils.autoExtFilename(filename, 'xls', opts);
	opts.autoExt = false;
	return XLSXLSX(getXLSX(), filename, opts, cb, idx, query);
};

alasql.from.XLSX = function (filename, opts, cb, idx, query) {
	opts = opts || {};
	filename = alasql.utils.autoExtFilename(filename, 'xlsx', opts);
	opts.autoExt = false;
	return XLSXLSX(getXLSX(), filename, opts, cb, idx, query);
};

alasql.from.ODS = function (filename, opts, cb, idx, query) {
	opts = opts || {};
	filename = alasql.utils.autoExtFilename(filename, 'ods', opts);
	opts.autoExt = false;
	return XLSXLSX(getXLSX(), filename, opts, cb, idx, query);
};
alasql.from.XML = function (filename, opts, cb, idx, query) {
	var res;

	alasql.utils.loadFile(filename, !!cb, function (data) {

		//    res = [{a:1}];

		res = xmlparse(data).root;

		if (cb) res = cb(res, idx, query);
	});
	return res;
};

/**
 * Parse the given string of `xml`.
 *
 * @param {String} xml
 * @return {Object}
 * @api public
 */

function xmlparse(xml) {
	xml = xml.trim();

	// strip comments
	xml = xml.replace(/<!--[\s\S]*?-->/g, '');

	return document();

	/**
	 * XML document.
	 */

	function document() {
		return {
			declaration: declaration(),
			root: tag(),
		};
	}

	/**
	 * Declaration.
	 */

	function declaration() {
		var m = match(/^<\?xml\s*/);
		if (!m) return;

		// tag
		var node = {
			attributes: {},
		};

		// attributes
		while (!(eos() || is('?>'))) {
			var attr = attribute();
			if (!attr) return node;
			node.attributes[attr.name] = attr.value;
		}

		match(/\?>\s*/);

		return node;
	}

	/**
	 * Tag.
	 */

	function tag() {
		var m = match(/^<([\w-:.]+)\s*/);
		if (!m) return;

		// name
		var node = {
			name: m[1],
			attributes: {},
			children: [],
		};

		// attributes
		while (!(eos() || is('>') || is('?>') || is('/>'))) {
			var attr = attribute();
			if (!attr) return node;
			node.attributes[attr.name] = attr.value;
		}

		// self closing tag
		if (match(/^\s*\/>\s*/)) {
			return node;
		}

		match(/\??>\s*/);

		// content
		node.content = content();

		// children
		var child;
		while ((child = tag())) {
			node.children.push(child);
		}

		// closing
		match(/^<\/[\w-:.]+>\s*/);

		return node;
	}

	/**
	 * Text content.
	 */

	function content() {
		var m = match(/^([^<]*)/);
		if (m) return m[1];
		return '';
	}

	/**
	 * Attribute.
	 */

	function attribute() {
		var m = match(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/);
		if (!m) return;
		return {name: m[1], value: strip(m[2])};
	}

	/**
	 * Strip quotes from `val`.
	 */

	function strip(val) {
		return val.replace(/^['"]|['"]$/g, '');
	}

	/**
	 * Match `re` and advance the string.
	 */

	function match(re) {
		var m = xml.match(re);
		if (!m) return;
		xml = xml.slice(m[0].length);
		return m;
	}

	/**
	 * End-of-source.
	 */

	function eos() {
		return 0 == xml.length;
	}

	/**
	 * Check for `prefix`.
	 */

	function is(prefix) {
		return 0 == xml.indexOf(prefix);
	}
}
alasql.from.GEXF = function (filename, opts, cb, idx, query) {
	var res;
	alasql('SEARCH FROM XML(' + filename + ')', [], function (data) {
		res = data;

		if (cb) res = cb(res);
	});
	return res;
};
/*
//
// HELP for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* globals: alasql, yy */

/**
	Print statement
	@class
	@param {object} params Initial setup properties
*/

/* global alasql, yy */

yy.Print = function (params) {
	return Object.assign(this, params);
};

/**
	Generate SQL string
	@this Print statement object
*/
yy.Print.prototype.toString = function () {
	var s = 'PRINT';
	if (this.statement) s += ' ' + this.statement.toString();
	return s;
};

/**
 	Print result of select statement or expression
 	@param {string} databaseid Database identificator
 	@param {object} params Query parameters
 	@param {statement-callback} cb Callback function
	@this Print statement object
*/
yy.Print.prototype.execute = function (databaseid, params, cb) {

	var self = this;
	var res = 1;

	alasql.precompile(this, databaseid, params); /** @todo Change from alasql to this */

	if (this.exprs && this.exprs.length > 0) {
		var rs = this.exprs.map(function (expr) {

			var exprfn = new Function(
				'params,alasql,p',
				'var y;return ' + expr.toJS('({})', '', null)
			).bind(self);
			var r = exprfn(params, alasql);
			return JSONtoString(r);
		});
		console.log.apply(console, rs);
	} else if (this.select) {
		var r = this.select.execute(databaseid, params);
		console.log(JSONtoString(r));
	} else {
		console.log();
	}

	if (cb) res = cb(res);
	return res;
};
/*
//
// HELP for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Source = function (params) {
	return Object.assign(this, params);
};
yy.Source.prototype.toString = function () {
	var s = 'SOURCE';
	if (this.url) s += " '" + this.url + " '";
	return s;
};

// SOURCE FILE
yy.Source.prototype.execute = function (databaseid, params, cb) {
	var res;
	loadFile(
		this.url,
		!!cb,
		function (data) {
			res = alasql(data);
			if (cb) res = cb(res);
			return res;
		},
		function (err) {
			throw err;
		}
	);
	return res;
};
/*
//
// HELP for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

/* global alasql, yy */

yy.Require = function (params) {
	return Object.assign(this, params);
};
yy.Require.prototype.toString = function () {
	var s = 'REQUIRE';
	if (this.paths && this.paths.length > 0) {
		s += this.paths
			.map(function (path) {
				return path.toString();
			})
			.join(',');
	}
	if (this.plugins && this.plugins.length > 0) {
		s += this.plugins
			.map(function (plugin) {
				return plugin.toUpperCase();
			})
			.join(',');
	}
	return s;
};

/**
 Attach plug-in for Alasql
 */
yy.Require.prototype.execute = function (databaseid, params, cb) {
	var self = this;
	var res = 0;
	var ss = '';
	if (this.paths && this.paths.length > 0) {
		this.paths.forEach(function (path) {
			loadFile(path.value, !!cb, function (data) {
				res++;
				ss += data;
				if (res < self.paths.length) return;
				new Function('params,alasql', ss)(params, alasql);
				if (cb) res = cb(res);
			});
		});
	} else if (this.plugins && this.plugins.length > 0) {
		this.plugins.forEach(function (plugin) {
			// If plugin is not loaded already
			if (!alasql.plugins[plugin]) {
				loadFile(alasql.path + '/alasql-' + plugin.toLowerCase() + '.js', !!cb, function (data) {
					// Execute all plugins at the same time
					res++;
					ss += data;
					if (res < self.plugins.length) return;
					new Function('params,alasql', ss)(params, alasql);
					alasql.plugins[plugin] = true; // Plugin is loaded
					if (cb) res = cb(res);
				});
			}
		});
	} else {
		if (cb) res = cb(res);
	}
	return res;
};
/*
//
// HELP for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

yy.Assert = function (params) {
	return Object.assign(this, params);
};
yy.Source.prototype.toString = function () {
	var s = 'ASSERT';
	if (this.value) s += ' ' + JSON.stringify(this.value);
	return s;
};

// SOURCE FILE
yy.Assert.prototype.execute = function (databaseid) {
	if (!deepEqual(alasql.res, this.value)) {
		throw new Error(
			(this.message || 'Assert wrong') +
				': ' +
				JSON.stringify(alasql.res) +
				' == ' +
				JSON.stringify(this.value)
		);
	}
	return 1;
};
//
// 91indexeddb.js
// AlaSQL IndexedDB module
// Date: 18.04.2015
// (c) Andrey Gershun
//

/* global alasql, yy, utils*/

var IDB = (alasql.engines.INDEXEDDB = function () {
	'';
});

/**
 * @param {string} name
 * @returns {Promise<{name: string, version: number}|0>}
 */
async function _databaseExists(name) {
	const indexedDB = globalThis.indexedDB;

	if (!indexedDB) {
		throw new Error('IndexedDB is not supported in this browser');
	}

	if (indexedDB.databases) {
		const dbs = await indexedDB.databases();
		const db = dbs.find(db => db.name === name);
		// @ts-ignore
		return db || 0;
	}

	// Try if it exist
	const req = indexedDB.open(name);

	return new Promise(function (resolve, reject) {
		req.onsuccess = () => {
			req.result.close();
			resolve({name, version: req.result.version});
		};

		req.onupgradeneeded = evt => {
			evt.target.transaction.abort();
			resolve(0);
		};

		req.onerror = () => {
			reject(new Error('IndexedDB error'));
		};

		req.onblocked = () => {
			resolve({name, version: req.result.version});
		};
	});
}

//
// SHOW DATABASES
// work only in chrome
//
IDB.showDatabases = function (like, cb) {
	if (!indexedDB.databases) {
		cb(null, new Error('SHOW DATABASE is not supported in this browser'));
		return;
	}

	indexedDB.databases().then(dblist => {
		const res = [];
		const relike = like && new RegExp(like.value.replace(/\%/g, '.*'), 'g');

		for (var i = 0; i < dblist.length; i++) {
			if (!like || dblist[i].name.match(relike)) {
				res.push({databaseid: dblist[i].name});
			}
		}

		cb(res);
	});
};

IDB.createDatabase = async function (ixdbid, args, ifnotexists, dbid, cb) {
	const found = await _databaseExists(ixdbid).catch(err => {
		if (cb) cb(null, err);
		throw err;
	});

	if (found) {
		if (ifnotexists) {
			cb && cb(0);
		} else {
			const err = new Error(
				`IndexedDB: Cannot create new database "${ixdbid}" because it already exists`
			);
			if (cb) cb(null, err);
		}
	} else {
		const request = indexedDB.open(ixdbid, 1);
		request.onsuccess = () => {
			request.result.close();
			cb(1);
		};
	}
};

IDB.dropDatabase = async function (ixdbid, ifexists, cb) {
	const found = await _databaseExists(ixdbid).catch(err => {
		if (cb) cb(null, err);
		throw err;
	});

	if (found) {
		const request = indexedDB.deleteDatabase(ixdbid);
		request.onsuccess = () => {
			if (cb) cb(1);
		};
	} else {
		if (ifexists) {
			cb && cb(0);
		} else {
			cb &&
				cb(
					null,
					new Error(`IndexedDB: Cannot drop new database "${ixdbid}" because it does not exist'`)
				);
		}
	}
};

IDB.attachDatabase = async function (ixdbid, dbid, args, params, cb) {
	const found = await _databaseExists(ixdbid).catch(err => {
		if (cb) cb(null, err);
		throw err;
	});

	if (!found) {
		const err = new Error(
			`IndexedDB: Cannot attach database "${ixdbid}" because it does not exist`
		);
		if (cb) cb(null, err);
		throw err;
	}

	const stores = await new Promise((resolve, reject) => {
		const request = indexedDB.open(ixdbid);
		request.onsuccess = () => {
			resolve(request.result.objectStoreNames);
			request.result.close();
		};
	});

	const db = new alasql.Database(dbid || ixdbid);
	db.engineid = 'INDEXEDDB';
	db.ixdbid = ixdbid;
	db.tables = [];

	for (var i = 0; i < stores.length; i++) {
		db.tables[stores[i]] = {};
	}

	if (cb) cb(1);
};

IDB.createTable = async function (databaseid, tableid, ifnotexists, cb) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const found = await _databaseExists(ixdbid).catch(err => {
		if (cb) cb(null, err);
		throw err;
	});

	if (!found) {
		const err = new Error(
			'IndexedDB: Cannot create table in database "' + ixdbid + '" because it does not exist'
		);
		if (cb) cb(null, err);
		throw err;
	}

	const request = indexedDB.open(ixdbid, found.version + 1);
	request.onupgradeneeded = function (event) {
		request.result.createObjectStore(tableid, {autoIncrement: true});
	};
	request.onsuccess = function (event) {
		request.result.close();
		if (cb) cb(1);
	};
	request.onerror = evt => {
		cb(null, evt);
	};
	request.onblocked = function (event) {
		cb(
			null,
			new Error(`Cannot create table "${tableid}" because database "${databaseid}"  is blocked`)
		);
	};
};

IDB.dropTable = async function (databaseid, tableid, ifexists, cb) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const found = await _databaseExists(ixdbid).catch(err => {
		if (cb) cb(null, err);
		throw err;
	});

	if (!found) {
		const err = new Error(
			'IndexedDB: Cannot drop table in database "' + ixdbid + '" because it does not exist'
		);
		if (cb) cb(null, err);
		throw err;
	}

	const request = indexedDB.open(ixdbid, found.version + 1);

	let err;
	request.onupgradeneeded = function (evt) {
		var ixdb = request.result;
		if (ixdb.objectStoreNames.contains(tableid)) {
			ixdb.deleteObjectStore(tableid);
			delete alasql.databases[databaseid].tables[tableid];
		} else {
			if (!ifexists) {
				err = new Error(`IndexedDB: Cannot drop table "${tableid}" because it does not exist`);
				evt.target.transaction.abort();
			}
		}
	};
	request.onsuccess = function (event) {
		request.result.close();
		if (cb) cb(1);
	};
	request.onerror = function (event) {
		cb && cb(null, err || event);
	};
	request.onblocked = function (event) {
		cb(
			null,
			new Error(`Cannot drop table "${tableid}" because database "${databaseid}" is blocked`)
		);
	};
};

IDB.intoTable = function (databaseid, tableid, value, columns, cb) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const request = indexedDB.open(ixdbid);
	var db = alasql.databases[databaseid];
	var table = db.tables[tableid];

	request.onupgradeneeded = evt => {
		evt.target.transaction.abort();
		const err = new Error(
			`Cannot insert into table "${tableid}" because database "${databaseid}" does not exist`
		);
		if (cb) cb(null, err);
	};

	request.onsuccess = () => {
		var ixdb = request.result;
		var tx = ixdb.transaction([tableid], 'readwrite');
		var tb = tx.objectStore(tableid);
		for (var i = 0, ilen = value.length; i < ilen; i++) {
			tb.add(value[i]);
		}
		tx.oncomplete = function () {
			ixdb.close();
			for (var tr in table.afterinsert) {
				if (table.afterinsert[tr]) {
					var trigger = table.afterinsert[tr];
					if (trigger.funcid) {
						alasql.fn[trigger.funcid](value);
					} else if (trigger.statement) {
						trigger.statement.execute(databaseid);
					}
				}
			}
			if (cb) cb(ilen);
		};
	};
};

IDB.fromTable = function (databaseid, tableid, cb, idx, query) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const request = indexedDB.open(ixdbid);

	request.onupgradeneeded = evt => {
		evt.target.transaction.abort();
		const err = new Error(
			`Cannot select from table "${tableid}" because database "${databaseid}" does not exist`
		);
		if (cb) cb(null, err);
	};

	request.onsuccess = () => {
		const res = [];
		const ixdb = request.result;
		const cur = ixdb.transaction([tableid]).objectStore(tableid).openCursor();

		cur.onsuccess = () => {
			const cursor = cur.result;
			if (cursor) {
				// if keyPath(columns) is not present then we take the key and value as object.
				const cursorValue =
					typeof cursor === 'object' ? cursor.value : {[cursor.key]: cursor.value};
				res.push(cursorValue);
				cursor.continue();
			} else {
				ixdb.close();
				if (cb) cb(res, idx, query);
			}
		};
	};
};

IDB.deleteFromTable = function (databaseid, tableid, wherefn, params, cb) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const request = indexedDB.open(ixdbid);

	request.onsuccess = () => {
		const ixdb = request.result;
		const cur = ixdb.transaction([tableid], 'readwrite').objectStore(tableid).openCursor();

		let num = 0;
		cur.onsuccess = () => {
			var cursor = cur.result;
			if (cursor) {
				if (!wherefn || wherefn(cursor.value, params, alasql)) {
					cursor.delete();
					num++;
				}
				cursor.continue();
			} else {
				ixdb.close();
				if (cb) cb(num);
			}
		};
	};
};

IDB.updateTable = function (databaseid, tableid, assignfn, wherefn, params, cb) {
	const ixdbid = alasql.databases[databaseid].ixdbid;
	const request = indexedDB.open(ixdbid);
	request.onsuccess = function () {
		const ixdb = request.result;
		const cur = ixdb.transaction([tableid], 'readwrite').objectStore(tableid).openCursor();

		let num = 0;
		cur.onsuccess = () => {
			var cursor = cur.result;
			if (cursor) {
				if (!wherefn || wherefn(cursor.value, params)) {
					var r = cursor.value;
					assignfn(r, params);
					cursor.update(r);
					num++;
				}
				cursor.continue();
			} else {
				ixdb.close();
				if (cb) cb(num);
			}
		};
	};
};
//
// 91localstorage.js
// localStorage and DOM-Storage engine
// Date: 09.12.2014
// (c) Andrey Gershun
//

/* global alasql, yy, localStorage*/

var LS = (alasql.engines.LOCALSTORAGE = function () {});

/**
	Read data from localStorage with security breaks
	@param key {string} Address in localStorage
	@return {object} JSON object
*/
LS.get = function (key) {
	var s = localStorage.getItem(key);
	if (typeof s === 'undefined') return;
	var v;
	try {
		v = JSON.parse(s);
	} catch (err) {
		throw new Error('Cannot parse JSON object from localStorage' + s);
	}
	return v;
};

/**
	Store data into localStorage with security breaks
	@param key {string} Address in localStorage
	@return {object} JSON object
*/
LS.set = function (key, value) {
	if (typeof value === 'undefined') localStorage.removeItem(key);
	else localStorage.setItem(key, JSON.stringify(value));
};

/**
	Store table structure and data into localStorage
	@param databaseid {string} AlaSQL database id (not external localStorage)
	@param tableid {string} Table name
	@return Nothing
*/
LS.storeTable = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	var table = db.tables[tableid];
	// Create empty structure for table
	var tbl = {};
	tbl.columns = table.columns;
	tbl.data = table.data;
	tbl.identities = table.identities;
	// TODO: May be add indexes, objects and other fields?
	LS.set(db.lsdbid + '.' + tableid, tbl);
};

/**
	Restore table structure and data
	@param databaseid {string} AlaSQL database id (not external localStorage)
	@param tableid {string} Table name
	@return Nothing
*/
LS.restoreTable = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	var tbl = LS.get(db.lsdbid + '.' + tableid);
	var table = new alasql.Table();
	for (var f in tbl) {
		table[f] = tbl[f];
	}
	db.tables[tableid] = table;
	table.indexColumns();
	// We need to add other things here
	return table;
};

/**
	Remove table from localStorage
	@param databaseid {string} AlaSQL database id (not external localStorage)
	@param tableid {string} Table name
*/

LS.removeTable = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	localStorage.removeItem(db.lsdbid + '.' + tableid);
};

/**
	Create database in localStorage
	@param lsdbid {string} localStorage database id
	@param args {array} List of parameters (not used in localStorage)
	@param ifnotexists {boolean} Check if database does not exist
	@param databaseid {string} AlaSQL database id (not external localStorage)
	@param cb {function} Callback
*/

LS.createDatabase = function (lsdbid, args, ifnotexists, databaseid, cb) {
	var res = 1;
	var ls = LS.get('alasql'); // Read list of all databases
	if (!(ifnotexists && ls && ls.databases && ls.databases[lsdbid])) {
		if (!ls) ls = {databases: {}}; // Empty record
		if (ls.databases && ls.databases[lsdbid]) {
			throw new Error(
				'localStorage: Cannot create new database "' + lsdbid + '" because it already exists'
			);
		}
		ls.databases[lsdbid] = true;
		LS.set('alasql', ls);
		LS.set(lsdbid, {databaseid: lsdbid, tables: {}}); // Create database record
	} else {
		res = 0;
	}
	if (cb) res = cb(res);
	return res;
};

/**
	Drop external database
	@param lsdbid {string} localStorage database id
	@param ifexists {boolean} Check if database exists
	@param cb {function} Callback
*/
LS.dropDatabase = function (lsdbid, ifexists, cb) {
	var res = 1;
	var ls = LS.get('alasql');
	if (!(ifexists && ls && ls.databases && !ls.databases[lsdbid])) {
		// 1. Remove record from 'alasql' record
		if (!ls) {
			if (!ifexists) {
				throw new Error('There is no any AlaSQL databases in localStorage');
			} else {
				return cb ? cb(0) : 0;
			}
		}

		if (ls.databases && !ls.databases[lsdbid]) {
			throw new Error(
				'localStorage: Cannot drop database "' + lsdbid + '" because there is no such database'
			);
		}
		delete ls.databases[lsdbid];
		LS.set('alasql', ls);

		// 2. Remove tables definitions
		var db = LS.get(lsdbid);
		for (var tableid in db.tables) {
			localStorage.removeItem(lsdbid + '.' + tableid);
		}

		// 3. Remove database definition
		localStorage.removeItem(lsdbid);
	} else {
		res = 0;
	}
	if (cb) res = cb(res);
	return res;
};

/**
	Attach existing localStorage database to AlaSQL database
	@param lsdibid {string} localStorage database id
	@param
*/

LS.attachDatabase = function (lsdbid, databaseid, args, params, cb) {
	var res = 1;
	if (alasql.databases[databaseid]) {
		throw new Error('Unable to attach database as "' + databaseid + '" because it already exists');
	}
	if (!databaseid) databaseid = lsdbid;
	var db = new alasql.Database(databaseid);
	db.engineid = 'LOCALSTORAGE';
	db.lsdbid = lsdbid;
	db.tables = LS.get(lsdbid).tables;
	// IF AUTOABORT IS OFF then copy data to memory
	if (!alasql.options.autocommit) {
		if (db.tables) {
			for (var tbid in db.tables) {
				LS.restoreTable(databaseid, tbid);
			}
		}
	}
	if (cb) res = cb(res);
	return res;
};

/**
	Show list of databases from localStorage
	@param like {string} Mathing pattern
	@param cb {function} Callback
*/
LS.showDatabases = function (like, cb) {
	var res = [];
	var ls = LS.get('alasql');
	if (like) {
		// TODO: If we have a special function for LIKE patterns?
		var relike = new RegExp(like.value.replace(/%/g, '.*'), 'g');
	}
	if (ls && ls.databases) {
		for (var dbid in ls.databases) {
			res.push({databaseid: dbid});
		}
		if (like && res && res.length > 0) {
			res = res.filter(function (d) {
				return d.databaseid.match(relike);
			});
		}
	}
	if (cb) res = cb(res);
	return res;
};

/**
	Create table in localStorage database
	@param databaseid {string} AlaSQL database id
	@param tableid {string} Table id
	@param ifnotexists {boolean} If not exists flag
	@param cb {function} Callback
*/

LS.createTable = function (databaseid, tableid, ifnotexists, cb) {
	var res = 1;
	var lsdbid = alasql.databases[databaseid].lsdbid;
	var tb = LS.get(lsdbid + '.' + tableid);
	// Check if such record exists
	if (tb && !ifnotexists) {
		throw new Error(
			'Table "' + tableid + '" alsready exists in localStorage database "' + lsdbid + '"'
		);
	}
	var lsdb = LS.get(lsdbid);
	var table = alasql.databases[databaseid].tables[tableid];

	// TODO: Check if required
	lsdb.tables[tableid] = true;

	LS.set(lsdbid, lsdb);
	LS.storeTable(databaseid, tableid);

	if (cb) res = cb(res);
	return res;
};

/**
   Empty table and reset identities
   @param databaseid {string} AlaSQL database id (not external localStorage)
   @param tableid {string} Table name
   @param ifexists {boolean} If exists flag
   @param cb {function} Callback
   @return 1 on success
*/
LS.truncateTable = function (databaseid, tableid, ifexists, cb) {
	var res = 1;
	var lsdbid = alasql.databases[databaseid].lsdbid;
	var lsdb;
	if (alasql.options.autocommit) {
		lsdb = LS.get(lsdbid);
	} else {
		lsdb = alasql.databases[databaseid];
	}

	if (!ifexists && !lsdb.tables[tableid]) {
		throw new Error(
			'Cannot truncate table "' + tableid + '" in localStorage, because it does not exist'
		);
	}

	//load table
	var tbl = LS.restoreTable(databaseid, tableid);

	//clear data from table
	tbl.data = [];
	//TODO reset all identities
	//but identities are not working on LOCALSTORAGE
	//See test 607 for details

	//store table
	LS.storeTable(databaseid, tableid);

	if (cb) res = cb(res);
	return res;
};

/**
	Create table in localStorage database
	@param databaseid {string} AlaSQL database id
	@param tableid {string} Table id
	@param ifexists {boolean} If exists flag
	@param cb {function} Callback
*/

LS.dropTable = function (databaseid, tableid, ifexists, cb) {
	var res = 1;
	var lsdbid = alasql.databases[databaseid].lsdbid;
	var lsdb;

	if (alasql.options.autocommit) {
		lsdb = LS.get(lsdbid);
	} else {
		lsdb = alasql.databases[databaseid];
	}
	if (!ifexists && !lsdb.tables[tableid]) {
		throw new Error(
			'Cannot drop table "' + tableid + '" in localStorage, because it does not exist'
		);
	}
	delete lsdb.tables[tableid];
	LS.set(lsdbid, lsdb);
	//	localStorage.removeItem(lsdbid+'.'+tableid);
	LS.removeTable(databaseid, tableid);
	if (cb) res = cb(res);
	return res;
};

/**
	Read all data from table
*/

LS.fromTable = function (databaseid, tableid, cb, idx, query) {

	var lsdbid = alasql.databases[databaseid].lsdbid;
	//	var res = LS.get(lsdbid+'.'+tableid);

	var res = LS.restoreTable(databaseid, tableid).data;

	if (cb) res = cb(res, idx, query);
	return res;
};

/**
	Insert data into the table
	@param databaseid {string} Database id
	@param tableid {string} Table id
	@param value {array} Array of values
	@param columns {array} Columns (not used)
	@param cb {function} Callback
*/

LS.intoTable = function (databaseid, tableid, value, columns, cb) {

	var lsdbid = alasql.databases[databaseid].lsdbid;
	var res = value.length;
	//	var tb = LS.get(lsdbid+'.'+tableid);
	var tb = LS.restoreTable(databaseid, tableid);
	for (var columnid in tb.identities) {
		var ident = tb.identities[columnid];

		for (var index in value) {
			value[index][columnid] = ident.value;
			ident.value += ident.step;
		}
	}
	if (!tb.data) tb.data = [];
	tb.data = tb.data.concat(value);
	LS.storeTable(databaseid, tableid);
	if (cb) res = cb(res);

	return res;
};

/**
	Laad data from table
*/
LS.loadTableData = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	var lsdbid = alasql.databases[databaseid].lsdbid;
	LS.restoreTable(databaseid, tableid);
	//	db.tables[tableid].data = LS.get(lsdbid+'.'+tableid);
};

/**
	Save data to the table
*/

LS.saveTableData = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	var lsdbid = alasql.databases[databaseid].lsdbid;
	LS.storeTable(lsdbid, tableid);
	//	LS.set(lsdbid+'.'+tableid,db.tables[tableid].data);
	db.tables[tableid].data = undefined;
};

/**
	Commit
*/

LS.commit = function (databaseid, cb) {

	var db = alasql.databases[databaseid];
	var lsdbid = alasql.databases[databaseid].lsdbid;
	var lsdb = {databaseid: lsdbid, tables: {}};
	if (db.tables) {
		for (var tbid in db.tables) {
			// TODO: Question - do we need this line
			lsdb.tables[tbid] = true;
			LS.storeTable(databaseid, tbid);
			//			LS.set(lsdbid+'.'+tbid, db.tables[tbid].data);
		}
	}
	LS.set(lsdbid, lsdb);
	return cb ? cb(1) : 1;
};

/**
	Alias BEGIN = COMMIT
*/
LS.begin = LS.commit;

/**
	ROLLBACK
*/

LS.rollback = function (databaseid, cb) {
	// This does not work and should be fixed
	// Plus test 151 and 231

	return;

	var db = alasql.databases[databaseid];
	db.dbversion++;

	var lsdbid = alasql.databases[databaseid].lsdbid;
	var lsdb = LS.get(lsdbid);
	//	if(!alasql.options.autocommit) {

	delete alasql.databases[databaseid];
	alasql.databases[databaseid] = new alasql.Database(databaseid);
	extend(alasql.databases[databaseid], lsdb);
	alasql.databases[databaseid].databaseid = databaseid;
	alasql.databases[databaseid].engineid = 'LOCALSTORAGE';

	if (lsdb.tables) {
		for (var tbid in lsdb.tables) {
			//				var tb = new alasql.Table({columns: db.tables[tbid].columns});
			//				extend(tb,lsdb.tables[tbid]);
			//				lsdb.tables[tbid] = true;

			//				if(!alasql.options.autocommit) {

			//					lsdb.tables[tbid].data = LS.get(db.lsdbid+'.'+tbid);
			LS.restoreTable(databaseid, tbid);
			//				}
			//				lsdb.tables[tbid].indexColumns();

			// index columns
			// convert types
		}
	}
	//	}

};
//
// 93sqlite.js
// SQLite database support
// (c) 2014, Andrey Gershun
//

var SQLITE = (alasql.engines.SQLITE = function () {});

SQLITE.createDatabase = function (wdbid, args, ifnotexists, dbid, cb) {
	throw new Error('Connot create SQLITE database in memory. Attach it.');
};

SQLITE.dropDatabase = function (databaseid) {
	throw new Error('This is impossible to drop SQLite database. Detach it.');
};

SQLITE.attachDatabase = function (sqldbid, dbid, args, params, cb) {
	var res = 1;
	if (alasql.databases[dbid]) {
		throw new Error('Unable to attach database as "' + dbid + '" because it already exists');
	}

	if ((args[0] && args[0] instanceof yy.StringValue) || args[0] instanceof yy.ParamValue) {
		if (args[0] instanceof yy.StringValue) {
			var value = args[0].value;
		} else if (args[0] instanceof yy.ParamValue) {
			var value = params[args[0].param];
		}
		alasql.utils.loadBinaryFile(
			value,
			true,
			function (data) {
				var db = new alasql.Database(dbid || sqldbid);
				db.engineid = 'SQLITE';
				db.sqldbid = sqldbid;
				var sqldb = (db.sqldb = new SQL.Database(data));
				db.tables = [];
				var tables = sqldb.exec("SELECT * FROM sqlite_master WHERE type='table'")[0].values;

				tables.forEach(function (tbl) {
					db.tables[tbl[1]] = {};
					var columns = (db.tables[tbl[1]].columns = []);
					var ast = alasql.parse(tbl[4]);
					var coldefs = ast.statements[0].columns;
					if (coldefs && coldefs.length > 0) {
						coldefs.forEach(function (cd) {
							columns.push(cd);
						});
					}
				});

				cb(1);
			},
			function (err) {
				throw new Error('Cannot open SQLite database file "' + args[0].value + '"');
			}
		);
		return res;
	} else {
		throw new Error('Cannot attach SQLite database without a file');
	}

	return res;
};

SQLITE.fromTable = function (databaseid, tableid, cb, idx, query) {
	var data = alasql.databases[databaseid].sqldb.exec('SELECT * FROM ' + tableid);
	var columns = (query.sources[idx].columns = []);
	if (data[0].columns.length > 0) {
		data[0].columns.forEach(function (columnid) {
			columns.push({columnid: columnid});
		});
	}

	var res = [];
	if (data[0].values.length > 0) {
		data[0].values.forEach(function (d) {
			var r = {};
			columns.forEach(function (col, idx) {
				r[col.columnid] = d[idx];
			});
			res.push(r);
		});
	}
	if (cb) cb(res, idx, query);
};

SQLITE.intoTable = function (databaseid, tableid, value, columns, cb) {
	var sqldb = alasql.databases[databaseid].sqldb;
	for (var i = 0, ilen = value.length; i < ilen; i++) {
		var s = 'INSERT INTO ' + tableid + ' (';
		var d = value[i];
		var keys = Object.keys(d);
		s += keys.join(',');
		s += ') VALUES (';
		s += keys
			.map(function (k) {
				var v = d[k];
				if (typeof v == 'string') v = "'" + v + "'";
				return v;
			})
			.join(',');
		s += ')';
		sqldb.exec(s);
	}
	var res = ilen;
	if (cb) cb(res);
	return res;
};
//
// 91localstorage.js
// localStorage and DOM-Storage engine
// Date: 09.12.2014
// (c) Andrey Gershun
//

var FS = (alasql.engines.FILESTORAGE = alasql.engines.FILE = function () {});

FS.createDatabase = function (fsdbid, args, ifnotexists, dbid, cb) {
	var res = 1;
	var filename = args[0].value;
	alasql.utils.fileExists(filename, function (fex) {
		if (fex) {
			if (ifnotexists) {
				res = 0;
				if (cb) res = cb(res);
				return res;
			} else {
				throw new Error('Cannot create new database file, because it already exists');
			}
		} else {
			var data = {tables: {}};
			alasql.utils.saveFile(filename, JSON.stringify(data), function (data) {
				if (cb) res = cb(res);
			});
		}
	});
	return res;
};

FS.dropDatabase = function (fsdbid, ifexists, cb) {
	var res;
	var filename = '';

	if (typeof fsdbid === 'object' && fsdbid.value) {
		// Existing tests (test225.js) had DROP directly without DETACH and
		// without a database id / name. It instead used the filename directly.
		// This block will handle that
		filename = fsdbid.value;
	} else {
		// When a database id / name is specified in DROP, it will be handled by this block.
		// Note: Both DETACH + DROP and direct DROP without DETACH will be handled by this block
		// We will be deleting the database object and the file either way.
		// However, in the future, if we would like to have a stricter implementation
		// where we cannot DROP without DETACHing it first, we can handle that case using
		// the 'isDetached' property of the database object.
		// (i.e) alasql.databases[fsdbid].isDetached will be set if it is
		// has been detached first
		var db = alasql.databases[fsdbid] || {};

		filename = db.filename || '';
		delete alasql.databases[fsdbid];
	}
	alasql.utils.fileExists(filename, function (fex) {
		if (fex) {
			res = 1;
			alasql.utils.deleteFile(filename, function () {
				res = 1;
				if (cb) res = cb(res);
			});
		} else {
			if (!ifexists) {
				throw new Error('Cannot drop database file, because it does not exist');
			}
			res = 0;
			if (cb) res = cb(res);
		}
	});
	return res;
};

FS.attachDatabase = function (fsdbid, dbid, args, params, cb) {
	var res = 1;
	if (alasql.databases[dbid]) {
		throw new Error('Unable to attach database as "' + dbid + '" because it already exists');
	}
	var db = new alasql.Database(dbid || fsdbid);
	db.engineid = 'FILESTORAGE';
	db.filename = args[0].value;
	loadFile(db.filename, !!cb, function (s) {
		try {
			db.data = JSON.parse(s);
		} catch (err) {
			throw new Error('Data in FileStorage database are corrupted');
		}
		db.tables = db.data.tables;
		// IF AUTOCOMMIT IS OFF then copy data to memory
		if (!alasql.options.autocommit) {
			if (db.tables) {
				for (var tbid in db.tables) {
					db.tables[tbid].data = db.data[tbid];
				}
			}
		}
		if (cb) res = cb(res);
	});
	return res;
};

FS.createTable = function (databaseid, tableid, ifnotexists, cb) {
	var db = alasql.databases[databaseid];
	var tb = db.data[tableid];
	var res = 1;

	if (tb && !ifnotexists) {
		throw new Error('Table "' + tableid + '" alsready exists in the database "' + fsdbid + '"');
	}
	var table = alasql.databases[databaseid].tables[tableid];
	db.data.tables[tableid] = {columns: table.columns};
	db.data[tableid] = [];

	FS.updateFile(databaseid);

	if (cb) cb(res);
	return res;
};

FS.updateFile = function (databaseid) {
	var db = alasql.databases[databaseid];
	if (db.issaving) {
		db.postsave = true;
		return;
	}
	db.issaving = true;
	db.postsave = false;
	alasql.utils.saveFile(db.filename, JSON.stringify(db.data), function () {
		db.issaving = false;

		if (db.postsave) {
			setTimeout(function () {
				FS.updateFile(databaseid);
			}, 50); // TODO Test with different timeout parameters
		}
	});
};

FS.dropTable = function (databaseid, tableid, ifexists, cb) {
	var res = 1;
	var db = alasql.databases[databaseid];
	if (!ifexists && !db.tables[tableid]) {
		throw new Error(
			'Cannot drop table "' + tableid + '" in fileStorage, because it does not exist'
		);
	}
	delete db.tables[tableid];
	delete db.data.tables[tableid];
	delete db.data[tableid];
	FS.updateFile(databaseid);
	if (cb) cb(res);
	return res;
};

FS.fromTable = function (databaseid, tableid, cb, idx, query) {
	var db = alasql.databases[databaseid];
	var res = db.data[tableid];
	if (cb) res = cb(res, idx, query);
	return res;
};

FS.intoTable = function (databaseid, tableid, value, columns, cb) {
	var db = alasql.databases[databaseid];
	var res = value.length;
	var tb = db.data[tableid];
	if (!tb) tb = [];
	db.data[tableid] = tb.concat(value);
	FS.updateFile(databaseid);
	if (cb) cb(res);
	return res;
};

FS.loadTableData = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	db.tables[tableid].data = db.data[tableid];
};

FS.saveTableData = function (databaseid, tableid) {
	var db = alasql.databases[databaseid];
	db.data[tableid] = db.tables[tableid].data;
	db.tables[tableid].data = null;
	FS.updateFile(databaseid);
};

FS.commit = function (databaseid, cb) {
	var db = alasql.databases[databaseid];
	var fsdb = {tables: {}};
	if (db.tables) {
		for (var tbid in db.tables) {
			db.data.tables[tbid] = {columns: db.tables[tbid].columns};
			db.data[tbid] = db.tables[tbid].data;
		}
	}
	FS.updateFile(databaseid);
	return cb ? cb(1) : 1;
};

FS.begin = FS.commit;

FS.rollback = function (databaseid, cb) {
	var res = 1;
	var db = alasql.databases[databaseid];
	db.dbversion++;
	wait();
	function wait() {
		setTimeout(function () {
			if (db.issaving) {
				return wait();
			} else {
				alasql.loadFile(db.filename, !!cb, function (data) {
					db.data = data;
					db.tables = {};
					for (var tbid in db.data.tables) {
						var tb = new alasql.Table({columns: db.data.tables[tbid].columns});
						extend(tb, db.data.tables[tbid]);
						db.tables[tbid] = tb;
						if (!alasql.options.autocommit) {
							db.tables[tbid].data = db.data[tbid];
						}
						db.tables[tbid].indexColumns();
					}

					delete alasql.databases[databaseid];
					alasql.databases[databaseid] = new alasql.Database(databaseid);
					extend(alasql.databases[databaseid], db);
					alasql.databases[databaseid].engineid = 'FILESTORAGE';
					alasql.databases[databaseid].filename = db.filename;

					if (cb) res = cb(res);
					// Todo: check why no return
				});
			}
		}, 100);
	}
};
if(utils.isBrowser && !utils.isWebWorker) {
alasql = alasql || false;

if (!alasql) {
	throw new Error('alasql was not found');
}

alasql.worker = function () {
	throw new Error('Can find webworker in this enviroment');
};

if (typeof Worker !== 'undefined') {
	alasql.worker = function (path, paths, cb) {
		//	var path;
		if (path === true) {
			path = undefined;
		}

		if (typeof path === 'undefined') {
			var sc = document.getElementsByTagName('script');
			for (var i = 0; i < sc.length; i++) {
				if (sc[i].src.substr(-16).toLowerCase() === 'alasql-worker.js') {
					path = sc[i].src.substr(0, sc[i].src.length - 16) + 'alasql.js';
					break;
				} else if (sc[i].src.substr(-20).toLowerCase() === 'alasql-worker.min.js') {
					path = sc[i].src.substr(0, sc[i].src.length - 20) + 'alasql.min.js';
					break;
				} else if (sc[i].src.substr(-9).toLowerCase() === 'alasql.js') {
					path = sc[i].src;
					break;
				} else if (sc[i].src.substr(-13).toLowerCase() === 'alasql.min.js') {
					path = sc[i].src.substr(0, sc[i].src.length - 13) + 'alasql.min.js';
					break;
				}
			}
		}

		if (typeof path === 'undefined') {
			throw new Error('Path to alasql.js is not specified');
		} else if (path !== false) {
			var js = "importScripts('";
			js += path;
			js +=
				"');self.onmessage = function(event) {" +
				'alasql(event.data.sql,event.data.params, function(data){' +
				'postMessage({id:event.data.id, data:data});});}';

			var blob = new Blob([js], {type: 'text/plain'});
			alasql.webworker = new Worker(URL.createObjectURL(blob));

			alasql.webworker.onmessage = function (event) {
				var id = event.data.id;

				alasql.buffer[id](event.data.data);
				delete alasql.buffer[id];
			};

			alasql.webworker.onerror = function (e) {
				throw e;
			};

			if (arguments.length > 1) {
				var sql =
					'REQUIRE ' +
					paths
						.map(function (p) {
							return '"' + p + '"';
						})
						.join(',');
				alasql(sql, [], cb);
			}
		} else if (path === false) {
			delete alasql.webworker;
			return;
		}
	};
}
/* FileSaver.js
 * A saveAs() FileSaver implementation.
 * 1.3.2
 * 2016-06-16 18:25:19
 *
 * By Eli Grey, http://eligrey.com
 * License: MIT
 *   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
 */

/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */

/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */

var saveAs =
	saveAs ||
	(function (view) {
		'use strict';
		// IE <10 is explicitly unsupported
		if (
			typeof view === 'undefined' ||
			(typeof navigator !== 'undefined' && /MSIE [1-9]\./.test(navigator.userAgent))
		) {
			return;
		}
		var doc = view.document,
			// only get URL when necessary in case Blob.js hasn't overridden it yet
			get_URL = function () {
				return view.URL || view.webkitURL || view;
			},
			save_link = doc.createElementNS('http://www.w3.org/1999/xhtml', 'a'),
			can_use_save_link = 'download' in save_link,
			click = function (node) {
				var event = new MouseEvent('click');
				node.dispatchEvent(event);
			},
			is_safari = /constructor/i.test(view.HTMLElement) || view.safari,
			is_chrome_ios = /CriOS\/[\d]+/.test(navigator.userAgent),
			throw_outside = function (ex) {
				(view.setImmediate || view.setTimeout)(function () {
					throw ex;
				}, 0);
			},
			force_saveable_type = 'application/octet-stream',
			// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
			arbitrary_revoke_timeout = 1000 * 40, // in ms
			revoke = function (file) {
				var revoker = function () {
					if (typeof file === 'string') {
						// file is an object URL
						get_URL().revokeObjectURL(file);
					} else {
						// file is a File
						file.remove();
					}
				};
				setTimeout(revoker, arbitrary_revoke_timeout);
			},
			dispatch = function (filesaver, event_types, event) {
				event_types = [].concat(event_types);
				var i = event_types.length;
				while (i--) {
					var listener = filesaver['on' + event_types[i]];
					if (typeof listener === 'function') {
						try {
							listener.call(filesaver, event || filesaver);
						} catch (ex) {
							throw_outside(ex);
						}
					}
				}
			},
			auto_bom = function (blob) {
				// prepend BOM for UTF-8 XML and text/* types (including HTML)
				// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
				if (
					/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(
						blob.type
					)
				) {
					return new Blob([String.fromCharCode(0xfeff), blob], {
						type: blob.type,
					});
				}
				return blob;
			},
			FileSaver = function (blob, name, no_auto_bom) {
				if (!no_auto_bom) {
					blob = auto_bom(blob);
				}
				// First try a.download, then web filesystem, then object URLs
				var filesaver = this,
					type = blob.type,
					force = type === force_saveable_type,
					object_url,
					dispatch_all = function () {
						dispatch(filesaver, 'writestart progress write writeend'.split(' '));
					},
					// on any filesys errors revert to saving with object URLs
					fs_error = function () {
						if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
							// Safari doesn't allow downloading of blob urls
							var reader = new FileReader();
							reader.onloadend = function () {
								var url = is_chrome_ios
									? reader.result
									: reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
								var popup = view.open(url, '_blank');
								if (!popup) view.location.href = url;
								url = undefined; // release reference before dispatching
								filesaver.readyState = filesaver.DONE;
								dispatch_all();
							};
							reader.readAsDataURL(blob);
							filesaver.readyState = filesaver.INIT;
							return;
						}
						// don't create more object URLs than needed
						if (!object_url) {
							object_url = get_URL().createObjectURL(blob);
						}
						if (force) {
							view.location.href = object_url;
						} else {
							var opened = view.open(object_url, '_blank');
							if (!opened) {
								// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
								view.location.href = object_url;
							}
						}
						filesaver.readyState = filesaver.DONE;
						dispatch_all();
						revoke(object_url);
					};
				filesaver.readyState = filesaver.INIT;

				if (can_use_save_link) {
					object_url = get_URL().createObjectURL(blob);
					setTimeout(function () {
						save_link.href = object_url;
						save_link.download = name;
						click(save_link);
						dispatch_all();
						revoke(object_url);
						filesaver.readyState = filesaver.DONE;
					});
					return;
				}

				fs_error();
			},
			FS_proto = FileSaver.prototype,
			saveAs = function (blob, name, no_auto_bom) {
				return new FileSaver(blob, name || blob.name || 'download', no_auto_bom);
			};
		// IE 10+ (native saveAs)
		if (typeof navigator !== 'undefined' && navigator.msSaveOrOpenBlob) {
			return function (blob, name, no_auto_bom) {
				name = name || blob.name || 'download';

				if (!no_auto_bom) {
					blob = auto_bom(blob);
				}
				return navigator.msSaveOrOpenBlob(blob, name);
			};
		}

		FS_proto.abort = function () {};
		FS_proto.readyState = FS_proto.INIT = 0;
		FS_proto.WRITING = 1;
		FS_proto.DONE = 2;

		FS_proto.error =
			FS_proto.onwritestart =
			FS_proto.onprogress =
			FS_proto.onwrite =
			FS_proto.onabort =
			FS_proto.onerror =
			FS_proto.onwriteend =
				null;

		return saveAs;
	})(
		(typeof self !== 'undefined' && self) ||
			(typeof window !== 'undefined' && window) ||
			this.content
	);
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window

if (typeof module !== 'undefined' && module.exports) {
	module.exports.saveAs = saveAs;
} else if (typeof define !== 'undefined' && define !== null && define.amd !== null) {
	define('FileSaver.js', function () {
		return saveAs;
	});
}
/* eslint-disable */ 

/*
//
// Last part of Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/

// This is a final part of Alasql

//*only-for-browser/*
if(utils.isCordova || utils.isMeteorServer || utils.isNode ){
  console.log('It looks like you are using the browser version of AlaSQL. Please use the alasql.fs.js file instead.')
}
//*/

// FileSaveAs
alasql.utils.saveAs = saveAs;

};

// Create default database
new Database("alasql");

// Set default database
alasql.use("alasql");

return alasql;
}));

