diff --git a/go/vt/sqlparser/ast.go b/go/vt/sqlparser/ast.go index 52b8e39e8e4..92c3300ccd1 100644 --- a/go/vt/sqlparser/ast.go +++ b/go/vt/sqlparser/ast.go @@ -1208,34 +1208,28 @@ type ( ShowCollationFilterOpt Expr } - // ShowColumns is of ShowInternal type, holds the show columns statement. - ShowColumns struct { - Full string - Table TableName - DbName string - Filter *ShowFilter - } - - // ShowTableStatus is of ShowInternal type, holds SHOW TABLE STATUS queries. - ShowTableStatus struct { - DatabaseName string - Filter *ShowFilter - } - // ShowCommandType represents the show statement type. ShowCommandType int8 // ShowBasic is of ShowInternal type, holds Simple SHOW queries with a filter. ShowBasic struct { Command ShowCommandType + Full bool + Tbl TableName + DbName string Filter *ShowFilter } + + // ShowCreate is of ShowInternal type, holds SHOW CREATE queries. + ShowCreate struct { + Command ShowCommandType + Op TableName + } ) -func (*ShowLegacy) isShowInternal() {} -func (*ShowColumns) isShowInternal() {} -func (*ShowTableStatus) isShowInternal() {} -func (*ShowBasic) isShowInternal() {} +func (*ShowLegacy) isShowInternal() {} +func (*ShowBasic) isShowInternal() {} +func (*ShowCreate) isShowInternal() {} // InsertRows represents the rows for an INSERT statement. type InsertRows interface { @@ -2442,17 +2436,6 @@ func (node *Show) Format(buf *TrackedBuffer) { buf.astPrintf(node, "%v", node.Internal) } -// Format formats the node. -func (node *ShowColumns) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "show %s", node.Full) - buf.astPrintf(node, "columns from %v", node.Table) - - buf.printIf(node.DbName != "", " from "+node.DbName) - if node.Filter != nil { - buf.astPrintf(node, "%v", node.Filter) - } -} - // Format formats the node. func (node *ShowLegacy) Format(buf *TrackedBuffer) { nodeType := strings.ToLower(node.Type) @@ -3147,18 +3130,24 @@ func (node *Load) Format(buf *TrackedBuffer) { } // Format formats the node. -func (node *ShowTableStatus) Format(buf *TrackedBuffer) { - buf.WriteString("show table status") - if node.DatabaseName != "" { - buf.WriteString(" from ") - buf.WriteString(node.DatabaseName) +func (node *ShowBasic) Format(buf *TrackedBuffer) { + buf.WriteString("show") + if node.Full { + buf.WriteString(" full") + } + buf.astPrintf(node, "%s", node.Command.ToString()) + if !node.Tbl.IsEmpty() { + buf.astPrintf(node, " from %v", node.Tbl) + } + if node.DbName != "" { + buf.astPrintf(node, " from %s", node.DbName) } buf.astPrintf(node, "%v", node.Filter) } // Format formats the node. -func (node *ShowBasic) Format(buf *TrackedBuffer) { - buf.astPrintf(node, "show%s%v", node.Command.ToString(), node.Filter) +func (node *ShowCreate) Format(buf *TrackedBuffer) { + buf.astPrintf(node, "show%s %v", node.Command.ToString(), node.Op) } // Format formats the node. diff --git a/go/vt/sqlparser/ast_funcs.go b/go/vt/sqlparser/ast_funcs.go index bdd00bce729..07fea6767d5 100644 --- a/go/vt/sqlparser/ast_funcs.go +++ b/go/vt/sqlparser/ast_funcs.go @@ -1227,18 +1227,48 @@ func (ty ShowCommandType) ToString() string { return CharsetStr case Collation: return CollationStr + case Column: + return ColumnStr + case CreateDb: + return CreateDbStr + case CreateE: + return CreateEStr + case CreateF: + return CreateFStr + case CreateProc: + return CreateProcStr + case CreateTbl: + return CreateTblStr + case CreateTr: + return CreateTrStr + case CreateV: + return CreateVStr case Database: return DatabaseStr + case FunctionC: + return FunctionCStr case Function: return FunctionStr + case Index: + return IndexStr + case OpenTable: + return OpenTableStr case Privilege: return PrivilegeStr + case ProcedureC: + return ProcedureCStr case Procedure: return ProcedureStr case StatusGlobal: return StatusGlobalStr case StatusSession: return StatusSessionStr + case Table: + return TableStr + case TableStatus: + return TableStatusStr + case Trigger: + return TriggerStr case VariableGlobal: return VariableGlobalStr case VariableSession: @@ -1246,7 +1276,8 @@ func (ty ShowCommandType) ToString() string { case Keyspace: return KeyspaceStr default: - return "Unknown ShowCommandType" + return "" + + "Unknown ShowCommandType" } } diff --git a/go/vt/sqlparser/constants.go b/go/vt/sqlparser/constants.go index 854586c0118..de5c899c8e0 100644 --- a/go/vt/sqlparser/constants.go +++ b/go/vt/sqlparser/constants.go @@ -16,6 +16,7 @@ limitations under the License. package sqlparser +// String constants to be used in ast. const ( // Select.Distinct DistinctStr = "distinct " @@ -211,12 +212,27 @@ const ( // ShowCommand Types CharsetStr = " charset" CollationStr = " collation" + ColumnStr = " columns" + CreateDbStr = " create database" + CreateEStr = " create event" + CreateFStr = " create function" + CreateProcStr = " create procedure" + CreateTblStr = " create table" + CreateTrStr = " create trigger" + CreateVStr = " create view" DatabaseStr = " databases" + FunctionCStr = " function code" FunctionStr = " function status" + IndexStr = " indexes" + OpenTableStr = " open tables" PrivilegeStr = " privileges" + ProcedureCStr = " procedure code" ProcedureStr = " procedure status" StatusGlobalStr = " global status" StatusSessionStr = " status" + TableStr = " tables" + TableStatusStr = " table status" + TriggerStr = " triggers" VariableGlobalStr = " global variables" VariableSessionStr = " variables" KeyspaceStr = " keyspaces" @@ -451,12 +467,27 @@ const ( UnknownCommandType ShowCommandType = iota Charset Collation + Column + CreateDb + CreateE + CreateF + CreateProc + CreateTbl + CreateTr + CreateV Database + FunctionC Function + Index + OpenTable Privilege + ProcedureC Procedure StatusGlobal StatusSession + Table + TableStatus + Trigger VariableGlobal VariableSession Keyspace diff --git a/go/vt/sqlparser/parse_table.go b/go/vt/sqlparser/parse_table.go index a8431aacc01..8766994ecfd 100644 --- a/go/vt/sqlparser/parse_table.go +++ b/go/vt/sqlparser/parse_table.go @@ -32,7 +32,10 @@ func ParseTable(input string) (keyspace, table string, err error) { case ID: table = string(value) default: - return "", "", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table name: %s", input) + table = KeywordString(token) + if table == "" { + return "", "", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table name: %s", input) + } } // Seen first ID, want '.' or 0 @@ -52,7 +55,10 @@ func ParseTable(input string) (keyspace, table string, err error) { case ID: table = string(value) default: - return "", "", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table name: %s", input) + table = KeywordString(token) + if table == "" { + return "", "", vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "invalid table name: %s", input) + } } // Seen second ID, want 0 diff --git a/go/vt/sqlparser/parse_test.go b/go/vt/sqlparser/parse_test.go index 80b8d60edf5..d4c1553927d 100644 --- a/go/vt/sqlparser/parse_test.go +++ b/go/vt/sqlparser/parse_test.go @@ -732,10 +732,10 @@ var ( }, { input: "insert /* bool expression on duplicate */ into a values (1, 2) on duplicate key update b = func(a), c = a > d", }, { - input: "insert into user(username, `status`) values ('Chuck', default(`status`))", + input: "insert into `user`(username, `status`) values ('Chuck', default(`status`))", }, { input: "insert into user(format, tree, vitess) values ('Chuck', 42, 'Barry')", - output: "insert into user(`format`, `tree`, `vitess`) values ('Chuck', 42, 'Barry')", + output: "insert into `user`(`format`, `tree`, `vitess`) values ('Chuck', 42, 'Barry')", }, { input: "insert into customer () values ()", output: "insert into customer values ()", @@ -1182,7 +1182,7 @@ var ( output: "alter vschema on a add vindex hash (id) using hash", }, { input: "alter vschema on user add vindex name_lookup_vdx (name) using lookup_hash with owner=user, table=name_user_idx, from=name, to=user_id", - output: "alter vschema on user add vindex name_lookup_vdx (`name`) using lookup_hash with owner=user, table=name_user_idx, from=name, to=user_id", + output: "alter vschema on `user` add vindex name_lookup_vdx (`name`) using lookup_hash with owner=user, table=name_user_idx, from=name, to=user_id", }, { input: "alter vschema on user2 add vindex name_lastname_lookup_vdx (name,lastname) using lookup with owner=`user`, table=`name_lastname_keyspace_id_map`, from=`name,lastname`, to=`keyspace_id`", output: "alter vschema on user2 add vindex name_lastname_lookup_vdx (`name`, lastname) using lookup with owner=user, table=name_lastname_keyspace_id_map, from=name,lastname, to=keyspace_id", @@ -1325,28 +1325,22 @@ var ( input: "show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'", output: "show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'", }, { - input: "show create database d", - output: "show create database", + input: "show create database d", }, { - input: "show create event e", - output: "show create event", + input: "show create event e", }, { input: "show create function f", }, { - input: "show create procedure p", - output: "show create procedure", + input: "show create procedure p", }, { - input: "show create table t", - output: "show create table t", + input: "show create table t", }, { - input: "show create trigger t", - output: "show create trigger", + input: "show create trigger t", }, { input: "show create user u", output: "show create user", }, { - input: "show create view v", - output: "show create view", + input: "show create view v", }, { input: "show databases", output: "show databases", @@ -1379,17 +1373,18 @@ var ( input: "show grants for 'root@localhost'", output: "show grants", }, { - input: "show index from t", + input: "show index from t", + output: "show indexes from t", }, { input: "show indexes from t", }, { - input: "show keys from t", + input: "show keys from t", + output: "show indexes from t", }, { input: "show master status", output: "show master", }, { - input: "show open tables", - output: "show open", + input: "show open tables", }, { input: "show plugins", output: "show plugins", @@ -1789,22 +1784,22 @@ var ( output: "show full columns from AO_E8B6CC_ISSUE_MAPPING from jiradb like '%'", }, { input: "SHOW KEYS FROM `AO_E8B6CC_ISSUE_MAPPING` FROM `jiradb`", - output: "show keys from AO_E8B6CC_ISSUE_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_ISSUE_MAPPING from jiradb", }, { input: "SHOW CREATE TABLE `jiradb`.`AO_E8B6CC_ISSUE_MAPPING`", output: "show create table jiradb.AO_E8B6CC_ISSUE_MAPPING", }, { input: "SHOW INDEX FROM `AO_E8B6CC_ISSUE_MAPPING` FROM `jiradb`", - output: "show index from AO_E8B6CC_ISSUE_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_ISSUE_MAPPING from jiradb", }, { input: "SHOW FULL TABLES FROM `jiradb` LIKE '%'", output: "show full tables from jiradb like '%'", }, { input: "SHOW EXTENDED INDEX FROM `AO_E8B6CC_PROJECT_MAPPING` FROM `jiradb`", - output: "show extended index from AO_E8B6CC_PROJECT_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_PROJECT_MAPPING from jiradb", }, { input: "SHOW EXTENDED KEYS FROM `AO_E8B6CC_ISSUE_MAPPING` FROM `jiradb`", - output: "show extended keys from AO_E8B6CC_ISSUE_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_ISSUE_MAPPING from jiradb", }, { input: "SHOW CREATE TABLE `jiradb`.`AO_E8B6CC_ISSUE_MAPPING`", output: "show create table jiradb.AO_E8B6CC_ISSUE_MAPPING", @@ -1828,10 +1823,10 @@ var ( output: "show full tables from jiradb like '%'", }, { input: "SHOW EXTENDED INDEXES FROM `AO_E8B6CC_PROJECT_MAPPING` FROM `jiradb`", - output: "show extended indexes from AO_E8B6CC_PROJECT_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_PROJECT_MAPPING from jiradb", }, { input: "SHOW EXTENDED INDEXES IN `AO_E8B6CC_PROJECT_MAPPING` IN `jiradb`", - output: "show extended indexes from AO_E8B6CC_PROJECT_MAPPING from jiradb", + output: "show indexes from AO_E8B6CC_PROJECT_MAPPING from jiradb", }, { input: "do 1", output: "otheradmin", diff --git a/go/vt/sqlparser/rewriter.go b/go/vt/sqlparser/rewriter.go index 94b54f9bacd..9e407fee6a3 100644 --- a/go/vt/sqlparser/rewriter.go +++ b/go/vt/sqlparser/rewriter.go @@ -745,12 +745,12 @@ func replaceShowBasicFilter(newNode, parent SQLNode) { parent.(*ShowBasic).Filter = newNode.(*ShowFilter) } -func replaceShowColumnsFilter(newNode, parent SQLNode) { - parent.(*ShowColumns).Filter = newNode.(*ShowFilter) +func replaceShowBasicTbl(newNode, parent SQLNode) { + parent.(*ShowBasic).Tbl = newNode.(TableName) } -func replaceShowColumnsTable(newNode, parent SQLNode) { - parent.(*ShowColumns).Table = newNode.(TableName) +func replaceShowCreateOp(newNode, parent SQLNode) { + parent.(*ShowCreate).Op = newNode.(TableName) } func replaceShowFilterFilter(newNode, parent SQLNode) { @@ -769,10 +769,6 @@ func replaceShowLegacyTable(newNode, parent SQLNode) { parent.(*ShowLegacy).Table = newNode.(TableName) } -func replaceShowTableStatusFilter(newNode, parent SQLNode) { - parent.(*ShowTableStatus).Filter = newNode.(*ShowFilter) -} - func replaceStarExprTableName(newNode, parent SQLNode) { parent.(*StarExpr).TableName = newNode.(TableName) } @@ -1523,10 +1519,10 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { case *ShowBasic: a.apply(node, n.Filter, replaceShowBasicFilter) + a.apply(node, n.Tbl, replaceShowBasicTbl) - case *ShowColumns: - a.apply(node, n.Filter, replaceShowColumnsFilter) - a.apply(node, n.Table, replaceShowColumnsTable) + case *ShowCreate: + a.apply(node, n.Op, replaceShowCreateOp) case *ShowFilter: a.apply(node, n.Filter, replaceShowFilterFilter) @@ -1536,9 +1532,6 @@ func (a *application) apply(parent, node SQLNode, replacer replacerFunc) { a.apply(node, n.ShowCollationFilterOpt, replaceShowLegacyShowCollationFilterOpt) a.apply(node, n.Table, replaceShowLegacyTable) - case *ShowTableStatus: - a.apply(node, n.Filter, replaceShowTableStatusFilter) - case *StarExpr: a.apply(node, n.TableName, replaceStarExprTableName) diff --git a/go/vt/sqlparser/sql.go b/go/vt/sqlparser/sql.go index 31282263b9e..84e70012044 100644 --- a/go/vt/sqlparser/sql.go +++ b/go/vt/sqlparser/sql.go @@ -419,169 +419,173 @@ const VITESS_TABLETS = 57622 const CODE = 57623 const PRIVILEGES = 57624 const FUNCTION = 57625 -const NAMES = 57626 -const CHARSET = 57627 -const GLOBAL = 57628 -const SESSION = 57629 -const ISOLATION = 57630 -const LEVEL = 57631 -const READ = 57632 -const WRITE = 57633 -const ONLY = 57634 -const REPEATABLE = 57635 -const COMMITTED = 57636 -const UNCOMMITTED = 57637 -const SERIALIZABLE = 57638 -const CURRENT_TIMESTAMP = 57639 -const DATABASE = 57640 -const CURRENT_DATE = 57641 -const CURRENT_TIME = 57642 -const LOCALTIME = 57643 -const LOCALTIMESTAMP = 57644 -const CURRENT_USER = 57645 -const UTC_DATE = 57646 -const UTC_TIME = 57647 -const UTC_TIMESTAMP = 57648 -const REPLACE = 57649 -const CONVERT = 57650 -const CAST = 57651 -const SUBSTR = 57652 -const SUBSTRING = 57653 -const GROUP_CONCAT = 57654 -const SEPARATOR = 57655 -const TIMESTAMPADD = 57656 -const TIMESTAMPDIFF = 57657 -const MATCH = 57658 -const AGAINST = 57659 -const BOOLEAN = 57660 -const LANGUAGE = 57661 -const WITH = 57662 -const QUERY = 57663 -const EXPANSION = 57664 -const WITHOUT = 57665 -const VALIDATION = 57666 -const UNUSED = 57667 -const ARRAY = 57668 -const CUME_DIST = 57669 -const DESCRIPTION = 57670 -const DENSE_RANK = 57671 -const EMPTY = 57672 -const EXCEPT = 57673 -const FIRST_VALUE = 57674 -const GROUPING = 57675 -const GROUPS = 57676 -const JSON_TABLE = 57677 -const LAG = 57678 -const LAST_VALUE = 57679 -const LATERAL = 57680 -const LEAD = 57681 -const MEMBER = 57682 -const NTH_VALUE = 57683 -const NTILE = 57684 -const OF = 57685 -const OVER = 57686 -const PERCENT_RANK = 57687 -const RANK = 57688 -const RECURSIVE = 57689 -const ROW_NUMBER = 57690 -const SYSTEM = 57691 -const WINDOW = 57692 -const ACTIVE = 57693 -const ADMIN = 57694 -const BUCKETS = 57695 -const CLONE = 57696 -const COMPONENT = 57697 -const DEFINITION = 57698 -const ENFORCED = 57699 -const EXCLUDE = 57700 -const FOLLOWING = 57701 -const GEOMCOLLECTION = 57702 -const GET_MASTER_PUBLIC_KEY = 57703 -const HISTOGRAM = 57704 -const HISTORY = 57705 -const INACTIVE = 57706 -const INVISIBLE = 57707 -const LOCKED = 57708 -const MASTER_COMPRESSION_ALGORITHMS = 57709 -const MASTER_PUBLIC_KEY_PATH = 57710 -const MASTER_TLS_CIPHERSUITES = 57711 -const MASTER_ZSTD_COMPRESSION_LEVEL = 57712 -const NESTED = 57713 -const NETWORK_NAMESPACE = 57714 -const NOWAIT = 57715 -const NULLS = 57716 -const OJ = 57717 -const OLD = 57718 -const OPTIONAL = 57719 -const ORDINALITY = 57720 -const ORGANIZATION = 57721 -const OTHERS = 57722 -const PATH = 57723 -const PERSIST = 57724 -const PERSIST_ONLY = 57725 -const PRECEDING = 57726 -const PRIVILEGE_CHECKS_USER = 57727 -const PROCESS = 57728 -const RANDOM = 57729 -const REFERENCE = 57730 -const REQUIRE_ROW_FORMAT = 57731 -const RESOURCE = 57732 -const RESPECT = 57733 -const RESTART = 57734 -const RETAIN = 57735 -const REUSE = 57736 -const ROLE = 57737 -const SECONDARY = 57738 -const SECONDARY_ENGINE = 57739 -const SECONDARY_LOAD = 57740 -const SECONDARY_UNLOAD = 57741 -const SKIP = 57742 -const SRID = 57743 -const THREAD_PRIORITY = 57744 -const TIES = 57745 -const UNBOUNDED = 57746 -const VCPU = 57747 -const VISIBLE = 57748 -const FORMAT = 57749 -const TREE = 57750 -const VITESS = 57751 -const TRADITIONAL = 57752 -const LOCAL = 57753 -const LOW_PRIORITY = 57754 -const NO_WRITE_TO_BINLOG = 57755 -const LOGS = 57756 -const ERROR = 57757 -const GENERAL = 57758 -const HOSTS = 57759 -const OPTIMIZER_COSTS = 57760 -const USER_RESOURCES = 57761 -const SLOW = 57762 -const CHANNEL = 57763 -const RELAY = 57764 -const EXPORT = 57765 -const AVG_ROW_LENGTH = 57766 -const CONNECTION = 57767 -const CHECKSUM = 57768 -const DELAY_KEY_WRITE = 57769 -const ENCRYPTION = 57770 -const ENGINE = 57771 -const INSERT_METHOD = 57772 -const MAX_ROWS = 57773 -const MIN_ROWS = 57774 -const PACK_KEYS = 57775 -const PASSWORD = 57776 -const FIXED = 57777 -const DYNAMIC = 57778 -const COMPRESSED = 57779 -const REDUNDANT = 57780 -const COMPACT = 57781 -const ROW_FORMAT = 57782 -const STATS_AUTO_RECALC = 57783 -const STATS_PERSISTENT = 57784 -const STATS_SAMPLE_PAGES = 57785 -const STORAGE = 57786 -const MEMORY = 57787 -const DISK = 57788 +const OPEN = 57626 +const TRIGGERS = 57627 +const EVENT = 57628 +const USER = 57629 +const NAMES = 57630 +const CHARSET = 57631 +const GLOBAL = 57632 +const SESSION = 57633 +const ISOLATION = 57634 +const LEVEL = 57635 +const READ = 57636 +const WRITE = 57637 +const ONLY = 57638 +const REPEATABLE = 57639 +const COMMITTED = 57640 +const UNCOMMITTED = 57641 +const SERIALIZABLE = 57642 +const CURRENT_TIMESTAMP = 57643 +const DATABASE = 57644 +const CURRENT_DATE = 57645 +const CURRENT_TIME = 57646 +const LOCALTIME = 57647 +const LOCALTIMESTAMP = 57648 +const CURRENT_USER = 57649 +const UTC_DATE = 57650 +const UTC_TIME = 57651 +const UTC_TIMESTAMP = 57652 +const REPLACE = 57653 +const CONVERT = 57654 +const CAST = 57655 +const SUBSTR = 57656 +const SUBSTRING = 57657 +const GROUP_CONCAT = 57658 +const SEPARATOR = 57659 +const TIMESTAMPADD = 57660 +const TIMESTAMPDIFF = 57661 +const MATCH = 57662 +const AGAINST = 57663 +const BOOLEAN = 57664 +const LANGUAGE = 57665 +const WITH = 57666 +const QUERY = 57667 +const EXPANSION = 57668 +const WITHOUT = 57669 +const VALIDATION = 57670 +const UNUSED = 57671 +const ARRAY = 57672 +const CUME_DIST = 57673 +const DESCRIPTION = 57674 +const DENSE_RANK = 57675 +const EMPTY = 57676 +const EXCEPT = 57677 +const FIRST_VALUE = 57678 +const GROUPING = 57679 +const GROUPS = 57680 +const JSON_TABLE = 57681 +const LAG = 57682 +const LAST_VALUE = 57683 +const LATERAL = 57684 +const LEAD = 57685 +const MEMBER = 57686 +const NTH_VALUE = 57687 +const NTILE = 57688 +const OF = 57689 +const OVER = 57690 +const PERCENT_RANK = 57691 +const RANK = 57692 +const RECURSIVE = 57693 +const ROW_NUMBER = 57694 +const SYSTEM = 57695 +const WINDOW = 57696 +const ACTIVE = 57697 +const ADMIN = 57698 +const BUCKETS = 57699 +const CLONE = 57700 +const COMPONENT = 57701 +const DEFINITION = 57702 +const ENFORCED = 57703 +const EXCLUDE = 57704 +const FOLLOWING = 57705 +const GEOMCOLLECTION = 57706 +const GET_MASTER_PUBLIC_KEY = 57707 +const HISTOGRAM = 57708 +const HISTORY = 57709 +const INACTIVE = 57710 +const INVISIBLE = 57711 +const LOCKED = 57712 +const MASTER_COMPRESSION_ALGORITHMS = 57713 +const MASTER_PUBLIC_KEY_PATH = 57714 +const MASTER_TLS_CIPHERSUITES = 57715 +const MASTER_ZSTD_COMPRESSION_LEVEL = 57716 +const NESTED = 57717 +const NETWORK_NAMESPACE = 57718 +const NOWAIT = 57719 +const NULLS = 57720 +const OJ = 57721 +const OLD = 57722 +const OPTIONAL = 57723 +const ORDINALITY = 57724 +const ORGANIZATION = 57725 +const OTHERS = 57726 +const PATH = 57727 +const PERSIST = 57728 +const PERSIST_ONLY = 57729 +const PRECEDING = 57730 +const PRIVILEGE_CHECKS_USER = 57731 +const PROCESS = 57732 +const RANDOM = 57733 +const REFERENCE = 57734 +const REQUIRE_ROW_FORMAT = 57735 +const RESOURCE = 57736 +const RESPECT = 57737 +const RESTART = 57738 +const RETAIN = 57739 +const REUSE = 57740 +const ROLE = 57741 +const SECONDARY = 57742 +const SECONDARY_ENGINE = 57743 +const SECONDARY_LOAD = 57744 +const SECONDARY_UNLOAD = 57745 +const SKIP = 57746 +const SRID = 57747 +const THREAD_PRIORITY = 57748 +const TIES = 57749 +const UNBOUNDED = 57750 +const VCPU = 57751 +const VISIBLE = 57752 +const FORMAT = 57753 +const TREE = 57754 +const VITESS = 57755 +const TRADITIONAL = 57756 +const LOCAL = 57757 +const LOW_PRIORITY = 57758 +const NO_WRITE_TO_BINLOG = 57759 +const LOGS = 57760 +const ERROR = 57761 +const GENERAL = 57762 +const HOSTS = 57763 +const OPTIMIZER_COSTS = 57764 +const USER_RESOURCES = 57765 +const SLOW = 57766 +const CHANNEL = 57767 +const RELAY = 57768 +const EXPORT = 57769 +const AVG_ROW_LENGTH = 57770 +const CONNECTION = 57771 +const CHECKSUM = 57772 +const DELAY_KEY_WRITE = 57773 +const ENCRYPTION = 57774 +const ENGINE = 57775 +const INSERT_METHOD = 57776 +const MAX_ROWS = 57777 +const MIN_ROWS = 57778 +const PACK_KEYS = 57779 +const PASSWORD = 57780 +const FIXED = 57781 +const DYNAMIC = 57782 +const COMPRESSED = 57783 +const REDUNDANT = 57784 +const COMPACT = 57785 +const ROW_FORMAT = 57786 +const STATS_AUTO_RECALC = 57787 +const STATS_PERSISTENT = 57788 +const STATS_SAMPLE_PAGES = 57789 +const STORAGE = 57790 +const MEMORY = 57791 +const DISK = 57792 var yyToknames = [...]string{ "$end", @@ -884,6 +888,10 @@ var yyToknames = [...]string{ "CODE", "PRIVILEGES", "FUNCTION", + "OPEN", + "TRIGGERS", + "EVENT", + "USER", "NAMES", "CHARSET", "GLOBAL", @@ -1062,33 +1070,33 @@ var yyExca = [...]int{ 1, -1, -2, 0, -1, 43, - 163, 921, + 163, 923, -2, 90, -1, 44, 1, 111, - 464, 111, + 468, 111, -2, 117, -1, 45, 143, 117, 254, 117, - 302, 117, + 306, 117, -2, 324, -1, 52, - 34, 463, - 164, 463, - 176, 463, - 209, 477, - 210, 477, - -2, 465, + 34, 465, + 164, 465, + 176, 465, + 209, 479, + 210, 479, + -2, 467, -1, 57, - 166, 487, - -2, 485, + 166, 489, + -2, 487, -1, 82, - 56, 554, - -2, 562, + 56, 556, + -2, 564, -1, 107, 1, 112, - 464, 112, + 468, 112, -2, 117, -1, 117, 169, 229, @@ -1097,578 +1105,585 @@ var yyExca = [...]int{ -1, 136, 143, 117, 254, 117, - 302, 117, + 306, 117, -2, 333, - -1, 564, - 150, 942, - -2, 938, - -1, 565, - 150, 943, - -2, 939, - -1, 583, - 56, 555, - -2, 567, - -1, 584, - 56, 556, - -2, 568, - -1, 604, - 118, 1279, + -1, 570, + 150, 944, + -2, 940, + -1, 571, + 150, 945, + -2, 941, + -1, 589, + 56, 557, + -2, 569, + -1, 590, + 56, 558, + -2, 570, + -1, 610, + 118, 1283, -2, 83, - -1, 605, - 118, 1163, - -2, 84, -1, 611, - 118, 1213, - -2, 915, - -1, 748, - 118, 1102, - -2, 912, - -1, 783, + 118, 1166, + -2, 84, + -1, 617, + 118, 1216, + -2, 917, + -1, 754, + 118, 1104, + -2, 914, + -1, 789, 175, 37, 180, 37, -2, 240, - -1, 862, + -1, 868, 1, 371, - 464, 371, + 468, 371, -2, 117, - -1, 1094, + -1, 1104, 1, 267, - 464, 267, + 468, 267, -2, 117, - -1, 1172, + -1, 1182, 169, 229, 170, 229, -2, 318, - -1, 1181, + -1, 1191, 175, 38, 180, 38, -2, 241, - -1, 1385, - 150, 945, - -2, 941, - -1, 1477, + -1, 1399, + 150, 947, + -2, 943, + -1, 1491, 74, 65, 82, 65, -2, 69, - -1, 1498, + -1, 1512, 1, 268, - 464, 268, + 468, 268, -2, 117, - -1, 1906, - 5, 809, - 18, 809, - 20, 809, - 32, 809, - 83, 809, - -2, 593, - -1, 2118, - 46, 883, - -2, 881, + -1, 1920, + 5, 811, + 18, 811, + 20, 811, + 32, 811, + 83, 811, + -2, 595, + -1, 2132, + 46, 885, + -2, 883, } const yyPrivate = 57344 -const yyLast = 27755 +const yyLast = 27976 var yyAct = [...]int{ - 564, 2199, 2186, 1958, 2118, 1819, 2163, 1709, 2127, 2069, - 2047, 1676, 1886, 81, 3, 997, 1561, 593, 1788, 537, - 1887, 1955, 523, 1883, 1528, 1422, 1042, 1792, 1710, 1156, - 506, 1696, 1533, 916, 1773, 508, 1774, 1495, 1049, 145, - 1898, 576, 1845, 1379, 1303, 1636, 1474, 1772, 176, 1766, - 1611, 188, 1559, 471, 188, 1535, 1179, 1290, 131, 487, - 1371, 188, 1079, 1086, 1513, 752, 778, 1456, 1069, 188, - 874, 79, 609, 1047, 1070, 1424, 1463, 585, 1052, 570, - 499, 510, 500, 1405, 1072, 1035, 1348, 32, 759, 813, - 487, 933, 1186, 487, 188, 487, 1155, 1269, 764, 760, - 756, 784, 1439, 779, 780, 1524, 1083, 1059, 1085, 77, - 1306, 868, 108, 148, 1076, 1479, 1171, 1151, 109, 114, - 115, 768, 494, 606, 781, 175, 855, 1010, 8, 7, - 1197, 6, 1811, 1810, 1590, 76, 1011, 1833, 1834, 2071, - 177, 178, 179, 1337, 1419, 1420, 1336, 1256, 1335, 1334, - 1333, 82, 1332, 791, 497, 2155, 498, 1674, 110, 753, - 1325, 2115, 116, 591, 595, 571, 2026, 1932, 2093, 2092, - 2042, 188, 817, 2043, 2205, 816, 818, 1514, 2160, 2198, - 1382, 188, 78, 867, 2138, 495, 188, 84, 85, 86, - 87, 88, 89, 2189, 1157, 549, 603, 555, 556, 553, - 554, 1959, 552, 551, 550, 177, 178, 179, 1578, 1626, - 2159, 934, 557, 558, 1862, 1538, 1990, 2137, 770, 1675, - 772, 110, 1912, 815, 914, 102, 771, 1832, 34, 174, - 449, 70, 38, 39, 1597, 1624, 829, 830, 1596, 833, - 834, 835, 836, 794, 1489, 839, 840, 841, 842, 843, - 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, - 1913, 1914, 819, 820, 821, 462, 1421, 610, 169, 1490, - 1491, 1480, 795, 884, 463, 1740, 944, 1087, 1739, 1088, - 105, 1741, 97, 475, 460, 882, 912, 100, 773, 110, - 99, 98, 169, 111, 1537, 568, 870, 105, 826, 182, - 183, 895, 567, 69, 153, 896, 893, 894, 893, 894, - 1757, 1507, 1981, 1821, 105, 170, 1979, 111, 485, 133, - 1326, 1327, 1328, 457, 1324, 832, 831, 2140, 153, 774, - 489, 474, 469, 483, 1246, 1793, 1560, 103, 1815, 177, - 178, 179, 1275, 1270, 1593, 1744, 1816, 2188, 1278, 856, - 1279, 932, 1280, 910, 103, 888, 889, 890, 150, 143, - 151, 1824, 885, 863, 132, 911, 940, 886, 887, 168, - 1605, 2156, 838, 837, 883, 475, 1247, 1823, 1248, 1272, - 2037, 1274, 150, 802, 151, 1822, 2089, 775, 1562, 120, - 121, 142, 141, 168, 1457, 811, 1276, 800, 810, 503, - 809, 808, 450, 451, 452, 807, 467, 468, 478, 806, - 805, 804, 464, 466, 479, 453, 454, 481, 480, 799, - 456, 455, 1273, 474, 459, 476, 1846, 154, 1165, 812, - 2038, 1931, 2175, 104, 1480, 757, 475, 159, 173, 755, - 475, 137, 118, 144, 125, 117, 908, 138, 139, 188, - 104, 154, 2206, 757, 1610, 107, 757, 1539, 787, 1185, - 1184, 159, 126, 897, 901, 786, 2203, 104, 869, 1848, - 1595, 769, 487, 487, 487, 803, 129, 127, 122, 123, - 124, 128, 2136, 934, 474, 597, 119, 898, 474, 801, - 487, 487, 1825, 1754, 1749, 130, 1584, 793, 939, 936, - 937, 938, 943, 945, 942, 926, 941, 1677, 1679, 475, - 177, 178, 179, 935, 2128, 1283, 793, 920, 793, 822, - 951, 877, 878, 879, 880, 881, 1625, 1850, 1782, 1854, - 1613, 1849, 1592, 1847, 828, 1612, 2141, 1750, 1852, 146, - 793, 913, 1871, 1870, 1869, 767, 71, 1851, 944, 477, - 1613, 793, 766, 765, 1803, 1612, 500, 474, 866, 1752, - 1853, 1855, 1747, 146, 763, 1008, 448, 472, 188, 1258, - 1257, 1259, 1260, 1261, 1748, 1604, 907, 180, 1603, 1580, - 982, 983, 473, 2122, 2010, 1736, 1040, 980, 909, 903, - 1911, 905, 1701, 1644, 487, 1045, 1048, 188, 1570, 188, - 188, 891, 487, 1678, 1485, 1063, 995, 793, 487, 1039, - 872, 1655, 140, 2201, 860, 1652, 2202, 1496, 2200, 960, - 929, 927, 970, 928, 134, 970, 998, 135, 902, 904, - 1435, 862, 792, 1755, 1753, 606, 1321, 1304, 940, 786, - 789, 790, 950, 757, 876, 1068, 2097, 783, 787, 1307, - 92, 792, 1036, 792, 814, 1896, 1355, 796, 786, 1864, - 786, 789, 790, 1053, 757, 1271, 782, 797, 783, 787, - 1353, 1354, 1352, 1089, 930, 792, 947, 827, 1013, 1015, - 1017, 1019, 1021, 1023, 1024, 798, 792, 1014, 1016, 1033, - 1020, 1022, 950, 1025, 857, 93, 858, 917, 918, 859, - 177, 178, 179, 1579, 147, 152, 149, 155, 156, 157, - 158, 160, 161, 162, 163, 861, 1406, 1162, 1662, 1406, - 164, 165, 166, 167, 1577, 1041, 900, 1575, 147, 152, - 149, 155, 156, 157, 158, 160, 161, 162, 163, 802, - 1751, 899, 792, 1916, 164, 165, 166, 167, 796, 786, - 982, 983, 188, 1305, 982, 983, 1147, 875, 797, 1572, - 1762, 800, 1408, 1051, 172, 1308, 1158, 1159, 1160, 1161, - 939, 936, 937, 938, 943, 945, 942, 1572, 941, 610, - 949, 947, 487, 1576, 1181, 935, 963, 964, 965, 966, - 967, 960, 1190, 2190, 970, 1056, 1194, 950, 2207, 487, - 487, 1574, 487, 2025, 487, 487, 2180, 487, 487, 487, - 487, 487, 487, 961, 962, 963, 964, 965, 966, 967, - 960, 2191, 487, 970, 2024, 1937, 188, 1230, 2193, 1265, - 1191, 177, 178, 179, 2181, 1373, 1170, 1629, 1630, 1631, - 1770, 1650, 1243, 1769, 579, 69, 1084, 1177, 1189, 1649, - 948, 949, 947, 487, 1542, 1225, 1226, 1351, 1866, 596, - 762, 188, 1437, 1163, 1164, 1263, 2208, 1253, 950, 188, - 1266, 1289, 1251, 188, 948, 949, 947, 1250, 1249, 1440, - 1441, 1146, 1241, 1188, 188, 1154, 188, 1227, 1264, 1153, - 1235, 1374, 950, 1167, 1294, 1232, 1168, 1166, 487, 487, - 487, 188, 487, 487, 188, 487, 487, 1231, 1873, 1180, - 1206, 984, 985, 986, 987, 988, 989, 990, 991, 992, - 993, 1233, 1234, 1818, 1262, 1436, 1252, 1239, 1240, 2192, - 1199, 580, 1200, 188, 1202, 1204, 601, 1309, 1208, 1210, - 1212, 1214, 1216, 1187, 1187, 1292, 1651, 598, 599, 2182, - 948, 949, 947, 1295, 1993, 1297, 1874, 1299, 1300, 1301, - 1302, 948, 949, 947, 1338, 1339, 1340, 1341, 950, 2171, - 2060, 1372, 2022, 1349, 1998, 772, 110, 1919, 1284, 950, - 1375, 771, 959, 958, 968, 969, 961, 962, 963, 964, - 965, 966, 967, 960, 487, 1875, 970, 177, 178, 179, - 1228, 959, 958, 968, 969, 961, 962, 963, 964, 965, - 966, 967, 960, 1376, 1377, 970, 1779, 1319, 1771, 1392, - 1393, 1767, 1343, 1345, 1346, 1620, 1588, 487, 487, 1383, - 948, 949, 947, 1587, 1344, 1350, 1293, 1389, 188, 1394, - 1397, 1637, 948, 949, 947, 1407, 1254, 1331, 950, 1242, - 565, 487, 1238, 1384, 1429, 1237, 500, 1236, 188, 2087, - 950, 487, 948, 949, 947, 188, 2086, 188, 1385, 998, - 1944, 2174, 1957, 1413, 1414, 188, 188, 1944, 2134, 1795, - 950, 1430, 487, 1944, 2123, 487, 1944, 580, 1475, 1944, - 2095, 1442, 2040, 580, 1572, 580, 487, 1383, 177, 178, - 179, 189, 1743, 1781, 189, 1504, 1386, 1494, 1895, 488, - 2126, 189, 177, 178, 179, 606, 1554, 78, 606, 189, - 1730, 1454, 1310, 1311, 1312, 2005, 1314, 1315, 1480, 1317, - 1318, 1450, 2008, 580, 1499, 69, 1385, 177, 178, 179, - 488, 1552, 946, 488, 189, 488, 177, 178, 179, 2096, - 1244, 487, 1944, 1949, 1884, 188, 1929, 1928, 487, 1925, - 1926, 1500, 1503, 1895, 1551, 1553, 1532, 1944, 1452, 34, - 1530, 1925, 1924, 1927, 1515, 1516, 1517, 487, 34, 1536, - 1390, 1391, 1449, 487, 1396, 1399, 1400, 1190, 1486, 1190, - 1478, 1487, 1460, 1483, 1704, 580, 1481, 1571, 1481, 1502, - 1501, 1448, 580, 1480, 1812, 1150, 1797, 1790, 1791, 1412, - 1460, 580, 1415, 1416, 946, 580, 1459, 1705, 1150, 1149, - 1508, 189, 1509, 1510, 1511, 1512, 2076, 487, 1697, 1372, - 1697, 189, 1095, 1094, 1372, 1372, 189, 80, 1520, 1521, - 1522, 1523, 1558, 1568, 69, 1569, 1573, 1531, 1526, 1527, - 1540, 1543, 1448, 69, 1541, 1547, 1548, 1549, 1482, 610, - 1482, 1992, 610, 1488, 1667, 1666, 1484, 1460, 1480, 188, - 1448, 1564, 1572, 188, 188, 188, 188, 188, 1567, 1555, - 1582, 1531, 1563, 188, 188, 188, 188, 1438, 2027, 1583, - 1417, 1329, 1581, 2049, 1585, 1586, 34, 1460, 573, 1895, - 794, 1572, 1282, 1448, 1081, 188, 188, 188, 959, 958, - 968, 969, 961, 962, 963, 964, 965, 966, 967, 960, - 188, 777, 970, 188, 487, 776, 1956, 1221, 2016, 795, - 1152, 1529, 1817, 1565, 1525, 1519, 2028, 2029, 2030, 1187, - 959, 958, 968, 969, 961, 962, 963, 964, 965, 966, - 967, 960, 1347, 1518, 970, 1356, 1357, 1358, 1359, 1360, - 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1368, 1369, 1370, - 1268, 69, 1349, 69, 1614, 1222, 1223, 1224, 1775, 1182, - 1618, 1178, 1148, 1591, 94, 2105, 959, 958, 968, 969, - 961, 962, 963, 964, 965, 966, 967, 960, 1776, 1608, - 970, 958, 968, 969, 961, 962, 963, 964, 965, 966, - 967, 960, 1409, 2031, 970, 174, 1899, 1900, 188, 1820, - 2195, 1623, 1218, 1776, 1663, 2050, 188, 1157, 2187, 1902, - 1884, 1646, 1786, 1785, 1350, 1784, 1545, 1322, 1285, 1632, - 968, 969, 961, 962, 963, 964, 965, 966, 967, 960, - 188, 1905, 970, 1904, 1687, 1688, 1048, 1683, 2032, 2033, - 1718, 188, 188, 188, 188, 188, 1645, 1219, 1220, 1690, - 1706, 1721, 1717, 188, 571, 2177, 1722, 188, 1719, 586, - 188, 188, 2158, 1720, 188, 188, 188, 1702, 1661, 1723, - 1728, 1469, 1470, 1876, 587, 1711, 1699, 1742, 1686, 189, - 1050, 1681, 1036, 1673, 2009, 526, 525, 528, 529, 530, - 531, 2146, 1689, 1947, 527, 1761, 532, 1054, 1055, 589, - 1695, 588, 488, 488, 488, 1694, 1731, 1698, 1700, 1712, - 1733, 2143, 1715, 2179, 2162, 2164, 1713, 1714, 1745, 1716, - 488, 488, 1684, 2170, 2169, 1729, 188, 1734, 1724, 2119, - 1685, 1760, 1737, 1763, 1764, 1765, 2117, 487, 1292, 96, - 1281, 1641, 1642, 487, 1536, 566, 487, 1746, 1190, 1768, - 1780, 1402, 824, 487, 1758, 1759, 101, 586, 823, 1043, - 1968, 919, 1659, 1775, 1798, 1809, 1403, 1805, 1831, 2074, - 1777, 1044, 587, 188, 2106, 1804, 1794, 111, 1921, 1465, - 1468, 1469, 1470, 1466, 1800, 1467, 1471, 1920, 1566, 181, - 1807, 188, 1196, 1195, 1170, 583, 584, 589, 189, 588, - 1183, 1808, 2003, 171, 1799, 1433, 184, 1778, 1384, 1465, - 1468, 1469, 1470, 1466, 1806, 1467, 1471, 1440, 1441, 1899, - 1900, 1550, 1288, 1385, 488, 487, 2088, 189, 2044, 189, - 189, 1372, 488, 1473, 574, 575, 1628, 1827, 488, 1826, - 1693, 577, 1829, 2184, 1830, 1879, 2183, 2167, 1692, 2147, - 2002, 1943, 1556, 1844, 578, 80, 2001, 1697, 1842, 1835, - 1865, 487, 2197, 2196, 1843, 1656, 1653, 1841, 1064, 1057, - 2197, 2120, 188, 1918, 1857, 1434, 573, 78, 1863, 83, - 75, 1, 487, 458, 1418, 1034, 470, 2185, 487, 487, - 1255, 1856, 1885, 1245, 1960, 1880, 2046, 1950, 1534, 785, - 136, 1497, 1498, 2130, 91, 1888, 750, 90, 788, 906, - 1557, 188, 2041, 1756, 1506, 1842, 1101, 1099, 1100, 1098, - 1711, 1894, 1103, 1102, 1882, 1097, 1323, 484, 1472, 1090, - 1058, 825, 1930, 1633, 1634, 1635, 1903, 1320, 1589, 1387, - 1388, 1907, 465, 1909, 892, 1910, 461, 978, 1691, 1738, - 607, 600, 1890, 2168, 2144, 2142, 2116, 1908, 2070, 2145, - 2114, 1938, 2178, 188, 1915, 188, 188, 188, 2161, 1505, - 1432, 487, 1046, 2000, 1878, 1660, 1922, 1923, 1007, 1404, - 1073, 509, 189, 1431, 188, 1428, 1342, 524, 521, 1934, - 1933, 1872, 169, 522, 1443, 1703, 952, 507, 501, 1951, - 1065, 1961, 487, 487, 487, 1464, 188, 1536, 1462, 1946, - 1948, 1461, 488, 1286, 1954, 1969, 1953, 111, 1077, 1893, - 1901, 1897, 1071, 1447, 1594, 1814, 931, 582, 153, 488, - 488, 496, 488, 95, 488, 488, 1945, 488, 488, 488, - 488, 488, 488, 1401, 2104, 1935, 1936, 1627, 1989, 581, - 60, 37, 488, 491, 2154, 1977, 189, 922, 590, 31, - 30, 29, 28, 23, 1991, 1972, 22, 21, 20, 19, - 25, 18, 17, 16, 106, 47, 44, 42, 113, 112, - 1966, 1967, 150, 488, 151, 45, 41, 500, 864, 2004, - 27, 189, 26, 168, 2014, 15, 14, 2015, 13, 189, - 2017, 12, 11, 189, 2013, 10, 9, 5, 4, 925, - 24, 1711, 996, 2012, 189, 2, 189, 0, 0, 1999, - 2019, 2020, 0, 0, 487, 487, 2018, 0, 488, 488, - 488, 189, 488, 488, 189, 488, 488, 487, 0, 0, - 487, 2034, 2035, 0, 1974, 1975, 0, 1976, 0, 0, - 1978, 154, 1980, 0, 0, 2045, 2053, 0, 0, 0, - 0, 159, 0, 189, 0, 0, 0, 0, 0, 2021, - 0, 2023, 0, 2048, 0, 487, 487, 487, 188, 2051, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, - 0, 487, 0, 2063, 2065, 2066, 0, 487, 2073, 2072, - 500, 2077, 2079, 2067, 0, 1888, 2075, 0, 0, 1888, - 0, 2059, 0, 0, 0, 2082, 0, 1837, 1838, 188, - 2052, 0, 0, 0, 488, 0, 0, 0, 0, 0, - 487, 188, 1858, 1859, 2081, 1860, 1861, 2091, 2094, 2084, - 2083, 2085, 0, 2068, 0, 0, 1867, 1868, 2098, 0, - 0, 0, 0, 0, 0, 0, 0, 488, 488, 2113, - 0, 0, 0, 146, 0, 0, 0, 0, 189, 2121, - 0, 0, 0, 0, 0, 0, 1888, 487, 487, 0, - 0, 488, 2124, 0, 0, 0, 0, 2129, 189, 0, - 0, 488, 0, 0, 0, 189, 0, 189, 0, 0, - 0, 0, 0, 487, 2139, 189, 189, 487, 2148, 536, - 2048, 2131, 488, 2150, 0, 488, 0, 0, 1639, 0, - 2157, 0, 1640, 0, 0, 2153, 488, 2166, 2165, 1917, - 0, 0, 0, 1647, 1648, 0, 1711, 0, 0, 1654, - 0, 2176, 1657, 1658, 0, 0, 0, 0, 0, 0, - 1664, 0, 1665, 0, 0, 1668, 1669, 1670, 1671, 1672, - 187, 0, 0, 482, 0, 0, 0, 0, 2194, 0, - 187, 1682, 0, 0, 0, 0, 0, 0, 187, 2204, - 0, 488, 0, 1118, 0, 189, 0, 0, 488, 0, - 0, 0, 0, 0, 594, 594, 0, 0, 0, 0, - 0, 0, 0, 187, 0, 0, 0, 488, 1987, 0, - 0, 0, 580, 488, 0, 0, 1970, 1726, 1727, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 147, 152, - 149, 155, 156, 157, 158, 160, 161, 162, 163, 0, - 0, 0, 0, 0, 164, 165, 166, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 488, 959, 958, - 968, 969, 961, 962, 963, 964, 965, 966, 967, 960, - 0, 0, 970, 0, 0, 0, 0, 0, 0, 0, + 570, 2213, 2200, 1972, 2177, 1833, 1802, 1723, 514, 2141, + 2132, 2083, 2061, 926, 81, 3, 1900, 1575, 543, 1690, + 1509, 1901, 582, 1436, 1969, 1059, 1724, 1007, 529, 1897, + 1542, 1806, 1710, 512, 1527, 1166, 1547, 758, 1787, 1488, + 1788, 1912, 1859, 145, 1650, 1786, 880, 1625, 176, 1393, + 1573, 188, 1300, 477, 188, 907, 1052, 1189, 79, 493, + 819, 188, 131, 1385, 1549, 1096, 1780, 1089, 1477, 188, + 784, 1470, 1062, 1057, 1438, 1082, 1045, 1419, 615, 576, + 591, 1362, 32, 516, 943, 1080, 797, 1161, 765, 762, + 493, 1165, 505, 493, 188, 493, 1196, 1079, 770, 790, + 1279, 1453, 1086, 612, 766, 1538, 785, 786, 1095, 1069, + 1493, 77, 924, 787, 1093, 1305, 1207, 774, 874, 861, + 1181, 500, 8, 114, 115, 7, 108, 109, 148, 76, + 6, 1825, 1824, 1604, 2085, 1847, 1848, 1351, 175, 1020, + 1266, 1433, 1434, 1528, 1350, 1349, 1021, 177, 178, 179, + 1348, 82, 1347, 1346, 503, 1339, 504, 597, 601, 1688, + 577, 2129, 509, 759, 2169, 2040, 116, 2107, 2106, 1946, + 823, 188, 2056, 110, 822, 2057, 2219, 2174, 2212, 1167, + 824, 188, 78, 873, 501, 2152, 188, 84, 85, 86, + 87, 88, 89, 944, 821, 2203, 453, 177, 178, 179, + 1552, 1973, 1592, 1640, 609, 801, 2173, 835, 836, 1876, + 839, 840, 841, 842, 2004, 776, 845, 846, 847, 848, + 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, + 859, 832, 800, 616, 778, 777, 110, 944, 555, 2151, + 561, 562, 559, 560, 102, 558, 557, 556, 1097, 174, + 1098, 825, 826, 827, 779, 563, 564, 470, 954, 1927, + 1928, 1504, 1505, 1435, 34, 1494, 469, 70, 38, 39, + 1611, 1689, 1754, 1926, 1610, 1753, 467, 1846, 1755, 1551, + 169, 105, 1638, 182, 183, 1503, 914, 900, 916, 177, + 178, 179, 837, 481, 893, 887, 888, 899, 574, 105, + 838, 97, 954, 876, 110, 111, 100, 133, 922, 99, + 98, 573, 1771, 780, 1521, 464, 153, 2154, 1835, 1340, + 1341, 1342, 1995, 1993, 475, 913, 915, 491, 1338, 495, + 489, 1256, 1807, 942, 105, 170, 1396, 885, 103, 69, + 1574, 886, 887, 888, 1607, 480, 1829, 143, 950, 1280, + 2202, 1288, 132, 1289, 1830, 1290, 103, 862, 904, 905, + 902, 903, 1285, 920, 906, 1619, 869, 481, 1838, 844, + 150, 843, 151, 1257, 2103, 1258, 901, 120, 121, 142, + 141, 168, 1837, 894, 2170, 1282, 781, 921, 2051, 808, + 1836, 1576, 950, 1284, 454, 456, 457, 1175, 473, 474, + 482, 806, 1471, 818, 471, 472, 483, 458, 459, 487, + 486, 481, 463, 460, 462, 468, 1286, 817, 816, 480, + 466, 484, 815, 912, 481, 814, 911, 917, 2220, 137, + 118, 144, 125, 117, 1283, 138, 139, 1945, 104, 154, + 813, 812, 910, 811, 810, 805, 1553, 2052, 1494, 159, + 126, 1624, 763, 188, 897, 2189, 104, 793, 173, 481, + 763, 1195, 1194, 480, 129, 127, 122, 123, 124, 128, + 107, 918, 1768, 1763, 119, 792, 480, 875, 493, 493, + 493, 809, 775, 130, 949, 946, 947, 948, 953, 955, + 952, 104, 951, 807, 603, 1839, 493, 493, 919, 945, + 2217, 883, 1598, 889, 890, 891, 892, 1293, 2150, 930, + 1609, 480, 936, 799, 828, 763, 1764, 1796, 2142, 761, + 1606, 1691, 1693, 923, 1639, 799, 2155, 1885, 949, 946, + 947, 948, 953, 955, 952, 1884, 951, 1883, 1766, 773, + 772, 1761, 771, 945, 1627, 485, 1817, 1627, 872, 1626, + 769, 146, 1626, 1762, 452, 180, 1860, 1618, 992, 993, + 1617, 2136, 1510, 478, 2024, 1925, 1268, 1267, 1269, 1270, + 1271, 834, 1715, 1658, 188, 1584, 1669, 799, 479, 1499, + 1073, 1594, 1005, 878, 896, 866, 71, 980, 1750, 1449, + 884, 927, 928, 1050, 970, 990, 898, 980, 799, 1862, + 493, 908, 1049, 188, 140, 188, 188, 1666, 493, 177, + 178, 179, 1769, 1767, 493, 799, 134, 1692, 1335, 135, + 939, 612, 882, 937, 960, 2111, 92, 1008, 938, 820, + 2119, 969, 968, 978, 979, 971, 972, 973, 974, 975, + 976, 977, 970, 799, 1078, 980, 868, 2215, 798, 1046, + 2216, 1910, 2214, 1306, 802, 792, 1281, 1864, 1099, 1868, + 798, 1863, 940, 1861, 803, 863, 1878, 864, 1866, 1776, + 865, 93, 1063, 867, 177, 178, 179, 1865, 1387, 1420, + 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, + 1867, 1869, 957, 1591, 1043, 1665, 1023, 1025, 1027, 1029, + 1031, 1033, 1034, 1024, 1026, 1593, 1030, 1032, 960, 1035, + 1172, 1420, 798, 1676, 833, 992, 993, 909, 1589, 1765, + 147, 152, 149, 155, 156, 157, 158, 160, 161, 162, + 163, 1051, 808, 798, 1388, 881, 164, 165, 166, 167, + 792, 795, 796, 806, 763, 1369, 992, 993, 789, 793, + 798, 616, 1586, 1586, 1454, 1455, 802, 792, 188, 1367, + 1368, 1366, 1157, 1451, 2204, 1930, 803, 788, 2039, 1307, + 172, 2221, 1168, 1169, 1170, 1171, 1590, 1588, 798, 958, + 959, 957, 959, 957, 804, 792, 795, 796, 493, 763, + 1191, 69, 2205, 789, 793, 1066, 1664, 960, 1200, 960, + 2038, 1951, 1204, 1365, 1663, 493, 493, 1784, 493, 1201, + 493, 493, 1783, 493, 493, 493, 493, 493, 493, 973, + 974, 975, 976, 977, 970, 1187, 1450, 980, 493, 958, + 959, 957, 188, 1240, 1235, 1236, 958, 959, 957, 2222, + 1173, 1174, 2194, 2120, 1556, 1276, 1180, 960, 1253, 602, + 1261, 958, 959, 957, 960, 1199, 958, 959, 957, 493, + 958, 959, 957, 1094, 1880, 1237, 768, 188, 1260, 960, + 2195, 1643, 1644, 1645, 960, 188, 1259, 1299, 960, 188, + 1275, 1887, 1197, 1197, 1357, 1359, 1360, 1164, 1163, 1251, + 177, 178, 179, 1198, 1757, 188, 1358, 1273, 1243, 1244, + 1156, 1245, 188, 1177, 1249, 1250, 1178, 1176, 599, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 493, 493, + 493, 1263, 1209, 1242, 1210, 1061, 1212, 1214, 1190, 1888, + 1218, 1220, 1222, 1224, 1226, 1785, 1241, 604, 605, 1274, + 1310, 1308, 1309, 188, 177, 178, 179, 1314, 1568, 1316, + 1317, 1318, 1319, 607, 1321, 1313, 1272, 1302, 1216, 958, + 959, 957, 1320, 2207, 971, 972, 973, 974, 975, 976, + 977, 970, 1238, 506, 980, 2206, 2196, 960, 2185, 1832, + 1262, 1386, 1363, 532, 531, 534, 535, 536, 537, 2074, + 1389, 1294, 533, 2036, 538, 778, 777, 110, 177, 178, + 179, 2012, 1566, 1933, 493, 177, 178, 179, 1889, 1254, + 1793, 1312, 177, 178, 179, 1781, 78, 1634, 1602, 1397, + 1601, 1303, 1408, 1411, 1264, 1252, 1390, 1391, 1421, 1248, + 1331, 1332, 1333, 1247, 1403, 1246, 586, 493, 493, 1958, + 2188, 1958, 2148, 1958, 2137, 1345, 2101, 1364, 188, 1958, + 586, 1958, 2109, 2054, 586, 1586, 586, 1495, 1398, 2022, + 586, 493, 1958, 1963, 1943, 1942, 1939, 1940, 188, 1939, + 1938, 493, 1444, 2100, 1008, 188, 1443, 188, 1462, 586, + 1494, 1826, 1456, 1495, 1399, 188, 188, 1397, 1711, 1427, + 1428, 1971, 493, 1711, 586, 493, 1160, 1811, 34, 1489, + 1804, 1805, 1474, 586, 1809, 612, 493, 1898, 612, 956, + 586, 1160, 1159, 1105, 1104, 34, 1909, 80, 1400, 1496, + 1795, 2041, 1587, 1718, 1518, 1361, 1468, 1498, 1370, 1371, + 1372, 1373, 1374, 1375, 1376, 1377, 1378, 1379, 1380, 1381, + 1382, 1383, 1384, 1514, 1464, 1496, 1719, 1463, 1513, 1909, + 1744, 2019, 1399, 1494, 1529, 1530, 1531, 1474, 1494, 1473, + 956, 493, 1909, 2090, 2110, 188, 1231, 34, 493, 2042, + 2043, 2044, 1958, 69, 1565, 1567, 1517, 1586, 1941, 1474, + 1466, 1502, 1681, 1462, 1680, 1423, 1544, 493, 1492, 1462, + 69, 579, 1586, 493, 1569, 1550, 1452, 1200, 1497, 1200, + 1522, 1501, 1523, 1524, 1525, 1526, 1500, 1585, 1431, 1343, + 1474, 1292, 1516, 1515, 1232, 1233, 1234, 1462, 1534, 1535, + 1536, 1537, 1091, 783, 1572, 782, 2140, 69, 2063, 1970, + 2030, 1162, 1543, 1831, 1579, 616, 1539, 493, 616, 1386, + 1533, 1532, 69, 1278, 1386, 1386, 1545, 1192, 1188, 1158, + 94, 1790, 2045, 174, 1582, 1789, 1583, 1834, 1540, 1541, + 1561, 1562, 1563, 1555, 1557, 1554, 69, 1913, 1914, 1228, + 2064, 571, 801, 1167, 1595, 2209, 2201, 1916, 1898, 188, + 1545, 1578, 1197, 188, 188, 188, 188, 188, 1596, 1800, + 1577, 1799, 1581, 188, 188, 188, 188, 2046, 2047, 800, + 1790, 1798, 1597, 1559, 1336, 1295, 188, 1599, 1600, 1919, + 1918, 1735, 1732, 188, 1229, 1230, 1736, 1479, 1482, 1483, + 1484, 1480, 189, 1481, 1485, 189, 1733, 1913, 1914, 1731, + 494, 1734, 189, 2191, 2172, 1060, 1890, 188, 493, 1737, + 189, 1483, 1484, 1700, 2023, 1961, 1404, 1405, 1709, 1708, + 1410, 1413, 1414, 2160, 2157, 1629, 1630, 2193, 2176, 2178, + 1632, 494, 96, 2184, 494, 189, 494, 1633, 101, 2183, + 1479, 1482, 1483, 1484, 1480, 1426, 1481, 1485, 1429, 1430, + 2133, 1605, 2131, 1291, 572, 1363, 978, 979, 971, 972, + 973, 974, 975, 976, 977, 970, 592, 1622, 980, 969, + 968, 978, 979, 971, 972, 973, 974, 975, 976, 977, + 970, 593, 181, 980, 1698, 171, 1794, 961, 184, 830, + 829, 1053, 1699, 1982, 1789, 1845, 1660, 929, 1637, 592, + 1416, 2088, 188, 1054, 1064, 1065, 595, 2017, 594, 1422, + 188, 1819, 189, 1818, 593, 1417, 111, 1935, 1646, 1934, + 1364, 1580, 189, 506, 1206, 1205, 1193, 189, 1651, 1454, + 1455, 1564, 1018, 1447, 188, 1298, 2102, 589, 590, 595, + 2058, 594, 1487, 580, 581, 188, 188, 188, 188, 188, + 1659, 1707, 1725, 577, 1642, 1720, 583, 188, 2198, 1706, + 2197, 188, 1055, 1058, 188, 188, 1675, 2181, 188, 188, + 188, 1697, 1716, 1713, 2161, 1742, 2016, 1046, 1687, 1957, + 1570, 1756, 584, 1704, 1695, 80, 2015, 1893, 1711, 2211, + 2210, 585, 1670, 1667, 1074, 1067, 1703, 2211, 579, 1775, + 1647, 1648, 1649, 1745, 2134, 1712, 1932, 1747, 1448, 78, + 83, 75, 1, 465, 1432, 1714, 1044, 476, 1774, 2199, + 1777, 1778, 1779, 1265, 1738, 1255, 1759, 1974, 1772, 1773, + 188, 1727, 1728, 1743, 1730, 2060, 1748, 1964, 1751, 1548, + 791, 493, 1726, 136, 1511, 1729, 1512, 493, 1302, 2144, + 493, 91, 1200, 1808, 1550, 1760, 1812, 493, 756, 90, + 794, 895, 1571, 2055, 1770, 1520, 1111, 1109, 1814, 1823, + 1782, 586, 1110, 1108, 1113, 1112, 1107, 188, 1337, 490, + 1486, 1100, 1792, 1791, 1068, 831, 455, 1944, 1822, 1334, + 1603, 461, 988, 1705, 1752, 188, 613, 542, 1821, 606, + 1904, 2182, 1180, 2158, 2156, 2130, 2084, 1398, 2159, 1813, + 2128, 2192, 2175, 1519, 1446, 1056, 1820, 969, 968, 978, + 979, 971, 972, 973, 974, 975, 976, 977, 970, 493, + 2014, 980, 1892, 1399, 1674, 1386, 1017, 1418, 1083, 1841, + 1840, 515, 1856, 1442, 1356, 530, 527, 528, 187, 1457, + 1717, 488, 962, 513, 1843, 1857, 507, 1844, 187, 1075, + 1478, 1476, 1849, 1475, 1296, 493, 187, 1087, 1915, 1877, + 1911, 1081, 1461, 1608, 1828, 941, 188, 1855, 1871, 588, + 502, 95, 600, 600, 1415, 2118, 493, 1858, 1641, 2003, + 587, 187, 493, 493, 189, 60, 1899, 1725, 1870, 1856, + 37, 1655, 1656, 497, 2168, 932, 596, 31, 1902, 1896, + 30, 29, 28, 23, 22, 188, 21, 20, 19, 494, + 494, 494, 1673, 25, 18, 17, 1908, 16, 106, 47, + 44, 42, 113, 112, 45, 41, 870, 494, 494, 27, + 26, 1917, 15, 14, 13, 12, 1921, 11, 1923, 10, + 1924, 9, 5, 4, 1922, 935, 24, 1006, 2, 0, + 0, 1304, 0, 1936, 1937, 1952, 0, 188, 187, 188, + 188, 188, 1929, 0, 0, 493, 0, 0, 187, 0, + 0, 1886, 0, 187, 1851, 1852, 1960, 0, 188, 0, + 0, 0, 0, 0, 0, 0, 0, 1948, 1947, 1872, + 1873, 0, 1874, 1875, 1965, 1975, 493, 493, 493, 1907, + 188, 0, 1959, 1881, 1882, 189, 0, 1550, 1962, 1983, + 1949, 1950, 1968, 1967, 2007, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1352, 1353, 1354, 1355, 0, + 0, 494, 0, 0, 189, 0, 189, 189, 0, 494, + 1986, 0, 0, 0, 0, 494, 0, 0, 0, 0, + 1980, 1981, 0, 0, 0, 1991, 0, 0, 0, 0, + 0, 969, 968, 978, 979, 971, 972, 973, 974, 975, + 976, 977, 970, 0, 0, 980, 0, 0, 1725, 0, + 1406, 1407, 0, 2013, 0, 0, 1931, 0, 0, 2018, + 0, 0, 0, 0, 2026, 0, 2027, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2032, 1988, 1989, + 0, 1990, 0, 0, 1992, 2033, 1994, 506, 493, 493, + 169, 2034, 0, 0, 2049, 0, 0, 0, 0, 0, + 0, 493, 0, 2035, 493, 2037, 0, 2059, 2048, 0, + 0, 0, 0, 0, 0, 111, 0, 2062, 0, 0, + 2067, 0, 0, 0, 0, 0, 153, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1508, 493, + 493, 493, 188, 1984, 0, 2077, 2079, 2080, 0, 0, + 0, 0, 0, 493, 2066, 493, 2073, 0, 0, 189, + 0, 493, 0, 0, 0, 2081, 2091, 2096, 1902, 0, + 2093, 2089, 1902, 2065, 2087, 0, 0, 2082, 0, 2095, + 150, 0, 151, 188, 0, 2097, 2098, 0, 2099, 494, + 0, 168, 0, 0, 493, 188, 0, 1546, 0, 0, + 2112, 0, 2105, 2108, 0, 0, 494, 494, 0, 494, + 187, 494, 494, 0, 494, 494, 494, 494, 494, 494, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 494, + 0, 2127, 0, 189, 0, 0, 0, 2135, 0, 1902, + 0, 493, 493, 0, 0, 0, 0, 2138, 0, 154, + 0, 0, 0, 2143, 2062, 2145, 0, 0, 0, 159, + 494, 0, 0, 0, 0, 0, 0, 493, 189, 0, + 2153, 493, 2162, 1725, 0, 0, 189, 2167, 2164, 0, + 189, 0, 0, 0, 2171, 0, 0, 0, 0, 0, + 2179, 2068, 2069, 2070, 2071, 2072, 189, 2180, 0, 2075, + 2076, 0, 0, 189, 2001, 2190, 0, 0, 0, 0, + 189, 189, 189, 189, 189, 189, 189, 189, 189, 494, + 494, 494, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 187, 2208, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2218, 189, 2006, 600, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 964, 0, 967, 0, + 187, 146, 187, 1090, 981, 982, 983, 984, 985, 986, + 987, 0, 965, 966, 963, 969, 968, 978, 979, 971, + 972, 973, 974, 975, 976, 977, 970, 0, 0, 980, + 0, 0, 969, 968, 978, 979, 971, 972, 973, 974, + 975, 976, 977, 970, 0, 494, 980, 0, 0, 0, + 0, 169, 0, 969, 968, 978, 979, 971, 972, 973, + 974, 975, 976, 977, 970, 0, 0, 980, 0, 0, + 0, 0, 2165, 0, 0, 0, 111, 0, 494, 494, + 0, 0, 0, 0, 0, 0, 0, 153, 0, 189, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1677, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 189, + 0, 0, 494, 0, 0, 0, 189, 0, 189, 0, + 0, 0, 0, 0, 0, 0, 189, 189, 1758, 1701, + 1702, 1058, 2000, 494, 0, 0, 494, 0, 0, 0, + 0, 150, 0, 151, 0, 0, 0, 494, 0, 0, + 0, 0, 168, 0, 0, 187, 968, 978, 979, 971, + 972, 973, 974, 975, 976, 977, 970, 0, 0, 980, + 147, 152, 149, 155, 156, 157, 158, 160, 161, 162, + 163, 0, 0, 0, 0, 0, 164, 165, 166, 167, + 0, 0, 0, 0, 0, 0, 0, 0, 1203, 0, + 0, 0, 494, 0, 0, 0, 189, 0, 0, 494, + 154, 0, 0, 0, 0, 0, 1401, 1402, 0, 0, + 159, 0, 0, 1203, 1203, 0, 0, 0, 494, 187, + 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, + 0, 969, 968, 978, 979, 971, 972, 973, 974, 975, + 976, 977, 970, 1999, 0, 980, 0, 0, 0, 1850, + 1445, 0, 0, 0, 187, 0, 0, 0, 0, 0, + 0, 0, 187, 0, 0, 0, 1301, 0, 494, 969, + 968, 978, 979, 971, 972, 973, 974, 975, 976, 977, + 970, 0, 187, 980, 0, 0, 0, 0, 0, 187, + 0, 0, 0, 0, 0, 0, 1322, 1323, 187, 187, + 187, 187, 187, 187, 187, 0, 0, 0, 0, 0, + 189, 0, 146, 0, 189, 189, 189, 189, 189, 0, + 541, 0, 0, 0, 189, 189, 189, 189, 1998, 0, + 187, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 0, 0, 189, 1879, 0, 0, 0, 0, + 0, 0, 969, 968, 978, 979, 971, 972, 973, 974, + 975, 976, 977, 970, 0, 0, 980, 0, 189, 494, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, + 1894, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 600, 1301, 0, 0, 0, 600, 600, 0, + 0, 600, 600, 600, 0, 0, 0, 1203, 0, 0, + 614, 0, 0, 760, 0, 767, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 600, 600, 600, 600, + 600, 0, 0, 0, 0, 1440, 0, 969, 968, 978, + 979, 971, 972, 973, 974, 975, 976, 977, 970, 0, + 0, 980, 0, 0, 0, 187, 0, 0, 0, 0, + 0, 1301, 187, 189, 187, 0, 0, 0, 0, 0, + 0, 189, 187, 187, 0, 0, 0, 0, 0, 0, + 0, 147, 152, 149, 155, 156, 157, 158, 160, 161, + 162, 163, 0, 0, 0, 189, 0, 164, 165, 166, + 167, 0, 0, 0, 0, 0, 189, 189, 189, 189, + 189, 0, 1652, 0, 0, 0, 0, 0, 189, 0, + 0, 0, 189, 0, 0, 189, 189, 0, 0, 189, + 189, 189, 969, 968, 978, 979, 971, 972, 973, 974, + 975, 976, 977, 970, 0, 0, 980, 0, 0, 2005, + 0, 0, 187, 969, 968, 978, 979, 971, 972, 973, + 974, 975, 976, 977, 970, 0, 0, 980, 0, 0, + 0, 0, 506, 0, 0, 0, 0, 0, 0, 2028, + 0, 0, 2029, 0, 0, 2031, 0, 0, 0, 1653, + 0, 189, 0, 1654, 0, 0, 0, 0, 0, 0, + 0, 0, 494, 0, 1661, 1662, 0, 0, 494, 0, + 1668, 494, 0, 1671, 1672, 0, 0, 0, 494, 0, + 0, 1678, 0, 1679, 0, 0, 1682, 1683, 1684, 1685, + 1686, 0, 0, 0, 0, 0, 0, 0, 189, 0, + 0, 0, 1696, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, + 187, 187, 187, 187, 187, 0, 0, 0, 0, 0, + 187, 187, 187, 187, 2086, 506, 0, 0, 1740, 1741, + 494, 0, 0, 187, 0, 0, 0, 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 0, 0, 187, 1106, 0, 0, 189, - 0, 0, 0, 189, 189, 189, 189, 189, 0, 0, - 0, 0, 0, 189, 189, 189, 189, 959, 958, 968, - 969, 961, 962, 963, 964, 965, 966, 967, 960, 0, - 0, 970, 0, 0, 0, 189, 189, 189, 0, 1119, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1986, - 189, 0, 0, 189, 488, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2054, 2055, 2056, 2057, 2058, 0, - 0, 0, 2061, 2062, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1839, 1840, 1132, 1135, 1136, 1137, - 1138, 1139, 1140, 0, 1141, 1142, 1143, 1144, 1145, 1120, - 1121, 1122, 1123, 1104, 1105, 1133, 0, 1107, 1836, 1108, - 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1124, - 1125, 1126, 1127, 1128, 1129, 1130, 1131, 0, 959, 958, - 968, 969, 961, 962, 963, 964, 965, 966, 967, 960, - 0, 535, 970, 0, 0, 0, 0, 0, 189, 0, - 1891, 1985, 0, 0, 0, 0, 189, 0, 959, 958, - 968, 969, 961, 962, 963, 964, 965, 966, 967, 960, - 0, 1906, 970, 0, 0, 0, 0, 0, 0, 0, - 189, 0, 0, 0, 0, 0, 0, 1134, 0, 0, - 0, 189, 189, 189, 189, 189, 0, 0, 0, 0, - 486, 0, 0, 189, 0, 2151, 0, 189, 0, 0, - 189, 189, 0, 0, 189, 189, 189, 0, 0, 0, - 34, 35, 36, 70, 38, 39, 0, 0, 0, 0, - 0, 608, 0, 1984, 754, 0, 761, 0, 0, 0, - 74, 0, 0, 0, 0, 40, 66, 67, 0, 64, - 68, 0, 0, 0, 0, 0, 65, 0, 187, 0, - 959, 958, 968, 969, 961, 962, 963, 964, 965, 966, - 967, 960, 0, 0, 970, 0, 189, 0, 0, 0, - 0, 0, 0, 0, 1971, 53, 0, 488, 1973, 0, - 0, 0, 0, 488, 0, 69, 488, 0, 0, 1982, - 1983, 0, 0, 488, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1997, 0, 0, 0, 0, - 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, - 0, 0, 2006, 2007, 0, 0, 2011, 0, 0, 0, - 0, 189, 959, 958, 968, 969, 961, 962, 963, 964, - 965, 966, 967, 960, 0, 0, 970, 0, 0, 0, - 1638, 0, 0, 0, 0, 0, 0, 43, 46, 49, - 48, 51, 0, 63, 0, 488, 0, 187, 0, 0, - 959, 958, 968, 969, 961, 962, 963, 964, 965, 966, - 967, 960, 594, 2039, 970, 0, 0, 0, 52, 73, - 72, 0, 0, 61, 62, 50, 187, 0, 187, 1080, - 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 488, 0, 0, 0, 0, 2064, 488, 488, - 54, 55, 0, 56, 57, 58, 59, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 954, 0, 957, - 0, 189, 0, 0, 0, 971, 972, 973, 974, 975, - 976, 977, 1037, 955, 956, 953, 959, 958, 968, 969, - 961, 962, 963, 964, 965, 966, 967, 960, 0, 0, - 970, 0, 0, 0, 0, 0, 0, 2100, 2101, 2102, - 2103, 0, 2107, 0, 2108, 2109, 2110, 0, 2111, 2112, - 0, 0, 0, 189, 0, 189, 189, 189, 0, 0, - 0, 488, 0, 186, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 490, 189, 0, 0, 0, 71, 0, - 0, 569, 0, 0, 0, 0, 0, 2135, 0, 0, - 0, 0, 488, 488, 488, 0, 189, 0, 0, 0, - 0, 187, 0, 0, 0, 0, 758, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2172, 2173, 0, 0, 0, 0, - 0, 0, 0, 0, 1193, 0, 0, 0, 0, 0, - 0, 0, 0, 608, 608, 608, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, - 1193, 921, 923, 0, 0, 187, 0, 0, 0, 0, - 0, 0, 0, 854, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 865, 0, 0, 0, 0, 871, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 0, 488, 488, 0, 0, 187, 0, - 0, 0, 1291, 0, 0, 0, 0, 488, 0, 0, - 488, 0, 0, 187, 0, 187, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 187, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 488, 488, 488, 189, 0, - 0, 0, 0, 0, 0, 1061, 0, 0, 0, 488, - 0, 488, 187, 608, 0, 0, 0, 488, 0, 1091, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 187, 0, 494, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 189, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 494, 0, 0, + 0, 0, 0, 494, 494, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 189, 0, 0, 0, + 0, 0, 600, 600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 614, 614, + 614, 0, 0, 600, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 931, 933, 0, 187, + 0, 0, 0, 0, 0, 0, 0, 1440, 189, 0, + 189, 189, 189, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, + 600, 187, 0, 0, 0, 1853, 1854, 0, 0, 0, + 0, 1203, 187, 187, 187, 187, 187, 494, 494, 494, + 0, 189, 0, 0, 1739, 0, 0, 0, 187, 0, + 0, 187, 187, 0, 0, 187, 1749, 1301, 0, 0, + 0, 0, 0, 0, 1047, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1071, 1905, 0, 0, 0, 0, 0, 0, 614, 0, + 0, 0, 0, 0, 1101, 0, 0, 0, 0, 0, + 0, 0, 1920, 0, 0, 186, 0, 187, 0, 0, + 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, + 0, 0, 1203, 575, 0, 0, 0, 0, 0, 0, + 0, 0, 1301, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 764, 494, + 494, 0, 0, 0, 187, 0, 0, 0, 0, 0, + 0, 0, 494, 0, 0, 494, 0, 0, 0, 0, + 0, 0, 187, 544, 33, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 494, 494, 494, 189, 0, 600, 0, 33, 0, 0, + 0, 0, 0, 0, 494, 1985, 494, 0, 0, 1987, + 0, 0, 494, 0, 0, 860, 0, 0, 0, 0, + 1996, 1997, 0, 0, 0, 871, 0, 0, 0, 0, + 877, 0, 0, 0, 189, 0, 2011, 0, 0, 0, + 0, 578, 0, 187, 0, 494, 189, 0, 0, 0, + 0, 0, 0, 2020, 2021, 0, 1203, 2025, 760, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1202, 0, 0, 0, 1208, 1208, 0, 1208, 0, + 1208, 1208, 187, 1217, 1208, 1208, 1208, 1208, 1208, 0, + 0, 0, 494, 494, 0, 0, 1202, 1202, 760, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2053, 0, 0, 0, 494, 0, + 0, 0, 494, 0, 0, 0, 0, 0, 0, 1277, + 0, 0, 0, 0, 187, 0, 187, 187, 187, 0, + 0, 0, 0, 0, 0, 1203, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 187, 0, 0, 2078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 488, 189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 594, 1291, 0, 0, 0, 594, - 594, 0, 0, 594, 594, 594, 0, 0, 0, 1193, - 0, 0, 0, 0, 0, 0, 0, 488, 488, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 594, 594, - 594, 594, 594, 0, 0, 0, 0, 1426, 0, 0, - 0, 0, 0, 488, 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, 0, - 0, 0, 0, 1291, 187, 0, 187, 0, 0, 0, - 0, 0, 0, 0, 187, 187, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 614, 614, + 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2114, 2115, + 2116, 2117, 0, 2121, 0, 2122, 2123, 2124, 0, 2125, + 2126, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1203, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2149, 0, + 0, 0, 0, 0, 1392, 0, 614, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1202, 0, 0, 0, 0, 0, 0, 879, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1424, 1425, 0, + 0, 0, 0, 0, 0, 2186, 2187, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, + 0, 1458, 0, 0, 0, 0, 0, 0, 1801, 0, + 0, 1071, 0, 0, 614, 1128, 0, 0, 0, 1440, + 0, 0, 111, 0, 133, 0, 0, 0, 0, 0, + 0, 0, 614, 153, 0, 614, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 760, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 187, 0, 0, 0, 143, 0, 0, 0, 0, 132, + 0, 0, 187, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 150, 0, 151, + 0, 0, 0, 0, 1183, 1184, 142, 141, 168, 0, + 0, 767, 0, 0, 0, 0, 0, 0, 1560, 0, + 0, 925, 925, 925, 0, 0, 0, 1077, 0, 0, + 1088, 0, 0, 0, 0, 0, 0, 760, 1116, 0, + 0, 33, 0, 767, 0, 0, 0, 0, 0, 0, + 0, 0, 1203, 0, 989, 991, 137, 1185, 144, 0, + 1182, 0, 138, 139, 0, 0, 154, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, + 0, 1129, 0, 0, 0, 1004, 0, 760, 0, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 0, 1019, 1022, + 1022, 1022, 1028, 1022, 1022, 1028, 1022, 1036, 1037, 1038, + 1039, 1040, 1041, 1042, 0, 0, 0, 0, 0, 1048, + 0, 0, 33, 0, 0, 0, 0, 0, 1142, 1145, + 1146, 1147, 1148, 1149, 1150, 0, 1151, 1152, 1153, 1154, + 1155, 1130, 1131, 1132, 1133, 1114, 1115, 1143, 1084, 1117, + 0, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, + 0, 0, 1106, 0, 0, 0, 0, 0, 1636, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 140, 0, 1144, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 134, 0, 0, 135, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1239, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1287, 0, 0, 0, 0, 0, 0, 0, 1297, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1311, + 0, 0, 0, 0, 1202, 0, 1315, 0, 0, 0, + 0, 0, 0, 0, 0, 1324, 1325, 1326, 1327, 1328, + 1329, 1330, 0, 0, 0, 0, 0, 147, 152, 149, + 155, 156, 157, 158, 160, 161, 162, 163, 0, 0, + 0, 0, 0, 164, 165, 166, 167, 1088, 0, 0, + 0, 34, 35, 36, 70, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1787, - 0, 873, 0, 754, 0, 0, 538, 33, 0, 0, - 0, 0, 0, 111, 0, 133, 1192, 0, 0, 0, - 1198, 1198, 0, 1198, 153, 1198, 1198, 0, 1207, 1198, - 1198, 1198, 1198, 1198, 0, 0, 0, 0, 0, 0, - 33, 1192, 1192, 754, 187, 0, 0, 0, 0, 0, + 0, 74, 0, 0, 0, 0, 40, 66, 67, 1179, + 64, 68, 0, 0, 0, 0, 0, 65, 0, 0, + 0, 0, 0, 111, 0, 133, 0, 0, 0, 0, + 0, 1803, 0, 0, 153, 1202, 0, 1810, 0, 0, + 1803, 0, 0, 0, 0, 614, 53, 1815, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, - 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1267, 0, 0, 0, 150, 0, - 151, 0, 0, 0, 572, 1173, 1174, 142, 141, 168, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, - 608, 608, 0, 608, 608, 0, 608, 608, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 137, 1175, 144, - 0, 1172, 0, 138, 139, 0, 0, 154, 0, 1067, - 0, 0, 1078, 0, 0, 0, 0, 159, 187, 0, - 0, 0, 187, 187, 187, 187, 187, 0, 0, 0, - 0, 0, 187, 187, 187, 187, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1615, 1616, 187, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, - 0, 0, 187, 0, 0, 1378, 0, 608, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1192, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1410, 1411, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 594, 594, 1444, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1061, 0, 0, 608, 0, 0, 0, 0, - 0, 594, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 608, 1096, 0, 608, 187, 140, 0, - 0, 0, 0, 0, 0, 1426, 0, 754, 0, 0, - 134, 0, 0, 135, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 594, 187, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, - 187, 187, 187, 187, 187, 0, 0, 0, 0, 0, - 0, 0, 1725, 0, 0, 0, 187, 0, 0, 187, - 187, 0, 761, 187, 1735, 1291, 0, 0, 1229, 1546, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 754, 0, - 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, - 0, 0, 0, 1277, 0, 0, 0, 0, 0, 0, - 0, 1287, 0, 0, 147, 152, 149, 155, 156, 157, - 158, 160, 161, 162, 163, 187, 1296, 0, 1298, 0, - 164, 165, 166, 167, 0, 0, 0, 0, 754, 0, - 1193, 0, 0, 1313, 0, 0, 1316, 0, 0, 0, - 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 915, 915, - 915, 0, 187, 0, 0, 1078, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, - 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 979, 981, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, - 0, 0, 994, 0, 0, 1622, 999, 1000, 1001, 1002, - 1003, 1004, 1005, 1006, 0, 1009, 1012, 1012, 1012, 1018, - 1012, 1012, 1018, 1012, 1026, 1027, 1028, 1029, 1030, 1031, - 1032, 0, 0, 0, 0, 0, 1038, 0, 0, 33, - 0, 187, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1193, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1074, 0, 0, 0, 0, - 1451, 0, 169, 0, 0, 0, 0, 1455, 0, 1458, - 187, 0, 0, 1169, 0, 0, 0, 0, 1477, 0, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 133, - 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 187, 0, 187, 187, 187, 0, 0, 143, - 0, 1192, 0, 1193, 132, 0, 0, 0, 0, 0, - 0, 0, 0, 187, 0, 0, 0, 0, 0, 0, - 0, 0, 150, 0, 151, 0, 0, 1544, 0, 1173, - 1174, 142, 141, 168, 0, 187, 0, 0, 0, 0, + 132, 925, 925, 925, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 150, 0, + 151, 0, 0, 0, 0, 1183, 1184, 142, 141, 168, + 0, 0, 1465, 0, 0, 0, 0, 0, 0, 1469, + 0, 1472, 0, 0, 0, 0, 0, 0, 0, 614, + 1491, 0, 0, 0, 0, 0, 0, 0, 43, 46, + 49, 48, 51, 0, 63, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 137, 1185, 144, + 0, 1182, 0, 138, 139, 1208, 0, 154, 0, 52, + 73, 72, 0, 0, 61, 62, 50, 159, 0, 0, + 0, 0, 0, 0, 0, 0, 614, 0, 0, 1202, + 0, 0, 1906, 1208, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1558, + 0, 54, 55, 0, 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 137, 1175, 144, 0, 1172, 0, 138, 139, 0, - 0, 154, 0, 0, 0, 0, 0, 0, 1789, 0, - 0, 159, 1192, 0, 1796, 1193, 0, 1789, 0, 0, - 0, 0, 608, 0, 1801, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 760, 0, 0, 1202, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1078, 0, 0, 0, 1598, 1599, 1600, 1601, 1602, - 0, 0, 0, 0, 0, 1606, 1607, 1078, 1609, 0, + 0, 0, 0, 0, 0, 0, 1976, 1977, 1978, 0, + 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1088, 0, 0, 0, 1612, 1613, 1614, + 1615, 1616, 140, 0, 0, 0, 0, 1620, 1621, 1088, + 1623, 0, 0, 0, 134, 0, 0, 135, 0, 0, + 1628, 0, 0, 0, 0, 0, 0, 1631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1617, - 0, 0, 0, 0, 0, 0, 608, 0, 0, 0, - 0, 0, 1619, 0, 0, 1621, 0, 0, 0, 0, - 0, 0, 0, 146, 0, 0, 0, 1426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1198, 0, 915, 915, 915, 0, 915, 915, - 0, 915, 915, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 608, 0, 0, 1192, 0, 187, 1892, - 1198, 0, 140, 0, 0, 0, 0, 0, 0, 0, - 187, 0, 0, 0, 134, 0, 0, 135, 0, 0, + 1202, 1635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1803, 2050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1193, 0, 754, 0, 0, 1192, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1732, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1962, 1963, 1964, 0, 0, 147, 152, + 0, 1803, 0, 0, 614, 0, 0, 0, 147, 152, 149, 155, 156, 157, 158, 160, 161, 162, 163, 0, 0, 0, 0, 0, 164, 165, 166, 167, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1803, + 1803, 1803, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2092, 0, 2094, 0, 0, 0, 0, + 0, 1803, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1476, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1783, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1192, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1813, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1828, 0, 1789, 2036, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1789, 0, - 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1789, 1789, 1789, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2078, 0, 2080, 0, 0, 0, 0, 0, 1789, 0, - 0, 0, 0, 0, 1877, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1789, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1803, 0, 0, 0, 0, 1746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 608, 608, + 0, 1657, 0, 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1939, 0, 1940, 1941, 1942, - 0, 0, 1192, 0, 2149, 0, 0, 0, 1789, 0, - 0, 0, 0, 0, 0, 0, 1952, 0, 0, 0, + 0, 614, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1965, 0, + 0, 1694, 0, 0, 1797, 1202, 0, 2163, 0, 0, + 0, 1803, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1084, 0, 0, + 0, 0, 0, 0, 1721, 1722, 0, 0, 1084, 1084, + 1084, 1084, 1084, 0, 0, 0, 0, 0, 0, 0, + 0, 1827, 0, 0, 1490, 0, 0, 1084, 0, 0, + 0, 1084, 0, 0, 0, 0, 0, 0, 0, 1842, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1643, 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1074, 0, 0, 0, - 0, 0, 0, 1707, 1708, 0, 0, 1074, 1074, 1074, - 1074, 1074, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1476, 0, 0, 1074, 0, 0, 0, - 1074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1891, 1816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1802, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2090, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1953, 0, 1954, 1955, 1956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1903, 1979, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1084, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1889, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1677,12 +1692,13 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2002, 0, 0, 0, 0, 0, 0, 2008, 2009, 2010, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1988, - 0, 0, 0, 0, 0, 0, 1994, 1995, 1996, 0, + 0, 0, 0, 0, 0, 0, 0, 2104, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -1690,2285 +1706,2299 @@ var yyAct = [...]int{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1903, 0, 33, 0, 1903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1889, 0, 33, 0, 1889, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1889, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 732, 719, 33, 2125, 668, 735, 639, - 657, 744, 659, 662, 702, 619, 681, 330, 654, 0, - 643, 615, 650, 616, 641, 670, 241, 674, 638, 721, - 684, 734, 288, 0, 621, 644, 343, 704, 380, 227, - 297, 295, 408, 251, 244, 240, 226, 272, 303, 341, - 398, 335, 741, 292, 691, 0, 389, 315, 0, 0, - 0, 672, 724, 679, 715, 667, 703, 628, 690, 736, - 655, 699, 737, 278, 225, 195, 327, 390, 254, 0, - 0, 0, 177, 178, 179, 0, 2132, 2133, 0, 0, - 0, 0, 0, 217, 0, 223, 696, 731, 652, 698, - 237, 276, 243, 236, 405, 701, 747, 614, 693, 0, - 617, 620, 743, 727, 647, 648, 0, 0, 0, 0, - 0, 0, 0, 671, 680, 712, 665, 0, 0, 0, - 0, 0, 0, 0, 0, 645, 0, 689, 0, 0, - 0, 624, 618, 0, 0, 0, 0, 669, 0, 0, - 0, 627, 0, 646, 713, 0, 612, 262, 622, 316, - 717, 726, 666, 434, 730, 664, 663, 733, 708, 625, - 723, 658, 287, 623, 284, 191, 205, 0, 656, 326, - 364, 370, 722, 642, 651, 228, 649, 368, 339, 421, - 213, 252, 361, 344, 366, 688, 706, 367, 293, 410, - 356, 420, 435, 436, 235, 320, 427, 402, 432, 444, - 206, 232, 333, 395, 424, 386, 313, 406, 407, 283, - 385, 260, 194, 291, 198, 397, 418, 218, 378, 0, - 0, 0, 200, 416, 394, 310, 280, 281, 199, 0, - 360, 239, 258, 230, 329, 413, 414, 229, 446, 208, - 431, 202, 209, 430, 322, 409, 417, 311, 302, 201, - 415, 309, 301, 286, 249, 268, 354, 296, 355, 269, - 318, 317, 319, 0, 196, 0, 391, 425, 447, 215, - 637, 718, 404, 440, 443, 0, 357, 216, 259, 248, - 353, 257, 289, 439, 441, 442, 214, 351, 265, 321, - 210, 271, 387, 285, 294, 710, 746, 338, 369, 219, - 423, 388, 632, 636, 630, 631, 682, 683, 633, 738, - 739, 740, 714, 626, 0, 634, 635, 0, 720, 728, - 729, 687, 190, 203, 290, 742, 358, 255, 445, 429, - 426, 613, 629, 234, 640, 0, 0, 653, 660, 661, - 673, 675, 676, 677, 678, 686, 694, 695, 697, 705, - 707, 709, 711, 716, 725, 745, 192, 193, 204, 212, - 221, 233, 246, 253, 263, 267, 270, 273, 274, 277, - 282, 299, 304, 305, 306, 307, 323, 324, 325, 328, - 331, 332, 334, 336, 337, 340, 346, 347, 348, 349, - 350, 352, 359, 363, 371, 372, 373, 374, 375, 376, - 377, 381, 382, 383, 384, 392, 396, 411, 412, 422, - 433, 437, 264, 419, 438, 0, 298, 685, 692, 300, - 250, 266, 275, 700, 428, 393, 207, 365, 256, 197, - 224, 211, 231, 245, 247, 279, 308, 314, 342, 345, - 261, 242, 222, 362, 220, 379, 399, 400, 401, 403, - 312, 238, 732, 719, 0, 0, 668, 735, 639, 657, - 744, 659, 662, 702, 619, 681, 330, 654, 0, 643, - 615, 650, 616, 641, 670, 241, 674, 638, 721, 684, - 734, 288, 0, 621, 644, 343, 704, 380, 227, 297, - 295, 408, 251, 244, 240, 226, 272, 303, 341, 398, - 335, 741, 292, 691, 0, 389, 315, 0, 0, 0, - 672, 724, 679, 715, 667, 703, 628, 690, 736, 655, - 699, 737, 278, 225, 195, 327, 390, 254, 0, 0, - 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, - 0, 0, 217, 0, 223, 696, 731, 652, 698, 237, - 276, 243, 236, 405, 701, 747, 614, 693, 0, 617, - 620, 743, 727, 647, 648, 0, 0, 0, 0, 0, - 0, 0, 671, 680, 712, 665, 0, 0, 0, 0, - 0, 0, 1881, 0, 645, 0, 689, 0, 0, 0, - 624, 618, 0, 0, 0, 0, 669, 0, 0, 0, - 627, 0, 646, 713, 0, 612, 262, 622, 316, 717, - 726, 666, 434, 730, 664, 663, 733, 708, 625, 723, - 658, 287, 623, 284, 191, 205, 0, 656, 326, 364, - 370, 722, 642, 651, 228, 649, 368, 339, 421, 213, - 252, 361, 344, 366, 688, 706, 367, 293, 410, 356, - 420, 435, 436, 235, 320, 427, 402, 432, 444, 206, - 232, 333, 395, 424, 386, 313, 406, 407, 283, 385, - 260, 194, 291, 198, 397, 418, 218, 378, 0, 0, - 0, 200, 416, 394, 310, 280, 281, 199, 0, 360, - 239, 258, 230, 329, 413, 414, 229, 446, 208, 431, - 202, 209, 430, 322, 409, 417, 311, 302, 201, 415, - 309, 301, 286, 249, 268, 354, 296, 355, 269, 318, - 317, 319, 0, 196, 0, 391, 425, 447, 215, 637, - 718, 404, 440, 443, 0, 357, 216, 259, 248, 353, - 257, 289, 439, 441, 442, 214, 351, 265, 321, 210, - 271, 387, 285, 294, 710, 746, 338, 369, 219, 423, - 388, 632, 636, 630, 631, 682, 683, 633, 738, 739, - 740, 714, 626, 0, 634, 635, 0, 720, 728, 729, - 687, 190, 203, 290, 742, 358, 255, 445, 429, 426, - 613, 629, 234, 640, 0, 0, 653, 660, 661, 673, - 675, 676, 677, 678, 686, 694, 695, 697, 705, 707, - 709, 711, 716, 725, 745, 192, 193, 204, 212, 221, - 233, 246, 253, 263, 267, 270, 273, 274, 277, 282, - 299, 304, 305, 306, 307, 323, 324, 325, 328, 331, - 332, 334, 336, 337, 340, 346, 347, 348, 349, 350, - 352, 359, 363, 371, 372, 373, 374, 375, 376, 377, - 381, 382, 383, 384, 392, 396, 411, 412, 422, 433, - 437, 264, 419, 438, 0, 298, 685, 692, 300, 250, - 266, 275, 700, 428, 393, 207, 365, 256, 197, 224, - 211, 231, 245, 247, 279, 308, 314, 342, 345, 261, - 242, 222, 362, 220, 379, 399, 400, 401, 403, 312, - 238, 732, 719, 0, 0, 668, 735, 639, 657, 744, - 659, 662, 702, 619, 681, 330, 654, 0, 643, 615, - 650, 616, 641, 670, 241, 674, 638, 721, 684, 734, - 288, 0, 621, 644, 343, 704, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 741, 292, 691, 0, 389, 315, 0, 0, 0, 672, - 724, 679, 715, 667, 703, 628, 690, 736, 655, 699, - 737, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 696, 731, 652, 698, 237, 276, - 243, 236, 405, 701, 747, 614, 693, 0, 617, 620, - 743, 727, 647, 648, 0, 0, 0, 0, 0, 0, - 0, 671, 680, 712, 665, 0, 0, 0, 0, 0, - 0, 1736, 0, 645, 0, 689, 0, 0, 0, 624, - 618, 0, 0, 0, 0, 669, 0, 0, 0, 627, - 0, 646, 713, 0, 612, 262, 622, 316, 717, 726, - 666, 434, 730, 664, 663, 733, 708, 625, 723, 658, - 287, 623, 284, 191, 205, 0, 656, 326, 364, 370, - 722, 642, 651, 228, 649, 368, 339, 421, 213, 252, - 361, 344, 366, 688, 706, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 637, 718, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 710, 746, 338, 369, 219, 423, 388, - 632, 636, 630, 631, 682, 683, 633, 738, 739, 740, - 714, 626, 0, 634, 635, 0, 720, 728, 729, 687, - 190, 203, 290, 742, 358, 255, 445, 429, 426, 613, - 629, 234, 640, 0, 0, 653, 660, 661, 673, 675, - 676, 677, 678, 686, 694, 695, 697, 705, 707, 709, - 711, 716, 725, 745, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 685, 692, 300, 250, 266, - 275, 700, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 732, 719, 0, 0, 668, 735, 639, 657, 744, 659, - 662, 702, 619, 681, 330, 654, 0, 643, 615, 650, - 616, 641, 670, 241, 674, 638, 721, 684, 734, 288, - 0, 621, 644, 343, 704, 380, 227, 297, 295, 408, - 251, 244, 240, 226, 272, 303, 341, 398, 335, 741, - 292, 691, 0, 389, 315, 0, 0, 0, 672, 724, - 679, 715, 667, 703, 628, 690, 736, 655, 699, 737, - 278, 225, 195, 327, 390, 254, 0, 0, 0, 177, + 0, 0, 0, 0, 1903, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 738, 725, 33, 2139, 674, 741, + 645, 663, 750, 665, 668, 708, 625, 687, 331, 660, + 0, 649, 621, 656, 622, 647, 676, 241, 680, 644, + 727, 690, 740, 289, 0, 627, 650, 345, 710, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 747, 293, 697, 0, 391, 316, 0, + 0, 0, 678, 730, 685, 721, 673, 709, 634, 696, + 742, 661, 705, 743, 279, 225, 195, 328, 392, 255, + 0, 0, 0, 177, 178, 179, 0, 2146, 2147, 0, + 0, 0, 0, 0, 217, 0, 223, 702, 737, 658, + 704, 237, 277, 243, 236, 407, 707, 753, 620, 699, + 0, 623, 626, 749, 733, 653, 654, 0, 0, 0, + 0, 0, 0, 0, 677, 686, 718, 671, 0, 0, + 0, 0, 0, 0, 0, 0, 651, 0, 695, 0, + 0, 0, 630, 624, 0, 0, 0, 0, 675, 0, + 0, 0, 633, 0, 652, 719, 0, 618, 263, 628, + 317, 723, 732, 672, 438, 736, 670, 669, 739, 714, + 631, 729, 664, 288, 629, 285, 191, 205, 0, 662, + 327, 366, 372, 728, 648, 657, 228, 655, 370, 341, + 424, 213, 253, 363, 346, 368, 694, 712, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 643, 724, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 716, 752, 340, 371, 219, 426, 390, 638, 642, 636, + 637, 688, 689, 639, 744, 745, 746, 720, 632, 0, + 640, 641, 0, 726, 734, 735, 693, 190, 203, 291, + 748, 360, 256, 449, 433, 429, 619, 635, 234, 646, + 0, 0, 659, 666, 667, 679, 681, 682, 683, 684, + 692, 700, 701, 703, 711, 713, 715, 717, 722, 731, + 751, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 691, 698, 301, 250, 267, 276, 706, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 738, 725, 0, + 0, 674, 741, 645, 663, 750, 665, 668, 708, 625, + 687, 331, 660, 0, 649, 621, 656, 622, 647, 676, + 241, 680, 644, 727, 690, 740, 289, 0, 627, 650, + 345, 710, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 747, 293, 697, 0, + 391, 316, 0, 0, 0, 678, 730, 685, 721, 673, + 709, 634, 696, 742, 661, 705, 743, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, + 702, 737, 658, 704, 237, 277, 243, 236, 407, 707, + 753, 620, 699, 0, 623, 626, 749, 733, 653, 654, + 0, 0, 0, 0, 0, 0, 0, 677, 686, 718, + 671, 0, 0, 0, 0, 0, 0, 1895, 0, 651, + 0, 695, 0, 0, 0, 630, 624, 0, 0, 0, + 0, 675, 0, 0, 0, 633, 0, 652, 719, 0, + 618, 263, 628, 317, 723, 732, 672, 438, 736, 670, + 669, 739, 714, 631, 729, 664, 288, 629, 285, 191, + 205, 0, 662, 327, 366, 372, 728, 648, 657, 228, + 655, 370, 341, 424, 213, 253, 363, 346, 368, 694, + 712, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 643, 724, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 716, 752, 340, 371, 219, 426, 390, + 638, 642, 636, 637, 688, 689, 639, 744, 745, 746, + 720, 632, 0, 640, 641, 0, 726, 734, 735, 693, + 190, 203, 291, 748, 360, 256, 449, 433, 429, 619, + 635, 234, 646, 0, 0, 659, 666, 667, 679, 681, + 682, 683, 684, 692, 700, 701, 703, 711, 713, 715, + 717, 722, 731, 751, 192, 193, 204, 212, 221, 233, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 691, 698, 301, 250, 267, + 276, 706, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 738, 725, 0, 0, 674, 741, 645, 663, 750, 665, + 668, 708, 625, 687, 331, 660, 0, 649, 621, 656, + 622, 647, 676, 241, 680, 644, 727, 690, 740, 289, + 0, 627, 650, 345, 710, 382, 227, 298, 296, 410, + 251, 244, 240, 226, 273, 304, 343, 400, 337, 747, + 293, 697, 0, 391, 316, 0, 0, 0, 678, 730, + 685, 721, 673, 709, 634, 696, 742, 661, 705, 743, + 279, 225, 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, - 217, 0, 223, 696, 731, 652, 698, 237, 276, 243, - 236, 405, 701, 747, 614, 693, 0, 617, 620, 743, - 727, 647, 648, 0, 0, 0, 0, 0, 0, 0, - 671, 680, 712, 665, 0, 0, 0, 0, 0, 0, - 1453, 0, 645, 0, 689, 0, 0, 0, 624, 618, - 0, 0, 0, 0, 669, 0, 0, 0, 627, 0, - 646, 713, 0, 612, 262, 622, 316, 717, 726, 666, - 434, 730, 664, 663, 733, 708, 625, 723, 658, 287, - 623, 284, 191, 205, 0, 656, 326, 364, 370, 722, - 642, 651, 228, 649, 368, 339, 421, 213, 252, 361, - 344, 366, 688, 706, 367, 293, 410, 356, 420, 435, - 436, 235, 320, 427, 402, 432, 444, 206, 232, 333, - 395, 424, 386, 313, 406, 407, 283, 385, 260, 194, - 291, 198, 397, 418, 218, 378, 0, 0, 0, 200, - 416, 394, 310, 280, 281, 199, 0, 360, 239, 258, - 230, 329, 413, 414, 229, 446, 208, 431, 202, 209, - 430, 322, 409, 417, 311, 302, 201, 415, 309, 301, - 286, 249, 268, 354, 296, 355, 269, 318, 317, 319, - 0, 196, 0, 391, 425, 447, 215, 637, 718, 404, - 440, 443, 0, 357, 216, 259, 248, 353, 257, 289, - 439, 441, 442, 214, 351, 265, 321, 210, 271, 387, - 285, 294, 710, 746, 338, 369, 219, 423, 388, 632, - 636, 630, 631, 682, 683, 633, 738, 739, 740, 714, - 626, 0, 634, 635, 0, 720, 728, 729, 687, 190, - 203, 290, 742, 358, 255, 445, 429, 426, 613, 629, - 234, 640, 0, 0, 653, 660, 661, 673, 675, 676, - 677, 678, 686, 694, 695, 697, 705, 707, 709, 711, - 716, 725, 745, 192, 193, 204, 212, 221, 233, 246, - 253, 263, 267, 270, 273, 274, 277, 282, 299, 304, - 305, 306, 307, 323, 324, 325, 328, 331, 332, 334, - 336, 337, 340, 346, 347, 348, 349, 350, 352, 359, - 363, 371, 372, 373, 374, 375, 376, 377, 381, 382, - 383, 384, 392, 396, 411, 412, 422, 433, 437, 264, - 419, 438, 0, 298, 685, 692, 300, 250, 266, 275, - 700, 428, 393, 207, 365, 256, 197, 224, 211, 231, - 245, 247, 279, 308, 314, 342, 345, 261, 242, 222, - 362, 220, 379, 399, 400, 401, 403, 312, 238, 732, - 719, 0, 0, 668, 735, 639, 657, 744, 659, 662, - 702, 619, 681, 330, 654, 0, 643, 615, 650, 616, - 641, 670, 241, 674, 638, 721, 684, 734, 288, 0, - 621, 644, 343, 704, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 741, 292, - 691, 0, 389, 315, 0, 0, 0, 672, 724, 679, - 715, 667, 703, 628, 690, 736, 655, 699, 737, 278, - 225, 195, 327, 390, 254, 69, 0, 0, 177, 178, + 217, 0, 223, 702, 737, 658, 704, 237, 277, 243, + 236, 407, 707, 753, 620, 699, 0, 623, 626, 749, + 733, 653, 654, 0, 0, 0, 0, 0, 0, 0, + 677, 686, 718, 671, 0, 0, 0, 0, 0, 0, + 1750, 0, 651, 0, 695, 0, 0, 0, 630, 624, + 0, 0, 0, 0, 675, 0, 0, 0, 633, 0, + 652, 719, 0, 618, 263, 628, 317, 723, 732, 672, + 438, 736, 670, 669, 739, 714, 631, 729, 664, 288, + 629, 285, 191, 205, 0, 662, 327, 366, 372, 728, + 648, 657, 228, 655, 370, 341, 424, 213, 253, 363, + 346, 368, 694, 712, 369, 294, 412, 358, 422, 439, + 440, 235, 321, 430, 404, 436, 448, 206, 232, 335, + 397, 427, 388, 314, 408, 409, 284, 387, 261, 194, + 292, 198, 399, 420, 218, 380, 0, 0, 0, 200, + 418, 396, 311, 281, 282, 199, 0, 362, 239, 259, + 230, 330, 415, 416, 229, 450, 208, 435, 202, 209, + 434, 323, 411, 419, 312, 303, 201, 417, 310, 302, + 287, 249, 269, 356, 297, 357, 270, 319, 318, 320, + 0, 196, 0, 393, 428, 451, 215, 643, 724, 406, + 444, 447, 0, 359, 216, 260, 248, 355, 258, 290, + 443, 445, 446, 214, 353, 266, 334, 423, 252, 431, + 322, 210, 272, 389, 286, 295, 716, 752, 340, 371, + 219, 426, 390, 638, 642, 636, 637, 688, 689, 639, + 744, 745, 746, 720, 632, 0, 640, 641, 0, 726, + 734, 735, 693, 190, 203, 291, 748, 360, 256, 449, + 433, 429, 619, 635, 234, 646, 0, 0, 659, 666, + 667, 679, 681, 682, 683, 684, 692, 700, 701, 703, + 711, 713, 715, 717, 722, 731, 751, 192, 193, 204, + 212, 221, 233, 246, 254, 264, 268, 271, 274, 275, + 278, 283, 300, 305, 306, 307, 308, 324, 325, 326, + 329, 332, 333, 336, 338, 339, 342, 348, 349, 350, + 351, 352, 354, 361, 365, 373, 374, 375, 376, 377, + 378, 379, 383, 384, 385, 386, 394, 398, 413, 414, + 425, 437, 441, 265, 421, 442, 0, 299, 691, 698, + 301, 250, 267, 276, 706, 432, 395, 207, 367, 257, + 197, 224, 211, 231, 245, 247, 280, 309, 315, 344, + 347, 262, 242, 222, 364, 220, 381, 401, 402, 403, + 405, 313, 238, 738, 725, 0, 0, 674, 741, 645, + 663, 750, 665, 668, 708, 625, 687, 331, 660, 0, + 649, 621, 656, 622, 647, 676, 241, 680, 644, 727, + 690, 740, 289, 0, 627, 650, 345, 710, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 747, 293, 697, 0, 391, 316, 0, 0, + 0, 678, 730, 685, 721, 673, 709, 634, 696, 742, + 661, 705, 743, 279, 225, 195, 328, 392, 255, 0, + 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 217, 0, 223, 702, 737, 658, 704, + 237, 277, 243, 236, 407, 707, 753, 620, 699, 0, + 623, 626, 749, 733, 653, 654, 0, 0, 0, 0, + 0, 0, 0, 677, 686, 718, 671, 0, 0, 0, + 0, 0, 0, 1467, 0, 651, 0, 695, 0, 0, + 0, 630, 624, 0, 0, 0, 0, 675, 0, 0, + 0, 633, 0, 652, 719, 0, 618, 263, 628, 317, + 723, 732, 672, 438, 736, 670, 669, 739, 714, 631, + 729, 664, 288, 629, 285, 191, 205, 0, 662, 327, + 366, 372, 728, 648, 657, 228, 655, 370, 341, 424, + 213, 253, 363, 346, 368, 694, 712, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 643, 724, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 716, + 752, 340, 371, 219, 426, 390, 638, 642, 636, 637, + 688, 689, 639, 744, 745, 746, 720, 632, 0, 640, + 641, 0, 726, 734, 735, 693, 190, 203, 291, 748, + 360, 256, 449, 433, 429, 619, 635, 234, 646, 0, + 0, 659, 666, 667, 679, 681, 682, 683, 684, 692, + 700, 701, 703, 711, 713, 715, 717, 722, 731, 751, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 691, 698, 301, 250, 267, 276, 706, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, 738, 725, 0, 0, + 674, 741, 645, 663, 750, 665, 668, 708, 625, 687, + 331, 660, 0, 649, 621, 656, 622, 647, 676, 241, + 680, 644, 727, 690, 740, 289, 0, 627, 650, 345, + 710, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 747, 293, 697, 0, 391, + 316, 0, 0, 0, 678, 730, 685, 721, 673, 709, + 634, 696, 742, 661, 705, 743, 279, 225, 195, 328, + 392, 255, 69, 0, 0, 177, 178, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 223, 702, + 737, 658, 704, 237, 277, 243, 236, 407, 707, 753, + 620, 699, 0, 623, 626, 749, 733, 653, 654, 0, + 0, 0, 0, 0, 0, 0, 677, 686, 718, 671, + 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, + 695, 0, 0, 0, 630, 624, 0, 0, 0, 0, + 675, 0, 0, 0, 633, 0, 652, 719, 0, 618, + 263, 628, 317, 723, 732, 672, 438, 736, 670, 669, + 739, 714, 631, 729, 664, 288, 629, 285, 191, 205, + 0, 662, 327, 366, 372, 728, 648, 657, 228, 655, + 370, 341, 424, 213, 253, 363, 346, 368, 694, 712, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 643, 724, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 716, 752, 340, 371, 219, 426, 390, 638, + 642, 636, 637, 688, 689, 639, 744, 745, 746, 720, + 632, 0, 640, 641, 0, 726, 734, 735, 693, 190, + 203, 291, 748, 360, 256, 449, 433, 429, 619, 635, + 234, 646, 0, 0, 659, 666, 667, 679, 681, 682, + 683, 684, 692, 700, 701, 703, 711, 713, 715, 717, + 722, 731, 751, 192, 193, 204, 212, 221, 233, 246, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 691, 698, 301, 250, 267, 276, + 706, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 738, + 725, 0, 0, 674, 741, 645, 663, 750, 665, 668, + 708, 625, 687, 331, 660, 0, 649, 621, 656, 622, + 647, 676, 241, 680, 644, 727, 690, 740, 289, 0, + 627, 650, 345, 710, 382, 227, 298, 296, 410, 251, + 244, 240, 226, 273, 304, 343, 400, 337, 747, 293, + 697, 0, 391, 316, 0, 0, 0, 678, 730, 685, + 721, 673, 709, 634, 696, 742, 661, 705, 743, 279, + 225, 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 696, 731, 652, 698, 237, 276, 243, 236, - 405, 701, 747, 614, 693, 0, 617, 620, 743, 727, - 647, 648, 0, 0, 0, 0, 0, 0, 0, 671, - 680, 712, 665, 0, 0, 0, 0, 0, 0, 0, - 0, 645, 0, 689, 0, 0, 0, 624, 618, 0, - 0, 0, 0, 669, 0, 0, 0, 627, 0, 646, - 713, 0, 612, 262, 622, 316, 717, 726, 666, 434, - 730, 664, 663, 733, 708, 625, 723, 658, 287, 623, - 284, 191, 205, 0, 656, 326, 364, 370, 722, 642, - 651, 228, 649, 368, 339, 421, 213, 252, 361, 344, - 366, 688, 706, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 637, 718, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 710, 746, 338, 369, 219, 423, 388, 632, 636, - 630, 631, 682, 683, 633, 738, 739, 740, 714, 626, - 0, 634, 635, 0, 720, 728, 729, 687, 190, 203, - 290, 742, 358, 255, 445, 429, 426, 613, 629, 234, - 640, 0, 0, 653, 660, 661, 673, 675, 676, 677, - 678, 686, 694, 695, 697, 705, 707, 709, 711, 716, - 725, 745, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 685, 692, 300, 250, 266, 275, 700, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 732, 719, - 0, 0, 668, 735, 639, 657, 744, 659, 662, 702, - 619, 681, 330, 654, 0, 643, 615, 650, 616, 641, - 670, 241, 674, 638, 721, 684, 734, 288, 0, 621, - 644, 343, 704, 380, 227, 297, 295, 408, 251, 244, - 240, 226, 272, 303, 341, 398, 335, 741, 292, 691, - 0, 389, 315, 0, 0, 0, 672, 724, 679, 715, - 667, 703, 628, 690, 736, 655, 699, 737, 278, 225, - 195, 327, 390, 254, 0, 0, 0, 177, 178, 179, + 0, 223, 702, 737, 658, 704, 237, 277, 243, 236, + 407, 707, 753, 620, 699, 0, 623, 626, 749, 733, + 653, 654, 0, 0, 0, 0, 0, 0, 0, 677, + 686, 718, 671, 0, 0, 0, 0, 0, 0, 0, + 0, 651, 0, 695, 0, 0, 0, 630, 624, 0, + 0, 0, 0, 675, 0, 0, 0, 633, 0, 652, + 719, 0, 618, 263, 628, 317, 723, 732, 672, 438, + 736, 670, 669, 739, 714, 631, 729, 664, 288, 629, + 285, 191, 205, 0, 662, 327, 366, 372, 728, 648, + 657, 228, 655, 370, 341, 424, 213, 253, 363, 346, + 368, 694, 712, 369, 294, 412, 358, 422, 439, 440, + 235, 321, 430, 404, 436, 448, 206, 232, 335, 397, + 427, 388, 314, 408, 409, 284, 387, 261, 194, 292, + 198, 399, 420, 218, 380, 0, 0, 0, 200, 418, + 396, 311, 281, 282, 199, 0, 362, 239, 259, 230, + 330, 415, 416, 229, 450, 208, 435, 202, 209, 434, + 323, 411, 419, 312, 303, 201, 417, 310, 302, 287, + 249, 269, 356, 297, 357, 270, 319, 318, 320, 0, + 196, 0, 393, 428, 451, 215, 643, 724, 406, 444, + 447, 0, 359, 216, 260, 248, 355, 258, 290, 443, + 445, 446, 214, 353, 266, 334, 423, 252, 431, 322, + 210, 272, 389, 286, 295, 716, 752, 340, 371, 219, + 426, 390, 638, 642, 636, 637, 688, 689, 639, 744, + 745, 746, 720, 632, 0, 640, 641, 0, 726, 734, + 735, 693, 190, 203, 291, 748, 360, 256, 449, 433, + 429, 619, 635, 234, 646, 0, 0, 659, 666, 667, + 679, 681, 682, 683, 684, 692, 700, 701, 703, 711, + 713, 715, 717, 722, 731, 751, 192, 193, 204, 212, + 221, 233, 246, 254, 264, 268, 271, 274, 275, 278, + 283, 300, 305, 306, 307, 308, 324, 325, 326, 329, + 332, 333, 336, 338, 339, 342, 348, 349, 350, 351, + 352, 354, 361, 365, 373, 374, 375, 376, 377, 378, + 379, 383, 384, 385, 386, 394, 398, 413, 414, 425, + 437, 441, 265, 421, 442, 0, 299, 691, 698, 301, + 250, 267, 276, 706, 432, 395, 207, 367, 257, 197, + 224, 211, 231, 245, 247, 280, 309, 315, 344, 347, + 262, 242, 222, 364, 220, 381, 401, 402, 403, 405, + 313, 238, 738, 725, 0, 0, 674, 741, 645, 663, + 750, 665, 668, 708, 625, 687, 331, 660, 0, 649, + 621, 656, 622, 647, 676, 241, 680, 644, 727, 690, + 740, 289, 0, 627, 650, 345, 710, 382, 227, 298, + 296, 410, 251, 244, 240, 226, 273, 304, 343, 400, + 337, 747, 293, 697, 0, 391, 316, 0, 0, 0, + 678, 730, 685, 721, 673, 709, 634, 696, 742, 661, + 705, 743, 279, 225, 195, 328, 392, 255, 0, 0, + 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 217, 0, 223, 702, 737, 658, 704, 237, + 277, 243, 236, 407, 707, 753, 620, 699, 0, 623, + 626, 749, 733, 653, 654, 0, 0, 0, 0, 0, + 0, 0, 677, 686, 718, 671, 0, 0, 0, 0, + 0, 0, 0, 0, 651, 0, 695, 0, 0, 0, + 630, 624, 0, 0, 0, 0, 675, 0, 0, 0, + 633, 0, 652, 719, 0, 618, 263, 628, 317, 723, + 732, 672, 438, 736, 670, 669, 739, 714, 631, 729, + 664, 288, 629, 285, 191, 205, 0, 662, 327, 366, + 372, 728, 648, 657, 228, 655, 370, 341, 424, 213, + 253, 363, 346, 368, 694, 712, 369, 294, 412, 358, + 422, 439, 440, 235, 321, 430, 404, 436, 448, 206, + 232, 335, 397, 427, 388, 314, 408, 409, 284, 387, + 261, 194, 292, 198, 399, 420, 218, 380, 0, 0, + 0, 200, 418, 396, 311, 281, 282, 199, 0, 362, + 239, 259, 230, 330, 415, 416, 229, 450, 208, 435, + 202, 755, 434, 323, 411, 419, 312, 303, 201, 417, + 310, 302, 287, 249, 269, 356, 297, 357, 270, 319, + 318, 320, 0, 196, 0, 393, 428, 451, 215, 643, + 724, 406, 444, 447, 0, 359, 216, 260, 248, 355, + 258, 290, 443, 445, 446, 214, 353, 266, 334, 423, + 252, 431, 617, 754, 611, 610, 286, 295, 716, 752, + 340, 371, 219, 426, 390, 638, 642, 636, 637, 688, + 689, 639, 744, 745, 746, 720, 632, 0, 640, 641, + 0, 726, 734, 735, 693, 190, 203, 291, 748, 360, + 256, 449, 433, 429, 619, 635, 234, 646, 0, 0, + 659, 666, 667, 679, 681, 682, 683, 684, 692, 700, + 701, 703, 711, 713, 715, 717, 722, 731, 751, 192, + 193, 204, 212, 221, 233, 246, 254, 264, 268, 271, + 274, 275, 278, 283, 300, 305, 306, 307, 308, 324, + 325, 326, 329, 332, 333, 336, 338, 339, 342, 348, + 349, 350, 351, 352, 354, 361, 365, 373, 374, 375, + 376, 377, 378, 379, 383, 384, 385, 386, 394, 398, + 413, 414, 425, 437, 441, 265, 421, 442, 0, 299, + 691, 698, 301, 250, 267, 276, 706, 432, 395, 207, + 367, 257, 197, 224, 211, 231, 245, 247, 280, 309, + 315, 344, 347, 262, 242, 222, 364, 220, 381, 401, + 402, 403, 405, 313, 238, 738, 725, 0, 0, 674, + 741, 645, 663, 750, 665, 668, 708, 625, 687, 331, + 660, 0, 649, 621, 656, 622, 647, 676, 241, 680, + 644, 727, 690, 740, 289, 0, 627, 650, 345, 710, + 382, 227, 298, 296, 410, 251, 244, 240, 226, 273, + 304, 343, 400, 337, 747, 293, 697, 0, 391, 316, + 0, 0, 0, 678, 730, 685, 721, 673, 709, 634, + 696, 742, 661, 705, 743, 279, 225, 195, 328, 392, + 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 217, 0, 223, 702, 737, + 658, 704, 237, 277, 243, 236, 407, 707, 753, 620, + 699, 0, 623, 626, 749, 733, 653, 654, 0, 0, + 0, 0, 0, 0, 0, 677, 686, 718, 671, 0, + 0, 0, 0, 0, 0, 0, 0, 651, 0, 695, + 0, 0, 0, 630, 624, 0, 0, 0, 0, 675, + 0, 0, 0, 633, 0, 652, 719, 0, 618, 263, + 628, 317, 723, 732, 672, 438, 736, 670, 669, 739, + 714, 631, 729, 664, 288, 629, 285, 191, 205, 0, + 662, 327, 366, 372, 728, 648, 657, 228, 655, 370, + 341, 424, 213, 253, 363, 346, 368, 694, 712, 369, + 294, 412, 358, 422, 439, 440, 235, 321, 430, 404, + 436, 448, 206, 232, 335, 397, 427, 388, 314, 408, + 409, 284, 387, 261, 194, 292, 198, 399, 1092, 218, + 380, 0, 0, 0, 200, 418, 396, 311, 281, 282, + 199, 0, 362, 239, 259, 230, 330, 415, 416, 229, + 450, 208, 435, 202, 755, 434, 323, 411, 419, 312, + 303, 201, 417, 310, 302, 287, 249, 269, 356, 297, + 357, 270, 319, 318, 320, 0, 196, 0, 393, 428, + 451, 215, 643, 724, 406, 444, 447, 0, 359, 216, + 260, 248, 355, 258, 290, 443, 445, 446, 214, 353, + 266, 334, 423, 252, 431, 617, 754, 611, 610, 286, + 295, 716, 752, 340, 371, 219, 426, 390, 638, 642, + 636, 637, 688, 689, 639, 744, 745, 746, 720, 632, + 0, 640, 641, 0, 726, 734, 735, 693, 190, 203, + 291, 748, 360, 256, 449, 433, 429, 619, 635, 234, + 646, 0, 0, 659, 666, 667, 679, 681, 682, 683, + 684, 692, 700, 701, 703, 711, 713, 715, 717, 722, + 731, 751, 192, 193, 204, 212, 221, 233, 246, 254, + 264, 268, 271, 274, 275, 278, 283, 300, 305, 306, + 307, 308, 324, 325, 326, 329, 332, 333, 336, 338, + 339, 342, 348, 349, 350, 351, 352, 354, 361, 365, + 373, 374, 375, 376, 377, 378, 379, 383, 384, 385, + 386, 394, 398, 413, 414, 425, 437, 441, 265, 421, + 442, 0, 299, 691, 698, 301, 250, 267, 276, 706, + 432, 395, 207, 367, 257, 197, 224, 211, 231, 245, + 247, 280, 309, 315, 344, 347, 262, 242, 222, 364, + 220, 381, 401, 402, 403, 405, 313, 238, 738, 725, + 0, 0, 674, 741, 645, 663, 750, 665, 668, 708, + 625, 687, 331, 660, 0, 649, 621, 656, 622, 647, + 676, 241, 680, 644, 727, 690, 740, 289, 0, 627, + 650, 345, 710, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 747, 293, 697, + 0, 391, 316, 0, 0, 0, 678, 730, 685, 721, + 673, 709, 634, 696, 742, 661, 705, 743, 279, 225, + 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, - 223, 696, 731, 652, 698, 237, 276, 243, 236, 405, - 701, 747, 614, 693, 0, 617, 620, 743, 727, 647, - 648, 0, 0, 0, 0, 0, 0, 0, 671, 680, - 712, 665, 0, 0, 0, 0, 0, 0, 0, 0, - 645, 0, 689, 0, 0, 0, 624, 618, 0, 0, - 0, 0, 669, 0, 0, 0, 627, 0, 646, 713, - 0, 612, 262, 622, 316, 717, 726, 666, 434, 730, - 664, 663, 733, 708, 625, 723, 658, 287, 623, 284, - 191, 205, 0, 656, 326, 364, 370, 722, 642, 651, - 228, 649, 368, 339, 421, 213, 252, 361, 344, 366, - 688, 706, 367, 293, 410, 356, 420, 435, 436, 235, - 320, 427, 402, 432, 444, 206, 232, 333, 395, 424, - 386, 313, 406, 407, 283, 385, 260, 194, 291, 198, - 397, 418, 218, 378, 0, 0, 0, 200, 416, 394, - 310, 280, 281, 199, 0, 360, 239, 258, 230, 329, - 413, 414, 229, 446, 208, 431, 202, 209, 430, 322, - 409, 417, 311, 302, 201, 415, 309, 301, 286, 249, - 268, 354, 296, 355, 269, 318, 317, 319, 0, 196, - 0, 391, 425, 447, 215, 637, 718, 404, 440, 443, - 0, 357, 216, 259, 248, 353, 257, 289, 439, 441, - 442, 214, 351, 265, 321, 210, 271, 387, 285, 294, - 710, 746, 338, 369, 219, 423, 388, 632, 636, 630, - 631, 682, 683, 633, 738, 739, 740, 714, 626, 0, - 634, 635, 0, 720, 728, 729, 687, 190, 203, 290, - 742, 358, 255, 445, 429, 426, 613, 629, 234, 640, - 0, 0, 653, 660, 661, 673, 675, 676, 677, 678, - 686, 694, 695, 697, 705, 707, 709, 711, 716, 725, - 745, 192, 193, 204, 212, 221, 233, 246, 253, 263, - 267, 270, 273, 274, 277, 282, 299, 304, 305, 306, - 307, 323, 324, 325, 328, 331, 332, 334, 336, 337, - 340, 346, 347, 348, 349, 350, 352, 359, 363, 371, - 372, 373, 374, 375, 376, 377, 381, 382, 383, 384, - 392, 396, 411, 412, 422, 433, 437, 264, 419, 438, - 0, 298, 685, 692, 300, 250, 266, 275, 700, 428, - 393, 207, 365, 256, 197, 224, 211, 231, 245, 247, - 279, 308, 314, 342, 345, 261, 242, 222, 362, 220, - 379, 399, 400, 401, 403, 312, 238, 732, 719, 0, - 0, 668, 735, 639, 657, 744, 659, 662, 702, 619, - 681, 330, 654, 0, 643, 615, 650, 616, 641, 670, - 241, 674, 638, 721, 684, 734, 288, 0, 621, 644, - 343, 704, 380, 227, 297, 295, 408, 251, 244, 240, - 226, 272, 303, 341, 398, 335, 741, 292, 691, 0, - 389, 315, 0, 0, 0, 672, 724, 679, 715, 667, - 703, 628, 690, 736, 655, 699, 737, 278, 225, 195, - 327, 390, 254, 0, 0, 0, 177, 178, 179, 0, - 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, - 696, 731, 652, 698, 237, 276, 243, 236, 405, 701, - 747, 614, 693, 0, 617, 620, 743, 727, 647, 648, - 0, 0, 0, 0, 0, 0, 0, 671, 680, 712, - 665, 0, 0, 0, 0, 0, 0, 0, 0, 645, - 0, 689, 0, 0, 0, 624, 618, 0, 0, 0, - 0, 669, 0, 0, 0, 627, 0, 646, 713, 0, - 612, 262, 622, 316, 717, 726, 666, 434, 730, 664, - 663, 733, 708, 625, 723, 658, 287, 623, 284, 191, - 205, 0, 656, 326, 364, 370, 722, 642, 651, 228, - 649, 368, 339, 421, 213, 252, 361, 344, 366, 688, - 706, 367, 293, 410, 356, 420, 435, 436, 235, 320, - 427, 402, 432, 444, 206, 232, 333, 395, 424, 386, - 313, 406, 407, 283, 385, 260, 194, 291, 198, 397, - 418, 218, 378, 0, 0, 0, 200, 416, 394, 310, - 280, 281, 199, 0, 360, 239, 258, 230, 329, 413, - 414, 229, 446, 208, 431, 202, 749, 430, 322, 409, - 417, 311, 302, 201, 415, 309, 301, 286, 249, 268, - 354, 296, 355, 269, 318, 317, 319, 0, 196, 0, - 391, 425, 447, 215, 637, 718, 404, 440, 443, 0, - 357, 216, 259, 248, 353, 257, 289, 439, 441, 442, - 214, 351, 265, 611, 748, 605, 604, 285, 294, 710, - 746, 338, 369, 219, 423, 388, 632, 636, 630, 631, - 682, 683, 633, 738, 739, 740, 714, 626, 0, 634, - 635, 0, 720, 728, 729, 687, 190, 203, 290, 742, - 358, 255, 445, 429, 426, 613, 629, 234, 640, 0, - 0, 653, 660, 661, 673, 675, 676, 677, 678, 686, - 694, 695, 697, 705, 707, 709, 711, 716, 725, 745, - 192, 193, 204, 212, 221, 233, 246, 253, 263, 267, - 270, 273, 274, 277, 282, 299, 304, 305, 306, 307, - 323, 324, 325, 328, 331, 332, 334, 336, 337, 340, - 346, 347, 348, 349, 350, 352, 359, 363, 371, 372, - 373, 374, 375, 376, 377, 381, 382, 383, 384, 392, - 396, 411, 412, 422, 433, 437, 264, 419, 438, 0, - 298, 685, 692, 300, 250, 266, 275, 700, 428, 393, - 207, 365, 256, 197, 224, 211, 231, 245, 247, 279, - 308, 314, 342, 345, 261, 242, 222, 362, 220, 379, - 399, 400, 401, 403, 312, 238, 732, 719, 0, 0, - 668, 735, 639, 657, 744, 659, 662, 702, 619, 681, - 330, 654, 0, 643, 615, 650, 616, 641, 670, 241, - 674, 638, 721, 684, 734, 288, 0, 621, 644, 343, - 704, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 741, 292, 691, 0, 389, - 315, 0, 0, 0, 672, 724, 679, 715, 667, 703, - 628, 690, 736, 655, 699, 737, 278, 225, 195, 327, - 390, 254, 0, 0, 0, 177, 178, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 217, 0, 223, 696, - 731, 652, 698, 237, 276, 243, 236, 405, 701, 747, - 614, 693, 0, 617, 620, 743, 727, 647, 648, 0, - 0, 0, 0, 0, 0, 0, 671, 680, 712, 665, - 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, - 689, 0, 0, 0, 624, 618, 0, 0, 0, 0, - 669, 0, 0, 0, 627, 0, 646, 713, 0, 612, - 262, 622, 316, 717, 726, 666, 434, 730, 664, 663, - 733, 708, 625, 723, 658, 287, 623, 284, 191, 205, - 0, 656, 326, 364, 370, 722, 642, 651, 228, 649, - 368, 339, 421, 213, 252, 361, 344, 366, 688, 706, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 1082, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 749, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 637, 718, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 611, 748, 605, 604, 285, 294, 710, 746, - 338, 369, 219, 423, 388, 632, 636, 630, 631, 682, - 683, 633, 738, 739, 740, 714, 626, 0, 634, 635, - 0, 720, 728, 729, 687, 190, 203, 290, 742, 358, - 255, 445, 429, 426, 613, 629, 234, 640, 0, 0, - 653, 660, 661, 673, 675, 676, 677, 678, 686, 694, - 695, 697, 705, 707, 709, 711, 716, 725, 745, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 264, 419, 438, 0, 298, - 685, 692, 300, 250, 266, 275, 700, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, 732, 719, 0, 0, 668, - 735, 639, 657, 744, 659, 662, 702, 619, 681, 330, - 654, 0, 643, 615, 650, 616, 641, 670, 241, 674, - 638, 721, 684, 734, 288, 0, 621, 644, 343, 704, - 380, 227, 297, 295, 408, 251, 244, 240, 226, 272, - 303, 341, 398, 335, 741, 292, 691, 0, 389, 315, - 0, 0, 0, 672, 724, 679, 715, 667, 703, 628, - 690, 736, 655, 699, 737, 278, 225, 195, 327, 390, - 254, 0, 0, 0, 177, 178, 179, 0, 0, 0, - 0, 0, 0, 0, 0, 217, 0, 223, 696, 731, - 652, 698, 237, 276, 243, 236, 405, 701, 747, 614, - 693, 0, 617, 620, 743, 727, 647, 648, 0, 0, - 0, 0, 0, 0, 0, 671, 680, 712, 665, 0, - 0, 0, 0, 0, 0, 0, 0, 645, 0, 689, - 0, 0, 0, 624, 618, 0, 0, 0, 0, 669, - 0, 0, 0, 627, 0, 646, 713, 0, 612, 262, - 622, 316, 717, 726, 666, 434, 730, 664, 663, 733, - 708, 625, 723, 658, 287, 623, 284, 191, 205, 0, - 656, 326, 364, 370, 722, 642, 651, 228, 649, 368, - 339, 421, 213, 252, 361, 344, 366, 688, 706, 367, - 293, 410, 356, 420, 435, 436, 235, 320, 427, 402, - 432, 444, 206, 232, 333, 395, 424, 386, 313, 406, - 407, 283, 385, 260, 194, 291, 198, 397, 602, 218, - 378, 0, 0, 0, 200, 416, 394, 310, 280, 281, - 199, 0, 360, 239, 258, 230, 329, 413, 414, 229, - 446, 208, 431, 202, 749, 430, 322, 409, 417, 311, - 302, 201, 415, 309, 301, 286, 249, 268, 354, 296, - 355, 269, 318, 317, 319, 0, 196, 0, 391, 425, - 447, 215, 637, 718, 404, 440, 443, 0, 357, 216, - 259, 248, 353, 257, 289, 439, 441, 442, 214, 351, - 265, 611, 748, 605, 604, 285, 294, 710, 746, 338, - 369, 219, 423, 388, 632, 636, 630, 631, 682, 683, - 633, 738, 739, 740, 714, 626, 0, 634, 635, 0, - 720, 728, 729, 687, 190, 203, 290, 742, 358, 255, - 445, 429, 426, 613, 629, 234, 640, 0, 0, 653, - 660, 661, 673, 675, 676, 677, 678, 686, 694, 695, - 697, 705, 707, 709, 711, 716, 725, 745, 192, 193, - 204, 212, 221, 233, 246, 253, 263, 267, 270, 273, - 274, 277, 282, 299, 304, 305, 306, 307, 323, 324, - 325, 328, 331, 332, 334, 336, 337, 340, 346, 347, - 348, 349, 350, 352, 359, 363, 371, 372, 373, 374, - 375, 376, 377, 381, 382, 383, 384, 392, 396, 411, - 412, 422, 433, 437, 264, 419, 438, 0, 298, 685, - 692, 300, 250, 266, 275, 700, 428, 393, 207, 365, - 256, 197, 224, 211, 231, 245, 247, 279, 308, 314, - 342, 345, 261, 242, 222, 362, 220, 379, 399, 400, - 401, 403, 312, 238, 330, 0, 0, 1380, 0, 505, - 0, 0, 0, 241, 0, 504, 0, 0, 0, 288, - 0, 0, 1381, 343, 0, 380, 227, 297, 295, 408, - 251, 244, 240, 226, 272, 303, 341, 398, 335, 548, - 292, 0, 0, 389, 315, 0, 0, 0, 0, 0, - 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 225, 195, 327, 390, 254, 69, 0, 0, 177, - 178, 179, 526, 525, 528, 529, 530, 531, 0, 0, - 217, 527, 223, 532, 533, 534, 0, 237, 276, 243, - 236, 405, 0, 0, 0, 502, 519, 0, 547, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 516, 517, - 592, 0, 0, 0, 562, 0, 518, 0, 0, 511, - 512, 514, 513, 515, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 0, 316, 561, 0, 0, - 434, 0, 0, 559, 0, 0, 0, 0, 0, 287, - 0, 284, 191, 205, 0, 0, 326, 364, 370, 0, - 0, 0, 228, 0, 368, 339, 421, 213, 252, 361, - 344, 366, 0, 0, 367, 293, 410, 356, 420, 435, - 436, 235, 320, 427, 402, 432, 444, 206, 232, 333, - 395, 424, 386, 313, 406, 407, 283, 385, 260, 194, - 291, 198, 397, 418, 218, 378, 0, 0, 0, 200, - 416, 394, 310, 280, 281, 199, 0, 360, 239, 258, - 230, 329, 413, 414, 229, 446, 208, 431, 202, 209, - 430, 322, 409, 417, 311, 302, 201, 415, 309, 301, - 286, 249, 268, 354, 296, 355, 269, 318, 317, 319, - 0, 196, 0, 391, 425, 447, 215, 0, 0, 404, - 440, 443, 0, 357, 216, 259, 248, 353, 257, 289, - 439, 441, 442, 214, 351, 265, 321, 210, 271, 387, - 285, 294, 0, 0, 338, 369, 219, 423, 388, 549, - 560, 555, 556, 553, 554, 0, 552, 551, 550, 563, - 541, 542, 543, 544, 546, 0, 557, 558, 545, 190, - 203, 290, 0, 358, 255, 445, 429, 426, 0, 0, - 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, - 253, 263, 267, 270, 273, 274, 277, 282, 299, 304, - 305, 306, 307, 323, 324, 325, 328, 331, 332, 334, - 336, 337, 340, 346, 347, 348, 349, 350, 352, 359, - 363, 371, 372, 373, 374, 375, 376, 377, 381, 382, - 383, 384, 392, 396, 411, 412, 422, 433, 437, 264, - 419, 438, 0, 298, 0, 0, 300, 250, 266, 275, - 0, 428, 393, 207, 365, 256, 197, 224, 211, 231, - 245, 247, 279, 308, 314, 342, 345, 261, 242, 222, - 362, 220, 379, 399, 400, 401, 403, 312, 238, 330, - 0, 0, 0, 0, 505, 0, 0, 0, 241, 0, - 504, 0, 0, 0, 288, 0, 0, 0, 343, 0, - 380, 227, 297, 295, 408, 251, 244, 240, 226, 272, - 303, 341, 398, 335, 548, 292, 0, 0, 389, 315, - 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, - 0, 0, 0, 1492, 0, 278, 225, 195, 327, 390, - 254, 69, 0, 0, 177, 178, 179, 526, 525, 528, - 529, 530, 531, 0, 0, 217, 527, 223, 532, 533, - 534, 1493, 237, 276, 243, 236, 405, 0, 0, 0, - 502, 519, 0, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 516, 517, 0, 0, 0, 0, 562, - 0, 518, 0, 0, 511, 512, 514, 513, 515, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 0, 316, 561, 0, 0, 434, 0, 0, 559, 0, - 0, 0, 0, 0, 287, 0, 284, 191, 205, 0, - 0, 326, 364, 370, 0, 0, 0, 228, 0, 368, - 339, 421, 213, 252, 361, 344, 366, 0, 0, 367, - 293, 410, 356, 420, 435, 436, 235, 320, 427, 402, - 432, 444, 206, 232, 333, 395, 424, 386, 313, 406, - 407, 283, 385, 260, 194, 291, 198, 397, 418, 218, - 378, 0, 0, 0, 200, 416, 394, 310, 280, 281, - 199, 0, 360, 239, 258, 230, 329, 413, 414, 229, - 446, 208, 431, 202, 209, 430, 322, 409, 417, 311, - 302, 201, 415, 309, 301, 286, 249, 268, 354, 296, - 355, 269, 318, 317, 319, 0, 196, 0, 391, 425, - 447, 215, 0, 0, 404, 440, 443, 0, 357, 216, - 259, 248, 353, 257, 289, 439, 441, 442, 214, 351, - 265, 321, 210, 271, 387, 285, 294, 0, 0, 338, - 369, 219, 423, 388, 549, 560, 555, 556, 553, 554, - 0, 552, 551, 550, 563, 541, 542, 543, 544, 546, - 0, 557, 558, 545, 190, 203, 290, 0, 358, 255, - 445, 429, 426, 0, 0, 234, 0, 0, 0, 0, + 223, 702, 737, 658, 704, 237, 277, 243, 236, 407, + 707, 753, 620, 699, 0, 623, 626, 749, 733, 653, + 654, 0, 0, 0, 0, 0, 0, 0, 677, 686, + 718, 671, 0, 0, 0, 0, 0, 0, 0, 0, + 651, 0, 695, 0, 0, 0, 630, 624, 0, 0, + 0, 0, 675, 0, 0, 0, 633, 0, 652, 719, + 0, 618, 263, 628, 317, 723, 732, 672, 438, 736, + 670, 669, 739, 714, 631, 729, 664, 288, 629, 285, + 191, 205, 0, 662, 327, 366, 372, 728, 648, 657, + 228, 655, 370, 341, 424, 213, 253, 363, 346, 368, + 694, 712, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 608, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 755, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 643, 724, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 617, 754, + 611, 610, 286, 295, 716, 752, 340, 371, 219, 426, + 390, 638, 642, 636, 637, 688, 689, 639, 744, 745, + 746, 720, 632, 0, 640, 641, 0, 726, 734, 735, + 693, 190, 203, 291, 748, 360, 256, 449, 433, 429, + 619, 635, 234, 646, 0, 0, 659, 666, 667, 679, + 681, 682, 683, 684, 692, 700, 701, 703, 711, 713, + 715, 717, 722, 731, 751, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 691, 698, 301, 250, + 267, 276, 706, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 0, 1394, 0, 511, 0, 0, 0, + 241, 0, 510, 0, 0, 0, 289, 0, 0, 1395, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 554, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 545, 546, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 69, 0, 0, 177, 178, 179, 532, + 531, 534, 535, 536, 537, 0, 0, 217, 533, 223, + 538, 539, 540, 0, 237, 277, 243, 236, 407, 0, + 0, 0, 508, 525, 0, 553, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 522, 523, 598, 0, 0, + 0, 568, 0, 524, 0, 0, 517, 518, 520, 519, + 521, 526, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 263, 0, 317, 567, 0, 0, 438, 0, 0, + 565, 0, 0, 0, 0, 0, 288, 0, 285, 191, + 205, 0, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, + 555, 566, 561, 562, 559, 560, 0, 558, 557, 556, + 569, 547, 548, 549, 550, 552, 0, 563, 564, 551, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, + 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, - 204, 212, 221, 233, 246, 253, 263, 267, 270, 273, - 274, 277, 282, 299, 304, 305, 306, 307, 323, 324, - 325, 328, 331, 332, 334, 336, 337, 340, 346, 347, - 348, 349, 350, 352, 359, 363, 371, 372, 373, 374, - 375, 376, 377, 381, 382, 383, 384, 392, 396, 411, - 412, 422, 433, 437, 264, 419, 438, 0, 298, 0, - 0, 300, 250, 266, 275, 0, 428, 393, 207, 365, - 256, 197, 224, 211, 231, 245, 247, 279, 308, 314, - 342, 345, 261, 242, 222, 362, 220, 379, 399, 400, - 401, 403, 312, 238, 330, 0, 0, 0, 0, 505, - 0, 0, 0, 241, 0, 504, 0, 0, 0, 288, - 0, 0, 0, 343, 0, 380, 227, 297, 295, 408, - 251, 244, 240, 226, 272, 303, 341, 398, 335, 548, - 292, 0, 0, 389, 315, 0, 0, 0, 0, 0, - 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 225, 195, 327, 390, 254, 69, 0, 580, 177, - 178, 179, 526, 525, 528, 529, 530, 531, 0, 0, - 217, 527, 223, 532, 533, 534, 0, 237, 276, 243, - 236, 405, 0, 0, 0, 502, 519, 0, 547, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 516, 517, - 0, 0, 0, 0, 562, 0, 518, 0, 0, 511, - 512, 514, 513, 515, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 0, 316, 561, 0, 0, - 434, 0, 0, 559, 0, 0, 0, 0, 0, 287, - 0, 284, 191, 205, 0, 0, 326, 364, 370, 0, - 0, 0, 228, 0, 368, 339, 421, 213, 252, 361, - 344, 366, 0, 0, 367, 293, 410, 356, 420, 435, - 436, 235, 320, 427, 402, 432, 444, 206, 232, 333, - 395, 424, 386, 313, 406, 407, 283, 385, 260, 194, - 291, 198, 397, 418, 218, 378, 0, 0, 0, 200, - 416, 394, 310, 280, 281, 199, 0, 360, 239, 258, - 230, 329, 413, 414, 229, 446, 208, 431, 202, 209, - 430, 322, 409, 417, 311, 302, 201, 415, 309, 301, - 286, 249, 268, 354, 296, 355, 269, 318, 317, 319, - 0, 196, 0, 391, 425, 447, 215, 0, 0, 404, - 440, 443, 0, 357, 216, 259, 248, 353, 257, 289, - 439, 441, 442, 214, 351, 265, 321, 210, 271, 387, - 285, 294, 0, 0, 338, 369, 219, 423, 388, 549, - 560, 555, 556, 553, 554, 0, 552, 551, 550, 563, - 541, 542, 543, 544, 546, 0, 557, 558, 545, 190, - 203, 290, 0, 358, 255, 445, 429, 426, 0, 0, + 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 331, 0, 0, 0, 0, 511, 0, 0, 0, 241, + 0, 510, 0, 0, 0, 289, 0, 0, 0, 345, + 0, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 554, 293, 0, 0, 391, + 316, 0, 0, 0, 0, 0, 545, 546, 0, 0, + 0, 0, 0, 0, 1506, 0, 279, 225, 195, 328, + 392, 255, 69, 0, 0, 177, 178, 179, 532, 531, + 534, 535, 536, 537, 0, 0, 217, 533, 223, 538, + 539, 540, 1507, 237, 277, 243, 236, 407, 0, 0, + 0, 508, 525, 0, 553, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 522, 523, 0, 0, 0, 0, + 568, 0, 524, 0, 0, 517, 518, 520, 519, 521, + 526, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 263, 0, 317, 567, 0, 0, 438, 0, 0, 565, + 0, 0, 0, 0, 0, 288, 0, 285, 191, 205, + 0, 0, 327, 366, 372, 0, 0, 0, 228, 0, + 370, 341, 424, 213, 253, 363, 346, 368, 0, 0, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 0, 0, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 0, 0, 340, 371, 219, 426, 390, 555, + 566, 561, 562, 559, 560, 0, 558, 557, 556, 569, + 547, 548, 549, 550, 552, 0, 563, 564, 551, 190, + 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, - 253, 263, 267, 270, 273, 274, 277, 282, 299, 304, - 305, 306, 307, 323, 324, 325, 328, 331, 332, 334, - 336, 337, 340, 346, 347, 348, 349, 350, 352, 359, - 363, 371, 372, 373, 374, 375, 376, 377, 381, 382, - 383, 384, 392, 396, 411, 412, 422, 433, 437, 264, - 419, 438, 0, 298, 0, 0, 300, 250, 266, 275, - 0, 428, 393, 207, 365, 256, 197, 224, 211, 231, - 245, 247, 279, 308, 314, 342, 345, 261, 242, 222, - 362, 220, 379, 399, 400, 401, 403, 312, 238, 330, - 0, 0, 0, 0, 505, 0, 0, 0, 241, 0, - 504, 0, 0, 0, 288, 0, 0, 0, 343, 0, - 380, 227, 297, 295, 408, 251, 244, 240, 226, 272, - 303, 341, 398, 335, 548, 292, 0, 0, 389, 315, - 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, - 0, 0, 0, 0, 0, 278, 225, 195, 327, 390, - 254, 69, 0, 0, 177, 178, 179, 526, 525, 528, - 529, 530, 531, 0, 0, 217, 527, 223, 532, 533, - 534, 0, 237, 276, 243, 236, 405, 0, 0, 0, - 502, 519, 0, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 516, 517, 592, 0, 0, 0, 562, - 0, 518, 0, 0, 511, 512, 514, 513, 515, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 0, 316, 561, 0, 0, 434, 0, 0, 559, 0, - 0, 0, 0, 0, 287, 0, 284, 191, 205, 0, - 0, 326, 364, 370, 0, 0, 0, 228, 0, 368, - 339, 421, 213, 252, 361, 344, 366, 0, 0, 367, - 293, 410, 356, 420, 435, 436, 235, 320, 427, 402, - 432, 444, 206, 232, 333, 395, 424, 386, 313, 406, - 407, 283, 385, 260, 194, 291, 198, 397, 418, 218, - 378, 0, 0, 0, 200, 416, 394, 310, 280, 281, - 199, 0, 360, 239, 258, 230, 329, 413, 414, 229, - 446, 208, 431, 202, 209, 430, 322, 409, 417, 311, - 302, 201, 415, 309, 301, 286, 249, 268, 354, 296, - 355, 269, 318, 317, 319, 0, 196, 0, 391, 425, - 447, 215, 0, 0, 404, 440, 443, 0, 357, 216, - 259, 248, 353, 257, 289, 439, 441, 442, 214, 351, - 265, 321, 210, 271, 387, 285, 294, 0, 0, 338, - 369, 219, 423, 388, 549, 560, 555, 556, 553, 554, - 0, 552, 551, 550, 563, 541, 542, 543, 544, 546, - 0, 557, 558, 545, 190, 203, 290, 0, 358, 255, - 445, 429, 426, 0, 0, 234, 0, 0, 0, 0, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 0, 0, 301, 250, 267, 276, + 0, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 331, + 0, 0, 0, 0, 511, 0, 0, 0, 241, 0, + 510, 0, 0, 0, 289, 0, 0, 0, 345, 0, + 382, 227, 298, 296, 410, 251, 244, 240, 226, 273, + 304, 343, 400, 337, 554, 293, 0, 0, 391, 316, + 0, 0, 0, 0, 0, 545, 546, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 225, 195, 328, 392, + 255, 69, 0, 586, 177, 178, 179, 532, 531, 534, + 535, 536, 537, 0, 0, 217, 533, 223, 538, 539, + 540, 0, 237, 277, 243, 236, 407, 0, 0, 0, + 508, 525, 0, 553, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 522, 523, 0, 0, 0, 0, 568, + 0, 524, 0, 0, 517, 518, 520, 519, 521, 526, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, + 0, 317, 567, 0, 0, 438, 0, 0, 565, 0, + 0, 0, 0, 0, 288, 0, 285, 191, 205, 0, + 0, 327, 366, 372, 0, 0, 0, 228, 0, 370, + 341, 424, 213, 253, 363, 346, 368, 0, 0, 369, + 294, 412, 358, 422, 439, 440, 235, 321, 430, 404, + 436, 448, 206, 232, 335, 397, 427, 388, 314, 408, + 409, 284, 387, 261, 194, 292, 198, 399, 420, 218, + 380, 0, 0, 0, 200, 418, 396, 311, 281, 282, + 199, 0, 362, 239, 259, 230, 330, 415, 416, 229, + 450, 208, 435, 202, 209, 434, 323, 411, 419, 312, + 303, 201, 417, 310, 302, 287, 249, 269, 356, 297, + 357, 270, 319, 318, 320, 0, 196, 0, 393, 428, + 451, 215, 0, 0, 406, 444, 447, 0, 359, 216, + 260, 248, 355, 258, 290, 443, 445, 446, 214, 353, + 266, 334, 423, 252, 431, 322, 210, 272, 389, 286, + 295, 0, 0, 340, 371, 219, 426, 390, 555, 566, + 561, 562, 559, 560, 0, 558, 557, 556, 569, 547, + 548, 549, 550, 552, 0, 563, 564, 551, 190, 203, + 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 204, 212, 221, 233, 246, 254, + 264, 268, 271, 274, 275, 278, 283, 300, 305, 306, + 307, 308, 324, 325, 326, 329, 332, 333, 336, 338, + 339, 342, 348, 349, 350, 351, 352, 354, 361, 365, + 373, 374, 375, 376, 377, 378, 379, 383, 384, 385, + 386, 394, 398, 413, 414, 425, 437, 441, 265, 421, + 442, 0, 299, 0, 0, 301, 250, 267, 276, 0, + 432, 395, 207, 367, 257, 197, 224, 211, 231, 245, + 247, 280, 309, 315, 344, 347, 262, 242, 222, 364, + 220, 381, 401, 402, 403, 405, 313, 238, 331, 0, + 0, 0, 0, 511, 0, 0, 0, 241, 0, 510, + 0, 0, 0, 289, 0, 0, 0, 345, 0, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 554, 293, 0, 0, 391, 316, 0, + 0, 0, 0, 0, 545, 546, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 225, 195, 328, 392, 255, + 69, 0, 0, 177, 178, 179, 532, 531, 534, 535, + 536, 537, 0, 0, 217, 533, 223, 538, 539, 540, + 0, 237, 277, 243, 236, 407, 0, 0, 0, 508, + 525, 0, 553, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 522, 523, 598, 0, 0, 0, 568, 0, + 524, 0, 0, 517, 518, 520, 519, 521, 526, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 317, 567, 0, 0, 438, 0, 0, 565, 0, 0, + 0, 0, 0, 288, 0, 285, 191, 205, 0, 0, + 327, 366, 372, 0, 0, 0, 228, 0, 370, 341, + 424, 213, 253, 363, 346, 368, 0, 0, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 0, 0, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 0, 0, 340, 371, 219, 426, 390, 555, 566, 561, + 562, 559, 560, 0, 558, 557, 556, 569, 547, 548, + 549, 550, 552, 0, 563, 564, 551, 190, 203, 291, + 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 0, 0, 301, 250, 267, 276, 0, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 331, 0, 0, + 0, 0, 511, 0, 0, 0, 241, 0, 510, 0, + 0, 0, 289, 0, 0, 0, 345, 0, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 554, 293, 0, 0, 391, 316, 0, 0, + 0, 0, 0, 545, 546, 0, 0, 0, 0, 0, + 0, 0, 0, 279, 225, 195, 328, 392, 255, 69, + 0, 0, 177, 178, 179, 532, 1412, 534, 535, 536, + 537, 0, 0, 217, 533, 223, 538, 539, 540, 0, + 237, 277, 243, 236, 407, 0, 0, 0, 508, 525, + 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 522, 523, 598, 0, 0, 0, 568, 0, 524, + 0, 0, 517, 518, 520, 519, 521, 526, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 263, 0, 317, + 567, 0, 0, 438, 0, 0, 565, 0, 0, 0, + 0, 0, 288, 0, 285, 191, 205, 0, 0, 327, + 366, 372, 0, 0, 0, 228, 0, 370, 341, 424, + 213, 253, 363, 346, 368, 0, 0, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 0, 0, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 0, + 0, 340, 371, 219, 426, 390, 555, 566, 561, 562, + 559, 560, 0, 558, 557, 556, 569, 547, 548, 549, + 550, 552, 0, 563, 564, 551, 190, 203, 291, 0, + 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 0, 0, 301, 250, 267, 276, 0, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, 331, 0, 0, 0, + 0, 511, 0, 0, 0, 241, 0, 510, 0, 0, + 0, 289, 0, 0, 0, 345, 0, 382, 227, 298, + 296, 410, 251, 244, 240, 226, 273, 304, 343, 400, + 337, 554, 293, 0, 0, 391, 316, 0, 0, 0, + 0, 0, 545, 546, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 225, 195, 328, 392, 255, 69, 0, + 0, 177, 178, 179, 532, 1409, 534, 535, 536, 537, + 0, 0, 217, 533, 223, 538, 539, 540, 0, 237, + 277, 243, 236, 407, 0, 0, 0, 508, 525, 0, + 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 522, 523, 598, 0, 0, 0, 568, 0, 524, 0, + 0, 517, 518, 520, 519, 521, 526, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 263, 0, 317, 567, + 0, 0, 438, 0, 0, 565, 0, 0, 0, 0, + 0, 288, 0, 285, 191, 205, 0, 0, 327, 366, + 372, 0, 0, 0, 228, 0, 370, 341, 424, 213, + 253, 363, 346, 368, 0, 0, 369, 294, 412, 358, + 422, 439, 440, 235, 321, 430, 404, 436, 448, 206, + 232, 335, 397, 427, 388, 314, 408, 409, 284, 387, + 261, 194, 292, 198, 399, 420, 218, 380, 0, 0, + 0, 200, 418, 396, 311, 281, 282, 199, 0, 362, + 239, 259, 230, 330, 415, 416, 229, 450, 208, 435, + 202, 209, 434, 323, 411, 419, 312, 303, 201, 417, + 310, 302, 287, 249, 269, 356, 297, 357, 270, 319, + 318, 320, 0, 196, 0, 393, 428, 451, 215, 0, + 0, 406, 444, 447, 0, 359, 216, 260, 248, 355, + 258, 290, 443, 445, 446, 214, 353, 266, 334, 423, + 252, 431, 322, 210, 272, 389, 286, 295, 0, 0, + 340, 371, 219, 426, 390, 555, 566, 561, 562, 559, + 560, 0, 558, 557, 556, 569, 547, 548, 549, 550, + 552, 0, 563, 564, 551, 190, 203, 291, 0, 360, + 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, - 204, 212, 221, 233, 246, 253, 263, 267, 270, 273, - 274, 277, 282, 299, 304, 305, 306, 307, 323, 324, - 325, 328, 331, 332, 334, 336, 337, 340, 346, 347, - 348, 349, 350, 352, 359, 363, 371, 372, 373, 374, - 375, 376, 377, 381, 382, 383, 384, 392, 396, 411, - 412, 422, 433, 437, 264, 419, 438, 0, 298, 0, - 0, 300, 250, 266, 275, 0, 428, 393, 207, 365, - 256, 197, 224, 211, 231, 245, 247, 279, 308, 314, - 342, 345, 261, 242, 222, 362, 220, 379, 399, 400, - 401, 403, 312, 238, 330, 0, 0, 0, 0, 505, - 0, 0, 0, 241, 0, 504, 0, 0, 0, 288, - 0, 0, 0, 343, 0, 380, 227, 297, 295, 408, - 251, 244, 240, 226, 272, 303, 341, 398, 335, 548, - 292, 0, 0, 389, 315, 0, 0, 0, 0, 0, - 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, - 278, 225, 195, 327, 390, 254, 69, 0, 0, 177, - 178, 179, 526, 1398, 528, 529, 530, 531, 0, 0, - 217, 527, 223, 532, 533, 534, 0, 237, 276, 243, - 236, 405, 0, 0, 0, 502, 519, 0, 547, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 516, 517, - 592, 0, 0, 0, 562, 0, 518, 0, 0, 511, - 512, 514, 513, 515, 520, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 0, 316, 561, 0, 0, - 434, 0, 0, 559, 0, 0, 0, 0, 0, 287, - 0, 284, 191, 205, 0, 0, 326, 364, 370, 0, - 0, 0, 228, 0, 368, 339, 421, 213, 252, 361, - 344, 366, 0, 0, 367, 293, 410, 356, 420, 435, - 436, 235, 320, 427, 402, 432, 444, 206, 232, 333, - 395, 424, 386, 313, 406, 407, 283, 385, 260, 194, - 291, 198, 397, 418, 218, 378, 0, 0, 0, 200, - 416, 394, 310, 280, 281, 199, 0, 360, 239, 258, - 230, 329, 413, 414, 229, 446, 208, 431, 202, 209, - 430, 322, 409, 417, 311, 302, 201, 415, 309, 301, - 286, 249, 268, 354, 296, 355, 269, 318, 317, 319, - 0, 196, 0, 391, 425, 447, 215, 0, 0, 404, - 440, 443, 0, 357, 216, 259, 248, 353, 257, 289, - 439, 441, 442, 214, 351, 265, 321, 210, 271, 387, - 285, 294, 0, 0, 338, 369, 219, 423, 388, 549, - 560, 555, 556, 553, 554, 0, 552, 551, 550, 563, - 541, 542, 543, 544, 546, 0, 557, 558, 545, 190, - 203, 290, 0, 358, 255, 445, 429, 426, 0, 0, - 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, + 193, 204, 212, 221, 233, 246, 254, 264, 268, 271, + 274, 275, 278, 283, 300, 305, 306, 307, 308, 324, + 325, 326, 329, 332, 333, 336, 338, 339, 342, 348, + 349, 350, 351, 352, 354, 361, 365, 373, 374, 375, + 376, 377, 378, 379, 383, 384, 385, 386, 394, 398, + 413, 414, 425, 437, 441, 265, 421, 442, 0, 299, + 0, 0, 301, 250, 267, 276, 0, 432, 395, 207, + 367, 257, 197, 224, 211, 231, 245, 247, 280, 309, + 315, 344, 347, 262, 242, 222, 364, 220, 381, 401, + 402, 403, 405, 313, 238, 579, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, + 0, 0, 0, 511, 0, 0, 0, 241, 0, 510, + 0, 0, 0, 289, 0, 0, 0, 345, 0, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 554, 293, 0, 0, 391, 316, 0, + 0, 0, 0, 0, 545, 546, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 225, 195, 328, 392, 255, + 69, 0, 0, 177, 178, 179, 532, 531, 534, 535, + 536, 537, 0, 0, 217, 533, 223, 538, 539, 540, + 0, 237, 277, 243, 236, 407, 0, 0, 0, 508, + 525, 0, 553, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 522, 523, 0, 0, 0, 0, 568, 0, + 524, 0, 0, 517, 518, 520, 519, 521, 526, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 317, 567, 0, 0, 438, 0, 0, 565, 0, 0, + 0, 0, 0, 288, 0, 285, 191, 205, 0, 0, + 327, 366, 372, 0, 0, 0, 228, 0, 370, 341, + 424, 213, 253, 363, 346, 368, 0, 0, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 0, 0, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 0, 0, 340, 371, 219, 426, 390, 555, 566, 561, + 562, 559, 560, 0, 558, 557, 556, 569, 547, 548, + 549, 550, 552, 0, 563, 564, 551, 190, 203, 291, + 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 0, 0, 301, 250, 267, 276, 0, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 331, 0, 0, + 0, 0, 511, 0, 0, 0, 241, 0, 510, 0, + 0, 0, 289, 0, 0, 0, 345, 0, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 554, 293, 0, 0, 391, 316, 0, 0, + 0, 0, 0, 545, 546, 0, 0, 0, 0, 0, + 0, 0, 0, 279, 225, 195, 328, 392, 255, 69, + 0, 0, 177, 178, 179, 532, 531, 534, 535, 536, + 537, 0, 0, 217, 533, 223, 538, 539, 540, 0, + 237, 277, 243, 236, 407, 0, 0, 0, 508, 525, + 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 522, 523, 0, 0, 0, 0, 568, 0, 524, + 0, 0, 517, 518, 520, 519, 521, 526, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 263, 0, 317, + 567, 0, 0, 438, 0, 0, 565, 0, 0, 0, + 0, 0, 288, 0, 285, 191, 205, 0, 0, 327, + 366, 372, 0, 0, 0, 228, 0, 370, 341, 424, + 213, 253, 363, 346, 368, 0, 0, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 0, 0, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 0, + 0, 340, 371, 219, 426, 390, 555, 566, 561, 562, + 559, 560, 0, 558, 557, 556, 569, 547, 548, 549, + 550, 552, 0, 563, 564, 551, 190, 203, 291, 0, + 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 0, 0, 301, 250, 267, 276, 0, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, + 0, 289, 0, 0, 0, 345, 0, 382, 227, 298, + 296, 410, 251, 244, 240, 226, 273, 304, 343, 400, + 337, 554, 293, 0, 0, 391, 316, 0, 0, 0, + 0, 0, 545, 546, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 225, 195, 328, 392, 255, 69, 0, + 0, 177, 178, 179, 532, 531, 534, 535, 536, 537, + 0, 0, 217, 533, 223, 538, 539, 540, 0, 237, + 277, 243, 236, 407, 0, 0, 0, 0, 525, 0, + 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 522, 523, 0, 0, 0, 0, 568, 0, 524, 0, + 0, 517, 518, 520, 519, 521, 526, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 263, 0, 317, 567, + 0, 0, 438, 0, 0, 565, 0, 0, 0, 0, + 0, 288, 0, 285, 191, 205, 0, 0, 327, 366, + 372, 0, 0, 0, 228, 0, 370, 341, 424, 213, + 253, 363, 346, 368, 2166, 0, 369, 294, 412, 358, + 422, 439, 440, 235, 321, 430, 404, 436, 448, 206, + 232, 335, 397, 427, 388, 314, 408, 409, 284, 387, + 261, 194, 292, 198, 399, 420, 218, 380, 0, 0, + 0, 200, 418, 396, 311, 281, 282, 199, 0, 362, + 239, 259, 230, 330, 415, 416, 229, 450, 208, 435, + 202, 209, 434, 323, 411, 419, 312, 303, 201, 417, + 310, 302, 287, 249, 269, 356, 297, 357, 270, 319, + 318, 320, 0, 196, 0, 393, 428, 451, 215, 0, + 0, 406, 444, 447, 0, 359, 216, 260, 248, 355, + 258, 290, 443, 445, 446, 214, 353, 266, 334, 423, + 252, 431, 322, 210, 272, 389, 286, 295, 0, 0, + 340, 371, 219, 426, 390, 555, 566, 561, 562, 559, + 560, 0, 558, 557, 556, 569, 547, 548, 549, 550, + 552, 0, 563, 564, 551, 190, 203, 291, 0, 360, + 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, - 253, 263, 267, 270, 273, 274, 277, 282, 299, 304, - 305, 306, 307, 323, 324, 325, 328, 331, 332, 334, - 336, 337, 340, 346, 347, 348, 349, 350, 352, 359, - 363, 371, 372, 373, 374, 375, 376, 377, 381, 382, - 383, 384, 392, 396, 411, 412, 422, 433, 437, 264, - 419, 438, 0, 298, 0, 0, 300, 250, 266, 275, - 0, 428, 393, 207, 365, 256, 197, 224, 211, 231, - 245, 247, 279, 308, 314, 342, 345, 261, 242, 222, - 362, 220, 379, 399, 400, 401, 403, 312, 238, 330, - 0, 0, 0, 0, 505, 0, 0, 0, 241, 0, - 504, 0, 0, 0, 288, 0, 0, 0, 343, 0, - 380, 227, 297, 295, 408, 251, 244, 240, 226, 272, - 303, 341, 398, 335, 548, 292, 0, 0, 389, 315, - 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, - 0, 0, 0, 0, 0, 278, 225, 195, 327, 390, - 254, 69, 0, 0, 177, 178, 179, 526, 1395, 528, - 529, 530, 531, 0, 0, 217, 527, 223, 532, 533, - 534, 0, 237, 276, 243, 236, 405, 0, 0, 0, - 502, 519, 0, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 516, 517, 592, 0, 0, 0, 562, - 0, 518, 0, 0, 511, 512, 514, 513, 515, 520, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, - 0, 316, 561, 0, 0, 434, 0, 0, 559, 0, - 0, 0, 0, 0, 287, 0, 284, 191, 205, 0, - 0, 326, 364, 370, 0, 0, 0, 228, 0, 368, - 339, 421, 213, 252, 361, 344, 366, 0, 0, 367, - 293, 410, 356, 420, 435, 436, 235, 320, 427, 402, - 432, 444, 206, 232, 333, 395, 424, 386, 313, 406, - 407, 283, 385, 260, 194, 291, 198, 397, 418, 218, - 378, 0, 0, 0, 200, 416, 394, 310, 280, 281, - 199, 0, 360, 239, 258, 230, 329, 413, 414, 229, - 446, 208, 431, 202, 209, 430, 322, 409, 417, 311, - 302, 201, 415, 309, 301, 286, 249, 268, 354, 296, - 355, 269, 318, 317, 319, 0, 196, 0, 391, 425, - 447, 215, 0, 0, 404, 440, 443, 0, 357, 216, - 259, 248, 353, 257, 289, 439, 441, 442, 214, 351, - 265, 321, 210, 271, 387, 285, 294, 0, 0, 338, - 369, 219, 423, 388, 549, 560, 555, 556, 553, 554, - 0, 552, 551, 550, 563, 541, 542, 543, 544, 546, - 0, 557, 558, 545, 190, 203, 290, 0, 358, 255, - 445, 429, 426, 0, 0, 234, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, + 193, 204, 212, 221, 233, 246, 254, 264, 268, 271, + 274, 275, 278, 283, 300, 305, 306, 307, 308, 324, + 325, 326, 329, 332, 333, 336, 338, 339, 342, 348, + 349, 350, 351, 352, 354, 361, 365, 373, 374, 375, + 376, 377, 378, 379, 383, 384, 385, 386, 394, 398, + 413, 414, 425, 437, 441, 265, 421, 442, 0, 299, + 0, 0, 301, 250, 267, 276, 0, 432, 395, 207, + 367, 257, 197, 224, 211, 231, 245, 247, 280, 309, + 315, 344, 347, 262, 242, 222, 364, 220, 381, 401, + 402, 403, 405, 313, 238, 331, 0, 0, 0, 0, + 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, + 289, 0, 0, 0, 345, 0, 382, 227, 298, 296, + 410, 251, 244, 240, 226, 273, 304, 343, 400, 337, + 554, 293, 0, 0, 391, 316, 0, 0, 0, 0, + 0, 545, 546, 0, 0, 0, 0, 0, 0, 0, + 0, 279, 225, 195, 328, 392, 255, 69, 0, 586, + 177, 178, 179, 532, 531, 534, 535, 536, 537, 0, + 0, 217, 533, 223, 538, 539, 540, 0, 237, 277, + 243, 236, 407, 0, 0, 0, 0, 525, 0, 553, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, + 523, 0, 0, 0, 0, 568, 0, 524, 0, 0, + 517, 518, 520, 519, 521, 526, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 263, 0, 317, 567, 0, + 0, 438, 0, 0, 565, 0, 0, 0, 0, 0, + 288, 0, 285, 191, 205, 0, 0, 327, 366, 372, + 0, 0, 0, 228, 0, 370, 341, 424, 213, 253, + 363, 346, 368, 0, 0, 369, 294, 412, 358, 422, + 439, 440, 235, 321, 430, 404, 436, 448, 206, 232, + 335, 397, 427, 388, 314, 408, 409, 284, 387, 261, + 194, 292, 198, 399, 420, 218, 380, 0, 0, 0, + 200, 418, 396, 311, 281, 282, 199, 0, 362, 239, + 259, 230, 330, 415, 416, 229, 450, 208, 435, 202, + 209, 434, 323, 411, 419, 312, 303, 201, 417, 310, + 302, 287, 249, 269, 356, 297, 357, 270, 319, 318, + 320, 0, 196, 0, 393, 428, 451, 215, 0, 0, + 406, 444, 447, 0, 359, 216, 260, 248, 355, 258, + 290, 443, 445, 446, 214, 353, 266, 334, 423, 252, + 431, 322, 210, 272, 389, 286, 295, 0, 0, 340, + 371, 219, 426, 390, 555, 566, 561, 562, 559, 560, + 0, 558, 557, 556, 569, 547, 548, 549, 550, 552, + 0, 563, 564, 551, 190, 203, 291, 0, 360, 256, + 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, - 204, 212, 221, 233, 246, 253, 263, 267, 270, 273, - 274, 277, 282, 299, 304, 305, 306, 307, 323, 324, - 325, 328, 331, 332, 334, 336, 337, 340, 346, 347, - 348, 349, 350, 352, 359, 363, 371, 372, 373, 374, - 375, 376, 377, 381, 382, 383, 384, 392, 396, 411, - 412, 422, 433, 437, 264, 419, 438, 0, 298, 0, - 0, 300, 250, 266, 275, 0, 428, 393, 207, 365, - 256, 197, 224, 211, 231, 245, 247, 279, 308, 314, - 342, 345, 261, 242, 222, 362, 220, 379, 399, 400, - 401, 403, 312, 238, 573, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 330, 0, 0, - 0, 0, 505, 0, 0, 0, 241, 0, 504, 0, - 0, 0, 288, 0, 0, 0, 343, 0, 380, 227, - 297, 295, 408, 251, 244, 240, 226, 272, 303, 341, - 398, 335, 548, 292, 0, 0, 389, 315, 0, 0, - 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, - 0, 0, 0, 278, 225, 195, 327, 390, 254, 69, - 0, 0, 177, 178, 179, 526, 525, 528, 529, 530, - 531, 0, 0, 217, 527, 223, 532, 533, 534, 0, - 237, 276, 243, 236, 405, 0, 0, 0, 502, 519, - 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 516, 517, 0, 0, 0, 0, 562, 0, 518, - 0, 0, 511, 512, 514, 513, 515, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 316, - 561, 0, 0, 434, 0, 0, 559, 0, 0, 0, - 0, 0, 287, 0, 284, 191, 205, 0, 0, 326, - 364, 370, 0, 0, 0, 228, 0, 368, 339, 421, - 213, 252, 361, 344, 366, 0, 0, 367, 293, 410, - 356, 420, 435, 436, 235, 320, 427, 402, 432, 444, - 206, 232, 333, 395, 424, 386, 313, 406, 407, 283, - 385, 260, 194, 291, 198, 397, 418, 218, 378, 0, - 0, 0, 200, 416, 394, 310, 280, 281, 199, 0, - 360, 239, 258, 230, 329, 413, 414, 229, 446, 208, - 431, 202, 209, 430, 322, 409, 417, 311, 302, 201, - 415, 309, 301, 286, 249, 268, 354, 296, 355, 269, - 318, 317, 319, 0, 196, 0, 391, 425, 447, 215, - 0, 0, 404, 440, 443, 0, 357, 216, 259, 248, - 353, 257, 289, 439, 441, 442, 214, 351, 265, 321, - 210, 271, 387, 285, 294, 0, 0, 338, 369, 219, - 423, 388, 549, 560, 555, 556, 553, 554, 0, 552, - 551, 550, 563, 541, 542, 543, 544, 546, 0, 557, - 558, 545, 190, 203, 290, 0, 358, 255, 445, 429, - 426, 0, 0, 234, 0, 0, 0, 0, 0, 0, + 204, 212, 221, 233, 246, 254, 264, 268, 271, 274, + 275, 278, 283, 300, 305, 306, 307, 308, 324, 325, + 326, 329, 332, 333, 336, 338, 339, 342, 348, 349, + 350, 351, 352, 354, 361, 365, 373, 374, 375, 376, + 377, 378, 379, 383, 384, 385, 386, 394, 398, 413, + 414, 425, 437, 441, 265, 421, 442, 0, 299, 0, + 0, 301, 250, 267, 276, 0, 432, 395, 207, 367, + 257, 197, 224, 211, 231, 245, 247, 280, 309, 315, + 344, 347, 262, 242, 222, 364, 220, 381, 401, 402, + 403, 405, 313, 238, 331, 0, 0, 0, 0, 0, + 0, 0, 0, 241, 0, 0, 0, 0, 0, 289, + 0, 0, 0, 345, 0, 382, 227, 298, 296, 410, + 251, 244, 240, 226, 273, 304, 343, 400, 337, 554, + 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, + 545, 546, 0, 0, 0, 0, 0, 0, 0, 0, + 279, 225, 195, 328, 392, 255, 69, 0, 0, 177, + 178, 179, 532, 531, 534, 535, 536, 537, 0, 0, + 217, 533, 223, 538, 539, 540, 0, 237, 277, 243, + 236, 407, 0, 0, 0, 0, 525, 0, 553, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 522, 523, + 0, 0, 0, 0, 568, 0, 524, 0, 0, 517, + 518, 520, 519, 521, 526, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 263, 0, 317, 567, 0, 0, + 438, 0, 0, 565, 0, 0, 0, 0, 0, 288, + 0, 285, 191, 205, 0, 0, 327, 366, 372, 0, + 0, 0, 228, 0, 370, 341, 424, 213, 253, 363, + 346, 368, 0, 0, 369, 294, 412, 358, 422, 439, + 440, 235, 321, 430, 404, 436, 448, 206, 232, 335, + 397, 427, 388, 314, 408, 409, 284, 387, 261, 194, + 292, 198, 399, 420, 218, 380, 0, 0, 0, 200, + 418, 396, 311, 281, 282, 199, 0, 362, 239, 259, + 230, 330, 415, 416, 229, 450, 208, 435, 202, 209, + 434, 323, 411, 419, 312, 303, 201, 417, 310, 302, + 287, 249, 269, 356, 297, 357, 270, 319, 318, 320, + 0, 196, 0, 393, 428, 451, 215, 0, 0, 406, + 444, 447, 0, 359, 216, 260, 248, 355, 258, 290, + 443, 445, 446, 214, 353, 266, 334, 423, 252, 431, + 322, 210, 272, 389, 286, 295, 0, 0, 340, 371, + 219, 426, 390, 555, 566, 561, 562, 559, 560, 0, + 558, 557, 556, 569, 547, 548, 549, 550, 552, 0, + 563, 564, 551, 190, 203, 291, 0, 360, 256, 449, + 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, - 221, 233, 246, 253, 263, 267, 270, 273, 274, 277, - 282, 299, 304, 305, 306, 307, 323, 324, 325, 328, - 331, 332, 334, 336, 337, 340, 346, 347, 348, 349, - 350, 352, 359, 363, 371, 372, 373, 374, 375, 376, - 377, 381, 382, 383, 384, 392, 396, 411, 412, 422, - 433, 437, 264, 419, 438, 0, 298, 0, 0, 300, - 250, 266, 275, 0, 428, 393, 207, 365, 256, 197, - 224, 211, 231, 245, 247, 279, 308, 314, 342, 345, - 261, 242, 222, 362, 220, 379, 399, 400, 401, 403, - 312, 238, 330, 0, 0, 0, 0, 505, 0, 0, - 0, 241, 0, 504, 0, 0, 0, 288, 0, 0, - 0, 343, 0, 380, 227, 297, 295, 408, 251, 244, - 240, 226, 272, 303, 341, 398, 335, 548, 292, 0, - 0, 389, 315, 0, 0, 0, 0, 0, 539, 540, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 225, - 195, 327, 390, 254, 69, 0, 0, 177, 178, 179, - 526, 525, 528, 529, 530, 531, 0, 0, 217, 527, - 223, 532, 533, 534, 0, 237, 276, 243, 236, 405, - 0, 0, 0, 502, 519, 0, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 516, 517, 0, 0, - 0, 0, 562, 0, 518, 0, 0, 511, 512, 514, - 513, 515, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 262, 0, 316, 561, 0, 0, 434, 0, - 0, 559, 0, 0, 0, 0, 0, 287, 0, 284, - 191, 205, 0, 0, 326, 364, 370, 0, 0, 0, - 228, 0, 368, 339, 421, 213, 252, 361, 344, 366, - 0, 0, 367, 293, 410, 356, 420, 435, 436, 235, - 320, 427, 402, 432, 444, 206, 232, 333, 395, 424, - 386, 313, 406, 407, 283, 385, 260, 194, 291, 198, - 397, 418, 218, 378, 0, 0, 0, 200, 416, 394, - 310, 280, 281, 199, 0, 360, 239, 258, 230, 329, - 413, 414, 229, 446, 208, 431, 202, 209, 430, 322, - 409, 417, 311, 302, 201, 415, 309, 301, 286, 249, - 268, 354, 296, 355, 269, 318, 317, 319, 0, 196, - 0, 391, 425, 447, 215, 0, 0, 404, 440, 443, - 0, 357, 216, 259, 248, 353, 257, 289, 439, 441, - 442, 214, 351, 265, 321, 210, 271, 387, 285, 294, - 0, 0, 338, 369, 219, 423, 388, 549, 560, 555, - 556, 553, 554, 0, 552, 551, 550, 563, 541, 542, - 543, 544, 546, 0, 557, 558, 545, 190, 203, 290, - 0, 358, 255, 445, 429, 426, 0, 0, 234, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 193, 204, 212, 221, 233, 246, 253, 263, - 267, 270, 273, 274, 277, 282, 299, 304, 305, 306, - 307, 323, 324, 325, 328, 331, 332, 334, 336, 337, - 340, 346, 347, 348, 349, 350, 352, 359, 363, 371, - 372, 373, 374, 375, 376, 377, 381, 382, 383, 384, - 392, 396, 411, 412, 422, 433, 437, 264, 419, 438, - 0, 298, 0, 0, 300, 250, 266, 275, 0, 428, - 393, 207, 365, 256, 197, 224, 211, 231, 245, 247, - 279, 308, 314, 342, 345, 261, 242, 222, 362, 220, - 379, 399, 400, 401, 403, 312, 238, 330, 0, 0, - 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, - 0, 0, 288, 0, 0, 0, 343, 0, 380, 227, - 297, 295, 408, 251, 244, 240, 226, 272, 303, 341, - 398, 335, 548, 292, 0, 0, 389, 315, 0, 0, - 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, - 0, 0, 0, 278, 225, 195, 327, 390, 254, 69, - 0, 0, 177, 178, 179, 526, 525, 528, 529, 530, - 531, 0, 0, 217, 527, 223, 532, 533, 534, 0, - 237, 276, 243, 236, 405, 0, 0, 0, 0, 519, - 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 516, 517, 0, 0, 0, 0, 562, 0, 518, - 0, 0, 511, 512, 514, 513, 515, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 316, - 561, 0, 0, 434, 0, 0, 559, 0, 0, 0, - 0, 0, 287, 0, 284, 191, 205, 0, 0, 326, - 364, 370, 0, 0, 0, 228, 0, 368, 339, 421, - 213, 252, 361, 344, 366, 2152, 0, 367, 293, 410, - 356, 420, 435, 436, 235, 320, 427, 402, 432, 444, - 206, 232, 333, 395, 424, 386, 313, 406, 407, 283, - 385, 260, 194, 291, 198, 397, 418, 218, 378, 0, - 0, 0, 200, 416, 394, 310, 280, 281, 199, 0, - 360, 239, 258, 230, 329, 413, 414, 229, 446, 208, - 431, 202, 209, 430, 322, 409, 417, 311, 302, 201, - 415, 309, 301, 286, 249, 268, 354, 296, 355, 269, - 318, 317, 319, 0, 196, 0, 391, 425, 447, 215, - 0, 0, 404, 440, 443, 0, 357, 216, 259, 248, - 353, 257, 289, 439, 441, 442, 214, 351, 265, 321, - 210, 271, 387, 285, 294, 0, 0, 338, 369, 219, - 423, 388, 549, 560, 555, 556, 553, 554, 0, 552, - 551, 550, 563, 541, 542, 543, 544, 546, 0, 557, - 558, 545, 190, 203, 290, 0, 358, 255, 445, 429, - 426, 0, 0, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, - 221, 233, 246, 253, 263, 267, 270, 273, 274, 277, - 282, 299, 304, 305, 306, 307, 323, 324, 325, 328, - 331, 332, 334, 336, 337, 340, 346, 347, 348, 349, - 350, 352, 359, 363, 371, 372, 373, 374, 375, 376, - 377, 381, 382, 383, 384, 392, 396, 411, 412, 422, - 433, 437, 264, 419, 438, 0, 298, 0, 0, 300, - 250, 266, 275, 0, 428, 393, 207, 365, 256, 197, - 224, 211, 231, 245, 247, 279, 308, 314, 342, 345, - 261, 242, 222, 362, 220, 379, 399, 400, 401, 403, - 312, 238, 330, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 0, 0, 0, 0, 0, 288, 0, 0, - 0, 343, 0, 380, 227, 297, 295, 408, 251, 244, - 240, 226, 272, 303, 341, 398, 335, 548, 292, 0, - 0, 389, 315, 0, 0, 0, 0, 0, 539, 540, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 225, - 195, 327, 390, 254, 69, 0, 580, 177, 178, 179, - 526, 525, 528, 529, 530, 531, 0, 0, 217, 527, - 223, 532, 533, 534, 0, 237, 276, 243, 236, 405, - 0, 0, 0, 0, 519, 0, 547, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 516, 517, 0, 0, - 0, 0, 562, 0, 518, 0, 0, 511, 512, 514, - 513, 515, 520, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 262, 0, 316, 561, 0, 0, 434, 0, - 0, 559, 0, 0, 0, 0, 0, 287, 0, 284, - 191, 205, 0, 0, 326, 364, 370, 0, 0, 0, - 228, 0, 368, 339, 421, 213, 252, 361, 344, 366, - 0, 0, 367, 293, 410, 356, 420, 435, 436, 235, - 320, 427, 402, 432, 444, 206, 232, 333, 395, 424, - 386, 313, 406, 407, 283, 385, 260, 194, 291, 198, - 397, 418, 218, 378, 0, 0, 0, 200, 416, 394, - 310, 280, 281, 199, 0, 360, 239, 258, 230, 329, - 413, 414, 229, 446, 208, 431, 202, 209, 430, 322, - 409, 417, 311, 302, 201, 415, 309, 301, 286, 249, - 268, 354, 296, 355, 269, 318, 317, 319, 0, 196, - 0, 391, 425, 447, 215, 0, 0, 404, 440, 443, - 0, 357, 216, 259, 248, 353, 257, 289, 439, 441, - 442, 214, 351, 265, 321, 210, 271, 387, 285, 294, - 0, 0, 338, 369, 219, 423, 388, 549, 560, 555, - 556, 553, 554, 0, 552, 551, 550, 563, 541, 542, - 543, 544, 546, 0, 557, 558, 545, 190, 203, 290, - 0, 358, 255, 445, 429, 426, 0, 0, 234, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 193, 204, 212, 221, 233, 246, 253, 263, - 267, 270, 273, 274, 277, 282, 299, 304, 305, 306, - 307, 323, 324, 325, 328, 331, 332, 334, 336, 337, - 340, 346, 347, 348, 349, 350, 352, 359, 363, 371, - 372, 373, 374, 375, 376, 377, 381, 382, 383, 384, - 392, 396, 411, 412, 422, 433, 437, 264, 419, 438, - 0, 298, 0, 0, 300, 250, 266, 275, 0, 428, - 393, 207, 365, 256, 197, 224, 211, 231, 245, 247, - 279, 308, 314, 342, 345, 261, 242, 222, 362, 220, - 379, 399, 400, 401, 403, 312, 238, 330, 0, 0, - 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, - 0, 0, 288, 0, 0, 0, 343, 0, 380, 227, - 297, 295, 408, 251, 244, 240, 226, 272, 303, 341, - 398, 335, 548, 292, 0, 0, 389, 315, 0, 0, - 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, - 0, 0, 0, 278, 225, 195, 327, 390, 254, 69, - 0, 0, 177, 178, 179, 526, 525, 528, 529, 530, - 531, 0, 0, 217, 527, 223, 532, 533, 534, 0, - 237, 276, 243, 236, 405, 0, 0, 0, 0, 519, - 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 516, 517, 0, 0, 0, 0, 562, 0, 518, - 0, 0, 511, 512, 514, 513, 515, 520, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 316, - 561, 0, 0, 434, 0, 0, 559, 0, 0, 0, - 0, 0, 287, 0, 284, 191, 205, 0, 0, 326, - 364, 370, 0, 0, 0, 228, 0, 368, 339, 421, - 213, 252, 361, 344, 366, 0, 0, 367, 293, 410, - 356, 420, 435, 436, 235, 320, 427, 402, 432, 444, - 206, 232, 333, 395, 424, 386, 313, 406, 407, 283, - 385, 260, 194, 291, 198, 397, 418, 218, 378, 0, - 0, 0, 200, 416, 394, 310, 280, 281, 199, 0, - 360, 239, 258, 230, 329, 413, 414, 229, 446, 208, - 431, 202, 209, 430, 322, 409, 417, 311, 302, 201, - 415, 309, 301, 286, 249, 268, 354, 296, 355, 269, - 318, 317, 319, 0, 196, 0, 391, 425, 447, 215, - 0, 0, 404, 440, 443, 0, 357, 216, 259, 248, - 353, 257, 289, 439, 441, 442, 214, 351, 265, 321, - 210, 271, 387, 285, 294, 0, 0, 338, 369, 219, - 423, 388, 549, 560, 555, 556, 553, 554, 0, 552, - 551, 550, 563, 541, 542, 543, 544, 546, 0, 557, - 558, 545, 190, 203, 290, 0, 358, 255, 445, 429, - 426, 0, 0, 234, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, + 212, 221, 233, 246, 254, 264, 268, 271, 274, 275, + 278, 283, 300, 305, 306, 307, 308, 324, 325, 326, + 329, 332, 333, 336, 338, 339, 342, 348, 349, 350, + 351, 352, 354, 361, 365, 373, 374, 375, 376, 377, + 378, 379, 383, 384, 385, 386, 394, 398, 413, 414, + 425, 437, 441, 265, 421, 442, 0, 299, 0, 0, + 301, 250, 267, 276, 0, 432, 395, 207, 367, 257, + 197, 224, 211, 231, 245, 247, 280, 309, 315, 344, + 347, 262, 242, 222, 364, 220, 381, 401, 402, 403, + 405, 313, 238, 331, 0, 0, 0, 0, 0, 0, + 0, 0, 241, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 345, 0, 382, 227, 298, 296, 410, 251, + 244, 240, 226, 273, 304, 343, 400, 337, 0, 293, + 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, + 225, 195, 328, 392, 255, 0, 0, 0, 177, 178, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 0, 223, 0, 0, 0, 0, 237, 277, 243, 236, + 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 969, 968, 978, 979, 971, 972, 973, + 974, 975, 976, 977, 970, 0, 0, 980, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 263, 0, 317, 0, 0, 0, 438, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, + 285, 191, 205, 0, 0, 327, 366, 372, 0, 0, + 0, 228, 0, 370, 341, 424, 213, 253, 363, 346, + 368, 0, 0, 369, 294, 412, 358, 422, 439, 440, + 235, 321, 430, 404, 436, 448, 206, 232, 335, 397, + 427, 388, 314, 408, 409, 284, 387, 261, 194, 292, + 198, 399, 420, 218, 380, 0, 0, 0, 200, 418, + 396, 311, 281, 282, 199, 0, 362, 239, 259, 230, + 330, 415, 416, 229, 450, 208, 435, 202, 209, 434, + 323, 411, 419, 312, 303, 201, 417, 310, 302, 287, + 249, 269, 356, 297, 357, 270, 319, 318, 320, 0, + 196, 0, 393, 428, 451, 215, 0, 0, 406, 444, + 447, 0, 359, 216, 260, 248, 355, 258, 290, 443, + 445, 446, 214, 353, 266, 334, 423, 252, 431, 322, + 210, 272, 389, 286, 295, 0, 0, 340, 371, 219, + 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 190, 203, 291, 0, 360, 256, 449, 433, + 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, - 221, 233, 246, 253, 263, 267, 270, 273, 274, 277, - 282, 299, 304, 305, 306, 307, 323, 324, 325, 328, - 331, 332, 334, 336, 337, 340, 346, 347, 348, 349, - 350, 352, 359, 363, 371, 372, 373, 374, 375, 376, - 377, 381, 382, 383, 384, 392, 396, 411, 412, 422, - 433, 437, 264, 419, 438, 0, 298, 0, 0, 300, - 250, 266, 275, 0, 428, 393, 207, 365, 256, 197, - 224, 211, 231, 245, 247, 279, 308, 314, 342, 345, - 261, 242, 222, 362, 220, 379, 399, 400, 401, 403, - 312, 238, 330, 0, 0, 0, 0, 0, 0, 0, - 0, 241, 0, 0, 0, 0, 0, 288, 0, 0, - 0, 343, 0, 380, 227, 297, 295, 408, 251, 244, - 240, 226, 272, 303, 341, 398, 335, 0, 292, 0, - 0, 389, 315, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 225, - 195, 327, 390, 254, 0, 0, 0, 177, 178, 179, + 221, 233, 246, 254, 264, 268, 271, 274, 275, 278, + 283, 300, 305, 306, 307, 308, 324, 325, 326, 329, + 332, 333, 336, 338, 339, 342, 348, 349, 350, 351, + 352, 354, 361, 365, 373, 374, 375, 376, 377, 378, + 379, 383, 384, 385, 386, 394, 398, 413, 414, 425, + 437, 441, 265, 421, 442, 0, 299, 0, 0, 301, + 250, 267, 276, 0, 432, 395, 207, 367, 257, 197, + 224, 211, 231, 245, 247, 280, 309, 315, 344, 347, + 262, 242, 222, 364, 220, 381, 401, 402, 403, 405, + 313, 238, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 241, 799, 0, 0, 0, 0, 289, 0, 0, + 0, 345, 0, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 0, 293, 0, + 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 225, + 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, - 223, 0, 0, 0, 0, 237, 276, 243, 236, 405, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 959, 958, 968, 969, 961, 962, 963, 964, - 965, 966, 967, 960, 0, 0, 970, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 262, 0, 316, 0, 0, 0, 434, 0, - 0, 0, 0, 0, 0, 0, 0, 287, 0, 284, - 191, 205, 0, 0, 326, 364, 370, 0, 0, 0, - 228, 0, 368, 339, 421, 213, 252, 361, 344, 366, - 0, 0, 367, 293, 410, 356, 420, 435, 436, 235, - 320, 427, 402, 432, 444, 206, 232, 333, 395, 424, - 386, 313, 406, 407, 283, 385, 260, 194, 291, 198, - 397, 418, 218, 378, 0, 0, 0, 200, 416, 394, - 310, 280, 281, 199, 0, 360, 239, 258, 230, 329, - 413, 414, 229, 446, 208, 431, 202, 209, 430, 322, - 409, 417, 311, 302, 201, 415, 309, 301, 286, 249, - 268, 354, 296, 355, 269, 318, 317, 319, 0, 196, - 0, 391, 425, 447, 215, 0, 0, 404, 440, 443, - 0, 357, 216, 259, 248, 353, 257, 289, 439, 441, - 442, 214, 351, 265, 321, 210, 271, 387, 285, 294, - 0, 0, 338, 369, 219, 423, 388, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 190, 203, 290, - 0, 358, 255, 445, 429, 426, 0, 0, 234, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 193, 204, 212, 221, 233, 246, 253, 263, - 267, 270, 273, 274, 277, 282, 299, 304, 305, 306, - 307, 323, 324, 325, 328, 331, 332, 334, 336, 337, - 340, 346, 347, 348, 349, 350, 352, 359, 363, 371, - 372, 373, 374, 375, 376, 377, 381, 382, 383, 384, - 392, 396, 411, 412, 422, 433, 437, 264, 419, 438, - 0, 298, 0, 0, 300, 250, 266, 275, 0, 428, - 393, 207, 365, 256, 197, 224, 211, 231, 245, 247, - 279, 308, 314, 342, 345, 261, 242, 222, 362, 220, - 379, 399, 400, 401, 403, 312, 238, 330, 0, 0, - 0, 0, 0, 0, 0, 0, 241, 793, 0, 0, - 0, 0, 288, 0, 0, 0, 343, 0, 380, 227, - 297, 295, 408, 251, 244, 240, 226, 272, 303, 341, - 398, 335, 0, 292, 0, 0, 389, 315, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 278, 225, 195, 327, 390, 254, 0, - 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, - 0, 0, 0, 217, 0, 223, 0, 0, 0, 0, - 237, 276, 243, 236, 405, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 0, 316, - 0, 0, 792, 434, 0, 0, 0, 0, 0, 0, - 789, 790, 287, 757, 284, 191, 205, 783, 787, 326, - 364, 370, 0, 0, 0, 228, 0, 368, 339, 421, - 213, 252, 361, 344, 366, 0, 0, 367, 293, 410, - 356, 420, 435, 436, 235, 320, 427, 402, 432, 444, - 206, 232, 333, 395, 424, 386, 313, 406, 407, 283, - 385, 260, 194, 291, 198, 397, 418, 218, 378, 0, - 0, 0, 200, 416, 394, 310, 280, 281, 199, 0, - 360, 239, 258, 230, 329, 413, 414, 229, 446, 208, - 431, 202, 209, 430, 322, 409, 417, 311, 302, 201, - 415, 309, 301, 286, 249, 268, 354, 296, 355, 269, - 318, 317, 319, 0, 196, 0, 391, 425, 447, 215, - 0, 0, 404, 440, 443, 0, 357, 216, 259, 248, - 353, 257, 289, 439, 441, 442, 214, 351, 265, 321, - 210, 271, 387, 285, 294, 0, 0, 338, 369, 219, - 423, 388, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 190, 203, 290, 0, 358, 255, 445, 429, - 426, 0, 0, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, - 221, 233, 246, 253, 263, 267, 270, 273, 274, 277, - 282, 299, 304, 305, 306, 307, 323, 324, 325, 328, - 331, 332, 334, 336, 337, 340, 346, 347, 348, 349, - 350, 352, 359, 363, 371, 372, 373, 374, 375, 376, - 377, 381, 382, 383, 384, 392, 396, 411, 412, 422, - 433, 437, 264, 419, 438, 0, 298, 0, 0, 300, - 250, 266, 275, 0, 428, 393, 207, 365, 256, 197, - 224, 211, 231, 245, 247, 279, 308, 314, 342, 345, - 261, 242, 222, 362, 220, 379, 399, 400, 401, 403, - 312, 238, 330, 0, 0, 0, 1060, 0, 0, 0, - 0, 241, 0, 0, 0, 0, 0, 288, 0, 0, - 0, 343, 0, 380, 227, 297, 295, 408, 251, 244, - 240, 226, 272, 303, 341, 398, 335, 0, 292, 0, - 0, 389, 315, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 278, 225, - 195, 327, 390, 254, 0, 0, 0, 177, 178, 179, - 0, 1062, 0, 0, 0, 0, 0, 0, 217, 0, - 223, 0, 0, 0, 0, 237, 276, 243, 236, 405, - 948, 949, 947, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 950, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 262, 0, 316, 0, 0, 0, 434, 0, - 0, 0, 0, 0, 0, 0, 0, 287, 0, 284, - 191, 205, 0, 0, 326, 364, 370, 0, 0, 0, - 228, 0, 368, 339, 421, 213, 252, 361, 344, 366, - 0, 0, 367, 293, 410, 356, 420, 435, 436, 235, - 320, 427, 402, 432, 444, 206, 232, 333, 395, 424, - 386, 313, 406, 407, 283, 385, 260, 194, 291, 198, - 397, 418, 218, 378, 0, 0, 0, 200, 416, 394, - 310, 280, 281, 199, 0, 360, 239, 258, 230, 329, - 413, 414, 229, 446, 208, 431, 202, 209, 430, 322, - 409, 417, 311, 302, 201, 415, 309, 301, 286, 249, - 268, 354, 296, 355, 269, 318, 317, 319, 0, 196, - 0, 391, 425, 447, 215, 0, 0, 404, 440, 443, - 0, 357, 216, 259, 248, 353, 257, 289, 439, 441, - 442, 214, 351, 265, 321, 210, 271, 387, 285, 294, - 0, 0, 338, 369, 219, 423, 388, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 190, 203, 290, - 0, 358, 255, 445, 429, 426, 0, 0, 234, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 192, 193, 204, 212, 221, 233, 246, 253, 263, - 267, 270, 273, 274, 277, 282, 299, 304, 305, 306, - 307, 323, 324, 325, 328, 331, 332, 334, 336, 337, - 340, 346, 347, 348, 349, 350, 352, 359, 363, 371, - 372, 373, 374, 375, 376, 377, 381, 382, 383, 384, - 392, 396, 411, 412, 422, 433, 437, 264, 419, 438, - 0, 298, 0, 0, 300, 250, 266, 275, 0, 428, - 393, 207, 365, 256, 197, 224, 211, 231, 245, 247, - 279, 308, 314, 342, 345, 261, 242, 222, 362, 220, - 379, 399, 400, 401, 403, 312, 238, 34, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 330, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 0, 0, 0, 0, 0, 288, 0, 0, 0, 343, - 0, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 0, 292, 0, 0, 389, - 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 225, 195, 327, - 390, 254, 69, 0, 580, 177, 178, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, - 0, 0, 0, 237, 276, 243, 236, 405, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 223, 0, 0, 0, 0, 237, 277, 243, 236, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 263, 0, 317, 0, 0, 798, 438, 0, + 0, 0, 0, 0, 0, 795, 796, 288, 763, 285, + 191, 205, 789, 793, 327, 366, 372, 0, 0, 0, + 228, 0, 370, 341, 424, 213, 253, 363, 346, 368, + 0, 0, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 420, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 209, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 0, 0, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 322, 210, + 272, 389, 286, 295, 0, 0, 340, 371, 219, 426, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 203, 291, 0, 360, 256, 449, 433, 429, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 0, 0, 301, 250, + 267, 276, 0, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 0, 0, 1070, 0, 0, 0, 0, + 241, 0, 0, 0, 0, 0, 289, 0, 0, 0, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 0, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 1072, 0, 0, 0, 0, 0, 0, 217, 0, 223, + 0, 0, 0, 0, 237, 277, 243, 236, 407, 958, + 959, 957, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 960, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 263, 0, 317, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 285, 191, + 205, 0, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, + 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, + 0, 0, 241, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 345, 0, 382, 227, 298, 296, 410, 251, + 244, 240, 226, 273, 304, 343, 400, 337, 0, 293, + 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, + 225, 195, 328, 392, 255, 69, 0, 586, 177, 178, + 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, + 0, 223, 0, 0, 0, 0, 237, 277, 243, 236, + 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 316, 0, 0, 0, 434, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 284, 191, 205, - 0, 0, 326, 364, 370, 0, 0, 0, 228, 0, - 368, 339, 421, 213, 252, 361, 344, 366, 0, 0, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 418, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 209, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 0, 0, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 321, 210, 271, 387, 285, 294, 0, 0, - 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 203, 290, 0, 358, - 255, 445, 429, 426, 0, 0, 234, 0, 0, 0, + 0, 0, 0, 263, 0, 317, 0, 0, 0, 438, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, + 285, 191, 205, 0, 0, 327, 366, 372, 0, 0, + 0, 228, 0, 370, 341, 424, 213, 253, 363, 346, + 368, 0, 0, 369, 294, 412, 358, 422, 439, 440, + 235, 321, 430, 404, 436, 448, 206, 232, 335, 397, + 427, 388, 314, 408, 409, 284, 387, 261, 194, 292, + 198, 399, 420, 218, 380, 0, 0, 0, 200, 418, + 396, 311, 281, 282, 199, 0, 362, 239, 259, 230, + 330, 415, 416, 229, 450, 208, 435, 202, 209, 434, + 323, 411, 419, 312, 303, 201, 417, 310, 302, 287, + 249, 269, 356, 297, 357, 270, 319, 318, 320, 0, + 196, 0, 393, 428, 451, 215, 0, 0, 406, 444, + 447, 0, 359, 216, 260, 248, 355, 258, 290, 443, + 445, 446, 214, 353, 266, 334, 423, 252, 431, 322, + 210, 272, 389, 286, 295, 0, 0, 340, 371, 219, + 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 264, 419, 438, 0, 298, - 0, 0, 300, 250, 266, 275, 0, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, 330, 0, 0, 0, 1425, - 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 343, 0, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 0, 292, 0, 0, 389, 315, 0, 0, 0, 0, + 0, 0, 190, 203, 291, 0, 360, 256, 449, 433, + 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 1427, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 0, 0, 0, 0, 237, 276, - 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, + 221, 233, 246, 254, 264, 268, 271, 274, 275, 278, + 283, 300, 305, 306, 307, 308, 324, 325, 326, 329, + 332, 333, 336, 338, 339, 342, 348, 349, 350, 351, + 352, 354, 361, 365, 373, 374, 375, 376, 377, 378, + 379, 383, 384, 385, 386, 394, 398, 413, 414, 425, + 437, 441, 265, 421, 442, 0, 299, 0, 0, 301, + 250, 267, 276, 0, 432, 395, 207, 367, 257, 197, + 224, 211, 231, 245, 247, 280, 309, 315, 344, 347, + 262, 242, 222, 364, 220, 381, 401, 402, 403, 405, + 313, 238, 331, 0, 0, 0, 1439, 0, 0, 0, + 0, 241, 0, 0, 0, 0, 0, 289, 0, 0, + 0, 345, 0, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 0, 293, 0, + 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 225, + 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, + 0, 1441, 0, 0, 0, 0, 0, 0, 217, 0, + 223, 0, 0, 0, 0, 237, 277, 243, 236, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 263, 0, 317, 0, 0, 0, 438, 0, + 0, 0, 0, 0, 0, 0, 0, 288, 0, 285, + 191, 205, 0, 0, 327, 366, 372, 0, 0, 0, + 228, 0, 370, 341, 424, 213, 253, 363, 346, 368, + 0, 1437, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 420, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 209, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 0, 0, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 322, 210, + 272, 389, 286, 295, 0, 0, 340, 371, 219, 426, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 203, 291, 0, 360, 256, 449, 433, 429, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 0, 0, 301, 250, + 267, 276, 0, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 0, 0, 0, 0, 0, 0, 0, + 241, 0, 0, 0, 0, 0, 289, 0, 0, 0, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 0, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, + 0, 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 316, 0, 0, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 284, 191, 205, 0, 0, 326, 364, 370, - 0, 0, 0, 228, 0, 368, 339, 421, 213, 252, - 361, 344, 366, 0, 1423, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 0, 0, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 0, 0, 338, 369, 219, 423, 388, + 0, 263, 0, 317, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 763, 285, 191, + 205, 761, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 203, 290, 0, 358, 255, 445, 429, 426, 0, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 0, 0, 300, 250, 266, - 275, 0, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 330, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 0, 0, 0, 0, 0, 288, 0, 0, 0, 343, - 0, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 0, 292, 0, 0, 389, - 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 225, 195, 327, - 390, 254, 0, 0, 0, 177, 178, 179, 0, 0, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 331, 0, 0, 0, 1439, 0, 0, 0, 0, 241, + 0, 0, 0, 0, 0, 289, 0, 0, 0, 345, + 0, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 0, 293, 0, 0, 391, + 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 279, 225, 195, 328, + 392, 255, 0, 0, 0, 177, 178, 179, 0, 1441, 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, - 0, 0, 0, 237, 276, 243, 236, 405, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 751, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 316, 0, 0, 0, 434, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 757, 284, 191, 205, - 755, 0, 326, 364, 370, 0, 0, 0, 228, 0, - 368, 339, 421, 213, 252, 361, 344, 366, 0, 0, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 418, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 209, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 0, 0, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 321, 210, 271, 387, 285, 294, 0, 0, - 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 203, 290, 0, 358, - 255, 445, 429, 426, 0, 0, 234, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 264, 419, 438, 0, 298, - 0, 0, 300, 250, 266, 275, 0, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, 330, 0, 0, 0, 1425, - 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 343, 0, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 0, 292, 0, 0, 389, 315, 0, 0, 0, 0, + 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 1427, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 0, 0, 0, 0, 237, 276, - 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 316, 0, 0, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 284, 191, 205, 0, 0, 326, 364, 370, - 0, 0, 0, 228, 0, 368, 339, 421, 213, 252, - 361, 344, 366, 0, 0, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 0, 0, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 0, 0, 338, 369, 219, 423, 388, + 263, 0, 317, 0, 0, 0, 438, 0, 0, 0, + 0, 0, 0, 0, 0, 288, 0, 285, 191, 205, + 0, 0, 327, 366, 372, 0, 0, 0, 228, 0, + 370, 341, 424, 213, 253, 363, 346, 368, 0, 0, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 0, 0, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, + 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 203, 290, 0, 358, 255, 445, 429, 426, 0, + 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 0, 0, 301, 250, 267, 276, + 0, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 34, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 241, 0, 0, 0, 0, 0, 289, 0, 0, + 0, 345, 0, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 0, 293, 0, + 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 225, + 195, 328, 392, 255, 69, 0, 0, 177, 178, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 223, 0, 0, 0, 0, 237, 277, 243, 236, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 263, 0, 317, 0, 0, 0, 438, 0, + 0, 0, 0, 0, 0, 0, 0, 288, 0, 285, + 191, 205, 0, 0, 327, 366, 372, 0, 0, 0, + 228, 0, 370, 341, 424, 213, 253, 363, 346, 368, + 0, 0, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 420, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 209, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 0, 0, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 322, 210, + 272, 389, 286, 295, 0, 0, 340, 371, 219, 426, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 203, 291, 0, 360, 256, 449, 433, 429, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 0, 0, 301, 250, + 267, 276, 0, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 0, 0, 0, 0, 0, 0, 0, + 241, 0, 0, 0, 0, 0, 289, 0, 0, 0, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 0, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 0, 1459, 0, 0, 1460, 0, 0, 217, 0, 223, + 0, 0, 0, 0, 237, 277, 243, 236, 407, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 263, 0, 317, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 285, 191, + 205, 0, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 0, 0, 300, 250, 266, - 275, 0, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 69, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 0, 1445, 0, - 0, 1446, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 1093, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, - 179, 0, 1092, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 580, 177, 178, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 69, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 241, + 0, 1103, 0, 0, 0, 289, 0, 0, 0, 345, + 0, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 0, 293, 0, 0, 391, + 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 279, 225, 195, 328, + 392, 255, 0, 0, 0, 177, 178, 179, 0, 1102, + 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, + 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 1427, 0, 0, - 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, + 263, 0, 317, 0, 0, 0, 438, 0, 0, 0, + 0, 0, 0, 0, 0, 288, 0, 285, 191, 205, + 0, 0, 327, 366, 372, 0, 0, 0, 228, 0, + 370, 341, 424, 213, 253, 363, 346, 368, 0, 0, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 0, 0, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, + 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, - 179, 0, 1062, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, + 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 0, 0, 301, 250, 267, 276, + 0, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 331, + 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, + 0, 0, 0, 0, 289, 0, 0, 0, 345, 0, + 382, 227, 298, 296, 410, 251, 244, 240, 226, 273, + 304, 343, 400, 337, 0, 293, 0, 0, 391, 316, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 225, 195, 328, 392, + 255, 0, 0, 586, 177, 178, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 217, 0, 223, 0, 0, + 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, + 0, 317, 0, 0, 0, 438, 0, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 285, 191, 205, 0, + 0, 327, 366, 372, 0, 0, 0, 228, 0, 370, + 341, 424, 213, 253, 363, 346, 368, 0, 0, 369, + 294, 412, 358, 422, 439, 440, 235, 321, 430, 404, + 436, 448, 206, 232, 335, 397, 427, 388, 314, 408, + 409, 284, 387, 261, 194, 292, 198, 399, 420, 218, + 380, 0, 0, 0, 200, 418, 396, 311, 281, 282, + 199, 0, 362, 239, 259, 230, 330, 415, 416, 229, + 450, 208, 435, 202, 209, 434, 323, 411, 419, 312, + 303, 201, 417, 310, 302, 287, 249, 269, 356, 297, + 357, 270, 319, 318, 320, 0, 196, 0, 393, 428, + 451, 215, 0, 0, 406, 444, 447, 0, 359, 216, + 260, 248, 355, 258, 290, 443, 445, 446, 214, 353, + 266, 334, 423, 252, 431, 322, 210, 272, 389, 286, + 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, + 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 204, 212, 221, 233, 246, 254, + 264, 268, 271, 274, 275, 278, 283, 300, 305, 306, + 307, 308, 324, 325, 326, 329, 332, 333, 336, 338, + 339, 342, 348, 349, 350, 351, 352, 354, 361, 365, + 373, 374, 375, 376, 377, 378, 379, 383, 384, 385, + 386, 394, 398, 413, 414, 425, 437, 441, 265, 421, + 442, 0, 299, 0, 0, 301, 250, 267, 276, 0, + 432, 395, 207, 367, 257, 197, 224, 211, 231, 245, + 247, 280, 309, 315, 344, 347, 262, 242, 222, 364, + 220, 381, 401, 402, 403, 405, 313, 238, 331, 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, + 0, 0, 0, 289, 0, 0, 0, 345, 0, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 225, 195, 328, 392, 255, + 69, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 317, 0, 0, 0, 438, 0, 0, 0, 0, 0, + 0, 0, 0, 288, 0, 285, 191, 205, 0, 0, + 327, 366, 372, 0, 0, 0, 228, 0, 370, 341, + 424, 213, 253, 363, 346, 368, 0, 0, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 0, 0, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 190, 203, 291, + 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 0, 0, 301, 250, 267, 276, 0, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 331, 0, 0, + 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, + 0, 0, 289, 0, 0, 0, 345, 0, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 279, 225, 195, 328, 392, 255, 0, + 0, 0, 177, 178, 179, 0, 1441, 0, 0, 0, + 0, 0, 0, 217, 0, 223, 0, 0, 0, 0, + 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 263, 0, 317, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, + 0, 0, 288, 0, 285, 191, 205, 0, 0, 327, + 366, 372, 0, 0, 0, 228, 0, 370, 341, 424, + 213, 253, 363, 346, 368, 0, 0, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 0, 0, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 0, + 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 190, 203, 291, 0, + 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 0, 0, 301, 250, 267, 276, 0, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, + 0, 289, 0, 0, 0, 345, 0, 382, 227, 298, + 296, 410, 251, 244, 240, 226, 273, 304, 343, 400, + 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 225, 195, 328, 392, 255, 0, 0, + 0, 177, 178, 179, 0, 1072, 0, 0, 0, 0, + 0, 0, 217, 0, 223, 0, 0, 0, 0, 237, + 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 263, 0, 317, 0, + 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, + 0, 288, 0, 285, 191, 205, 0, 0, 327, 366, + 372, 0, 0, 0, 228, 0, 370, 341, 424, 213, + 253, 363, 346, 368, 0, 0, 369, 294, 412, 358, + 422, 439, 440, 235, 321, 430, 404, 436, 448, 206, + 232, 335, 397, 427, 388, 314, 408, 409, 284, 387, + 261, 194, 292, 198, 399, 420, 218, 380, 0, 0, + 0, 200, 418, 396, 311, 281, 282, 199, 0, 362, + 239, 259, 230, 330, 415, 416, 229, 450, 208, 435, + 202, 209, 434, 323, 411, 419, 312, 303, 201, 417, + 310, 302, 287, 249, 269, 356, 297, 357, 270, 319, + 318, 320, 0, 196, 0, 393, 428, 451, 215, 0, + 0, 406, 444, 447, 0, 359, 216, 260, 248, 355, + 258, 290, 443, 445, 446, 214, 353, 266, 334, 423, + 252, 431, 322, 210, 272, 389, 286, 295, 0, 0, + 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 190, 203, 291, 0, 360, + 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, + 193, 204, 212, 221, 233, 246, 254, 264, 268, 271, + 274, 275, 278, 283, 300, 305, 306, 307, 308, 324, + 325, 326, 329, 332, 333, 336, 338, 339, 342, 348, + 349, 350, 351, 352, 354, 361, 365, 373, 374, 375, + 376, 377, 378, 379, 383, 384, 385, 386, 394, 398, + 413, 414, 425, 437, 441, 265, 421, 442, 0, 299, + 0, 0, 301, 250, 267, 276, 0, 432, 395, 207, + 367, 257, 197, 224, 211, 231, 245, 247, 280, 309, + 315, 344, 347, 262, 242, 222, 364, 220, 381, 401, + 402, 403, 405, 313, 238, 331, 0, 0, 0, 0, + 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, + 289, 0, 0, 0, 345, 0, 382, 227, 298, 296, + 410, 251, 244, 240, 226, 273, 304, 343, 400, 337, + 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 1330, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, + 0, 279, 225, 195, 328, 392, 255, 0, 0, 0, + 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, + 0, 217, 0, 223, 0, 0, 0, 0, 237, 277, + 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 1217, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 263, 0, 317, 0, 0, + 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, + 288, 0, 285, 191, 205, 0, 0, 327, 366, 372, + 0, 0, 0, 228, 0, 370, 341, 424, 213, 253, + 363, 346, 368, 0, 0, 369, 294, 412, 358, 422, + 439, 440, 235, 321, 430, 404, 436, 448, 206, 232, + 335, 397, 427, 388, 314, 408, 409, 284, 387, 261, + 194, 292, 198, 399, 420, 218, 380, 0, 0, 0, + 200, 418, 396, 311, 281, 282, 199, 0, 362, 239, + 259, 230, 330, 415, 416, 229, 450, 208, 435, 202, + 209, 434, 323, 411, 419, 312, 303, 201, 417, 310, + 302, 287, 249, 269, 356, 297, 357, 270, 319, 318, + 320, 0, 196, 0, 393, 428, 451, 215, 0, 0, + 406, 444, 447, 0, 359, 216, 260, 248, 355, 258, + 290, 443, 445, 446, 214, 353, 266, 334, 423, 252, + 431, 322, 210, 272, 389, 286, 295, 0, 0, 340, + 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, + 0, 0, 0, 0, 190, 203, 291, 1344, 360, 256, + 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 1215, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, + 204, 212, 221, 233, 246, 254, 264, 268, 271, 274, + 275, 278, 283, 300, 305, 306, 307, 308, 324, 325, + 326, 329, 332, 333, 336, 338, 339, 342, 348, 349, + 350, 351, 352, 354, 361, 365, 373, 374, 375, 376, + 377, 378, 379, 383, 384, 385, 386, 394, 398, 413, + 414, 425, 437, 441, 265, 421, 442, 0, 299, 0, + 0, 301, 250, 267, 276, 0, 432, 395, 207, 367, + 257, 197, 224, 211, 231, 245, 247, 280, 309, 315, + 344, 347, 262, 242, 222, 364, 220, 381, 401, 402, + 403, 405, 313, 238, 331, 0, 1227, 0, 0, 0, + 0, 0, 0, 241, 0, 0, 0, 0, 0, 289, + 0, 0, 0, 345, 0, 382, 227, 298, 296, 410, + 251, 244, 240, 226, 273, 304, 343, 400, 337, 0, + 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 279, 225, 195, 328, 392, 255, 0, 0, 0, 177, + 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, + 217, 0, 223, 0, 0, 0, 0, 237, 277, 243, + 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 263, 0, 317, 0, 0, 0, + 438, 0, 0, 0, 0, 0, 0, 0, 0, 288, + 0, 285, 191, 205, 0, 0, 327, 366, 372, 0, + 0, 0, 228, 0, 370, 341, 424, 213, 253, 363, + 346, 368, 0, 0, 369, 294, 412, 358, 422, 439, + 440, 235, 321, 430, 404, 436, 448, 206, 232, 335, + 397, 427, 388, 314, 408, 409, 284, 387, 261, 194, + 292, 198, 399, 420, 218, 380, 0, 0, 0, 200, + 418, 396, 311, 281, 282, 199, 0, 362, 239, 259, + 230, 330, 415, 416, 229, 450, 208, 435, 202, 209, + 434, 323, 411, 419, 312, 303, 201, 417, 310, 302, + 287, 249, 269, 356, 297, 357, 270, 319, 318, 320, + 0, 196, 0, 393, 428, 451, 215, 0, 0, 406, + 444, 447, 0, 359, 216, 260, 248, 355, 258, 290, + 443, 445, 446, 214, 353, 266, 334, 423, 252, 431, + 322, 210, 272, 389, 286, 295, 0, 0, 340, 371, + 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 190, 203, 291, 0, 360, 256, 449, + 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 1213, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, + 212, 221, 233, 246, 254, 264, 268, 271, 274, 275, + 278, 283, 300, 305, 306, 307, 308, 324, 325, 326, + 329, 332, 333, 336, 338, 339, 342, 348, 349, 350, + 351, 352, 354, 361, 365, 373, 374, 375, 376, 377, + 378, 379, 383, 384, 385, 386, 394, 398, 413, 414, + 425, 437, 441, 265, 421, 442, 0, 299, 0, 0, + 301, 250, 267, 276, 0, 432, 395, 207, 367, 257, + 197, 224, 211, 231, 245, 247, 280, 309, 315, 344, + 347, 262, 242, 222, 364, 220, 381, 401, 402, 403, + 405, 313, 238, 331, 0, 1225, 0, 0, 0, 0, + 0, 0, 241, 0, 0, 0, 0, 0, 289, 0, + 0, 0, 345, 0, 382, 227, 298, 296, 410, 251, + 244, 240, 226, 273, 304, 343, 400, 337, 0, 293, + 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, + 225, 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 223, 0, 0, 0, 0, 237, 277, 243, 236, + 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, + 0, 0, 0, 263, 0, 317, 0, 0, 0, 438, + 0, 0, 0, 0, 0, 0, 0, 0, 288, 0, + 285, 191, 205, 0, 0, 327, 366, 372, 0, 0, + 0, 228, 0, 370, 341, 424, 213, 253, 363, 346, + 368, 0, 0, 369, 294, 412, 358, 422, 439, 440, + 235, 321, 430, 404, 436, 448, 206, 232, 335, 397, + 427, 388, 314, 408, 409, 284, 387, 261, 194, 292, + 198, 399, 420, 218, 380, 0, 0, 0, 200, 418, + 396, 311, 281, 282, 199, 0, 362, 239, 259, 230, + 330, 415, 416, 229, 450, 208, 435, 202, 209, 434, + 323, 411, 419, 312, 303, 201, 417, 310, 302, 287, + 249, 269, 356, 297, 357, 270, 319, 318, 320, 0, + 196, 0, 393, 428, 451, 215, 0, 0, 406, 444, + 447, 0, 359, 216, 260, 248, 355, 258, 290, 443, + 445, 446, 214, 353, 266, 334, 423, 252, 431, 322, + 210, 272, 389, 286, 295, 0, 0, 340, 371, 219, + 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 1211, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, + 0, 0, 190, 203, 291, 0, 360, 256, 449, 433, + 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 1209, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, + 221, 233, 246, 254, 264, 268, 271, 274, 275, 278, + 283, 300, 305, 306, 307, 308, 324, 325, 326, 329, + 332, 333, 336, 338, 339, 342, 348, 349, 350, 351, + 352, 354, 361, 365, 373, 374, 375, 376, 377, 378, + 379, 383, 384, 385, 386, 394, 398, 413, 414, 425, + 437, 441, 265, 421, 442, 0, 299, 0, 0, 301, + 250, 267, 276, 0, 432, 395, 207, 367, 257, 197, + 224, 211, 231, 245, 247, 280, 309, 315, 344, 347, + 262, 242, 222, 364, 220, 381, 401, 402, 403, 405, + 313, 238, 331, 0, 1223, 0, 0, 0, 0, 0, + 0, 241, 0, 0, 0, 0, 0, 289, 0, 0, + 0, 345, 0, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 0, 293, 0, + 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 225, + 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 223, 0, 0, 0, 0, 237, 277, 243, 236, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 263, 0, 317, 0, 0, 0, 438, 0, + 0, 0, 0, 0, 0, 0, 0, 288, 0, 285, + 191, 205, 0, 0, 327, 366, 372, 0, 0, 0, + 228, 0, 370, 341, 424, 213, 253, 363, 346, 368, + 0, 0, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 420, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 209, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 0, 0, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 322, 210, + 272, 389, 286, 295, 0, 0, 340, 371, 219, 426, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 203, 291, 0, 360, 256, 449, 433, 429, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 0, 0, 301, 250, + 267, 276, 0, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 1221, 0, 0, 0, 0, 0, 0, + 241, 0, 0, 0, 0, 0, 289, 0, 0, 0, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 0, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, + 0, 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 1205, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, - 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, - 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, + 0, 263, 0, 317, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 285, 191, + 205, 0, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, + 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 331, 0, 1219, 0, 0, 0, 0, 0, 0, 241, + 0, 0, 0, 0, 0, 289, 0, 0, 0, 345, + 0, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 0, 293, 0, 0, 391, + 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 279, 225, 195, 328, + 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, + 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, + 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 1203, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 0, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 263, 0, 317, 0, 0, 0, 438, 0, 0, 0, + 0, 0, 0, 0, 0, 288, 0, 285, 191, 205, + 0, 0, 327, 366, 372, 0, 0, 0, 228, 0, + 370, 341, 424, 213, 253, 363, 346, 368, 0, 0, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 0, 0, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, + 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, + 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 0, 0, 301, 250, 267, 276, + 0, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 331, + 0, 1215, 0, 0, 0, 0, 0, 0, 241, 0, + 0, 0, 0, 0, 289, 0, 0, 0, 345, 0, + 382, 227, 298, 296, 410, 251, 244, 240, 226, 273, + 304, 343, 400, 337, 0, 293, 0, 0, 391, 316, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 225, 195, 328, 392, + 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 217, 0, 223, 0, 0, + 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, + 0, 317, 0, 0, 0, 438, 0, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 285, 191, 205, 0, + 0, 327, 366, 372, 0, 0, 0, 228, 0, 370, + 341, 424, 213, 253, 363, 346, 368, 0, 0, 369, + 294, 412, 358, 422, 439, 440, 235, 321, 430, 404, + 436, 448, 206, 232, 335, 397, 427, 388, 314, 408, + 409, 284, 387, 261, 194, 292, 198, 399, 420, 218, + 380, 0, 0, 0, 200, 418, 396, 311, 281, 282, + 199, 0, 362, 239, 259, 230, 330, 415, 416, 229, + 450, 208, 435, 202, 209, 434, 323, 411, 419, 312, + 303, 201, 417, 310, 302, 287, 249, 269, 356, 297, + 357, 270, 319, 318, 320, 0, 196, 0, 393, 428, + 451, 215, 0, 0, 406, 444, 447, 0, 359, 216, + 260, 248, 355, 258, 290, 443, 445, 446, 214, 353, + 266, 334, 423, 252, 431, 322, 210, 272, 389, 286, + 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 330, 0, - 1201, 0, 0, 0, 0, 0, 0, 241, 0, 0, - 0, 0, 0, 288, 0, 0, 0, 343, 0, 380, - 227, 297, 295, 408, 251, 244, 240, 226, 272, 303, - 341, 398, 335, 0, 292, 0, 0, 389, 315, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 278, 225, 195, 327, 390, 254, + 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 204, 212, 221, 233, 246, 254, + 264, 268, 271, 274, 275, 278, 283, 300, 305, 306, + 307, 308, 324, 325, 326, 329, 332, 333, 336, 338, + 339, 342, 348, 349, 350, 351, 352, 354, 361, 365, + 373, 374, 375, 376, 377, 378, 379, 383, 384, 385, + 386, 394, 398, 413, 414, 425, 437, 441, 265, 421, + 442, 0, 299, 0, 0, 301, 250, 267, 276, 0, + 432, 395, 207, 367, 257, 197, 224, 211, 231, 245, + 247, 280, 309, 315, 344, 347, 262, 242, 222, 364, + 220, 381, 401, 402, 403, 405, 313, 238, 331, 0, + 1213, 0, 0, 0, 0, 0, 0, 241, 0, 0, + 0, 0, 0, 289, 0, 0, 0, 345, 0, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 0, 293, 0, 0, 391, 316, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 225, 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, - 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, - 316, 0, 0, 0, 434, 0, 0, 0, 0, 0, - 0, 0, 0, 287, 0, 284, 191, 205, 0, 0, - 326, 364, 370, 0, 0, 0, 228, 0, 368, 339, - 421, 213, 252, 361, 344, 366, 0, 0, 367, 293, - 410, 356, 420, 435, 436, 235, 320, 427, 402, 432, - 444, 206, 232, 333, 395, 424, 386, 313, 406, 407, - 283, 385, 260, 194, 291, 198, 397, 418, 218, 378, - 0, 0, 0, 200, 416, 394, 310, 280, 281, 199, - 0, 360, 239, 258, 230, 329, 413, 414, 229, 446, - 208, 431, 202, 209, 430, 322, 409, 417, 311, 302, - 201, 415, 309, 301, 286, 249, 268, 354, 296, 355, - 269, 318, 317, 319, 0, 196, 0, 391, 425, 447, - 215, 0, 0, 404, 440, 443, 0, 357, 216, 259, - 248, 353, 257, 289, 439, 441, 442, 214, 351, 265, - 321, 210, 271, 387, 285, 294, 0, 0, 338, 369, - 219, 423, 388, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 190, 203, 290, 0, 358, 255, 445, - 429, 426, 0, 0, 234, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, - 212, 221, 233, 246, 253, 263, 267, 270, 273, 274, - 277, 282, 299, 304, 305, 306, 307, 323, 324, 325, - 328, 331, 332, 334, 336, 337, 340, 346, 347, 348, - 349, 350, 352, 359, 363, 371, 372, 373, 374, 375, - 376, 377, 381, 382, 383, 384, 392, 396, 411, 412, - 422, 433, 437, 264, 419, 438, 0, 298, 0, 0, - 300, 250, 266, 275, 0, 428, 393, 207, 365, 256, - 197, 224, 211, 231, 245, 247, 279, 308, 314, 342, - 345, 261, 242, 222, 362, 220, 379, 399, 400, 401, - 403, 312, 238, 330, 0, 0, 0, 0, 0, 0, - 0, 0, 241, 0, 0, 0, 0, 0, 288, 0, - 0, 0, 343, 0, 380, 227, 297, 295, 408, 251, - 244, 240, 226, 272, 303, 341, 398, 335, 0, 292, - 0, 0, 389, 315, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, - 225, 195, 327, 390, 254, 1176, 0, 0, 177, 178, - 179, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 0, 223, 0, 0, 0, 0, 237, 276, 243, 236, - 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 262, 0, 316, 0, 0, 0, 434, - 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, - 284, 191, 205, 0, 0, 326, 364, 370, 0, 0, - 0, 228, 0, 368, 339, 421, 213, 252, 361, 344, - 366, 0, 0, 367, 293, 410, 356, 420, 435, 436, - 235, 320, 427, 402, 432, 444, 206, 232, 333, 395, - 424, 386, 313, 406, 407, 283, 385, 260, 194, 291, - 198, 397, 418, 218, 378, 0, 0, 0, 200, 416, - 394, 310, 280, 281, 199, 0, 360, 239, 258, 230, - 329, 413, 414, 229, 446, 208, 431, 202, 209, 430, - 322, 409, 417, 311, 302, 201, 415, 309, 301, 286, - 249, 268, 354, 296, 355, 269, 318, 317, 319, 0, - 196, 0, 391, 425, 447, 215, 0, 0, 404, 440, - 443, 0, 357, 216, 259, 248, 353, 257, 289, 439, - 441, 442, 214, 351, 265, 321, 210, 271, 387, 285, - 294, 0, 0, 338, 369, 219, 423, 388, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, - 290, 0, 358, 255, 445, 429, 426, 0, 0, 234, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 192, 193, 204, 212, 221, 233, 246, 253, - 263, 267, 270, 273, 274, 277, 282, 299, 304, 305, - 306, 307, 323, 324, 325, 328, 331, 332, 334, 336, - 337, 340, 346, 347, 348, 349, 350, 352, 359, 363, - 371, 372, 373, 374, 375, 376, 377, 381, 382, 383, - 384, 392, 396, 411, 412, 422, 433, 437, 264, 419, - 438, 0, 298, 0, 0, 300, 250, 266, 275, 0, - 428, 393, 207, 365, 256, 197, 224, 211, 231, 245, - 247, 279, 308, 314, 342, 345, 261, 242, 222, 362, - 220, 379, 399, 400, 401, 403, 312, 238, 1075, 0, - 0, 0, 0, 0, 0, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 343, 0, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 0, 292, 0, 0, 389, 315, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 0, 0, 0, 0, 237, 276, - 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 316, 0, 0, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 284, 191, 205, 0, 0, 326, 364, 370, - 0, 0, 0, 228, 0, 368, 339, 421, 213, 252, - 361, 344, 366, 0, 0, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 0, 0, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 0, 0, 338, 369, 219, 423, 388, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 203, 290, 0, 358, 255, 445, 429, 426, 0, - 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 0, 0, 300, 250, 266, - 275, 0, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 330, 0, 0, 0, 0, 0, 0, 0, 1066, 241, - 0, 0, 0, 0, 0, 288, 0, 0, 0, 343, - 0, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 0, 292, 0, 0, 389, - 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 225, 195, 327, - 390, 254, 0, 0, 0, 177, 178, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, - 0, 0, 0, 237, 276, 243, 236, 405, 0, 0, + 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 317, 0, 0, 0, 438, 0, 0, 0, 0, 0, + 0, 0, 0, 288, 0, 285, 191, 205, 0, 0, + 327, 366, 372, 0, 0, 0, 228, 0, 370, 341, + 424, 213, 253, 363, 346, 368, 0, 0, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 0, 0, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 190, 203, 291, + 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 0, 0, 301, 250, 267, 276, 0, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 331, 0, 1211, + 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, + 0, 0, 289, 0, 0, 0, 345, 0, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 279, 225, 195, 328, 392, 255, 0, + 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 217, 0, 223, 0, 0, 0, 0, + 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 263, 0, 317, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, + 0, 0, 288, 0, 285, 191, 205, 0, 0, 327, + 366, 372, 0, 0, 0, 228, 0, 370, 341, 424, + 213, 253, 363, 346, 368, 0, 0, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 0, 0, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 0, + 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 190, 203, 291, 0, + 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 0, 0, 301, 250, 267, 276, 0, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, 331, 0, 0, 0, + 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, + 0, 289, 0, 0, 0, 345, 0, 382, 227, 298, + 296, 410, 251, 244, 240, 226, 273, 304, 343, 400, + 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 279, 225, 195, 328, 392, 255, 1186, 0, + 0, 177, 178, 179, 0, 0, 0, 0, 0, 0, + 0, 0, 217, 0, 223, 0, 0, 0, 0, 237, + 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 316, 0, 0, 0, 434, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 284, 191, 205, - 0, 0, 326, 364, 370, 0, 0, 0, 228, 0, - 368, 339, 421, 213, 252, 361, 344, 366, 0, 0, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 418, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 209, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 0, 0, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 321, 210, 271, 387, 285, 294, 0, 0, - 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 263, 0, 317, 0, + 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, + 0, 288, 0, 285, 191, 205, 0, 0, 327, 366, + 372, 0, 0, 0, 228, 0, 370, 341, 424, 213, + 253, 363, 346, 368, 0, 0, 369, 294, 412, 358, + 422, 439, 440, 235, 321, 430, 404, 436, 448, 206, + 232, 335, 397, 427, 388, 314, 408, 409, 284, 387, + 261, 194, 292, 198, 399, 420, 218, 380, 0, 0, + 0, 200, 418, 396, 311, 281, 282, 199, 0, 362, + 239, 259, 230, 330, 415, 416, 229, 450, 208, 435, + 202, 209, 434, 323, 411, 419, 312, 303, 201, 417, + 310, 302, 287, 249, 269, 356, 297, 357, 270, 319, + 318, 320, 0, 196, 0, 393, 428, 451, 215, 0, + 0, 406, 444, 447, 0, 359, 216, 260, 248, 355, + 258, 290, 443, 445, 446, 214, 353, 266, 334, 423, + 252, 431, 322, 210, 272, 389, 286, 295, 0, 0, + 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 203, 290, 0, 358, - 255, 445, 429, 426, 0, 0, 234, 0, 0, 0, + 0, 0, 0, 0, 0, 190, 203, 291, 0, 360, + 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 264, 419, 438, 0, 298, - 0, 0, 300, 250, 266, 275, 0, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 343, 0, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 0, 292, 0, 0, 389, 315, 0, 0, 0, 0, + 193, 204, 212, 221, 233, 246, 254, 264, 268, 271, + 274, 275, 278, 283, 300, 305, 306, 307, 308, 324, + 325, 326, 329, 332, 333, 336, 338, 339, 342, 348, + 349, 350, 351, 352, 354, 361, 365, 373, 374, 375, + 376, 377, 378, 379, 383, 384, 385, 386, 394, 398, + 413, 414, 425, 437, 441, 265, 421, 442, 0, 299, + 0, 0, 301, 250, 267, 276, 0, 432, 395, 207, + 367, 257, 197, 224, 211, 231, 245, 247, 280, 309, + 315, 344, 347, 262, 242, 222, 364, 220, 381, 401, + 402, 403, 405, 313, 238, 1085, 0, 0, 0, 0, + 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, + 0, 241, 0, 0, 0, 0, 0, 289, 0, 0, + 0, 345, 0, 382, 227, 298, 296, 410, 251, 244, + 240, 226, 273, 304, 343, 400, 337, 0, 293, 0, + 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 279, 225, + 195, 328, 392, 255, 0, 0, 0, 177, 178, 179, + 0, 0, 0, 0, 0, 0, 0, 0, 217, 0, + 223, 0, 0, 0, 0, 237, 277, 243, 236, 407, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 263, 0, 317, 0, 0, 0, 438, 0, + 0, 0, 0, 0, 0, 0, 0, 288, 0, 285, + 191, 205, 0, 0, 327, 366, 372, 0, 0, 0, + 228, 0, 370, 341, 424, 213, 253, 363, 346, 368, + 0, 0, 369, 294, 412, 358, 422, 439, 440, 235, + 321, 430, 404, 436, 448, 206, 232, 335, 397, 427, + 388, 314, 408, 409, 284, 387, 261, 194, 292, 198, + 399, 420, 218, 380, 0, 0, 0, 200, 418, 396, + 311, 281, 282, 199, 0, 362, 239, 259, 230, 330, + 415, 416, 229, 450, 208, 435, 202, 209, 434, 323, + 411, 419, 312, 303, 201, 417, 310, 302, 287, 249, + 269, 356, 297, 357, 270, 319, 318, 320, 0, 196, + 0, 393, 428, 451, 215, 0, 0, 406, 444, 447, + 0, 359, 216, 260, 248, 355, 258, 290, 443, 445, + 446, 214, 353, 266, 334, 423, 252, 431, 322, 210, + 272, 389, 286, 295, 0, 0, 340, 371, 219, 426, + 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 190, 203, 291, 0, 360, 256, 449, 433, 429, + 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, + 233, 246, 254, 264, 268, 271, 274, 275, 278, 283, + 300, 305, 306, 307, 308, 324, 325, 326, 329, 332, + 333, 336, 338, 339, 342, 348, 349, 350, 351, 352, + 354, 361, 365, 373, 374, 375, 376, 377, 378, 379, + 383, 384, 385, 386, 394, 398, 413, 414, 425, 437, + 441, 265, 421, 442, 0, 299, 0, 0, 301, 250, + 267, 276, 0, 432, 395, 207, 367, 257, 197, 224, + 211, 231, 245, 247, 280, 309, 315, 344, 347, 262, + 242, 222, 364, 220, 381, 401, 402, 403, 405, 313, + 238, 331, 0, 0, 0, 0, 0, 0, 0, 1076, + 241, 0, 0, 0, 0, 0, 289, 0, 0, 0, + 345, 0, 382, 227, 298, 296, 410, 251, 244, 240, + 226, 273, 304, 343, 400, 337, 0, 293, 0, 0, + 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 279, 225, 195, + 328, 392, 255, 0, 0, 0, 177, 178, 179, 0, + 0, 0, 0, 0, 0, 0, 0, 217, 0, 223, + 0, 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 924, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 0, 0, 0, 0, 237, 276, - 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 316, 0, 0, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 284, 191, 205, 0, 0, 326, 364, 370, - 0, 0, 0, 228, 0, 368, 339, 421, 213, 252, - 361, 344, 366, 0, 0, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 0, 0, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 0, 0, 338, 369, 219, 423, 388, + 0, 263, 0, 317, 0, 0, 0, 438, 0, 0, + 0, 0, 0, 0, 0, 0, 288, 0, 285, 191, + 205, 0, 0, 327, 366, 372, 0, 0, 0, 228, + 0, 370, 341, 424, 213, 253, 363, 346, 368, 0, + 0, 369, 294, 412, 358, 422, 439, 440, 235, 321, + 430, 404, 436, 448, 206, 232, 335, 397, 427, 388, + 314, 408, 409, 284, 387, 261, 194, 292, 198, 399, + 420, 218, 380, 0, 0, 0, 200, 418, 396, 311, + 281, 282, 199, 0, 362, 239, 259, 230, 330, 415, + 416, 229, 450, 208, 435, 202, 209, 434, 323, 411, + 419, 312, 303, 201, 417, 310, 302, 287, 249, 269, + 356, 297, 357, 270, 319, 318, 320, 0, 196, 0, + 393, 428, 451, 215, 0, 0, 406, 444, 447, 0, + 359, 216, 260, 248, 355, 258, 290, 443, 445, 446, + 214, 353, 266, 334, 423, 252, 431, 322, 210, 272, + 389, 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 203, 290, 0, 358, 255, 445, 429, 426, 0, + 190, 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 0, 0, 300, 250, 266, - 275, 0, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 330, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 0, 0, 0, 0, 0, 288, 0, 0, 0, 343, - 0, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 0, 292, 0, 0, 389, - 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 225, 195, 327, - 390, 254, 0, 0, 0, 177, 178, 179, 0, 0, + 246, 254, 264, 268, 271, 274, 275, 278, 283, 300, + 305, 306, 307, 308, 324, 325, 326, 329, 332, 333, + 336, 338, 339, 342, 348, 349, 350, 351, 352, 354, + 361, 365, 373, 374, 375, 376, 377, 378, 379, 383, + 384, 385, 386, 394, 398, 413, 414, 425, 437, 441, + 265, 421, 442, 0, 299, 0, 0, 301, 250, 267, + 276, 0, 432, 395, 207, 367, 257, 197, 224, 211, + 231, 245, 247, 280, 309, 315, 344, 347, 262, 242, + 222, 364, 220, 381, 401, 402, 403, 405, 313, 238, + 331, 0, 0, 0, 0, 0, 0, 0, 0, 241, + 0, 0, 0, 0, 0, 289, 0, 0, 0, 345, + 0, 382, 227, 298, 296, 410, 251, 244, 240, 226, + 273, 304, 343, 400, 337, 0, 293, 0, 0, 391, + 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 279, 225, 195, 328, + 392, 255, 0, 0, 0, 177, 178, 179, 0, 934, 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, - 0, 0, 0, 237, 276, 243, 236, 405, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, - 262, 0, 316, 0, 0, 0, 434, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 284, 191, 205, - 0, 0, 326, 364, 370, 0, 0, 0, 228, 0, - 368, 339, 421, 213, 252, 361, 344, 366, 0, 0, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 418, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 209, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 0, 0, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 321, 210, 271, 387, 285, 294, 0, 0, - 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 203, 290, 0, 358, - 255, 445, 429, 426, 0, 0, 234, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 492, 419, 438, 0, 298, - 0, 0, 300, 250, 266, 275, 0, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, 330, 0, 0, 0, 0, - 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, - 288, 0, 0, 0, 343, 0, 380, 227, 297, 295, - 408, 251, 244, 240, 226, 272, 303, 341, 398, 335, - 0, 292, 0, 0, 389, 315, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 278, 225, 195, 327, 390, 254, 0, 0, 0, - 177, 178, 179, 0, 0, 0, 0, 0, 0, 0, - 0, 217, 0, 223, 0, 0, 0, 0, 237, 276, - 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 262, 0, 316, 0, 185, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, - 287, 0, 284, 191, 205, 0, 0, 326, 364, 370, - 0, 0, 0, 228, 0, 368, 339, 421, 213, 252, - 361, 344, 366, 0, 0, 367, 293, 410, 356, 420, - 435, 436, 235, 320, 427, 402, 432, 444, 206, 232, - 333, 395, 424, 386, 313, 406, 407, 283, 385, 260, - 194, 291, 198, 397, 418, 218, 378, 0, 0, 0, - 200, 416, 394, 310, 280, 281, 199, 0, 360, 239, - 258, 230, 329, 413, 414, 229, 446, 208, 431, 202, - 209, 430, 322, 409, 417, 311, 302, 201, 415, 309, - 301, 286, 249, 268, 354, 296, 355, 269, 318, 317, - 319, 0, 196, 0, 391, 425, 447, 215, 0, 0, - 404, 440, 443, 0, 357, 216, 259, 248, 353, 257, - 289, 439, 441, 442, 214, 351, 265, 321, 210, 271, - 387, 285, 294, 0, 0, 338, 369, 219, 423, 388, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 190, 203, 290, 0, 358, 255, 445, 429, 426, 0, - 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 192, 193, 204, 212, 221, 233, - 246, 253, 263, 267, 270, 273, 274, 277, 282, 299, - 304, 305, 306, 307, 323, 324, 325, 328, 331, 332, - 334, 336, 337, 340, 346, 347, 348, 349, 350, 352, - 359, 363, 371, 372, 373, 374, 375, 376, 377, 381, - 382, 383, 384, 392, 396, 411, 412, 422, 433, 437, - 264, 419, 438, 0, 298, 0, 0, 300, 250, 266, - 275, 0, 428, 393, 207, 365, 256, 197, 224, 211, - 231, 245, 247, 279, 308, 314, 342, 345, 261, 242, - 222, 362, 220, 379, 399, 400, 401, 403, 312, 238, - 330, 0, 0, 0, 0, 0, 0, 0, 0, 241, - 0, 0, 0, 0, 0, 288, 0, 0, 0, 343, - 0, 380, 227, 297, 295, 408, 251, 244, 240, 226, - 272, 303, 341, 398, 335, 0, 292, 0, 0, 389, - 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 225, 195, 327, - 390, 254, 0, 0, 0, 177, 178, 179, 0, 0, - 0, 0, 0, 0, 0, 0, 217, 0, 223, 0, - 0, 0, 0, 237, 276, 243, 236, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 263, 0, 317, 0, 0, 0, 438, 0, 0, 0, + 0, 0, 0, 0, 0, 288, 0, 285, 191, 205, + 0, 0, 327, 366, 372, 0, 0, 0, 228, 0, + 370, 341, 424, 213, 253, 363, 346, 368, 0, 0, + 369, 294, 412, 358, 422, 439, 440, 235, 321, 430, + 404, 436, 448, 206, 232, 335, 397, 427, 388, 314, + 408, 409, 284, 387, 261, 194, 292, 198, 399, 420, + 218, 380, 0, 0, 0, 200, 418, 396, 311, 281, + 282, 199, 0, 362, 239, 259, 230, 330, 415, 416, + 229, 450, 208, 435, 202, 209, 434, 323, 411, 419, + 312, 303, 201, 417, 310, 302, 287, 249, 269, 356, + 297, 357, 270, 319, 318, 320, 0, 196, 0, 393, + 428, 451, 215, 0, 0, 406, 444, 447, 0, 359, + 216, 260, 248, 355, 258, 290, 443, 445, 446, 214, + 353, 266, 334, 423, 252, 431, 322, 210, 272, 389, + 286, 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 190, + 203, 291, 0, 360, 256, 449, 433, 429, 0, 0, + 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 192, 193, 204, 212, 221, 233, 246, + 254, 264, 268, 271, 274, 275, 278, 283, 300, 305, + 306, 307, 308, 324, 325, 326, 329, 332, 333, 336, + 338, 339, 342, 348, 349, 350, 351, 352, 354, 361, + 365, 373, 374, 375, 376, 377, 378, 379, 383, 384, + 385, 386, 394, 398, 413, 414, 425, 437, 441, 265, + 421, 442, 0, 299, 0, 0, 301, 250, 267, 276, + 0, 432, 395, 207, 367, 257, 197, 224, 211, 231, + 245, 247, 280, 309, 315, 344, 347, 262, 242, 222, + 364, 220, 381, 401, 402, 403, 405, 313, 238, 331, + 0, 0, 0, 0, 0, 0, 0, 0, 241, 0, + 0, 0, 0, 0, 289, 0, 0, 0, 345, 0, + 382, 227, 298, 296, 410, 251, 244, 240, 226, 273, + 304, 343, 400, 337, 0, 293, 0, 0, 391, 316, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 279, 225, 195, 328, 392, + 255, 0, 0, 0, 177, 178, 179, 0, 0, 0, + 0, 0, 0, 0, 0, 217, 0, 223, 0, 0, + 0, 0, 237, 277, 243, 236, 407, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 499, 0, 263, + 0, 317, 0, 0, 0, 438, 0, 0, 0, 0, + 0, 0, 0, 0, 288, 0, 285, 191, 205, 0, + 0, 327, 366, 372, 0, 0, 0, 228, 0, 370, + 341, 424, 213, 253, 363, 346, 368, 0, 0, 369, + 294, 412, 358, 422, 439, 440, 235, 321, 430, 404, + 436, 448, 206, 232, 335, 397, 427, 388, 314, 408, + 409, 284, 387, 261, 194, 292, 198, 399, 420, 218, + 380, 0, 0, 0, 200, 418, 396, 311, 281, 282, + 199, 0, 362, 239, 259, 230, 330, 415, 416, 229, + 450, 208, 435, 202, 209, 434, 323, 411, 419, 312, + 303, 201, 417, 310, 302, 287, 249, 269, 356, 297, + 357, 270, 319, 318, 320, 0, 196, 0, 393, 428, + 451, 215, 0, 0, 406, 444, 447, 0, 359, 216, + 260, 248, 355, 258, 290, 443, 445, 446, 214, 353, + 266, 334, 423, 252, 431, 322, 210, 272, 389, 286, + 295, 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 262, 0, 316, 0, 0, 0, 434, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 0, 284, 191, 205, - 0, 0, 326, 364, 370, 0, 0, 0, 228, 0, - 368, 339, 421, 213, 252, 361, 344, 366, 0, 0, - 367, 293, 410, 356, 420, 435, 436, 235, 320, 427, - 402, 432, 444, 206, 232, 333, 395, 424, 386, 313, - 406, 407, 283, 385, 260, 194, 291, 198, 397, 418, - 218, 378, 0, 0, 0, 200, 416, 394, 310, 280, - 281, 199, 0, 360, 239, 258, 230, 329, 413, 414, - 229, 446, 208, 431, 202, 209, 430, 322, 409, 417, - 311, 302, 201, 415, 309, 301, 286, 249, 268, 354, - 296, 355, 269, 318, 317, 319, 0, 196, 0, 391, - 425, 447, 215, 0, 0, 404, 440, 443, 0, 357, - 216, 259, 248, 353, 257, 289, 439, 441, 442, 214, - 351, 265, 321, 210, 271, 387, 285, 294, 0, 0, - 338, 369, 219, 423, 388, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 190, 203, + 291, 0, 360, 256, 449, 433, 429, 0, 0, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, 193, 204, 212, 221, 233, 246, 254, + 264, 268, 271, 274, 275, 278, 283, 300, 305, 306, + 307, 308, 324, 325, 326, 329, 332, 333, 336, 338, + 339, 342, 348, 349, 350, 351, 352, 354, 361, 365, + 373, 374, 375, 376, 377, 378, 379, 383, 384, 385, + 386, 394, 398, 413, 414, 425, 437, 441, 498, 421, + 442, 0, 299, 0, 0, 301, 250, 267, 276, 0, + 432, 395, 207, 367, 257, 197, 224, 211, 231, 245, + 247, 280, 309, 315, 344, 347, 262, 242, 222, 364, + 220, 381, 401, 402, 403, 405, 313, 238, 331, 0, + 0, 0, 0, 0, 0, 0, 0, 241, 0, 0, + 0, 0, 0, 289, 0, 0, 0, 345, 0, 382, + 227, 298, 296, 410, 251, 244, 240, 226, 273, 304, + 343, 400, 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 190, 203, 290, 0, 358, - 255, 445, 429, 426, 0, 0, 234, 0, 0, 0, + 0, 0, 0, 0, 279, 225, 195, 328, 392, 255, + 0, 0, 0, 177, 178, 179, 0, 0, 0, 0, + 0, 0, 0, 0, 217, 0, 223, 0, 0, 0, + 0, 237, 277, 243, 236, 407, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, + 317, 0, 185, 0, 438, 0, 0, 0, 0, 0, + 0, 0, 0, 288, 0, 285, 191, 205, 0, 0, + 327, 366, 372, 0, 0, 0, 228, 0, 370, 341, + 424, 213, 253, 363, 346, 368, 0, 0, 369, 294, + 412, 358, 422, 439, 440, 235, 321, 430, 404, 436, + 448, 206, 232, 335, 397, 427, 388, 314, 408, 409, + 284, 387, 261, 194, 292, 198, 399, 420, 218, 380, + 0, 0, 0, 200, 418, 396, 311, 281, 282, 199, + 0, 362, 239, 259, 230, 330, 415, 416, 229, 450, + 208, 435, 202, 209, 434, 323, 411, 419, 312, 303, + 201, 417, 310, 302, 287, 249, 269, 356, 297, 357, + 270, 319, 318, 320, 0, 196, 0, 393, 428, 451, + 215, 0, 0, 406, 444, 447, 0, 359, 216, 260, + 248, 355, 258, 290, 443, 445, 446, 214, 353, 266, + 334, 423, 252, 431, 322, 210, 272, 389, 286, 295, + 0, 0, 340, 371, 219, 426, 390, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 190, 203, 291, + 0, 360, 256, 449, 433, 429, 0, 0, 234, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 192, 193, 204, 212, 221, 233, 246, 254, 264, + 268, 271, 274, 275, 278, 283, 300, 305, 306, 307, + 308, 324, 325, 326, 329, 332, 333, 336, 338, 339, + 342, 348, 349, 350, 351, 352, 354, 361, 365, 373, + 374, 375, 376, 377, 378, 379, 383, 384, 385, 386, + 394, 398, 413, 414, 425, 437, 441, 265, 421, 442, + 0, 299, 0, 0, 301, 250, 267, 276, 0, 432, + 395, 207, 367, 257, 197, 224, 211, 231, 245, 247, + 280, 309, 315, 344, 347, 262, 242, 222, 364, 220, + 381, 401, 402, 403, 405, 313, 238, 331, 0, 0, + 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, + 0, 0, 289, 0, 0, 0, 345, 0, 382, 227, + 298, 296, 410, 251, 244, 240, 226, 273, 304, 343, + 400, 337, 0, 293, 0, 0, 391, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, - 193, 204, 212, 221, 233, 246, 253, 263, 267, 270, - 273, 274, 277, 282, 299, 304, 305, 306, 307, 323, - 324, 325, 328, 331, 332, 334, 336, 337, 340, 346, - 347, 348, 349, 350, 352, 359, 363, 371, 372, 373, - 374, 375, 376, 377, 381, 382, 383, 384, 392, 396, - 411, 412, 422, 433, 437, 264, 419, 438, 0, 298, - 0, 0, 300, 250, 266, 275, 0, 428, 393, 207, - 365, 256, 197, 224, 211, 231, 245, 247, 279, 308, - 314, 342, 345, 261, 242, 222, 362, 220, 379, 399, - 400, 401, 403, 312, 238, + 0, 0, 0, 279, 225, 195, 328, 392, 255, 0, + 0, 0, 177, 178, 179, 0, 0, 0, 0, 0, + 0, 0, 0, 217, 0, 223, 0, 0, 0, 0, + 237, 277, 243, 236, 407, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 263, 0, 317, + 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, + 0, 0, 288, 0, 285, 191, 205, 0, 0, 327, + 366, 372, 0, 0, 0, 228, 0, 370, 341, 424, + 213, 253, 363, 346, 368, 0, 0, 369, 294, 412, + 358, 422, 439, 440, 235, 321, 430, 404, 436, 448, + 206, 232, 335, 397, 427, 388, 314, 408, 409, 284, + 387, 261, 194, 292, 198, 399, 420, 218, 380, 0, + 0, 0, 200, 418, 396, 311, 281, 282, 199, 0, + 362, 239, 259, 230, 330, 415, 416, 229, 450, 208, + 435, 202, 209, 434, 323, 411, 419, 312, 303, 201, + 417, 310, 302, 287, 249, 269, 356, 297, 357, 270, + 319, 318, 320, 0, 196, 0, 393, 428, 451, 215, + 0, 0, 406, 444, 447, 0, 359, 216, 260, 248, + 355, 258, 290, 443, 445, 446, 214, 353, 266, 334, + 423, 252, 431, 322, 210, 272, 389, 286, 295, 0, + 0, 340, 371, 219, 426, 390, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 190, 203, 291, 0, + 360, 256, 449, 433, 429, 0, 0, 234, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 193, 204, 212, 221, 233, 246, 254, 264, 268, + 271, 274, 275, 278, 283, 300, 305, 306, 307, 308, + 324, 325, 326, 329, 332, 333, 336, 338, 339, 342, + 348, 349, 350, 351, 352, 354, 361, 365, 373, 374, + 375, 376, 377, 378, 379, 383, 384, 385, 386, 394, + 398, 413, 414, 425, 437, 441, 265, 421, 442, 0, + 299, 0, 0, 301, 250, 267, 276, 0, 432, 395, + 207, 367, 257, 197, 224, 211, 231, 245, 247, 280, + 309, 315, 344, 347, 262, 242, 222, 364, 220, 381, + 401, 402, 403, 405, 313, 238, } var yyPact = [...]int{ - 2534, -1000, -329, 1692, -1000, -1000, -1000, -1000, -1000, -1000, + 4075, -1000, -339, 1534, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, 1659, 1290, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 569, 1303, 118, 1567, 287, 152, 913, 414, 135, - 26846, 403, 121, 27291, -1000, 105, -1000, 85, 27291, 99, - 26401, -1000, -1000, -274, 12573, 1524, 18, 11, 27291, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1292, 1633, 1643, - 1657, 1112, 1555, -1000, 10780, 10780, 318, 318, 318, 9000, - -1000, -1000, 16591, 27291, 27291, 1338, 401, 913, 389, 388, - 381, 303, -106, -1000, -1000, -1000, -1000, 1567, -1000, -1000, - 186, -1000, 191, 1243, -1000, 1239, -1000, 468, 487, 221, - 291, 277, 213, 212, 211, 207, 203, 202, 200, 197, - 234, -1000, 536, 536, -166, -169, 1807, 294, 294, 294, - 353, 1544, 1538, -1000, 511, -1000, 536, 536, 182, 536, - 536, 536, 536, 167, 166, 536, 536, 536, 536, 536, - 536, 536, 536, 536, 536, 536, 536, 536, 536, 536, - 27291, -1000, 136, 541, 597, 1567, 155, -1000, -1000, -1000, - 27291, 395, 913, 300, 300, 27291, -1000, 460, -1000, -1000, + -1000, -1000, 1499, 1161, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 545, 1169, 137, 1416, 275, 172, 928, 392, 119, + 27059, 391, 113, 27508, -1000, 102, -1000, 94, 27508, 98, + 26610, -1000, -1000, -278, 12658, 1343, 27, 14, 27508, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1185, 1452, 1468, + 1495, 1011, 1407, -1000, 10849, 10849, 327, 327, 327, 9053, + -1000, -1000, 16712, 27508, 27508, 1176, 387, 928, 378, 376, + 375, 314, -113, -1000, -1000, -1000, -1000, 1416, -1000, -1000, + 170, -1000, 190, 1143, -1000, 1141, -1000, 569, 586, 247, + 295, 283, 246, 245, 243, 242, 227, 224, 220, 219, + 208, -1000, 511, 511, -171, -175, 1955, 304, 304, 304, + 348, 1386, 1385, -1000, 548, -1000, 511, 511, 157, 511, + 511, 511, 511, 165, 163, 511, 511, 511, 511, 511, + 511, 511, 511, 511, 511, 511, 511, 511, 511, 511, + 27508, -1000, 144, 512, 555, 1416, 158, -1000, -1000, -1000, + 27508, 385, 928, 309, 309, 27508, -1000, 433, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -3994,25 +4024,24 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 27291, 631, - 631, 631, 631, 631, 631, 76, -1000, 64, 158, 146, - 148, 17, 56, 426, -1000, 412, -1000, 143, 81, -1000, - 631, 7164, 7164, 7164, -1000, 1550, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 351, -1000, -1000, -1000, -1000, 27291, - 25956, 222, 556, -1000, -1000, -1000, 67, -1000, -1000, 1060, - 955, -1000, 12573, 2667, 1054, 1054, -1000, -1000, 429, -1000, - -1000, 13908, 13908, 13908, 13908, 13908, 13908, 13908, 13908, 13908, - 13908, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 1054, 456, -1000, 12128, 1054, - 1054, 1054, 1054, 1054, 1054, 1054, 1054, 12573, 1054, 1054, - 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, - 1054, 1054, 1054, 1054, -1000, -1000, -1000, 27291, -1000, 1054, - 1659, -1000, 1290, -1000, -1000, -1000, 1559, 12573, 12573, 1659, - -1000, 1444, 10780, -1000, -1000, 1457, -1000, -1000, -1000, -1000, - 701, 1677, -1000, 15243, 455, 1676, 25511, -1000, 19274, 25066, - 1222, 8541, -28, -1000, -1000, -1000, 555, 18384, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, 27508, 609, 609, 53, 609, 609, 609, 609, + 85, 420, 13, -1000, 78, 151, 149, 155, 589, 123, + 63, -1000, -1000, 153, 103, -1000, 609, 7201, 7201, 7201, + -1000, 1396, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 343, -1000, -1000, -1000, -1000, 27508, 26161, 258, 544, -1000, + -1000, -1000, 49, -1000, -1000, 1078, 753, -1000, 12658, 2116, + 1146, 1146, -1000, -1000, 407, -1000, -1000, 14005, 14005, 14005, + 14005, 14005, 14005, 14005, 14005, 14005, 14005, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1146, 432, -1000, 12209, 1146, 1146, 1146, 1146, 1146, + 1146, 1146, 1146, 12658, 1146, 1146, 1146, 1146, 1146, 1146, + 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, + -1000, -1000, -1000, 27508, -1000, 1146, 1499, -1000, 1161, -1000, + -1000, -1000, 1401, 12658, 12658, 1499, -1000, 1279, 10849, -1000, + -1000, 1374, -1000, -1000, -1000, -1000, 701, 1513, -1000, 15352, + 430, 1512, 25712, -1000, 19419, 25263, 1140, 8590, -61, -1000, + -1000, -1000, 540, 18521, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, @@ -4024,283 +4053,308 @@ var yyPact = [...]int{ -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1550, - 1150, 27291, -1000, -1000, 2172, 913, -1000, 1301, -1000, 1136, - -1000, 1249, 136, 303, 1353, 913, 913, 913, 913, 607, - -1000, -1000, -1000, 536, 536, 233, 287, 3847, -1000, -1000, - -1000, 24614, 1300, 913, -1000, 1298, -1000, 1591, 290, 522, - 522, 913, -1000, -1000, 27291, 913, 1584, 1583, 27291, 27291, - -1000, 24169, -1000, 23724, 23279, 821, 27291, 22834, 22389, 21944, - 21499, 21054, -1000, 1392, -1000, 1297, -1000, -1000, -1000, 27291, - 27291, 27291, 29, -1000, -1000, 27291, 913, -1000, -1000, 818, - 806, 536, 536, 801, 969, 967, 964, 536, 536, 793, - 961, 1062, 153, 789, 788, 783, 837, 958, 117, 835, - 799, 781, 27291, 1289, -1000, 128, 547, 175, 218, 179, - 27291, 132, 1567, 1519, 1220, 349, 300, 1365, 27291, 1618, - 913, -1000, 7623, -1000, -1000, 948, 12573, -1000, -1000, -1000, - -1000, -1000, 631, 27291, 631, 27291, 631, 631, 631, 631, - 625, 637, 625, -1000, -1000, -1000, -1000, 7164, 7164, 7164, - 27291, 7164, 7164, 27291, 7164, 7164, 637, -1000, -1000, -1000, - 510, -1000, 1364, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - 93, -1000, -1000, -1000, -1000, -1000, 1692, -1000, -1000, -1000, - -105, 1209, 20609, -1000, -279, -281, -282, -283, -1000, -1000, - -1000, -285, -288, -1000, -1000, -1000, 12573, 12573, 12573, 12573, - 924, 517, 13908, 764, 544, 13908, 13908, 13908, 13908, 13908, - 13908, 13908, 13908, 13908, 13908, 13908, 13908, 13908, 13908, 13908, - 747, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 913, - -1000, 1690, 1418, 1418, 482, 482, 482, 482, 482, 482, - 482, 482, 482, 14353, 9445, 7623, 1112, 1132, 1659, 10780, - 10780, 12573, 12573, 11670, 11225, 10780, 1549, 605, 955, 27291, - -1000, -1000, 13463, -1000, -1000, -1000, -1000, -1000, 848, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, 27291, 27291, 10780, 10780, - 10780, 10780, 10780, -1000, 1208, -1000, -163, 16146, 12573, 1643, - 1112, 1457, 1598, 1685, 502, 843, 1205, -1000, 854, 1643, - 17939, 1170, -1000, 1457, -1000, -1000, -1000, 27291, -1000, -1000, - 20164, -1000, -1000, 6705, 27291, 196, 27291, -1000, 1185, 1536, - -1000, -1000, -1000, 1630, 17494, 27291, 1186, 1184, -1000, -1000, - 454, 8082, -28, -1000, 8082, 1181, -1000, -62, -39, 9890, - 474, -1000, -1000, -1000, 1807, 14798, 1022, -1000, 32, -1000, - -1000, -1000, 1249, -1000, 1249, 1249, 1249, 1249, 29, 29, - 29, 29, -1000, -1000, -1000, -1000, -1000, 1272, 1254, -1000, - 1249, 1249, 1249, 1249, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, 1253, 1253, 1253, 1250, 1250, 281, -1000, 12573, 120, - 27291, 1612, 765, 128, 27291, 1363, -1000, 27291, 1353, 1353, - 1353, -1000, 1617, 1053, 1028, -1000, 1197, -1000, -1000, 1655, - -1000, -1000, 489, 655, 633, 578, 27291, 113, 190, -1000, - 278, -1000, 27291, 1252, 1579, 522, 913, -1000, 913, -1000, - -1000, -1000, -1000, 448, -1000, -1000, 913, 1190, -1000, 1219, - 695, 621, 677, 618, 1190, -1000, -1000, -129, 1190, -1000, - 1190, -1000, 1190, -1000, 1190, -1000, 1190, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 548, 27291, 113, 747, -1000, - 330, -1000, -1000, 747, 747, -1000, -1000, -1000, -1000, 945, - 938, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -327, 27291, 367, - 122, 150, 27291, 27291, 27291, 27291, 27291, 420, -1000, -1000, - -1000, 164, 27291, 27291, 27291, 27291, 372, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 955, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, 631, 27291, 27291, 27291, -1000, -1000, 631, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 27291, - -1000, 937, 27291, 27291, -1000, -1000, -1000, -1000, -1000, 339, - -72, 189, -1000, -1000, -1000, -1000, 1636, -1000, 955, 517, - 672, 567, -1000, -1000, 739, -1000, -1000, 1211, -1000, -1000, - -1000, -1000, 764, 13908, 13908, 13908, 853, 1211, 2571, 1309, - 1271, 482, 651, 651, 479, 479, 479, 479, 479, 680, - 680, -1000, -1000, -1000, -1000, 848, -1000, -1000, -1000, 848, - 10780, 10780, 1188, 1054, 443, -1000, 1292, -1000, -1000, 1643, - 1119, 1119, 767, 923, 603, 1674, 1119, 599, 1673, 1119, - 1119, 10780, -1000, -1000, 602, -1000, 12573, 848, -1000, 2149, - 1183, 1182, 1119, 848, 848, 1119, 1119, 27291, -1000, -271, - -1000, -89, 436, 1054, -1000, 19719, -1000, -1000, 848, 1060, - 1559, -1000, -1000, 1503, -1000, 1440, 12573, 12573, 12573, -1000, - -1000, -1000, 1559, 1648, -1000, 1471, 1466, 1664, 10780, 19274, - 1457, -1000, -1000, -1000, 442, 1664, 1163, 1054, -1000, 27291, - 19274, 19274, 19274, 19274, 19274, -1000, 1409, 1397, -1000, 1415, - 1408, 1426, 27291, -1000, 1128, 1112, 17494, 196, 1046, 19274, - 27291, -1000, -1000, 19274, 27291, 6246, -1000, 1181, -28, -32, - -1000, -1000, -1000, -1000, 955, -1000, 1014, -1000, 263, -1000, - 260, -1000, -1000, -1000, -1000, 464, 30, -1000, -1000, 29, - 29, -1000, -1000, 474, 616, 474, 474, 474, 933, 933, - -1000, -1000, -1000, -1000, -1000, 754, -1000, -1000, -1000, 751, - -1000, -1000, 935, 1346, 120, -1000, -1000, 536, 928, 1532, - -1000, -1000, 1020, 363, -1000, 27291, -1000, 1362, 1360, 1359, - -1000, -1000, -1000, -1000, -1000, 3223, 27291, 1125, -1000, 111, - 27291, 996, 27291, -1000, 1123, 27291, -1000, 913, -1000, -1000, - 7623, -1000, 27291, 1054, -1000, -1000, -1000, -1000, 391, 1565, - 1557, 113, 111, 474, 913, -1000, -1000, -1000, -1000, -1000, - -330, 1121, 27291, 125, -1000, 1251, 838, -1000, 1345, -1000, - -1000, -1000, -1000, 109, 173, 154, 326, -1000, 352, 1346, - 27291, -1000, -1000, -1000, -1000, -1000, -1000, 625, -1000, 625, - -1000, -1000, -1000, -1000, 1556, -80, -303, -1000, -300, -1000, - -1000, -1000, -1000, 853, 1211, 2319, -1000, 13908, 13908, -1000, - -1000, 1119, 1119, 10780, 7623, 1659, 1559, -1000, -1000, 282, - 747, 282, 13908, 13908, -1000, 13908, 13908, -1000, -120, 1221, - 542, -1000, 12573, 743, -1000, -1000, 13908, 13908, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, -1000, -1000, 380, 379, 378, - 27291, -1000, -1000, -1000, 868, 907, 1434, 955, 955, -1000, - -1000, 27291, -1000, -1000, -1000, -1000, 1651, 12573, -1000, 1110, - -1000, 5787, 1643, 1357, 27291, 1054, 1692, 15701, 27291, 1217, - -1000, 537, 1536, 1343, 1356, 1566, -1000, -1000, -1000, -1000, - 1390, -1000, 1388, -1000, -1000, -1000, -1000, -1000, 1112, 1664, - 19274, 1215, -1000, 1215, -1000, 440, -1000, -1000, -1000, -85, - -51, -1000, -1000, -1000, 1807, -1000, -1000, -1000, 645, 13908, - 1683, -1000, 889, 1578, -1000, 1569, -1000, -1000, 474, 474, - -1000, -1000, -1000, -1000, -1000, -1000, 1089, -1000, 1077, 1091, - 1074, 57, -1000, 1321, 1551, 536, 536, -1000, 736, -1000, - 913, -1000, 27291, -1000, 27291, 27291, 27291, 1654, 1085, -1000, - 27291, -1000, -1000, 27291, -1000, -1000, 1459, 120, 1070, -1000, - -1000, -1000, 190, 27291, -1000, 1418, 111, -1000, -1000, -1000, - -1000, -1000, -1000, 1245, -1000, -1000, -1000, 989, -1000, -136, - 913, 27291, 27291, 27291, -1000, 27291, -1000, -1000, -1000, 631, - 631, -1000, 1548, -1000, 913, -1000, 13908, 1211, 1211, -1000, - -1000, 848, -1000, 1643, -1000, 848, 1249, 1249, -1000, 1249, - 1250, -1000, 1249, 77, 1249, 73, 848, 848, 2533, 2451, - 2349, 2208, 1054, -114, -1000, 955, 12573, 1179, 872, 1054, - 1054, 1054, 1012, 886, 29, -1000, -1000, -1000, 1661, 1653, - 955, -1000, -1000, -1000, 1594, 1081, 1043, -1000, -1000, 10335, - 1050, 1450, 434, 1012, 1659, 27291, 12573, -1000, -1000, 12573, - 1247, -1000, 12573, -1000, -1000, -1000, 1659, 1659, 1215, -1000, - -1000, 450, -1000, -1000, -1000, -1000, -1000, 1211, -119, -1000, - -1000, -1000, -1000, -1000, 29, 884, 29, 735, -1000, 714, - -1000, -1000, -208, -1000, -1000, 1258, 1383, -1000, -1000, 1245, - -1000, -1000, -1000, 27291, 27291, -1000, -1000, 180, -1000, 248, - 1010, -1000, -167, -1000, -1000, 1625, 27291, -1000, -1000, 7623, - -1000, -1000, 1212, 1351, -1000, -1000, -1000, -1000, -1000, -1000, - 1211, -1000, 1559, -1000, -1000, 255, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 13908, 13908, 13908, 13908, 13908, 1643, - 882, 955, 13908, 13908, 18829, 27291, 27291, 17036, 29, 19, - -1000, 12573, 12573, 1560, -1000, 1054, -1000, 1172, 27291, 1054, - 27291, -1000, 1643, -1000, 955, 955, 27291, 955, 1643, -1000, - -1000, 474, -1000, 474, 983, 976, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 1623, 1085, -1000, 185, 27291, -1000, - 190, -1000, -172, -173, 1290, 1007, 1067, -1000, 528, 27291, - 27291, -1000, -1000, -1000, 2149, 2149, 2149, 2149, 1257, 848, - -1000, 2149, 2149, 1004, -1000, 1004, 1004, 436, -263, -1000, - 1513, 1505, 955, 1060, 1681, -1000, 1054, 1692, 433, 1043, - -1000, -1000, 1001, -1000, -1000, -1000, -1000, -1000, 1290, 1054, - 1029, -1000, -1000, -1000, 177, -1000, 7623, 5328, 995, -1000, - -1000, -1000, -1000, -1000, 848, 147, -154, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 19, 279, -1000, 1479, 1458, 1652, - 27291, 1043, 27291, -1000, 177, 13018, 27291, -1000, -57, -1000, - -1000, -1000, -1000, -1000, 1345, -1000, 1423, -126, -161, 1484, - 1486, 1486, 1505, 1650, 1499, 1497, -1000, 881, 1026, -1000, - -1000, 2149, 848, 988, 257, -1000, -1000, -136, -1000, 1416, - -1000, 1482, 733, -1000, -1000, -1000, -1000, 861, -1000, 1649, - 1646, -1000, -1000, -1000, 1355, 133, -1000, -144, -1000, 720, - -1000, -1000, -1000, 841, 740, 1347, -1000, 1672, -1000, -159, - -1000, -1000, -1000, -1000, -1000, 1680, 435, 435, -165, -1000, - -1000, -1000, 275, 768, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 1396, 1031, 27508, -1000, -1000, + 3604, 928, -1000, 1168, -1000, 1029, -1000, 1150, 144, 314, + 1199, 928, 928, 928, 928, 600, -1000, -1000, -1000, 511, + 511, 202, 275, 4093, -1000, -1000, -1000, 24807, 1167, 928, + -1000, 1166, -1000, 1427, 292, 496, 496, 928, -1000, -1000, + 27508, 928, 1426, 1425, 27508, 27508, -1000, 24358, -1000, 23909, + 23460, 869, 27508, 23011, 22562, 22113, 21664, 21215, -1000, 1239, + -1000, 1136, -1000, -1000, -1000, 27508, 27508, 27508, 39, -1000, + -1000, 27508, 928, -1000, -1000, 847, 834, 511, 511, 812, + 947, 945, 941, 511, 511, 800, 937, 921, 150, 787, + 779, 761, 891, 936, 110, 867, 850, 756, 27508, 1162, + -1000, 134, 538, 181, 230, 199, 27508, 135, 1416, 1342, + 1129, 341, 309, 1232, 27508, 1441, 928, -1000, 7664, -1000, + -1000, 933, 12658, -1000, 641, 589, 589, -1000, -1000, -1000, + -1000, -1000, -1000, 609, 27508, 641, -1000, -1000, -1000, 589, + 609, 27508, 609, 609, 609, 609, 589, 609, 27508, 27508, + 27508, 27508, 27508, 27508, 27508, 27508, 27508, 7201, 7201, 7201, + 492, -1000, 1231, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 97, -1000, -1000, -1000, -1000, -1000, 1534, -1000, -1000, -1000, + -110, 1127, 20766, -1000, -282, -283, -285, -290, -1000, -1000, + -1000, -291, -298, -1000, -1000, -1000, 12658, 12658, 12658, 12658, + 786, 499, 14005, 710, 633, 14005, 14005, 14005, 14005, 14005, + 14005, 14005, 14005, 14005, 14005, 14005, 14005, 14005, 14005, 14005, + 590, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 928, + -1000, 1522, 896, 896, 444, 444, 444, 444, 444, 444, + 444, 444, 444, 14454, 9502, 7664, 1011, 1027, 1499, 10849, + 10849, 12658, 12658, 11747, 11298, 10849, 1408, 565, 753, 27508, + -1000, -1000, 13556, -1000, -1000, -1000, -1000, -1000, 953, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, 27508, 27508, 10849, 10849, + 10849, 10849, 10849, -1000, 1126, -1000, -170, 16263, 12658, 1468, + 1011, 1374, 1436, 1528, 461, 744, 1114, -1000, 729, 1468, + 18072, 1135, -1000, 1374, -1000, -1000, -1000, 27508, -1000, -1000, + 20317, -1000, -1000, 6738, 27508, 204, 27508, -1000, 1128, 1307, + -1000, -1000, -1000, 1449, 17623, 27508, 1071, 1045, -1000, -1000, + 429, 8127, -61, -1000, 8127, 1099, -1000, -25, -51, 9951, + 419, -1000, -1000, -1000, 1955, 14903, 1041, -1000, 35, -1000, + -1000, -1000, 1150, -1000, 1150, 1150, 1150, 1150, 39, 39, + 39, 39, -1000, -1000, -1000, -1000, -1000, 1160, 1159, -1000, + 1150, 1150, 1150, 1150, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 1155, 1155, 1155, 1151, 1151, 285, -1000, 12658, 105, + 27508, 1434, 755, 134, 27508, 1230, -1000, 27508, 1199, 1199, + 1199, -1000, 1437, 914, 860, -1000, 1112, -1000, -1000, 1493, + -1000, -1000, 614, 637, 626, 484, 27508, 117, 193, -1000, + 277, -1000, 27508, 1153, 1422, 496, 928, -1000, 928, -1000, + -1000, -1000, -1000, 425, -1000, -1000, 928, 1110, -1000, 1095, + 671, 612, 670, 587, 1110, -1000, -1000, -139, 1110, -1000, + 1110, -1000, 1110, -1000, 1110, -1000, 1110, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 550, 27508, 117, 590, -1000, + 336, -1000, -1000, 590, 590, -1000, -1000, -1000, -1000, 932, + 930, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -332, 27508, 355, + 122, 186, 27508, 27508, 27508, 27508, 27508, 402, -1000, -1000, + -1000, 159, 27508, 27508, 27508, 27508, 369, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 753, 27508, -1000, -1000, 609, 609, + -1000, -1000, 27508, 609, -1000, -1000, -1000, -1000, -1000, -1000, + 609, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 929, 27508, 27508, -1000, -1000, + -1000, -1000, -1000, 93, -29, 183, -1000, -1000, -1000, -1000, + 1464, -1000, 753, 499, 674, 583, -1000, -1000, 773, -1000, + -1000, 2664, -1000, -1000, -1000, -1000, 710, 14005, 14005, 14005, + 1270, 2664, 2643, 1255, 2256, 444, 684, 684, 454, 454, + 454, 454, 454, 831, 831, -1000, -1000, -1000, -1000, 953, + -1000, -1000, -1000, 953, 10849, 10849, 1107, 1146, 423, -1000, + 1185, -1000, -1000, 1468, 996, 996, 722, 672, 595, 1511, + 996, 564, 1510, 996, 996, 10849, -1000, -1000, 597, -1000, + 12658, 953, -1000, 1518, 1102, 1100, 996, 953, 953, 996, + 996, 27508, -1000, -273, -1000, -41, 450, 1146, -1000, 19868, + -1000, -1000, 953, 1078, 1401, -1000, -1000, 1375, -1000, 1285, + 12658, 12658, 12658, -1000, -1000, -1000, 1401, 1469, -1000, 1295, + 1294, 1505, 10849, 19419, 1374, -1000, -1000, -1000, 422, 1505, + 1092, 1146, -1000, 27508, 19419, 19419, 19419, 19419, 19419, -1000, + 1266, 1249, -1000, 1263, 1248, 1276, 27508, -1000, 1020, 1011, + 17623, 204, 1076, 19419, 27508, -1000, -1000, 19419, 27508, 6275, + -1000, 1099, -61, -39, -1000, -1000, -1000, -1000, 753, -1000, + 806, -1000, 2276, -1000, 340, -1000, -1000, -1000, -1000, 443, + 32, -1000, -1000, 39, 39, -1000, -1000, 419, 525, 419, + 419, 419, 927, 927, -1000, -1000, -1000, -1000, -1000, 723, + -1000, -1000, -1000, 718, -1000, -1000, 852, 1223, 105, -1000, + -1000, 511, 922, 1378, -1000, -1000, 1037, 352, -1000, 27508, + -1000, 1228, 1218, 1216, -1000, -1000, -1000, -1000, -1000, 3612, + 27508, 1018, -1000, 108, 27508, 1021, 27508, -1000, 1014, 27508, + -1000, 928, -1000, -1000, 7664, -1000, 27508, 1146, -1000, -1000, + -1000, -1000, 383, 1413, 1411, 117, 108, 419, 928, -1000, + -1000, -1000, -1000, -1000, -335, 998, 27508, 133, -1000, 1152, + 894, -1000, 1183, -1000, -1000, -1000, -1000, 114, 178, 161, + 329, -1000, 366, 1223, 27508, -1000, -1000, -1000, 589, -1000, + -1000, 589, -1000, -1000, -1000, -1000, -1000, -1000, 1393, -34, + -309, -1000, -306, -1000, -1000, -1000, -1000, 1270, 2664, 2380, + -1000, 14005, 14005, -1000, -1000, 996, 996, 10849, 7664, 1499, + 1401, -1000, -1000, 412, 590, 412, 14005, 14005, -1000, 14005, + 14005, -1000, -129, 1101, 549, -1000, 12658, 749, -1000, -1000, + 14005, 14005, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, 373, 371, 363, 27508, -1000, -1000, -1000, 841, 920, + 1277, 753, 753, -1000, -1000, 27508, -1000, -1000, -1000, -1000, + 1503, 12658, -1000, 1097, -1000, 5812, 1468, 1205, 27508, 1146, + 1534, 15814, 27508, 1080, -1000, 533, 1307, 1194, 1204, 1254, + -1000, -1000, -1000, -1000, 1247, -1000, 1246, -1000, -1000, -1000, + -1000, -1000, 1011, 1505, 19419, 1075, -1000, 1075, -1000, 415, + -1000, -1000, -1000, -38, -56, -1000, -1000, -1000, 1955, -1000, + -1000, -1000, 667, 14005, 1526, -1000, 915, 1420, -1000, 1418, + -1000, -1000, 419, 419, -1000, -1000, -1000, -1000, -1000, -1000, + 987, -1000, 984, 1096, 982, 59, -1000, 1174, 1392, 511, + 511, -1000, 712, -1000, 928, -1000, 27508, -1000, 27508, 27508, + 27508, 1492, 1090, -1000, 27508, -1000, -1000, 27508, -1000, -1000, + 1291, 105, 980, -1000, -1000, -1000, 193, 27508, -1000, 896, + 108, -1000, -1000, -1000, -1000, -1000, -1000, 1148, -1000, -1000, + -1000, 1008, -1000, -140, 928, 27508, 27508, 27508, -1000, 27508, + -1000, -1000, -1000, 609, 609, -1000, 1391, -1000, 928, -1000, + 14005, 2664, 2664, -1000, -1000, 953, -1000, 1468, -1000, 953, + 1150, 1150, -1000, 1150, 1151, -1000, 1150, 84, 1150, 83, + 953, 953, 2548, 2463, 2342, 2154, 1146, -120, -1000, 753, + 12658, 2133, 1772, 1146, 1146, 1146, 973, 913, 39, -1000, + -1000, -1000, 1501, 1489, 753, -1000, -1000, -1000, 1409, 1034, + 1069, -1000, -1000, 10400, 977, 1290, 414, 973, 1499, 27508, + 12658, -1000, -1000, 12658, 1149, -1000, 12658, -1000, -1000, -1000, + 1499, 1499, 1075, -1000, -1000, 453, -1000, -1000, -1000, -1000, + -1000, 2664, -80, -1000, -1000, -1000, -1000, -1000, 39, 905, + 39, 711, -1000, 679, -1000, -1000, -213, -1000, -1000, 1091, + 1222, -1000, -1000, 1148, -1000, -1000, -1000, 27508, 27508, -1000, + -1000, 188, -1000, 265, 971, -1000, -169, -1000, -1000, 1447, + 27508, -1000, -1000, 7664, -1000, -1000, 1147, 1196, -1000, -1000, + -1000, -1000, -1000, -1000, 2664, -1000, 1401, -1000, -1000, 205, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 14005, 14005, + 14005, 14005, 14005, 1468, 901, 753, 14005, 14005, 18970, 27508, + 27508, 17161, 39, 6, -1000, 12658, 12658, 1402, -1000, 1146, + -1000, 1109, 27508, 1146, 27508, -1000, 1468, -1000, 753, 753, + 27508, 753, 1468, -1000, -1000, 419, -1000, 419, 990, 963, + -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 1443, 1090, + -1000, 173, 27508, -1000, 193, -1000, -177, -178, 1161, 969, + 1082, -1000, 507, 27508, 27508, -1000, -1000, -1000, 1518, 1518, + 1518, 1518, 502, 953, -1000, 1518, 1518, 967, -1000, 967, + 967, 450, -267, -1000, 1339, 1336, 753, 1078, 1524, -1000, + 1146, 1534, 411, 1069, -1000, -1000, 961, -1000, -1000, -1000, + -1000, -1000, 1161, 1146, 1145, -1000, -1000, -1000, 177, -1000, + 7664, 5349, 959, -1000, -1000, -1000, -1000, -1000, 953, 169, + -157, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 6, 269, + -1000, 1302, 1300, 1487, 27508, 1069, 27508, -1000, 177, 13107, + 27508, -1000, -48, -1000, -1000, -1000, -1000, -1000, 1183, -1000, + 1275, -134, -166, 1308, 1310, 1310, 1336, 1480, 1324, 1317, + -1000, 890, 1067, -1000, -1000, 1518, 953, 957, 280, -1000, + -1000, -140, -1000, 1274, -1000, 1306, 769, -1000, -1000, -1000, + -1000, 888, -1000, 1473, 1471, -1000, -1000, -1000, 1203, 136, + -1000, -146, -1000, 691, -1000, -1000, -1000, 887, 875, 1202, + -1000, 1509, -1000, -164, -1000, -1000, -1000, -1000, -1000, 1517, + 469, 469, -167, -1000, -1000, -1000, 251, 741, -1000, -1000, + -1000, -1000, -1000, } var yyPgo = [...]int{ - 0, 1935, 1932, 13, 87, 79, 1930, 1929, 1928, 1927, - 131, 129, 128, 1926, 1925, 1922, 1921, 1918, 1916, 1915, - 1912, 1910, 1908, 1906, 1905, 58, 116, 34, 36, 120, - 1899, 1898, 47, 1897, 1896, 1895, 118, 112, 455, 1894, - 113, 1893, 1892, 1891, 1890, 1889, 1888, 1887, 1886, 1883, - 1882, 1881, 1880, 1879, 151, 1878, 1877, 8, 1874, 50, - 1873, 1871, 1870, 1869, 1868, 91, 1867, 1864, 1863, 109, - 1853, 1851, 45, 180, 43, 78, 1847, 1846, 77, 764, - 1845, 97, 126, 1844, 17, 1843, 46, 68, 74, 1842, - 40, 1841, 1840, 114, 1838, 1833, 1831, 76, 1828, 1825, - 2792, 1820, 62, 84, 11, 31, 1818, 1817, 1816, 1815, - 30, 399, 1814, 1813, 22, 1808, 1807, 136, 1806, 86, - 15, 1805, 12, 19, 20, 1801, 81, 1800, 35, 52, - 27, 1799, 83, 1798, 1795, 1794, 1793, 38, 1792, 73, - 102, 41, 1790, 1789, 6, 9, 1788, 1782, 1780, 1779, - 1778, 1776, 4, 1775, 1774, 1773, 26, 1772, 18, 21, - 67, 130, 23, 7, 1771, 177, 1770, 28, 106, 63, - 108, 1769, 1768, 1767, 859, 1766, 44, 1764, 139, 1762, - 1758, 70, 1757, 111, 121, 1752, 1559, 1751, 72, 1050, - 2461, 33, 107, 1750, 1749, 2129, 57, 75, 25, 1748, - 1747, 1746, 122, 224, 60, 846, 42, 1745, 1743, 1742, - 1739, 1738, 1737, 1736, 117, 64, 37, 105, 24, 1734, - 1733, 1732, 49, 65, 1730, 104, 103, 66, 153, 1729, - 110, 92, 56, 1728, 89, 1727, 1726, 1724, 1723, 39, - 1722, 1721, 1720, 1719, 99, 88, 55, 29, 1718, 32, - 96, 101, 100, 1717, 16, 119, 10, 1716, 3, 0, - 1714, 5, 125, 1576, 124, 1713, 1710, 1, 1707, 2, - 1706, 1705, 85, 1704, 1703, 1701, 1700, 3246, 762, 115, - 1699, 127, + 0, 1788, 1787, 14, 82, 79, 1786, 1785, 1783, 1782, + 130, 125, 122, 1781, 1779, 1777, 1775, 1774, 1773, 1772, + 1770, 1769, 1766, 1765, 1764, 62, 120, 38, 40, 124, + 1763, 1762, 45, 1761, 1760, 1759, 127, 126, 470, 1758, + 128, 1757, 1755, 1754, 1753, 1748, 1747, 1746, 1744, 1743, + 1742, 1741, 1740, 1737, 151, 1736, 1735, 9, 1734, 47, + 1733, 1730, 1725, 1720, 1719, 84, 1718, 1715, 1714, 111, + 1711, 1710, 44, 336, 49, 72, 1709, 1705, 80, 770, + 1704, 100, 119, 1703, 908, 1702, 39, 97, 85, 1701, + 41, 1700, 1698, 102, 1697, 1694, 1693, 68, 1691, 1690, + 3134, 1689, 67, 75, 19, 32, 1686, 1683, 1682, 1680, + 33, 162, 1679, 1677, 28, 1676, 1675, 146, 1674, 81, + 27, 1673, 16, 18, 21, 1671, 83, 1668, 8, 50, + 31, 1667, 77, 1666, 1664, 1662, 1660, 25, 1645, 73, + 101, 22, 1644, 1643, 4, 11, 1642, 1641, 1640, 1638, + 1636, 1635, 10, 1634, 1633, 1631, 56, 1630, 6, 24, + 71, 116, 29, 7, 1629, 143, 1626, 26, 114, 65, + 108, 1624, 1623, 1622, 849, 55, 134, 1621, 1620, 46, + 1619, 118, 117, 1617, 1362, 1616, 1615, 78, 1271, 2560, + 13, 109, 1614, 1611, 1627, 52, 74, 23, 1610, 1609, + 1608, 121, 112, 63, 863, 42, 1606, 1605, 1604, 1603, + 1602, 1597, 1596, 87, 34, 20, 105, 30, 1595, 1594, + 1593, 66, 37, 1592, 107, 106, 70, 86, 1591, 115, + 96, 57, 1590, 60, 1589, 1588, 1581, 1579, 43, 1576, + 1574, 1573, 1570, 104, 88, 64, 35, 1569, 36, 91, + 99, 89, 1567, 17, 123, 12, 1565, 3, 0, 1557, + 5, 138, 1368, 113, 1555, 1553, 1, 1549, 2, 1547, + 1546, 76, 1544, 1543, 1542, 1541, 3253, 1439, 110, 1540, + 139, } var yyR1 = [...]int{ - 0, 275, 276, 276, 1, 1, 1, 1, 1, 1, + 0, 274, 275, 275, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 259, 259, 259, 262, 262, 21, + 1, 1, 1, 1, 258, 258, 258, 261, 261, 21, 50, 3, 3, 3, 3, 2, 2, 8, 9, 4, 5, 5, 10, 10, 61, 61, 11, 12, 12, 12, - 12, 279, 279, 95, 95, 93, 93, 94, 94, 160, + 12, 278, 278, 95, 95, 93, 93, 94, 94, 160, 160, 13, 14, 14, 170, 170, 169, 169, 169, 171, - 171, 171, 171, 205, 205, 15, 15, 15, 15, 15, - 70, 70, 261, 261, 260, 258, 258, 257, 257, 256, - 23, 24, 33, 33, 33, 33, 34, 35, 263, 263, - 235, 39, 39, 38, 38, 38, 38, 40, 40, 37, - 37, 36, 36, 237, 237, 224, 224, 236, 236, 236, - 236, 236, 236, 236, 223, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 207, 207, 207, 207, - 210, 210, 208, 208, 208, 208, 208, 208, 208, 208, - 208, 209, 209, 209, 209, 209, 211, 211, 211, 211, - 211, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, - 213, 213, 213, 213, 222, 222, 214, 214, 217, 217, - 218, 218, 218, 219, 219, 220, 220, 215, 215, 215, - 216, 216, 216, 225, 249, 249, 248, 248, 246, 246, - 246, 246, 234, 234, 243, 243, 243, 243, 243, 233, - 233, 229, 229, 229, 230, 230, 231, 231, 228, 228, - 232, 232, 245, 245, 244, 226, 226, 227, 227, 251, - 251, 251, 251, 252, 268, 269, 267, 267, 267, 267, - 267, 59, 59, 59, 185, 185, 185, 241, 241, 240, - 240, 240, 242, 242, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 180, 180, 180, 266, 266, 266, 266, - 266, 266, 265, 265, 265, 238, 238, 238, 264, 264, + 171, 171, 171, 204, 204, 15, 15, 15, 15, 15, + 70, 70, 260, 260, 259, 257, 257, 256, 256, 255, + 23, 24, 33, 33, 33, 33, 34, 35, 262, 262, + 234, 39, 39, 38, 38, 38, 38, 40, 40, 37, + 37, 36, 36, 236, 236, 223, 223, 235, 235, 235, + 235, 235, 235, 235, 222, 143, 143, 143, 143, 143, + 143, 143, 143, 143, 143, 143, 206, 206, 206, 206, + 209, 209, 207, 207, 207, 207, 207, 207, 207, 207, + 207, 208, 208, 208, 208, 208, 210, 210, 210, 210, + 210, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, + 212, 212, 212, 212, 221, 221, 213, 213, 216, 216, + 217, 217, 217, 218, 218, 219, 219, 214, 214, 214, + 215, 215, 215, 224, 248, 248, 247, 247, 245, 245, + 245, 245, 233, 233, 242, 242, 242, 242, 242, 232, + 232, 228, 228, 228, 229, 229, 230, 230, 227, 227, + 231, 231, 244, 244, 243, 225, 225, 226, 226, 250, + 250, 250, 250, 251, 267, 268, 266, 266, 266, 266, + 266, 59, 59, 59, 183, 183, 183, 240, 240, 239, + 239, 239, 241, 241, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 238, 238, 238, 178, 178, 178, 265, 265, 265, 265, + 265, 265, 264, 264, 264, 237, 237, 237, 263, 263, 129, 129, 130, 130, 30, 30, 30, 30, 30, 30, 29, 29, 29, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 31, 31, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 221, 221, 221, 253, 253, 254, 254, + 16, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 220, 220, 220, 252, 252, 253, 253, 17, 22, 22, 18, 18, 18, 18, 19, 19, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 177, - 177, 270, 270, 179, 179, 175, 175, 178, 178, 176, - 176, 176, 181, 181, 181, 182, 182, 274, 274, 274, - 43, 43, 45, 45, 46, 47, 47, 200, 200, 201, - 201, 48, 49, 60, 60, 60, 60, 60, 60, 62, - 62, 62, 7, 7, 7, 7, 56, 56, 56, 6, - 6, 44, 44, 51, 271, 271, 272, 273, 273, 273, - 273, 52, 20, 20, 20, 20, 20, 20, 77, 77, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 71, 71, 71, 66, 66, 280, 54, 55, - 55, 69, 69, 69, 63, 63, 63, 68, 68, 68, - 74, 74, 76, 76, 76, 76, 76, 78, 78, 78, - 78, 78, 78, 73, 73, 75, 75, 75, 75, 193, - 193, 193, 192, 192, 85, 85, 86, 86, 87, 87, - 88, 88, 88, 127, 103, 103, 159, 159, 158, 158, - 161, 161, 89, 89, 89, 89, 90, 90, 91, 91, - 92, 92, 199, 199, 198, 198, 198, 197, 197, 96, - 96, 96, 98, 97, 97, 97, 97, 99, 99, 101, - 101, 100, 100, 102, 104, 104, 104, 104, 104, 105, - 105, 84, 84, 84, 84, 84, 84, 84, 84, 173, - 173, 107, 107, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 118, 118, 118, 118, 118, 118, 108, - 108, 108, 108, 108, 108, 108, 72, 72, 119, 119, - 119, 126, 120, 120, 111, 111, 111, 111, 111, 111, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 269, 269, 177, 177, 185, 185, 176, + 176, 175, 175, 175, 179, 179, 179, 180, 180, 273, + 273, 273, 43, 43, 45, 45, 46, 47, 47, 199, + 199, 200, 200, 48, 49, 60, 60, 60, 60, 60, + 60, 62, 62, 62, 7, 7, 7, 7, 56, 56, + 56, 6, 6, 44, 44, 51, 270, 270, 271, 272, + 272, 272, 272, 52, 20, 20, 20, 20, 20, 20, + 77, 77, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 71, 71, 71, 66, 66, 279, + 54, 55, 55, 69, 69, 69, 63, 63, 63, 68, + 68, 68, 74, 74, 76, 76, 76, 76, 76, 78, + 78, 78, 78, 78, 78, 73, 73, 75, 75, 75, + 75, 192, 192, 192, 191, 191, 85, 85, 86, 86, + 87, 87, 88, 88, 88, 127, 103, 103, 159, 159, + 158, 158, 161, 161, 89, 89, 89, 89, 90, 90, + 91, 91, 92, 92, 198, 198, 197, 197, 197, 196, + 196, 96, 96, 96, 98, 97, 97, 97, 97, 99, + 99, 101, 101, 100, 100, 102, 104, 104, 104, 104, + 104, 105, 105, 84, 84, 84, 84, 84, 84, 84, + 84, 173, 173, 107, 107, 106, 106, 106, 106, 106, + 106, 106, 106, 106, 106, 118, 118, 118, 118, 118, + 118, 108, 108, 108, 108, 108, 108, 108, 72, 72, + 119, 119, 119, 126, 120, 120, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111, 115, 115, - 115, 115, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, + 115, 115, 115, 115, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, - 114, 281, 281, 117, 116, 116, 116, 116, 116, 116, - 116, 67, 67, 67, 67, 67, 204, 204, 204, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 133, 133, 64, 64, 131, 131, 132, 134, - 134, 128, 128, 128, 110, 110, 110, 110, 110, 110, - 110, 110, 112, 112, 112, 135, 135, 136, 136, 137, - 137, 138, 138, 139, 140, 140, 140, 141, 141, 141, - 141, 32, 32, 32, 32, 32, 27, 27, 27, 27, - 28, 28, 28, 79, 79, 79, 79, 81, 81, 80, - 80, 57, 57, 58, 58, 58, 82, 82, 83, 83, - 83, 83, 156, 156, 156, 142, 142, 142, 142, 148, - 148, 148, 144, 144, 146, 146, 146, 147, 147, 147, - 145, 151, 151, 153, 153, 152, 152, 150, 150, 155, - 155, 154, 154, 149, 149, 109, 109, 109, 109, 109, - 157, 157, 157, 157, 162, 162, 122, 122, 124, 124, - 123, 125, 163, 163, 167, 164, 164, 168, 168, 168, - 168, 168, 165, 165, 166, 166, 194, 194, 194, 172, - 172, 186, 186, 183, 183, 184, 184, 174, 174, 187, - 187, 187, 53, 121, 121, 250, 250, 247, 190, 190, - 191, 191, 195, 195, 196, 196, 188, 188, 188, 188, + 114, 114, 114, 280, 280, 117, 116, 116, 116, 116, + 116, 116, 116, 67, 67, 67, 67, 67, 203, 203, + 203, 205, 205, 205, 205, 205, 205, 205, 205, 205, + 205, 205, 205, 205, 133, 133, 64, 64, 131, 131, + 132, 134, 134, 128, 128, 128, 110, 110, 110, 110, + 110, 110, 110, 110, 112, 112, 112, 135, 135, 136, + 136, 137, 137, 138, 138, 139, 140, 140, 140, 141, + 141, 141, 141, 32, 32, 32, 32, 32, 27, 27, + 27, 27, 28, 28, 28, 79, 79, 79, 79, 81, + 81, 80, 80, 57, 57, 58, 58, 58, 82, 82, + 83, 83, 83, 83, 156, 156, 156, 142, 142, 142, + 142, 148, 148, 148, 144, 144, 146, 146, 146, 147, + 147, 147, 145, 151, 151, 153, 153, 152, 152, 150, + 150, 155, 155, 154, 154, 149, 149, 109, 109, 109, + 109, 109, 157, 157, 157, 157, 162, 162, 122, 122, + 124, 124, 123, 125, 163, 163, 167, 164, 164, 168, + 168, 168, 168, 168, 165, 165, 166, 166, 193, 193, + 193, 172, 172, 184, 184, 181, 181, 182, 182, 174, + 174, 186, 186, 186, 53, 121, 121, 249, 249, 246, + 189, 189, 190, 190, 194, 194, 195, 195, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, @@ -4314,33 +4368,12 @@ var yyR1 = [...]int{ 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, - 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 277, 278, 202, 203, 203, 203, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, + 188, 188, 188, 188, 188, 188, 276, 277, 201, 202, + 202, 202, } var yyR2 = [...]int{ @@ -4386,58 +4419,58 @@ var yyR2 = [...]int{ 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 0, 2, 2, 1, 3, 8, 8, 3, 3, 5, 6, 6, 5, 4, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 4, 2, 4, 4, - 4, 4, 4, 5, 7, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 2, 4, 7, 2, 4, 5, - 4, 3, 3, 5, 2, 3, 3, 3, 3, 1, - 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, - 2, 2, 0, 2, 2, 0, 2, 0, 1, 1, - 2, 1, 1, 2, 1, 1, 5, 0, 1, 0, - 1, 2, 3, 0, 3, 3, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 1, 1, 3, - 3, 2, 2, 3, 1, 3, 2, 1, 2, 1, - 2, 2, 3, 3, 6, 4, 7, 6, 1, 3, - 2, 2, 2, 2, 1, 1, 1, 3, 2, 1, - 1, 1, 0, 1, 1, 0, 3, 0, 2, 0, - 2, 1, 2, 2, 0, 1, 1, 0, 1, 1, - 0, 1, 0, 1, 2, 3, 4, 1, 1, 1, - 1, 1, 1, 1, 3, 1, 2, 3, 5, 0, - 1, 2, 1, 1, 0, 2, 1, 3, 1, 1, - 1, 3, 3, 3, 3, 7, 0, 3, 1, 3, - 1, 3, 4, 4, 4, 3, 2, 4, 0, 1, - 0, 2, 0, 1, 0, 1, 2, 1, 1, 1, - 2, 2, 1, 2, 3, 2, 3, 2, 2, 2, - 1, 1, 3, 3, 0, 5, 4, 5, 5, 0, - 2, 1, 3, 3, 3, 2, 3, 1, 2, 0, - 3, 1, 1, 3, 3, 4, 4, 5, 3, 4, - 5, 6, 2, 1, 2, 1, 2, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, - 1, 3, 1, 3, 1, 1, 1, 1, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 1, 1, 1, 1, 4, 5, - 5, 6, 4, 4, 6, 6, 6, 8, 8, 8, - 8, 9, 8, 5, 4, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, - 8, 0, 2, 3, 4, 4, 4, 4, 4, 4, - 4, 0, 3, 4, 7, 3, 1, 1, 1, 2, - 3, 3, 1, 2, 2, 1, 2, 1, 2, 2, - 1, 2, 0, 1, 0, 2, 1, 2, 4, 0, - 2, 1, 3, 5, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 0, 3, 0, 2, 0, - 3, 1, 3, 2, 0, 1, 1, 0, 2, 4, - 4, 0, 2, 2, 1, 1, 3, 3, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 0, 3, 1, - 1, 0, 4, 0, 1, 1, 0, 3, 1, 3, - 2, 1, 0, 2, 4, 0, 9, 3, 5, 0, - 3, 3, 0, 1, 0, 2, 2, 0, 2, 2, - 2, 0, 3, 0, 3, 0, 3, 0, 4, 0, - 3, 0, 4, 0, 1, 2, 1, 5, 4, 4, - 1, 3, 3, 5, 0, 5, 1, 3, 1, 2, - 3, 1, 1, 3, 3, 1, 3, 3, 3, 3, - 3, 2, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 0, 1, 0, 2, 0, 3, 0, 1, 0, - 1, 1, 5, 0, 1, 0, 1, 2, 1, 1, + 3, 3, 7, 3, 3, 3, 3, 4, 7, 5, + 2, 4, 4, 4, 4, 4, 5, 5, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, + 4, 2, 4, 5, 4, 3, 3, 5, 2, 3, + 3, 3, 3, 1, 1, 0, 1, 0, 1, 1, + 1, 0, 2, 2, 0, 2, 2, 0, 2, 0, + 1, 1, 2, 1, 1, 2, 1, 1, 5, 0, + 1, 0, 1, 2, 3, 0, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 3, 3, 2, 2, 3, 1, 3, 2, 1, + 2, 1, 2, 2, 3, 3, 6, 4, 7, 6, + 1, 3, 2, 2, 2, 2, 1, 1, 1, 3, + 2, 1, 1, 1, 0, 1, 1, 0, 3, 0, + 2, 0, 2, 1, 2, 2, 0, 1, 1, 0, + 1, 1, 0, 1, 0, 1, 2, 3, 4, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 2, 3, + 5, 0, 1, 2, 1, 1, 0, 2, 1, 3, + 1, 1, 1, 3, 3, 3, 3, 7, 0, 3, + 1, 3, 1, 3, 4, 4, 4, 3, 2, 4, + 0, 1, 0, 2, 0, 1, 0, 1, 2, 1, + 1, 1, 2, 2, 1, 2, 3, 2, 3, 2, + 2, 2, 1, 1, 3, 3, 0, 5, 4, 5, + 5, 0, 2, 1, 3, 3, 3, 2, 3, 1, + 2, 0, 3, 1, 1, 3, 3, 4, 4, 5, + 3, 4, 5, 6, 2, 1, 2, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, + 4, 5, 5, 6, 4, 4, 6, 6, 6, 8, + 8, 8, 8, 9, 8, 5, 4, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 8, 8, 0, 2, 3, 4, 4, 4, 4, + 4, 4, 4, 0, 3, 4, 7, 3, 1, 1, + 1, 2, 3, 3, 1, 2, 2, 1, 2, 1, + 2, 2, 1, 2, 0, 1, 0, 2, 1, 2, + 4, 0, 2, 1, 3, 5, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 2, 0, 3, 0, + 2, 0, 3, 1, 3, 2, 0, 1, 1, 0, + 2, 4, 4, 0, 2, 2, 1, 1, 3, 3, + 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, + 3, 1, 1, 0, 4, 0, 1, 1, 0, 3, + 1, 3, 2, 1, 0, 2, 4, 0, 9, 3, + 5, 0, 3, 3, 0, 1, 0, 2, 2, 0, + 2, 2, 2, 0, 3, 0, 3, 0, 3, 0, + 4, 0, 3, 0, 4, 0, 1, 2, 1, 5, + 4, 4, 1, 3, 3, 5, 0, 5, 1, 3, + 1, 2, 3, 1, 1, 3, 3, 1, 3, 3, + 3, 3, 3, 2, 1, 2, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 0, 2, 0, 3, 0, + 1, 0, 1, 1, 5, 0, 1, 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -4478,354 +4511,358 @@ var yyR2 = [...]int{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, } var yyChk = [...]int{ - -1000, -275, -1, -3, -8, -9, -10, -11, -12, -13, + -1000, -274, -1, -3, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -41, -42, -43, -45, -46, -47, -48, -49, -6, -44, -20, -21, -50, -51, - -52, -53, -4, -277, 6, 7, 8, -61, 10, 11, + -52, -53, -4, -276, 6, 7, 8, -61, 10, 11, 31, -23, -33, 153, -34, -24, 154, -35, 156, 155, 191, 157, 184, 71, 226, 227, 229, 230, 231, 232, -62, 189, 190, 159, 35, 42, 32, 33, 36, 81, - 9, 324, 186, 185, 26, -276, 464, -69, 5, -137, - 16, -3, -54, -280, -54, -54, -54, -54, -54, -54, - -235, -237, 81, 126, 81, -70, -186, 164, 173, 172, - 169, -263, 107, 219, 315, 162, -39, -38, -37, -36, - -40, 30, -30, -31, -255, -29, -26, 158, 155, 199, + 9, 328, 186, 185, 26, -275, 468, -69, 5, -137, + 16, -3, -54, -279, -54, -54, -54, -54, -54, -54, + -234, -236, 81, 126, 81, -70, -184, 164, 173, 172, + 169, -262, 107, 219, 319, 162, -39, -38, -37, -36, + -40, 30, -30, -31, -254, -29, -26, 158, 155, 199, 102, 103, 191, 192, 193, 157, 175, 190, 194, 189, - 208, -25, 77, 32, 337, 340, -242, 154, 160, 161, - 325, 105, 104, 72, 156, -239, 276, 441, -40, 443, - 95, 97, 442, 41, 164, 444, 445, 446, 447, 174, - 448, 449, 450, 451, 457, 458, 459, 460, 106, 5, - 163, -263, -79, 286, 77, -262, -259, 84, 85, 86, - 163, -186, 164, 165, -263, 163, -100, -195, -259, -189, - 334, 177, 368, 369, 224, 77, 276, 441, 226, 240, - 234, 261, 253, 335, 370, 178, 212, 438, 251, 254, - 302, 443, 371, 192, 298, 281, 289, 95, 229, 311, - 456, 372, 454, 97, 442, 76, 48, 41, 187, 249, - 245, 444, 213, 373, 345, 206, 105, 102, 463, 243, - 47, 28, 453, 104, 46, 445, 374, 446, 291, 266, - 432, 45, 193, 375, 80, 339, 440, 293, 244, 290, - 223, 452, 159, 376, 424, 300, 433, 377, 267, 271, - 378, 303, 49, 379, 380, 434, 103, 381, 75, 447, - 238, 239, 382, 221, 176, 305, 265, 174, 34, 294, - 336, 225, 55, 200, 306, 43, 269, 42, 428, 383, - 431, 264, 260, 50, 384, 385, 386, 387, 448, 263, - 237, 259, 462, 218, 449, 59, 161, 273, 272, 274, - 207, 301, 256, 388, 389, 390, 181, 78, 391, 246, - 19, 392, 393, 214, 394, 53, 395, 396, 309, 190, - 397, 51, 450, 38, 195, 451, 398, 399, 400, 401, - 402, 299, 403, 292, 268, 270, 202, 288, 338, 404, - 242, 194, 455, 405, 182, 439, 196, 199, 189, 310, - 183, 406, 407, 408, 409, 410, 411, 412, 230, 457, - 40, 413, 414, 415, 416, 222, 217, 304, 313, 58, - 79, 278, 417, 437, 236, 215, 418, 227, 52, 458, - 459, 460, 209, 461, 284, 106, 219, 220, 44, 257, - 201, 419, 420, 247, 248, 262, 235, 258, 228, 425, - 203, 191, 421, 312, 216, 279, 342, 208, 436, 341, - 255, 252, 210, 422, 165, 204, 205, 423, 426, 295, - 285, 296, 297, 286, 211, 340, 250, 280, 163, -165, - 281, 282, 283, 294, 295, 300, 299, 202, -274, 303, - 163, -175, 144, 153, 291, -179, 292, 285, 286, 211, - -270, -259, 446, 461, 302, 254, 304, 428, 287, 293, - 297, 296, -195, 228, -200, 233, -190, -259, -189, 231, - -100, -60, 424, 157, -202, -202, -71, 428, 430, -120, - -84, -106, 110, -111, 30, 24, -110, -107, -128, -125, - -126, 144, 145, 147, 146, 148, 133, 134, 141, 111, - 149, -115, -113, -114, -116, 88, 87, 96, 89, 90, - 91, 92, 98, 99, 100, -190, -195, -123, -277, 65, - 66, 325, 326, 327, 328, 333, 329, 113, 54, 314, - 323, 322, 321, 318, 319, 316, 317, 331, 332, 168, - 315, 162, 139, 324, -259, -189, 41, 284, 284, -100, - -5, -4, -277, 6, 21, 22, -141, 18, 17, -278, - 83, -63, -76, 60, 61, -78, 22, 37, 64, 62, - -55, -75, 135, -84, -195, -75, -174, 167, -174, -174, - -164, -205, 228, -168, 304, 303, -191, -166, -190, -188, - -165, 301, 158, 343, 109, 23, 25, 112, 144, 17, - 113, 36, 160, 175, 143, 171, 325, 153, 69, 344, - 316, 317, 314, 320, 327, 328, 315, 282, 30, 11, - 346, 26, 185, 22, 37, 137, 155, 116, 117, 188, - 24, 186, 100, 349, 20, 72, 180, 12, 173, 14, - 350, 351, 15, 168, 167, 128, 164, 67, 9, 149, - 27, 125, 63, 352, 29, 353, 354, 355, 356, 65, - 126, 18, 318, 319, 32, 429, 357, 333, 197, 139, - 70, 56, 430, 110, 358, 359, 98, 360, 101, 73, - 435, 107, 16, 68, 39, 361, 198, 362, 170, 363, - 307, 364, 127, 156, 324, 66, 365, 162, 283, 6, - 330, 31, 184, 172, 64, 366, 163, 115, 331, 332, - 166, 99, 5, 169, 33, 10, 71, 74, 321, 322, - 323, 54, 337, 114, 13, 367, 308, 108, 302, 254, - -236, 126, -223, -227, -190, 179, -252, 175, -100, -245, - -244, -190, -79, 163, -259, 164, 164, 164, -184, 168, - 324, -36, -37, -165, 143, 196, 82, 82, -227, -226, - -225, -264, 198, 179, -251, -243, 171, 180, -233, 172, - 173, -228, 164, 29, -264, -228, 170, 180, 198, 198, - 106, 198, 106, 198, 198, 198, 198, 198, 198, 198, - 198, 198, 195, -234, 118, -234, 341, 341, -239, -264, - -264, -264, 166, 34, 34, -187, -228, 166, 23, -234, - -234, -165, 143, -234, -234, -234, -234, 206, 206, -234, - -234, -234, -234, -234, -234, -234, -234, -234, -234, -234, - -234, -234, -234, -234, -100, -82, 213, 153, 155, 158, - 73, 118, -38, 208, -22, -100, 163, -259, -183, 168, - -183, -100, 150, -100, -181, 126, 13, -181, -181, -181, - -181, -181, 209, 298, 209, 298, 209, 210, 209, 210, - 209, -178, -177, 289, 290, 284, 288, -259, 431, 315, - 300, -259, 202, 163, 203, 165, -229, 164, 34, 176, - 210, 284, 205, -181, -203, -277, -191, -203, -203, 31, - 166, -190, -56, -190, 88, -7, -3, -11, -10, -12, - 118, -77, 284, -65, 144, 446, 432, 433, 434, 431, - 299, 439, 437, 435, 209, 436, 82, 109, 107, 108, + 208, -25, 77, 32, 341, 344, -241, 154, 160, 161, + 329, 105, 104, 72, 156, -238, 276, 445, -40, 447, + 95, 97, 446, 41, 164, 448, 449, 450, 451, 174, + 452, 453, 454, 455, 461, 462, 463, 464, 106, 5, + 163, -262, -79, 286, 77, -261, -258, 84, 85, 86, + 163, -184, 164, 165, -262, 163, -100, -194, -258, -188, + 338, 177, 372, 373, 224, 77, 276, 445, 226, 240, + 234, 261, 253, 339, 374, 178, 212, 442, 251, 254, + 306, 447, 375, 192, 298, 281, 289, 95, 229, 315, + 460, 376, 458, 97, 446, 76, 48, 41, 187, 249, + 245, 448, 213, 377, 349, 206, 105, 102, 467, 243, + 47, 28, 457, 104, 46, 449, 378, 450, 291, 266, + 436, 45, 303, 193, 379, 80, 343, 444, 293, 244, + 290, 223, 456, 159, 380, 428, 300, 437, 381, 267, + 271, 382, 307, 49, 383, 384, 438, 103, 385, 75, + 451, 238, 239, 386, 221, 176, 309, 265, 174, 34, + 294, 340, 225, 55, 200, 310, 43, 269, 42, 432, + 387, 435, 264, 260, 50, 388, 389, 390, 391, 452, + 263, 237, 259, 466, 218, 453, 59, 161, 273, 272, + 274, 207, 305, 256, 392, 393, 394, 181, 78, 395, + 246, 19, 396, 397, 301, 214, 398, 53, 399, 400, + 313, 190, 401, 51, 454, 38, 195, 455, 402, 403, + 404, 405, 406, 299, 407, 292, 268, 270, 202, 288, + 342, 408, 242, 194, 459, 409, 182, 443, 196, 199, + 189, 314, 183, 410, 411, 412, 413, 414, 415, 416, + 230, 461, 40, 417, 418, 419, 420, 222, 217, 308, + 317, 58, 79, 278, 421, 441, 236, 215, 422, 227, + 52, 462, 463, 464, 209, 465, 284, 106, 219, 220, + 44, 257, 201, 423, 424, 247, 248, 262, 235, 258, + 228, 429, 203, 302, 191, 425, 316, 216, 279, 346, + 208, 304, 440, 345, 255, 252, 210, 426, 165, 204, + 205, 427, 430, 295, 285, 296, 297, 286, 211, 344, + 250, 280, 163, -165, 281, -185, 282, 283, 294, 295, + 300, -177, 301, 299, 202, -273, 307, 163, 302, 153, + 144, 291, 292, 285, 286, 211, -269, -258, 450, 465, + 306, 254, 287, 293, 308, 432, 297, 296, -194, 228, + -199, 233, -189, -258, -188, 231, -100, -60, 428, 157, + -201, -201, -71, 432, 434, -120, -84, -106, 110, -111, + 30, 24, -110, -107, -128, -125, -126, 144, 145, 147, + 146, 148, 133, 134, 141, 111, 149, -115, -113, -114, + -116, 88, 87, 96, 89, 90, 91, 92, 98, 99, + 100, -189, -194, -123, -276, 65, 66, 329, 330, 331, + 332, 337, 333, 113, 54, 318, 327, 326, 325, 322, + 323, 320, 321, 335, 336, 168, 319, 162, 139, 328, + -258, -188, 41, 284, 284, -100, -5, -4, -276, 6, + 21, 22, -141, 18, 17, -277, 83, -63, -76, 60, + 61, -78, 22, 37, 64, 62, -55, -75, 135, -84, + -194, -75, -174, 167, -174, -174, -164, -204, 228, -168, + 308, 307, -190, -166, -189, -187, -165, 305, 158, 347, + 109, 23, 25, 112, 144, 17, 113, 36, 160, 175, + 143, 171, 329, 153, 69, 348, 320, 321, 318, 324, + 331, 332, 319, 282, 30, 11, 350, 26, 185, 22, + 37, 137, 155, 116, 117, 188, 24, 186, 100, 353, + 20, 72, 180, 12, 173, 14, 354, 355, 15, 168, + 167, 128, 164, 67, 9, 149, 27, 125, 63, 356, + 29, 357, 358, 359, 360, 65, 126, 18, 322, 323, + 32, 433, 361, 337, 197, 139, 70, 56, 434, 110, + 362, 363, 98, 364, 101, 73, 439, 107, 16, 68, + 39, 365, 198, 366, 170, 367, 311, 368, 127, 156, + 328, 66, 369, 162, 283, 6, 334, 31, 184, 172, + 64, 370, 163, 115, 335, 336, 166, 99, 5, 169, + 33, 10, 71, 74, 325, 326, 327, 54, 341, 114, + 13, 371, 312, 108, 306, 254, -235, 126, -222, -226, + -189, 179, -251, 175, -100, -244, -243, -189, -79, 163, + -258, 164, 164, 164, -182, 168, 328, -36, -37, -165, + 143, 196, 82, 82, -226, -225, -224, -263, 198, 179, + -250, -242, 171, 180, -232, 172, 173, -227, 164, 29, + -263, -227, 170, 180, 198, 198, 106, 198, 106, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 195, -233, + 118, -233, 345, 345, -238, -263, -263, -263, 166, 34, + 34, -186, -227, 166, 23, -233, -233, -165, 143, -233, + -233, -233, -233, 206, 206, -233, -233, -233, -233, -233, + -233, -233, -233, -233, -233, -233, -233, -233, -233, -233, + -100, -82, 213, 153, 155, 158, 73, 118, -38, 208, + -22, -100, 163, -258, -181, 168, -181, -100, 150, -100, + -179, 126, 13, -179, -176, 284, 288, 289, 290, -179, + -179, -179, -179, 209, 298, -228, 164, 34, 176, 284, + 209, 298, 209, 210, 209, 210, 209, -175, 12, 128, + 319, 303, 300, 202, 163, 203, 165, 304, -258, 435, + 210, 284, 205, -179, -202, -276, -190, -202, -202, 31, + 166, -189, -56, -189, 88, -7, -3, -11, -10, -12, + 118, -77, 284, -65, 144, 450, 436, 437, 438, 435, + 299, 443, 441, 439, 209, 440, 82, 109, 107, 108, 125, -84, -108, 128, 110, 126, 127, 112, 130, 129, 140, 133, 134, 135, 136, 137, 138, 139, 131, 132, - 143, 118, 119, 120, 121, 122, 123, 124, -173, -277, - -126, -277, 151, 152, -111, -111, -111, -111, -111, -111, - -111, -111, -111, -111, -277, 150, -2, -120, -4, -277, - -277, -277, -277, -277, -277, -277, -277, -133, -84, -277, - -281, -117, -277, -281, -117, -281, -117, -281, -277, -281, - -117, -281, -117, -281, -281, -117, -277, -277, -277, -277, - -277, -277, -277, -202, -271, -272, -103, -100, -277, -137, + 143, 118, 119, 120, 121, 122, 123, 124, -173, -276, + -126, -276, 151, 152, -111, -111, -111, -111, -111, -111, + -111, -111, -111, -111, -276, 150, -2, -120, -4, -276, + -276, -276, -276, -276, -276, -276, -276, -133, -84, -276, + -280, -117, -276, -280, -117, -280, -117, -280, -276, -280, + -117, -280, -117, -280, -280, -117, -276, -276, -276, -276, + -276, -276, -276, -201, -270, -271, -103, -100, -276, -137, -3, -54, -156, 20, 32, -84, -138, -139, -84, -137, - 56, -73, -75, -78, 60, 61, 94, 12, -193, -192, - 23, -190, 88, 150, 12, -101, 27, -100, -86, -87, - -88, -89, -103, -127, -277, 12, -93, -94, -100, -102, - -195, 82, 228, -168, -205, -170, -169, 305, 307, 118, - -194, -190, 88, 30, 83, 82, -100, -207, -210, -212, - -211, -213, -208, -209, 251, 252, 144, 255, 257, 258, + 56, -73, -75, -78, 60, 61, 94, 12, -192, -191, + 23, -189, 88, 150, 12, -101, 27, -100, -86, -87, + -88, -89, -103, -127, -276, 12, -93, -94, -100, -102, + -194, 82, 228, -168, -204, -170, -169, 309, 311, 118, + -193, -189, 88, 30, 83, 82, -100, -206, -209, -211, + -210, -212, -207, -208, 251, 252, 144, 255, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 31, 187, 247, 248, 249, 250, 267, 268, 269, 270, 271, 272, - 273, 274, 234, 253, 335, 235, 236, 237, 238, 239, - 240, 242, 243, 244, 245, 246, -262, -259, 81, 83, - 82, -214, 81, -82, -184, -250, -247, 74, -259, -259, - -259, -259, 110, -234, -234, 195, -29, -26, -255, 16, - -25, -26, 158, 102, 103, 155, 81, -223, 81, -232, - -262, -259, 81, 29, 170, 169, -231, -228, -231, -232, - -259, -128, -190, -195, -259, 29, 29, -161, -190, -161, - -161, 21, -161, 21, -161, 21, 89, -190, -161, 21, + 273, 274, 234, 253, 339, 235, 236, 237, 238, 239, + 240, 242, 243, 244, 245, 246, -261, -258, 81, 83, + 82, -213, 81, -82, -182, -249, -246, 74, -258, -258, + -258, -258, 110, -233, -233, 195, -29, -26, -254, 16, + -25, -26, 158, 102, 103, 155, 81, -222, 81, -231, + -261, -258, 81, 29, 170, 169, -230, -227, -230, -231, + -258, -128, -189, -194, -258, 29, 29, -161, -189, -161, + -161, 21, -161, 21, -161, 21, 89, -189, -161, 21, -161, 21, -161, 21, -161, 21, -161, 21, 30, 75, - 76, 30, 78, 79, 80, -128, -128, -223, -165, -100, - -259, 89, 89, -234, -234, 89, 88, 88, 88, -234, - -234, 89, 88, -259, 88, -265, 181, 223, 225, 89, - 89, 89, 89, 30, 88, -266, 30, 453, 452, 454, - 455, 456, 89, 30, 89, 30, 89, -190, 81, -81, + 76, 30, 78, 79, 80, -128, -128, -222, -165, -100, + -258, 89, 89, -233, -233, 89, 88, 88, 88, -233, + -233, 89, 88, -258, 88, -264, 181, 223, 225, 89, + 89, 89, 89, 30, 88, -265, 30, 457, 456, 458, + 459, 460, 89, 30, 89, 30, 89, -189, 81, -81, 215, 118, 204, 204, 163, 163, 217, -100, 216, 218, - 220, 41, 82, 166, -183, 73, -95, -100, 24, -259, - -196, -195, -188, 88, -84, -181, -100, -181, -100, -181, - -181, -181, -181, -176, 12, 128, -230, 12, 128, -176, - -203, -203, -203, -100, -203, -203, -100, -203, -203, -230, - -182, 126, 73, -201, 231, 265, 425, 426, 427, 82, - 337, -93, 431, 431, 431, 431, 431, 431, -84, -84, - -84, -84, -118, 98, 110, 99, 100, -111, -119, -123, - -126, 93, 128, 126, 127, 112, -111, -111, -111, -111, + 220, 41, 82, 166, -181, 73, -95, -100, 24, -258, + -195, -194, -187, 88, -84, -229, 12, 128, -175, -175, + -179, -100, -229, -175, -179, -100, -179, -179, -179, -179, + -175, -179, -194, -194, -100, -100, -100, -100, -100, -100, + -100, -202, -202, -202, -180, 126, 73, -200, 231, 265, + 429, 430, 431, 82, 341, -93, 435, 435, 435, 435, + 435, 435, -84, -84, -84, -84, -118, 98, 110, 99, + 100, -111, -119, -123, -126, 93, 128, 126, 127, 112, -111, -111, -111, -111, -111, -111, -111, -111, -111, -111, - -111, -204, -259, 88, 144, -259, -110, -110, -190, -74, - 22, 37, -73, -191, -196, -188, -69, -278, -278, -137, - -73, -73, -84, -84, -128, 88, -73, -128, 88, -73, - -73, -68, 22, 37, -131, -132, 114, -128, -278, -111, - -190, -190, -73, -74, -74, -73, -73, 82, -273, 307, - 308, 429, -198, 198, -197, 23, -195, 88, -121, -120, - -141, -278, -142, 27, 10, 128, 82, 19, 82, -140, - 25, 26, -141, -112, -190, 89, 92, -85, 82, 12, - -78, -100, -192, 135, -196, -100, -160, 198, -100, 31, - 82, -96, -98, -97, -99, 63, 67, 69, 64, 65, - 66, 70, -199, 23, -86, -3, -277, -100, -93, -279, - 82, 12, 74, -279, 82, 150, -168, -170, 82, 306, - 308, 309, 73, 101, -84, -216, 143, -241, -240, -239, - -223, -225, -226, -227, 83, -143, -219, 279, -214, -214, - -214, -214, -214, -215, -165, -215, -215, -215, 81, 81, - -214, -214, -214, -214, -217, 81, -217, -217, -218, 81, - -218, -252, -84, -249, -248, -246, -247, 174, 95, 337, - -244, -140, 89, -81, -100, 73, -190, -250, -250, -250, - 24, -259, 88, -259, 88, 82, 17, -224, -223, -129, - 223, -254, 198, -251, -245, 81, 29, -231, -232, -232, - 150, -259, 82, 27, 106, 106, 106, 106, 337, 155, - 31, -223, -129, -204, 166, -204, -204, 88, 88, -180, - 461, -93, 165, 222, -83, 320, 88, 84, -100, -100, - -100, -100, -100, 158, 155, 206, -100, -100, -93, -100, - 82, -59, 183, 178, -181, -195, -195, -100, -181, -100, - 88, -100, -190, -65, 307, 337, 20, -66, 20, 98, - 99, 100, -119, -111, -111, -111, -72, 188, 109, -278, - -278, -73, -73, -277, 150, -5, -141, -278, -278, 82, - 74, 23, 12, 12, -278, 12, 12, -278, -278, -73, - -134, -132, 116, -84, -278, -278, 82, 82, -278, -278, - -278, -278, -278, -272, 428, 308, -104, 71, 167, 72, - -277, -197, -278, -156, 39, 47, 58, -84, -84, -139, - -156, -172, 20, 12, 54, 54, -105, 13, -75, -86, - -78, 150, -105, -109, 31, 54, -3, -277, -277, -163, - -167, -128, -87, -88, -88, -87, -88, 63, 63, 63, - 68, 63, 68, 63, -97, -195, -278, -278, -3, -160, - 74, -86, -100, -86, -102, -195, 135, -169, -171, 310, - 307, 313, -259, 88, 82, -239, -227, 98, 110, 30, - 73, 276, 95, 170, 29, 169, -220, 280, -215, -215, - -216, -259, 144, -216, -216, -216, -222, 88, -222, 89, - 89, 83, -32, -27, -28, 32, 77, -246, -234, 88, - 38, 83, 165, -100, 73, 73, 73, 16, -158, -190, - 82, 83, -130, 224, -128, 83, -190, 83, -158, -232, - -191, -190, -277, 163, 30, 30, -129, -130, -216, -259, - 463, 462, 83, -100, -80, 213, 221, 81, 85, -261, - 74, 204, 276, 204, 207, 166, -59, -32, -100, -176, - -176, 32, 307, 440, 438, -72, 109, -111, -111, -278, - -278, -74, -191, -137, -156, -206, 144, 251, 187, 249, - 245, 265, 256, 278, 247, 279, -204, -206, -111, -111, - -111, -111, 334, -137, 117, -84, 115, -111, -111, 164, - 164, 164, -161, 40, 88, 88, 59, -100, -135, 14, - -84, 135, -141, -162, 73, -163, -122, -124, -123, -277, - -157, -278, -190, -161, -105, 82, 118, -91, -90, 73, - 74, -92, 73, -90, 63, 63, -278, -105, -86, -105, - -105, 150, 307, 311, 312, -239, 98, -111, 10, 88, - 29, 29, -216, -216, 83, 82, 83, 82, 83, 82, - -185, 374, 110, -28, -27, -234, -234, 89, -259, -100, - -100, -100, -100, 17, 82, -223, -128, 54, -249, 83, - -253, -254, -100, -110, -130, -159, 81, 83, -258, 337, - -260, -259, -190, -190, -190, -100, -181, -181, 32, -259, - -111, -278, -141, -278, -214, -214, -214, -218, -214, 239, - -214, 239, -278, -278, 20, 20, 20, 20, -277, -64, - 330, -84, 82, 82, -277, -277, -277, -278, 88, -215, - -136, 15, 17, 28, -162, 82, -278, -278, 82, 54, - 150, -278, -137, -167, -84, -84, 81, -84, -137, -105, - -114, -215, 88, -215, 89, 89, 374, 30, 78, 79, - 80, 30, 75, 76, -159, -158, -190, 200, 182, -278, - 82, -221, 337, 340, 23, -158, -257, -256, -191, 81, - 74, -156, -215, -259, -111, -111, -111, -111, -111, -141, - 88, -111, -111, -158, -278, -158, -158, -198, -215, -145, - -150, -178, -84, -120, 29, -124, 54, -3, -190, -122, - -190, -141, -158, -141, -216, -216, 83, 83, 23, 201, - -100, -254, 341, 341, -3, 83, 82, 118, -158, -100, - -278, -278, -278, -278, -67, 128, 337, -278, -278, -278, - -278, -278, -278, -104, -148, 424, -151, 43, -152, 44, - 10, -122, 150, 83, -3, -277, 81, -57, 337, -256, - -238, -191, 88, 89, 83, -278, 335, 70, 338, -145, - 48, 257, -153, 52, -154, -149, 53, 17, -163, -190, - -57, -111, 197, -158, -58, 212, 428, -261, 59, 336, - 339, -146, 50, -144, 49, -144, -152, 17, -155, 45, - 46, 88, -278, -278, 83, 175, -258, 59, -147, 51, - 73, 101, 88, 17, 17, -268, -269, 73, 214, 337, - 73, 101, 88, 88, -269, 73, 11, 10, 338, -267, - 183, 178, 181, 31, -267, 339, 177, 30, 98, + -111, -111, -111, -111, -111, -203, -258, 88, 144, -258, + -110, -110, -189, -74, 22, 37, -73, -190, -195, -187, + -69, -277, -277, -137, -73, -73, -84, -84, -128, 88, + -73, -128, 88, -73, -73, -68, 22, 37, -131, -132, + 114, -128, -277, -111, -189, -189, -73, -74, -74, -73, + -73, 82, -272, 311, 312, 433, -197, 198, -196, 23, + -194, 88, -121, -120, -141, -277, -142, 27, 10, 128, + 82, 19, 82, -140, 25, 26, -141, -112, -189, 89, + 92, -85, 82, 12, -78, -100, -191, 135, -195, -100, + -160, 198, -100, 31, 82, -96, -98, -97, -99, 63, + 67, 69, 64, 65, 66, 70, -198, 23, -86, -3, + -276, -100, -93, -278, 82, 12, 74, -278, 82, 150, + -168, -170, 82, 310, 312, 313, 73, 101, -84, -215, + 143, -240, -239, -238, -222, -224, -225, -226, 83, -143, + -218, 279, -213, -213, -213, -213, -213, -214, -165, -214, + -214, -214, 81, 81, -213, -213, -213, -213, -216, 81, + -216, -216, -217, 81, -217, -251, -84, -248, -247, -245, + -246, 174, 95, 341, -243, -140, 89, -81, -100, 73, + -189, -249, -249, -249, 24, -258, 88, -258, 88, 82, + 17, -223, -222, -129, 223, -253, 198, -250, -244, 81, + 29, -230, -231, -231, 150, -258, 82, 27, 106, 106, + 106, 106, 341, 155, 31, -222, -129, -203, 166, -203, + -203, 88, 88, -178, 465, -93, 165, 222, -83, 324, + 88, 84, -100, -100, -100, -100, -100, 158, 155, 206, + -100, -100, -93, -100, 82, -59, 183, 178, -100, -179, + -179, -100, -179, -179, 88, -100, -189, -65, 311, 341, + 20, -66, 20, 98, 99, 100, -119, -111, -111, -111, + -72, 188, 109, -277, -277, -73, -73, -276, 150, -5, + -141, -277, -277, 82, 74, 23, 12, 12, -277, 12, + 12, -277, -277, -73, -134, -132, 116, -84, -277, -277, + 82, 82, -277, -277, -277, -277, -277, -271, 432, 312, + -104, 71, 167, 72, -276, -196, -277, -156, 39, 47, + 58, -84, -84, -139, -156, -172, 20, 12, 54, 54, + -105, 13, -75, -86, -78, 150, -105, -109, 31, 54, + -3, -276, -276, -163, -167, -128, -87, -88, -88, -87, + -88, 63, 63, 63, 68, 63, 68, 63, -97, -194, + -277, -277, -3, -160, 74, -86, -100, -86, -102, -194, + 135, -169, -171, 314, 311, 317, -258, 88, 82, -238, + -226, 98, 110, 30, 73, 276, 95, 170, 29, 169, + -219, 280, -214, -214, -215, -258, 144, -215, -215, -215, + -221, 88, -221, 89, 89, 83, -32, -27, -28, 32, + 77, -245, -233, 88, 38, 83, 165, -100, 73, 73, + 73, 16, -158, -189, 82, 83, -130, 224, -128, 83, + -189, 83, -158, -231, -190, -189, -276, 163, 30, 30, + -129, -130, -215, -258, 467, 466, 83, -100, -80, 213, + 221, 81, 85, -260, 74, 204, 276, 204, 207, 166, + -59, -32, -100, -175, -175, 32, 311, 444, 442, -72, + 109, -111, -111, -277, -277, -74, -190, -137, -156, -205, + 144, 251, 187, 249, 245, 265, 256, 278, 247, 279, + -203, -205, -111, -111, -111, -111, 338, -137, 117, -84, + 115, -111, -111, 164, 164, 164, -161, 40, 88, 88, + 59, -100, -135, 14, -84, 135, -141, -162, 73, -163, + -122, -124, -123, -276, -157, -277, -189, -161, -105, 82, + 118, -91, -90, 73, 74, -92, 73, -90, 63, 63, + -277, -105, -86, -105, -105, 150, 311, 315, 316, -238, + 98, -111, 10, 88, 29, 29, -215, -215, 83, 82, + 83, 82, 83, 82, -183, 378, 110, -28, -27, -233, + -233, 89, -258, -100, -100, -100, -100, 17, 82, -222, + -128, 54, -248, 83, -252, -253, -100, -110, -130, -159, + 81, 83, -257, 341, -259, -258, -189, -189, -189, -100, + -179, -179, 32, -258, -111, -277, -141, -277, -213, -213, + -213, -217, -213, 239, -213, 239, -277, -277, 20, 20, + 20, 20, -276, -64, 334, -84, 82, 82, -276, -276, + -276, -277, 88, -214, -136, 15, 17, 28, -162, 82, + -277, -277, 82, 54, 150, -277, -137, -167, -84, -84, + 81, -84, -137, -105, -114, -214, 88, -214, 89, 89, + 378, 30, 78, 79, 80, 30, 75, 76, -159, -158, + -189, 200, 182, -277, 82, -220, 341, 344, 23, -158, + -256, -255, -190, 81, 74, -156, -214, -258, -111, -111, + -111, -111, -111, -141, 88, -111, -111, -158, -277, -158, + -158, -197, -214, -145, -150, -176, -84, -120, 29, -124, + 54, -3, -189, -122, -189, -141, -158, -141, -215, -215, + 83, 83, 23, 201, -100, -253, 345, 345, -3, 83, + 82, 118, -158, -100, -277, -277, -277, -277, -67, 128, + 341, -277, -277, -277, -277, -277, -277, -104, -148, 428, + -151, 43, -152, 44, 10, -122, 150, 83, -3, -276, + 81, -57, 341, -255, -237, -190, 88, 89, 83, -277, + 339, 70, 342, -145, 48, 257, -153, 52, -154, -149, + 53, 17, -163, -189, -57, -111, 197, -158, -58, 212, + 432, -260, 59, 340, 343, -146, 50, -144, 49, -144, + -152, 17, -155, 45, 46, 88, -277, -277, 83, 175, + -257, 59, -147, 51, 73, 101, 88, 17, 17, -267, + -268, 73, 214, 341, 73, 101, 88, 88, -268, 73, + 11, 10, 342, -266, 183, 178, 181, 31, -266, 343, + 177, 30, 98, } var yyDef = [...]int{ 33, -2, 2, 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, 809, 0, 547, 547, 547, 547, 547, 547, - 547, 0, 0, -2, -2, -2, 833, 37, 0, 921, - 0, 0, -2, 481, 482, 0, 484, -2, 0, 0, - 493, 1342, 1342, 542, 0, 0, 0, 0, 0, 1340, - 54, 55, 499, 500, 501, 1, 3, 0, 551, 817, - 0, 0, -2, 549, 0, 0, 927, 927, 927, 0, - 85, 86, 0, 0, 0, 833, 0, 0, 0, 0, - 0, 925, 0, 922, 108, 109, 89, -2, 113, 114, + 31, 32, 811, 0, 549, 549, 549, 549, 549, 549, + 549, 0, 0, -2, -2, -2, 835, 37, 0, 923, + 0, 0, -2, 483, 484, 0, 486, -2, 0, 0, + 495, 1348, 1348, 544, 0, 0, 0, 0, 0, 1346, + 54, 55, 501, 502, 503, 1, 3, 0, 553, 819, + 0, 0, -2, 551, 0, 0, 929, 929, 929, 0, + 85, 86, 0, 0, 0, 835, 0, 0, 0, 0, + 0, 927, 0, 924, 108, 109, 89, -2, 113, 114, 0, 118, 366, 327, 369, 325, 355, -2, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 330, 222, 222, 0, 0, -2, 318, 318, 318, - 0, 0, 0, 352, 929, 272, 222, 222, 0, 222, + 0, 0, 0, 352, 931, 272, 222, 222, 0, 222, 222, 222, 222, 0, 0, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, - 0, 107, 846, 0, 0, 117, 38, 34, 35, 36, - 0, 0, 0, 923, 923, 0, 418, 631, 942, 943, - 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, - 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, - 1122, 1123, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, - 1132, 1133, 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, - 1142, 1143, 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, - 1152, 1153, 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, - 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, - 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, - 1182, 1183, 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, - 1192, 1193, 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, - 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, - 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, - 1222, 1223, 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, - 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, - 1242, 1243, 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, - 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, - 1262, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, - 1272, 1273, 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, - 1282, 1283, 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, - 1292, 1293, 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, - 1302, 1303, 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, - 1312, 1313, 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, - 1322, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, - 1332, 1333, 1334, 1335, 1336, 1337, 1338, 1339, 0, 472, - 472, 472, 472, 472, 472, 0, 427, 0, 0, 0, - 0, 0, 0, 0, 444, 0, 447, 0, 0, 454, - 472, 1343, 1343, 1343, 912, 0, 478, 479, 466, 464, - 461, 462, 480, 483, 0, 488, 491, 938, 939, 0, - 506, 0, 1156, 498, 511, 512, 0, 543, 544, 39, - 682, 641, 0, 647, 649, 0, 684, 685, 686, 687, - 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 714, 715, 716, 717, 794, 795, 796, 797, 798, - 799, 800, 801, 651, 652, 791, 0, 901, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 782, 0, 751, - 751, 751, 751, 751, 751, 751, 751, 0, 0, 0, - 0, 0, 0, 0, -2, -2, 1342, 0, 521, 0, - 809, 50, 0, 547, 552, 553, 852, 0, 0, 809, - 1341, 0, 0, -2, -2, 563, 569, 570, 571, 572, - 548, 0, 575, 579, 0, 0, 0, 928, 0, 0, - 71, 0, 1310, 905, -2, -2, 0, 0, 940, 941, - 914, -2, 946, 947, 948, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, - 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, - 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, - 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, - 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, - 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, - 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, - 1034, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, - 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1053, - 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, 1062, 1063, - 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, - 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1081, -2, 1101, - 0, 0, 127, 128, 0, 37, 248, 0, 123, 0, - 242, 196, 846, 925, 935, 0, 0, 0, 0, 0, - 91, 115, 116, 222, 222, 0, 117, 117, 334, 335, - 336, 0, 0, -2, 246, 0, 319, 0, 0, 236, - 236, 240, 238, 239, 0, 0, 0, 0, 0, 0, - 346, 0, 347, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 402, 0, 223, 0, 364, 365, 273, 0, - 0, 0, 0, 344, 345, 0, 0, 930, 931, 0, - 0, 222, 222, 0, 0, 0, 0, 222, 222, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 101, 837, 0, 0, 0, 0, - 0, 0, -2, 0, 410, 0, 923, 0, 0, 0, - 0, 417, 0, 419, 420, 0, 0, 421, 422, 423, - 424, 425, 472, 0, 472, 0, 472, 472, 472, 472, - 469, 0, 469, 467, 468, 459, 460, 1343, 1343, 1343, - 0, 1343, 1343, 0, 1343, 1343, 0, 231, 232, 233, - 475, 451, 452, 455, 456, 1344, 1345, 457, 458, 913, - 489, 492, 509, 507, 508, 510, 502, 503, 504, 505, - 0, 522, 523, 528, 0, 0, 0, 0, 534, 535, - 536, 0, 0, 539, 540, 541, 0, 0, 0, 0, - 0, 645, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 669, 670, 671, 672, 673, 674, 675, 648, 0, - 662, 0, 0, 0, 704, 705, 706, 707, 708, 709, - 710, 711, 712, 0, 560, 0, 0, 0, 809, 0, - 0, 0, 0, 0, 0, 0, 557, 0, 783, 0, - 735, 743, 0, 736, 744, 737, 745, 738, 0, 739, - 746, 740, 747, 741, 742, 748, 0, 0, 0, 560, - 560, 0, 0, 40, 513, 514, 0, 614, 933, 817, - 0, 562, 855, 0, 0, 818, 810, 811, 814, 817, - 0, 584, 573, 564, 567, 568, 550, 0, 576, 580, - 0, 582, 583, 0, 0, 69, 0, 630, 0, 586, - 588, 589, 590, 612, 0, 0, 0, 0, 65, 67, - 631, 0, 1310, 911, 0, 73, 74, 0, 0, 0, - 210, 916, 917, 918, -2, 229, 0, 135, 203, 147, + 0, 107, 848, 0, 0, 117, 38, 34, 35, 36, + 0, 0, 0, 925, 925, 0, 418, 633, 944, 945, + 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, + 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, + 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, + 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, + 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1133, + 1134, 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, + 1144, 1145, 1146, 1147, 1148, 1149, 1150, 1151, 1152, 1153, + 1154, 1155, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, + 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, + 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1182, 1183, + 1184, 1185, 1186, 1187, 1188, 1189, 1190, 1191, 1192, 1193, + 1194, 1195, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, + 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, + 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221, 1222, 1223, + 1224, 1225, 1226, 1227, 1228, 1229, 1230, 1231, 1232, 1233, + 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, 1242, 1243, + 1244, 1245, 1246, 1247, 1248, 1249, 1250, 1251, 1252, 1253, + 1254, 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, 1263, + 1264, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1272, 1273, + 1274, 1275, 1276, 1277, 1278, 1279, 1280, 1281, 1282, 1283, + 1284, 1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, + 1294, 1295, 1296, 1297, 1298, 1299, 1300, 1301, 1302, 1303, + 1304, 1305, 1306, 1307, 1308, 1309, 1310, 1311, 1312, 1313, + 1314, 1315, 1316, 1317, 1318, 1319, 1320, 1321, 1322, 1323, + 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1333, + 1334, 1335, 1336, 1337, 1338, 1339, 1340, 1341, 1342, 1343, + 1344, 1345, 0, 474, 474, 0, 474, 474, 474, 474, + 0, 0, 0, 430, 0, 0, 0, 0, 471, 0, + 0, 449, 451, 0, 0, 458, 474, 1349, 1349, 1349, + 914, 0, 468, 466, 480, 481, 463, 464, 482, 485, + 0, 490, 493, 940, 941, 0, 508, 0, 1159, 500, + 513, 514, 0, 545, 546, 39, 684, 643, 0, 649, + 651, 0, 686, 687, 688, 689, 690, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 716, 717, 718, + 719, 796, 797, 798, 799, 800, 801, 802, 803, 653, + 654, 793, 0, 903, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 784, 0, 753, 753, 753, 753, 753, + 753, 753, 753, 0, 0, 0, 0, 0, 0, 0, + -2, -2, 1348, 0, 523, 0, 811, 50, 0, 549, + 554, 555, 854, 0, 0, 811, 1347, 0, 0, -2, + -2, 565, 571, 572, 573, 574, 550, 0, 577, 581, + 0, 0, 0, 930, 0, 0, 71, 0, 1314, 907, + -2, -2, 0, 0, 942, 943, 916, -2, 948, 949, + 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, + 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, + 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, + 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, + 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 1012, 1013, 1014, 1015, 1016, 1017, 1018, 1019, + 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, + 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1038, 1039, + 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, + 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, + 1080, 1081, 1082, 1083, -2, 1103, 0, 0, 127, 128, + 0, 37, 248, 0, 123, 0, 242, 196, 848, 927, + 937, 0, 0, 0, 0, 0, 91, 115, 116, 222, + 222, 0, 117, 117, 334, 335, 336, 0, 0, -2, + 246, 0, 319, 0, 0, 236, 236, 240, 238, 239, + 0, 0, 0, 0, 0, 0, 346, 0, 347, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, + 223, 0, 364, 365, 273, 0, 0, 0, 0, 344, + 345, 0, 0, 932, 933, 0, 0, 222, 222, 0, + 0, 0, 0, 222, 222, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 839, 0, 0, 0, 0, 0, 0, -2, 0, + 410, 0, 925, 0, 0, 0, 0, 417, 0, 419, + 420, 0, 0, 421, 0, 471, 471, 469, 470, 423, + 424, 425, 426, 474, 0, 0, 231, 232, 233, 471, + 474, 0, 474, 474, 474, 474, 471, 474, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1349, 1349, 1349, + 477, 455, 456, 459, 460, 1350, 1351, 461, 462, 915, + 491, 494, 511, 509, 510, 512, 504, 505, 506, 507, + 0, 524, 525, 530, 0, 0, 0, 0, 536, 537, + 538, 0, 0, 541, 542, 543, 0, 0, 0, 0, + 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 671, 672, 673, 674, 675, 676, 677, 650, 0, + 664, 0, 0, 0, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 0, 562, 0, 0, 0, 811, 0, + 0, 0, 0, 0, 0, 0, 559, 0, 785, 0, + 737, 745, 0, 738, 746, 739, 747, 740, 0, 741, + 748, 742, 749, 743, 744, 750, 0, 0, 0, 562, + 562, 0, 0, 40, 515, 516, 0, 616, 935, 819, + 0, 564, 857, 0, 0, 820, 812, 813, 816, 819, + 0, 586, 575, 566, 569, 570, 552, 0, 578, 582, + 0, 584, 585, 0, 0, 69, 0, 632, 0, 588, + 590, 591, 592, 614, 0, 0, 0, 0, 65, 67, + 633, 0, 1314, 913, 0, 73, 74, 0, 0, 0, + 210, 918, 919, 920, -2, 229, 0, 135, 203, 147, 148, 149, 196, 151, 196, 196, 196, 196, 207, 207, 207, 207, 179, 180, 181, 182, 183, 0, 0, 166, 196, 196, 196, 196, 186, 187, 188, 189, 190, 191, 192, 193, 152, 153, 154, 155, 156, 157, 158, 159, 160, 198, 198, 198, 200, 200, 0, 38, 0, 214, - 0, 814, 0, 837, 0, 0, 936, 0, 935, 935, - 935, 106, 0, 0, 0, 367, 328, 356, 368, 0, + 0, 816, 0, 839, 0, 0, 938, 0, 937, 937, + 937, 106, 0, 0, 0, 367, 328, 356, 368, 0, 331, 332, -2, 0, 0, 318, 0, 320, 0, 230, 0, -2, 0, 0, 0, 236, 240, 237, 240, 228, - 241, 348, 791, 0, 349, 350, 0, 382, 600, 0, + 241, 348, 793, 0, 349, 350, 0, 382, 602, 0, 0, 0, 0, 0, 388, 389, 390, 0, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 357, 358, 359, 360, 361, 362, 363, 0, 0, 320, 0, 353, @@ -4833,100 +4870,101 @@ var yyDef = [...]int{ 0, 284, 285, 286, 287, 288, 312, 313, 314, 289, 290, 291, 292, 293, 294, 295, 306, 307, 308, 309, 310, 311, 296, 297, 298, 299, 300, 303, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 834, 835, - 836, 0, 0, 0, 0, 0, 261, 63, 924, 416, - 632, 944, 945, 473, 474, 426, 445, 428, 448, 429, - 431, 430, 432, 472, 0, 0, 0, 234, 235, 472, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 0, - 450, 0, 0, 0, 490, 494, 495, 496, 497, 0, - 0, 525, 530, 531, 532, 533, 545, 538, 683, 642, - 643, 644, 646, 663, 0, 665, 667, 653, 654, 678, - 679, 680, 0, 0, 0, 0, 676, 658, 0, 689, - 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 703, 766, 767, 768, 0, 701, 702, 713, 0, - 0, 0, 561, 792, 0, -2, 0, 681, 900, 817, - 0, 0, 0, 0, 686, 794, 0, 686, 794, 0, - 0, 0, 558, 559, 789, 786, 0, 0, 752, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 516, 517, - 519, 0, 634, 0, 615, 0, 617, 618, 0, 934, - 852, 51, 41, 0, 853, 0, 0, 0, 0, 813, - 815, 816, 852, 0, 802, 0, 0, 639, 0, 0, - 565, 47, 581, 577, 0, 639, 0, 0, 629, 0, - 0, 0, 0, 0, 0, 619, 0, 0, 622, 0, - 0, 0, 0, 613, 0, 0, 0, -2, 0, 0, - 0, 61, 62, 0, 0, 0, 906, 72, 0, 0, - 77, 78, 907, 908, 909, 910, 0, 110, -2, 269, - 129, 131, 132, 133, 124, 134, 205, 204, 150, 207, - 207, 173, 174, 210, 0, 210, 210, 210, 0, 0, - 167, 168, 169, 170, 161, 0, 162, 163, 164, 0, - 165, 247, 0, 821, 215, 216, 218, 222, 0, 0, - 243, 244, 0, 0, 100, 0, 937, 0, 0, 0, - 926, 119, 120, 121, 122, 117, 0, 0, 125, 322, - 0, 0, 0, 245, 0, 0, 224, 240, 225, 226, - 0, 351, 0, 0, 384, 385, 386, 387, 0, 0, - 0, 320, 322, 210, 0, 276, 277, 282, 283, 301, - 0, 0, 0, 0, 847, 848, 0, 851, 92, 374, - 376, 375, 379, 0, 0, 0, 0, 411, 261, 821, - 0, 415, 262, 263, 433, 470, 471, 469, 449, 469, - 476, 453, 486, 529, 0, 0, 0, 537, 0, 664, - 666, 668, 655, 676, 659, 0, 656, 0, 0, 650, - 718, 0, 0, 560, 0, 809, 852, 722, 723, 0, - 0, 0, 0, 0, 759, 0, 0, 760, 0, 809, - 0, 787, 0, 0, 734, 753, 0, 0, 754, 755, - 756, 757, 758, 515, 518, 520, 594, 0, 0, 0, - 0, 616, 932, 43, 0, 0, 0, 819, 820, 812, - 42, 0, 919, 920, 803, 804, 805, 0, 574, 585, - 566, 0, 817, 894, 0, 0, 886, 0, 0, 639, - 902, 0, 587, 608, 610, 0, 605, 620, 621, 623, - 0, 625, 0, 627, 628, 591, 592, 593, 0, 639, - 0, 639, 66, 639, 68, 0, 633, 75, 76, 0, - 0, 82, 211, 212, 117, 271, 130, 136, 0, 0, - 0, 140, 0, 0, 143, 145, 146, 206, 210, 210, - 175, 208, 209, 176, 177, 178, 0, 194, 0, 0, - 0, 264, 87, 825, 824, 222, 222, 217, 0, 220, - 0, 197, 0, 102, 0, 0, 0, 0, 326, 598, - 0, 337, 338, 0, 321, 381, 0, 214, 0, 227, - 792, 601, 0, 0, 339, 0, 322, 342, 343, 354, - 304, 305, 302, 596, 838, 839, 840, 0, 850, 95, - 0, 0, 0, 0, 372, 0, 413, 414, 64, 472, - 472, 524, 0, 527, 0, 657, 0, 677, 660, 719, - 720, 0, 793, 817, 45, 0, 196, 196, 772, 196, - 200, 775, 196, 777, 196, 780, 0, 0, 0, 0, - 0, 0, 0, 784, 733, 790, 0, 0, 0, 0, - 0, 0, 0, 0, 207, 857, 854, 44, 807, 0, - 640, 578, 48, 52, 0, 894, 885, 896, 898, 0, - 0, 0, 890, 0, 809, 0, 0, 602, 609, 0, - 0, 603, 0, 604, 624, 626, -2, 809, 639, 59, - 60, 0, 79, 80, 81, 270, 137, 138, 0, 141, - 142, 144, 171, 172, 207, 0, 207, 0, 201, 0, - 253, 265, 0, 822, 823, 0, 0, 219, 221, 596, - 103, 104, 105, 0, 0, 126, 323, 0, 213, 0, - 0, 406, 403, 340, 341, 0, 0, 849, 373, 0, - 93, 94, 0, 0, 378, 412, 434, 446, 526, 546, - 661, 721, 852, 724, 769, 207, 773, 774, 776, 778, - 779, 781, 726, 725, 0, 0, 0, 0, 0, 817, - 0, 788, 0, 0, 0, 0, 0, 614, 207, 877, - 49, 0, 0, 0, 53, 0, 899, 0, 0, 0, - 0, 70, 817, 903, 904, 606, 0, 611, 817, 58, - 139, 210, 195, 210, 0, 0, 266, 826, 827, 828, - 829, 830, 831, 832, 0, 329, 599, 0, 0, 383, - 0, 391, 0, 0, 0, 0, 96, 97, 0, 0, - 0, 46, 770, 771, 0, 0, 0, 0, 761, 0, - 785, 0, 0, 0, 636, 0, 0, 634, 859, 858, - 871, 875, 808, 806, 0, 897, 0, 889, 892, 888, - 891, 56, 0, 57, 184, 185, 199, 202, 0, 0, - 0, 407, 404, 405, 841, 597, 0, 0, 0, 380, - 727, 729, 728, 730, 0, 0, 0, 732, 749, 750, - 635, 637, 638, 595, 877, 0, 870, 873, -2, 0, - 0, 887, 0, 607, 841, 0, 0, 370, 843, 98, - 99, 315, 316, 317, 92, 731, 0, 0, 0, 864, - 862, 862, 875, 0, 879, 0, 884, 0, 895, 893, - 88, 0, 0, 0, 0, 844, 845, 95, 762, 0, - 765, 867, 0, 860, 863, 861, 872, 0, 878, 0, - 0, 876, 408, 409, 249, 0, 377, 763, 856, 0, - 865, 866, 874, 0, 0, 250, 251, 0, 842, 0, - 868, 869, 880, 882, 252, 0, 0, 0, 0, 254, - 256, 257, 0, 0, 255, 764, 258, 259, 260, + 0, 0, 0, 0, 0, 0, 0, 0, 836, 837, + 838, 0, 0, 0, 0, 0, 261, 63, 926, 416, + 634, 946, 947, 475, 476, 0, 234, 235, 474, 474, + 427, 450, 0, 474, 431, 452, 432, 434, 433, 435, + 474, 438, 472, 473, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 454, 0, 0, 0, 492, 496, + 497, 498, 499, 0, 0, 527, 532, 533, 534, 535, + 547, 540, 685, 644, 645, 646, 648, 665, 0, 667, + 669, 655, 656, 680, 681, 682, 0, 0, 0, 0, + 678, 660, 0, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 705, 768, 769, 770, 0, + 703, 704, 715, 0, 0, 0, 563, 794, 0, -2, + 0, 683, 902, 819, 0, 0, 0, 0, 688, 796, + 0, 688, 796, 0, 0, 0, 560, 561, 791, 788, + 0, 0, 754, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 518, 519, 521, 0, 636, 0, 617, 0, + 619, 620, 0, 936, 854, 51, 41, 0, 855, 0, + 0, 0, 0, 815, 817, 818, 854, 0, 804, 0, + 0, 641, 0, 0, 567, 47, 583, 579, 0, 641, + 0, 0, 631, 0, 0, 0, 0, 0, 0, 621, + 0, 0, 624, 0, 0, 0, 0, 615, 0, 0, + 0, -2, 0, 0, 0, 61, 62, 0, 0, 0, + 908, 72, 0, 0, 77, 78, 909, 910, 911, 912, + 0, 110, -2, 269, 129, 131, 132, 133, 124, 134, + 205, 204, 150, 207, 207, 173, 174, 210, 0, 210, + 210, 210, 0, 0, 167, 168, 169, 170, 161, 0, + 162, 163, 164, 0, 165, 247, 0, 823, 215, 216, + 218, 222, 0, 0, 243, 244, 0, 0, 100, 0, + 939, 0, 0, 0, 928, 119, 120, 121, 122, 117, + 0, 0, 125, 322, 0, 0, 0, 245, 0, 0, + 224, 240, 225, 226, 0, 351, 0, 0, 384, 385, + 386, 387, 0, 0, 0, 320, 322, 210, 0, 276, + 277, 282, 283, 301, 0, 0, 0, 0, 849, 850, + 0, 853, 92, 374, 376, 375, 379, 0, 0, 0, + 0, 411, 261, 823, 0, 415, 262, 263, 471, 437, + 453, 471, 429, 436, 478, 457, 488, 531, 0, 0, + 0, 539, 0, 666, 668, 670, 657, 678, 661, 0, + 658, 0, 0, 652, 720, 0, 0, 562, 0, 811, + 854, 724, 725, 0, 0, 0, 0, 0, 761, 0, + 0, 762, 0, 811, 0, 789, 0, 0, 736, 755, + 0, 0, 756, 757, 758, 759, 760, 517, 520, 522, + 596, 0, 0, 0, 0, 618, 934, 43, 0, 0, + 0, 821, 822, 814, 42, 0, 921, 922, 805, 806, + 807, 0, 576, 587, 568, 0, 819, 896, 0, 0, + 888, 0, 0, 641, 904, 0, 589, 610, 612, 0, + 607, 622, 623, 625, 0, 627, 0, 629, 630, 593, + 594, 595, 0, 641, 0, 641, 66, 641, 68, 0, + 635, 75, 76, 0, 0, 82, 211, 212, 117, 271, + 130, 136, 0, 0, 0, 140, 0, 0, 143, 145, + 146, 206, 210, 210, 175, 208, 209, 176, 177, 178, + 0, 194, 0, 0, 0, 264, 87, 827, 826, 222, + 222, 217, 0, 220, 0, 197, 0, 102, 0, 0, + 0, 0, 326, 600, 0, 337, 338, 0, 321, 381, + 0, 214, 0, 227, 794, 603, 0, 0, 339, 0, + 322, 342, 343, 354, 304, 305, 302, 598, 840, 841, + 842, 0, 852, 95, 0, 0, 0, 0, 372, 0, + 413, 414, 64, 474, 474, 526, 0, 529, 0, 659, + 0, 679, 662, 721, 722, 0, 795, 819, 45, 0, + 196, 196, 774, 196, 200, 777, 196, 779, 196, 782, + 0, 0, 0, 0, 0, 0, 0, 786, 735, 792, + 0, 0, 0, 0, 0, 0, 0, 0, 207, 859, + 856, 44, 809, 0, 642, 580, 48, 52, 0, 896, + 887, 898, 900, 0, 0, 0, 892, 0, 811, 0, + 0, 604, 611, 0, 0, 605, 0, 606, 626, 628, + -2, 811, 641, 59, 60, 0, 79, 80, 81, 270, + 137, 138, 0, 141, 142, 144, 171, 172, 207, 0, + 207, 0, 201, 0, 253, 265, 0, 824, 825, 0, + 0, 219, 221, 598, 103, 104, 105, 0, 0, 126, + 323, 0, 213, 0, 0, 406, 403, 340, 341, 0, + 0, 851, 373, 0, 93, 94, 0, 0, 378, 412, + 422, 428, 528, 548, 663, 723, 854, 726, 771, 207, + 775, 776, 778, 780, 781, 783, 728, 727, 0, 0, + 0, 0, 0, 819, 0, 790, 0, 0, 0, 0, + 0, 616, 207, 879, 49, 0, 0, 0, 53, 0, + 901, 0, 0, 0, 0, 70, 819, 905, 906, 608, + 0, 613, 819, 58, 139, 210, 195, 210, 0, 0, + 266, 828, 829, 830, 831, 832, 833, 834, 0, 329, + 601, 0, 0, 383, 0, 391, 0, 0, 0, 0, + 96, 97, 0, 0, 0, 46, 772, 773, 0, 0, + 0, 0, 763, 0, 787, 0, 0, 0, 638, 0, + 0, 636, 861, 860, 873, 877, 810, 808, 0, 899, + 0, 891, 894, 890, 893, 56, 0, 57, 184, 185, + 199, 202, 0, 0, 0, 407, 404, 405, 843, 599, + 0, 0, 0, 380, 729, 731, 730, 732, 0, 0, + 0, 734, 751, 752, 637, 639, 640, 597, 879, 0, + 872, 875, -2, 0, 0, 889, 0, 609, 843, 0, + 0, 370, 845, 98, 99, 315, 316, 317, 92, 733, + 0, 0, 0, 866, 864, 864, 877, 0, 881, 0, + 886, 0, 897, 895, 88, 0, 0, 0, 0, 846, + 847, 95, 764, 0, 767, 869, 0, 862, 865, 863, + 874, 0, 880, 0, 0, 878, 408, 409, 249, 0, + 377, 765, 858, 0, 867, 868, 876, 0, 0, 250, + 251, 0, 844, 0, 870, 871, 882, 884, 252, 0, + 0, 0, 0, 254, 256, 257, 0, 0, 255, 766, + 258, 259, 260, } var yyTok1 = [...]int{ @@ -4935,7 +4973,7 @@ var yyTok1 = [...]int{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 111, 3, 3, 3, 138, 130, 3, 81, 83, 135, 133, 82, 134, 150, 136, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 464, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 468, 119, 118, 120, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, @@ -5012,7 +5050,8 @@ var yyTok3 = [...]int{ 57770, 445, 57771, 446, 57772, 447, 57773, 448, 57774, 449, 57775, 450, 57776, 451, 57777, 452, 57778, 453, 57779, 454, 57780, 455, 57781, 456, 57782, 457, 57783, 458, 57784, 459, - 57785, 460, 57786, 461, 57787, 462, 57788, 463, 0, + 57785, 460, 57786, 461, 57787, 462, 57788, 463, 57789, 464, + 57790, 465, 57791, 466, 57792, 467, 0, } var yyErrorMessages = [...]struct { @@ -7757,10 +7796,10 @@ yydefault: yyVAL.statement = &Show{&ShowBasic{Command: Collation, Filter: yyDollar[3].showFilter}} } case 422: - yyDollar = yyS[yypt-3 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] //line sql.y:2324 { - yyVAL.statement = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Full: yyDollar[2].boolean, Command: Column, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter}} } case 423: yyDollar = yyS[yypt-3 : yypt+1] @@ -7772,7 +7811,7 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2332 { - yyVAL.statement = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: Database, Filter: yyDollar[3].showFilter}} } case 425: yyDollar = yyS[yypt-3 : yypt+1] @@ -7781,1208 +7820,1213 @@ yydefault: yyVAL.statement = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilter}} } case 426: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-3 : yypt+1] //line sql.y:2340 { - yyVAL.statement = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: Keyspace, Filter: yyDollar[3].showFilter}} } case 427: - yyDollar = yyS[yypt-2 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2344 { - yyVAL.statement = &Show{&ShowBasic{Command: Privilege}} + yyVAL.statement = &Show{&ShowBasic{Command: Function, Filter: yyDollar[4].showFilter}} } case 428: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-7 : yypt+1] //line sql.y:2348 { - yyVAL.statement = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: Index, Tbl: yyDollar[5].tableName, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter}} } case 429: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line sql.y:2352 { - yyVAL.statement = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: OpenTable, DbName: yyDollar[4].str, Filter: yyDollar[5].showFilter}} } case 430: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-2 : yypt+1] //line sql.y:2356 { - yyVAL.statement = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: Privilege}} } case 431: yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2360 { - yyVAL.statement = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: Procedure, Filter: yyDollar[4].showFilter}} } case 432: yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2364 { - yyVAL.statement = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: StatusSession, Filter: yyDollar[4].showFilter}} } case 433: - yyDollar = yyS[yypt-5 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2368 { - yyVAL.statement = &Show{&ShowTableStatus{DatabaseName: yyDollar[4].str, Filter: yyDollar[5].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: StatusGlobal, Filter: yyDollar[4].showFilter}} } case 434: - yyDollar = yyS[yypt-7 : yypt+1] + yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2372 { - yyVAL.statement = &Show{&ShowColumns{Full: yyDollar[2].str, Table: yyDollar[5].tableName, DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter}} + yyVAL.statement = &Show{&ShowBasic{Command: VariableSession, Filter: yyDollar[4].showFilter}} } case 435: yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2376 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String()), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowBasic{Command: VariableGlobal, Filter: yyDollar[4].showFilter}} } case 436: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line sql.y:2380 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowBasic{Command: TableStatus, DbName: yyDollar[4].str, Filter: yyDollar[5].showFilter}} } case 437: - yyDollar = yyS[yypt-4 : yypt+1] + yyDollar = yyS[yypt-5 : yypt+1] //line sql.y:2384 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowBasic{Command: Table, Full: yyDollar[2].boolean, DbName: yyDollar[4].str, Filter: yyDollar[5].showFilter}} } case 438: yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2388 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowBasic{Command: Trigger, DbName: yyDollar[3].str, Filter: yyDollar[4].showFilter}} } case 439: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2393 +//line sql.y:2392 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String()), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateDb, Op: yyDollar[4].tableName}} } case 440: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2397 +//line sql.y:2396 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateE, Op: yyDollar[4].tableName}} } case 441: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2401 +//line sql.y:2400 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateF, Op: yyDollar[4].tableName}} } case 442: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2405 +//line sql.y:2404 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateProc, Op: yyDollar[4].tableName}} } case 443: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2409 +//line sql.y:2408 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateTbl, Op: yyDollar[4].tableName}} } case 444: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2413 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:2412 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateTr, Op: yyDollar[4].tableName}} } case 445: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2417 +//line sql.y:2416 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowCreate{Command: CreateV, Op: yyDollar[4].tableName}} } case 446: - yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2421 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:2420 { - showTablesOpt := &ShowTablesOpt{DbName: yyDollar[6].str, Filter: yyDollar[7].showFilter} - yyVAL.statement = &Show{&ShowLegacy{Extended: string(yyDollar[2].str), Type: string(yyDollar[3].str), ShowTablesOpt: showTablesOpt, OnTable: yyDollar[5].tableName, Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} } case 447: - yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2426 + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:2424 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].colIdent.String()), Scope: ImplicitScope}} } case 448: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2430 +//line sql.y:2428 { - yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} } case 449: - yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2434 + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2432 { - // this is ugly, but I couldn't find a better way for now - if yyDollar[3].str == "processlist" { - yyVAL.statement = &Show{&ShowLegacy{Type: yyDollar[3].str, Scope: ImplicitScope}} - } else { - showTablesOpt := &ShowTablesOpt{Full: yyDollar[2].str, DbName: yyDollar[4].str, Filter: yyDollar[5].showFilter} - yyVAL.statement = &Show{&ShowLegacy{Type: yyDollar[3].str, ShowTablesOpt: showTablesOpt, Scope: ImplicitScope}} - } + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} } case 450: yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:2436 + { + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + } + case 451: + yyDollar = yyS[yypt-2 : yypt+1] +//line sql.y:2440 + { + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} + } + case 452: + yyDollar = yyS[yypt-4 : yypt+1] //line sql.y:2444 + { + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Table: yyDollar[4].tableName, Scope: ImplicitScope}} + } + case 453: + yyDollar = yyS[yypt-5 : yypt+1] +//line sql.y:2448 + { + yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[3].bytes), Scope: ImplicitScope}} + } + case 454: + yyDollar = yyS[yypt-4 : yypt+1] +//line sql.y:2452 { showTablesOpt := &ShowTablesOpt{Filter: yyDollar[4].showFilter} yyVAL.statement = &Show{&ShowLegacy{Scope: VitessMetadataScope, Type: string(yyDollar[3].bytes), ShowTablesOpt: showTablesOpt}} } - case 451: + case 455: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2449 +//line sql.y:2457 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} } - case 452: + case 456: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2453 +//line sql.y:2461 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), Scope: ImplicitScope}} } - case 453: + case 457: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2457 +//line sql.y:2465 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes) + " " + string(yyDollar[3].bytes), OnTable: yyDollar[5].tableName, Scope: ImplicitScope}} } - case 454: + case 458: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2461 +//line sql.y:2469 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} } - case 455: + case 459: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2466 +//line sql.y:2474 { // This should probably be a different type (ShowVitessTopoOpt), but // just getting the thing working for now showTablesOpt := &ShowTablesOpt{Filter: yyDollar[3].showFilter} yyVAL.statement = &Show{&ShowLegacy{Type: yyDollar[2].str, ShowTablesOpt: showTablesOpt}} } - case 456: + case 460: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2480 +//line sql.y:2488 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].colIdent.String()), Scope: ImplicitScope}} } - case 457: + case 461: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2484 +//line sql.y:2492 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} } - case 458: + case 462: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2488 +//line sql.y:2496 { yyVAL.statement = &Show{&ShowLegacy{Type: string(yyDollar[2].bytes), Scope: ImplicitScope}} } - case 459: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2494 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 460: - yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2498 - { - yyVAL.str = string(yyDollar[1].bytes) - } - case 461: + case 463: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2504 +//line sql.y:2502 { yyVAL.str = string(yyDollar[1].bytes) } - case 462: + case 464: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2508 +//line sql.y:2506 { yyVAL.str = string(yyDollar[1].bytes) } - case 463: + case 465: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2514 +//line sql.y:2512 { yyVAL.str = "" } - case 464: + case 466: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2518 +//line sql.y:2516 { yyVAL.str = "extended " } - case 465: + case 467: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2524 +//line sql.y:2522 { - yyVAL.str = "" + yyVAL.boolean = false } - case 466: + case 468: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2528 +//line sql.y:2526 { - yyVAL.str = "full " + yyVAL.boolean = true } - case 467: + case 469: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2534 +//line sql.y:2532 { yyVAL.str = string(yyDollar[1].bytes) } - case 468: + case 470: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2538 +//line sql.y:2536 { yyVAL.str = string(yyDollar[1].bytes) } - case 469: + case 471: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2544 +//line sql.y:2542 { yyVAL.str = "" } - case 470: + case 472: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2548 +//line sql.y:2546 { yyVAL.str = yyDollar[2].tableIdent.v } - case 471: + case 473: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2552 +//line sql.y:2550 { yyVAL.str = yyDollar[2].tableIdent.v } - case 472: + case 474: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2558 +//line sql.y:2556 { yyVAL.showFilter = nil } - case 473: + case 475: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2562 +//line sql.y:2560 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 474: + case 476: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2566 +//line sql.y:2564 { yyVAL.showFilter = &ShowFilter{Filter: yyDollar[2].expr} } - case 475: + case 477: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2572 +//line sql.y:2570 { yyVAL.showFilter = nil } - case 476: + case 478: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2576 +//line sql.y:2574 { yyVAL.showFilter = &ShowFilter{Like: string(yyDollar[2].bytes)} } - case 477: + case 479: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2582 +//line sql.y:2580 { yyVAL.empty = struct{}{} } - case 478: + case 480: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2586 +//line sql.y:2584 { yyVAL.empty = struct{}{} } - case 479: + case 481: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2590 +//line sql.y:2588 { yyVAL.empty = struct{}{} } - case 480: + case 482: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2596 +//line sql.y:2594 { yyVAL.statement = &Use{DBName: yyDollar[2].tableIdent} } - case 481: + case 483: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2600 +//line sql.y:2598 { yyVAL.statement = &Use{DBName: TableIdent{v: ""}} } - case 482: + case 484: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2606 +//line sql.y:2604 { yyVAL.statement = &Begin{} } - case 483: + case 485: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2610 +//line sql.y:2608 { yyVAL.statement = &Begin{} } - case 484: + case 486: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2616 +//line sql.y:2614 { yyVAL.statement = &Commit{} } - case 485: + case 487: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2622 +//line sql.y:2620 { yyVAL.statement = &Rollback{} } - case 486: + case 488: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:2626 +//line sql.y:2624 { yyVAL.statement = &SRollback{Name: yyDollar[5].colIdent} } - case 487: + case 489: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2631 +//line sql.y:2629 { yyVAL.empty = struct{}{} } - case 488: + case 490: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2633 +//line sql.y:2631 { yyVAL.empty = struct{}{} } - case 489: + case 491: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2636 +//line sql.y:2634 { yyVAL.empty = struct{}{} } - case 490: + case 492: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2638 +//line sql.y:2636 { yyVAL.empty = struct{}{} } - case 491: + case 493: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2643 +//line sql.y:2641 { yyVAL.statement = &Savepoint{Name: yyDollar[2].colIdent} } - case 492: + case 494: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2649 +//line sql.y:2647 { yyVAL.statement = &Release{Name: yyDollar[3].colIdent} } - case 493: + case 495: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2654 +//line sql.y:2652 { yyVAL.explainType = EmptyType } - case 494: + case 496: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2658 +//line sql.y:2656 { yyVAL.explainType = JSONType } - case 495: + case 497: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2662 +//line sql.y:2660 { yyVAL.explainType = TreeType } - case 496: + case 498: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2666 +//line sql.y:2664 { yyVAL.explainType = VitessType } - case 497: + case 499: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2670 +//line sql.y:2668 { yyVAL.explainType = TraditionalType } - case 498: + case 500: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2674 +//line sql.y:2672 { yyVAL.explainType = AnalyzeType } - case 499: + case 501: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2680 +//line sql.y:2678 { yyVAL.bytes = yyDollar[1].bytes } - case 500: + case 502: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2684 +//line sql.y:2682 { yyVAL.bytes = yyDollar[1].bytes } - case 501: + case 503: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2688 +//line sql.y:2686 { yyVAL.bytes = yyDollar[1].bytes } - case 502: + case 504: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2694 +//line sql.y:2692 { yyVAL.statement = yyDollar[1].selStmt } - case 503: + case 505: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2698 +//line sql.y:2696 { yyVAL.statement = yyDollar[1].statement } - case 504: + case 506: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2702 +//line sql.y:2700 { yyVAL.statement = yyDollar[1].statement } - case 505: + case 507: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2706 +//line sql.y:2704 { yyVAL.statement = yyDollar[1].statement } - case 506: + case 508: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2711 +//line sql.y:2709 { yyVAL.str = "" } - case 507: + case 509: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2715 +//line sql.y:2713 { yyVAL.str = yyDollar[1].colIdent.val } - case 508: + case 510: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2719 +//line sql.y:2717 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'" } - case 509: + case 511: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2725 +//line sql.y:2723 { yyVAL.statement = &ExplainTab{Table: yyDollar[2].tableName, Wild: yyDollar[3].str} } - case 510: + case 512: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2729 +//line sql.y:2727 { yyVAL.statement = &ExplainStmt{Type: yyDollar[2].explainType, Statement: yyDollar[3].statement} } - case 511: + case 513: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2735 +//line sql.y:2733 { yyVAL.statement = &OtherAdmin{} } - case 512: + case 514: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2739 +//line sql.y:2737 { yyVAL.statement = &OtherAdmin{} } - case 513: + case 515: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2745 +//line sql.y:2743 { yyVAL.statement = &LockTables{Tables: yyDollar[3].tableAndLockTypes} } - case 514: + case 516: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2751 +//line sql.y:2749 { yyVAL.tableAndLockTypes = TableAndLockTypes{yyDollar[1].tableAndLockType} } - case 515: + case 517: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2755 +//line sql.y:2753 { yyVAL.tableAndLockTypes = append(yyDollar[1].tableAndLockTypes, yyDollar[3].tableAndLockType) } - case 516: + case 518: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2761 +//line sql.y:2759 { yyVAL.tableAndLockType = &TableAndLockType{Table: yyDollar[1].aliasedTableName, Lock: yyDollar[2].lockType} } - case 517: + case 519: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2767 +//line sql.y:2765 { yyVAL.lockType = Read } - case 518: + case 520: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2771 +//line sql.y:2769 { yyVAL.lockType = ReadLocal } - case 519: + case 521: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2775 +//line sql.y:2773 { yyVAL.lockType = Write } - case 520: + case 522: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2779 +//line sql.y:2777 { yyVAL.lockType = LowPriorityWrite } - case 521: + case 523: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2785 +//line sql.y:2783 { yyVAL.statement = &UnlockTables{} } - case 522: + case 524: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2791 +//line sql.y:2789 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean, FlushOptions: yyDollar[3].strs} } - case 523: + case 525: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2795 +//line sql.y:2793 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean} } - case 524: + case 526: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2799 +//line sql.y:2797 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean, WithLock: true} } - case 525: + case 527: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2803 +//line sql.y:2801 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean, TableNames: yyDollar[4].tableNames} } - case 526: + case 528: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:2807 +//line sql.y:2805 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean, TableNames: yyDollar[4].tableNames, WithLock: true} } - case 527: + case 529: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:2811 +//line sql.y:2809 { yyVAL.statement = &Flush{IsLocal: yyDollar[2].boolean, TableNames: yyDollar[4].tableNames, ForExport: true} } - case 528: + case 530: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2817 +//line sql.y:2815 { yyVAL.strs = []string{yyDollar[1].str} } - case 529: + case 531: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2821 +//line sql.y:2819 { yyVAL.strs = append(yyDollar[1].strs, yyDollar[3].str) } - case 530: + case 532: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2827 +//line sql.y:2825 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) } - case 531: + case 533: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2831 +//line sql.y:2829 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) } - case 532: + case 534: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2835 +//line sql.y:2833 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) } - case 533: + case 535: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2839 +//line sql.y:2837 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) } - case 534: + case 536: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2843 +//line sql.y:2841 { yyVAL.str = string(yyDollar[1].bytes) } - case 535: + case 537: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2847 +//line sql.y:2845 { yyVAL.str = string(yyDollar[1].bytes) } - case 536: + case 538: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2851 +//line sql.y:2849 { yyVAL.str = string(yyDollar[1].bytes) } - case 537: + case 539: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2855 +//line sql.y:2853 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) + yyDollar[3].str } - case 538: + case 540: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2859 +//line sql.y:2857 { yyVAL.str = string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) } - case 539: + case 541: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2863 +//line sql.y:2861 { yyVAL.str = string(yyDollar[1].bytes) } - case 540: + case 542: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2867 +//line sql.y:2865 { yyVAL.str = string(yyDollar[1].bytes) } - case 541: + case 543: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2871 +//line sql.y:2869 { yyVAL.str = string(yyDollar[1].bytes) } - case 542: + case 544: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2876 +//line sql.y:2874 { yyVAL.boolean = false } - case 543: + case 545: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2880 +//line sql.y:2878 { yyVAL.boolean = true } - case 544: + case 546: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2884 +//line sql.y:2882 { yyVAL.boolean = true } - case 545: + case 547: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2889 +//line sql.y:2887 { yyVAL.str = "" } - case 546: + case 548: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2893 +//line sql.y:2891 { yyVAL.str = " " + string(yyDollar[1].bytes) + " " + string(yyDollar[2].bytes) + " " + yyDollar[3].colIdent.String() } - case 547: + case 549: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2898 +//line sql.y:2896 { setAllowComments(yylex, true) } - case 548: + case 550: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2902 +//line sql.y:2900 { yyVAL.bytes2 = yyDollar[2].bytes2 setAllowComments(yylex, false) } - case 549: + case 551: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2908 +//line sql.y:2906 { yyVAL.bytes2 = nil } - case 550: + case 552: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2912 +//line sql.y:2910 { yyVAL.bytes2 = append(yyDollar[1].bytes2, yyDollar[2].bytes) } - case 551: + case 553: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2918 +//line sql.y:2916 { yyVAL.boolean = true } - case 552: + case 554: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2922 +//line sql.y:2920 { yyVAL.boolean = false } - case 553: + case 555: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2926 +//line sql.y:2924 { yyVAL.boolean = true } - case 554: + case 556: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2931 +//line sql.y:2929 { yyVAL.str = "" } - case 555: + case 557: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2935 +//line sql.y:2933 { yyVAL.str = SQLNoCacheStr } - case 556: + case 558: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2939 +//line sql.y:2937 { yyVAL.str = SQLCacheStr } - case 557: + case 559: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2944 +//line sql.y:2942 { yyVAL.boolean = false } - case 558: + case 560: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2948 +//line sql.y:2946 { yyVAL.boolean = true } - case 559: + case 561: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2952 +//line sql.y:2950 { yyVAL.boolean = true } - case 560: + case 562: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2957 +//line sql.y:2955 { yyVAL.selectExprs = nil } - case 561: + case 563: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2961 +//line sql.y:2959 { yyVAL.selectExprs = yyDollar[1].selectExprs } - case 562: + case 564: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:2966 +//line sql.y:2964 { yyVAL.strs = nil } - case 563: + case 565: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2970 +//line sql.y:2968 { yyVAL.strs = []string{yyDollar[1].str} } - case 564: + case 566: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:2974 +//line sql.y:2972 { // TODO: This is a hack since I couldn't get it to work in a nicer way. I got 'conflicts: 8 shift/reduce' yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str} } - case 565: + case 567: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:2978 +//line sql.y:2976 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str} } - case 566: + case 568: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:2982 +//line sql.y:2980 { yyVAL.strs = []string{yyDollar[1].str, yyDollar[2].str, yyDollar[3].str, yyDollar[4].str} } - case 567: + case 569: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2988 +//line sql.y:2986 { yyVAL.str = SQLNoCacheStr } - case 568: + case 570: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2992 +//line sql.y:2990 { yyVAL.str = SQLCacheStr } - case 569: + case 571: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:2996 +//line sql.y:2994 { yyVAL.str = DistinctStr } - case 570: + case 572: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3000 +//line sql.y:2998 { yyVAL.str = DistinctStr } - case 571: + case 573: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3004 +//line sql.y:3002 { yyVAL.str = StraightJoinHint } - case 572: + case 574: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3008 +//line sql.y:3006 { yyVAL.str = SQLCalcFoundRowsStr } - case 573: + case 575: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3014 +//line sql.y:3012 { yyVAL.selectExprs = SelectExprs{yyDollar[1].selectExpr} } - case 574: + case 576: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3018 +//line sql.y:3016 { yyVAL.selectExprs = append(yyVAL.selectExprs, yyDollar[3].selectExpr) } - case 575: + case 577: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3024 +//line sql.y:3022 { yyVAL.selectExpr = &StarExpr{} } - case 576: + case 578: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3028 +//line sql.y:3026 { yyVAL.selectExpr = &AliasedExpr{Expr: yyDollar[1].expr, As: yyDollar[2].colIdent} } - case 577: + case 579: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3032 +//line sql.y:3030 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Name: yyDollar[1].tableIdent}} } - case 578: + case 580: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3036 +//line sql.y:3034 { yyVAL.selectExpr = &StarExpr{TableName: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}} } - case 579: + case 581: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3041 +//line sql.y:3039 { yyVAL.colIdent = ColIdent{} } - case 580: + case 582: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3045 +//line sql.y:3043 { yyVAL.colIdent = yyDollar[1].colIdent } - case 581: + case 583: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3049 +//line sql.y:3047 { yyVAL.colIdent = yyDollar[2].colIdent } - case 583: + case 585: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3056 +//line sql.y:3054 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 584: + case 586: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3061 +//line sql.y:3059 { yyVAL.tableExprs = TableExprs{&AliasedTableExpr{Expr: TableName{Name: NewTableIdent("dual")}}} } - case 585: + case 587: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3065 +//line sql.y:3063 { yyVAL.tableExprs = yyDollar[2].tableExprs } - case 586: + case 588: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3071 +//line sql.y:3069 { yyVAL.tableExprs = TableExprs{yyDollar[1].tableExpr} } - case 587: + case 589: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3075 +//line sql.y:3073 { yyVAL.tableExprs = append(yyVAL.tableExprs, yyDollar[3].tableExpr) } - case 590: + case 592: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3085 +//line sql.y:3083 { yyVAL.tableExpr = yyDollar[1].aliasedTableName } - case 591: + case 593: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3089 +//line sql.y:3087 { yyVAL.tableExpr = &AliasedTableExpr{Expr: yyDollar[1].derivedTable, As: yyDollar[3].tableIdent} } - case 592: + case 594: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3093 +//line sql.y:3091 { yyVAL.tableExpr = &ParenTableExpr{Exprs: yyDollar[2].tableExprs} } - case 593: + case 595: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3099 +//line sql.y:3097 { yyVAL.derivedTable = &DerivedTable{yyDollar[2].selStmt} } - case 594: + case 596: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3105 +//line sql.y:3103 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, As: yyDollar[2].tableIdent, Hints: yyDollar[3].indexHints} } - case 595: + case 597: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:3109 +//line sql.y:3107 { yyVAL.aliasedTableName = &AliasedTableExpr{Expr: yyDollar[1].tableName, Partitions: yyDollar[4].partitions, As: yyDollar[6].tableIdent, Hints: yyDollar[7].indexHints} } - case 596: + case 598: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3114 +//line sql.y:3112 { yyVAL.columns = nil } - case 597: + case 599: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3118 +//line sql.y:3116 { yyVAL.columns = yyDollar[2].columns } - case 598: + case 600: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3124 +//line sql.y:3122 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 599: + case 601: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3128 +//line sql.y:3126 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 600: + case 602: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3134 +//line sql.y:3132 { yyVAL.partitions = Partitions{yyDollar[1].colIdent} } - case 601: + case 603: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3138 +//line sql.y:3136 { yyVAL.partitions = append(yyVAL.partitions, yyDollar[3].colIdent) } - case 602: + case 604: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3151 +//line sql.y:3149 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 603: + case 605: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3155 +//line sql.y:3153 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 604: + case 606: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3159 +//line sql.y:3157 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr, Condition: yyDollar[4].joinCondition} } - case 605: + case 607: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3163 +//line sql.y:3161 { yyVAL.tableExpr = &JoinTableExpr{LeftExpr: yyDollar[1].tableExpr, Join: yyDollar[2].joinType, RightExpr: yyDollar[3].tableExpr} } - case 606: + case 608: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3169 +//line sql.y:3167 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 607: + case 609: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3171 +//line sql.y:3169 { yyVAL.joinCondition = JoinCondition{Using: yyDollar[3].columns} } - case 608: + case 610: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3175 +//line sql.y:3173 { yyVAL.joinCondition = JoinCondition{} } - case 609: + case 611: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3177 +//line sql.y:3175 { yyVAL.joinCondition = yyDollar[1].joinCondition } - case 610: + case 612: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3181 +//line sql.y:3179 { yyVAL.joinCondition = JoinCondition{} } - case 611: + case 613: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3183 +//line sql.y:3181 { yyVAL.joinCondition = JoinCondition{On: yyDollar[2].expr} } - case 612: + case 614: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3186 +//line sql.y:3184 { yyVAL.empty = struct{}{} } - case 613: + case 615: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3188 +//line sql.y:3186 { yyVAL.empty = struct{}{} } - case 614: + case 616: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3191 +//line sql.y:3189 { yyVAL.tableIdent = NewTableIdent("") } - case 615: + case 617: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3195 +//line sql.y:3193 { yyVAL.tableIdent = yyDollar[1].tableIdent } - case 616: + case 618: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3199 +//line sql.y:3197 { yyVAL.tableIdent = yyDollar[2].tableIdent } - case 618: + case 620: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3206 +//line sql.y:3204 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 619: + case 621: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3212 +//line sql.y:3210 { yyVAL.joinType = NormalJoinType } - case 620: + case 622: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3216 +//line sql.y:3214 { yyVAL.joinType = NormalJoinType } - case 621: + case 623: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3220 +//line sql.y:3218 { yyVAL.joinType = NormalJoinType } - case 622: + case 624: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3226 +//line sql.y:3224 { yyVAL.joinType = StraightJoinType } - case 623: + case 625: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3232 +//line sql.y:3230 { yyVAL.joinType = LeftJoinType } - case 624: + case 626: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3236 +//line sql.y:3234 { yyVAL.joinType = LeftJoinType } - case 625: + case 627: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3240 +//line sql.y:3238 { yyVAL.joinType = RightJoinType } - case 626: + case 628: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3244 +//line sql.y:3242 { yyVAL.joinType = RightJoinType } - case 627: + case 629: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3250 +//line sql.y:3248 { yyVAL.joinType = NaturalJoinType } - case 628: + case 630: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3254 +//line sql.y:3252 { if yyDollar[2].joinType == LeftJoinType { yyVAL.joinType = NaturalLeftJoinType @@ -8990,489 +9034,489 @@ yydefault: yyVAL.joinType = NaturalRightJoinType } } - case 629: + case 631: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3264 +//line sql.y:3262 { yyVAL.tableName = yyDollar[2].tableName } - case 630: + case 632: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3268 +//line sql.y:3266 { yyVAL.tableName = yyDollar[1].tableName } - case 631: + case 633: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3274 +//line sql.y:3272 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 632: + case 634: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3278 +//line sql.y:3276 { yyVAL.tableName = TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent} } - case 633: + case 635: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3284 +//line sql.y:3282 { yyVAL.tableName = TableName{Name: yyDollar[1].tableIdent} } - case 634: + case 636: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3289 +//line sql.y:3287 { yyVAL.indexHints = nil } - case 635: + case 637: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3293 +//line sql.y:3291 { yyVAL.indexHints = &IndexHints{Type: UseOp, Indexes: yyDollar[4].columns} } - case 636: + case 638: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3297 +//line sql.y:3295 { yyVAL.indexHints = &IndexHints{Type: UseOp} } - case 637: + case 639: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3301 +//line sql.y:3299 { yyVAL.indexHints = &IndexHints{Type: IgnoreOp, Indexes: yyDollar[4].columns} } - case 638: + case 640: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3305 +//line sql.y:3303 { yyVAL.indexHints = &IndexHints{Type: ForceOp, Indexes: yyDollar[4].columns} } - case 639: + case 641: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3310 +//line sql.y:3308 { yyVAL.expr = nil } - case 640: + case 642: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3314 +//line sql.y:3312 { yyVAL.expr = yyDollar[2].expr } - case 641: + case 643: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3320 +//line sql.y:3318 { yyVAL.expr = yyDollar[1].expr } - case 642: + case 644: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3324 +//line sql.y:3322 { yyVAL.expr = &AndExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 643: + case 645: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3328 +//line sql.y:3326 { yyVAL.expr = &OrExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 644: + case 646: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3332 +//line sql.y:3330 { yyVAL.expr = &XorExpr{Left: yyDollar[1].expr, Right: yyDollar[3].expr} } - case 645: + case 647: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3336 +//line sql.y:3334 { yyVAL.expr = &NotExpr{Expr: yyDollar[2].expr} } - case 646: + case 648: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3340 +//line sql.y:3338 { yyVAL.expr = &IsExpr{Operator: yyDollar[3].isExprOperator, Expr: yyDollar[1].expr} } - case 647: + case 649: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3344 +//line sql.y:3342 { yyVAL.expr = yyDollar[1].expr } - case 648: + case 650: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3348 +//line sql.y:3346 { yyVAL.expr = &Default{ColName: yyDollar[2].str} } - case 649: + case 651: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3354 +//line sql.y:3352 { yyVAL.str = "" } - case 650: + case 652: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3358 +//line sql.y:3356 { yyVAL.str = string(yyDollar[2].colIdent.String()) } - case 651: + case 653: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3364 +//line sql.y:3362 { yyVAL.boolVal = BoolVal(true) } - case 652: + case 654: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3368 +//line sql.y:3366 { yyVAL.boolVal = BoolVal(false) } - case 653: + case 655: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3374 +//line sql.y:3372 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: yyDollar[2].comparisonExprOperator, Right: yyDollar[3].expr} } - case 654: + case 656: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3378 +//line sql.y:3376 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: InOp, Right: yyDollar[3].colTuple} } - case 655: + case 657: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3382 +//line sql.y:3380 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotInOp, Right: yyDollar[4].colTuple} } - case 656: + case 658: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3386 +//line sql.y:3384 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: LikeOp, Right: yyDollar[3].expr, Escape: yyDollar[4].expr} } - case 657: + case 659: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3390 +//line sql.y:3388 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotLikeOp, Right: yyDollar[4].expr, Escape: yyDollar[5].expr} } - case 658: + case 660: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3394 +//line sql.y:3392 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: RegexpOp, Right: yyDollar[3].expr} } - case 659: + case 661: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3398 +//line sql.y:3396 { yyVAL.expr = &ComparisonExpr{Left: yyDollar[1].expr, Operator: NotRegexpOp, Right: yyDollar[4].expr} } - case 660: + case 662: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3402 +//line sql.y:3400 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: BetweenOp, From: yyDollar[3].expr, To: yyDollar[5].expr} } - case 661: + case 663: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3406 +//line sql.y:3404 { yyVAL.expr = &RangeCond{Left: yyDollar[1].expr, Operator: NotBetweenOp, From: yyDollar[4].expr, To: yyDollar[6].expr} } - case 662: + case 664: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3410 +//line sql.y:3408 { yyVAL.expr = &ExistsExpr{Subquery: yyDollar[2].subquery} } - case 663: + case 665: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3416 +//line sql.y:3414 { yyVAL.isExprOperator = IsNullOp } - case 664: + case 666: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3420 +//line sql.y:3418 { yyVAL.isExprOperator = IsNotNullOp } - case 665: + case 667: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3424 +//line sql.y:3422 { yyVAL.isExprOperator = IsTrueOp } - case 666: + case 668: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3428 +//line sql.y:3426 { yyVAL.isExprOperator = IsNotTrueOp } - case 667: + case 669: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3432 +//line sql.y:3430 { yyVAL.isExprOperator = IsFalseOp } - case 668: + case 670: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3436 +//line sql.y:3434 { yyVAL.isExprOperator = IsNotFalseOp } - case 669: + case 671: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3442 +//line sql.y:3440 { yyVAL.comparisonExprOperator = EqualOp } - case 670: + case 672: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3446 +//line sql.y:3444 { yyVAL.comparisonExprOperator = LessThanOp } - case 671: + case 673: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3450 +//line sql.y:3448 { yyVAL.comparisonExprOperator = GreaterThanOp } - case 672: + case 674: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3454 +//line sql.y:3452 { yyVAL.comparisonExprOperator = LessEqualOp } - case 673: + case 675: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3458 +//line sql.y:3456 { yyVAL.comparisonExprOperator = GreaterEqualOp } - case 674: + case 676: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3462 +//line sql.y:3460 { yyVAL.comparisonExprOperator = NotEqualOp } - case 675: + case 677: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3466 +//line sql.y:3464 { yyVAL.comparisonExprOperator = NullSafeEqualOp } - case 676: + case 678: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3471 +//line sql.y:3469 { yyVAL.expr = nil } - case 677: + case 679: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3475 +//line sql.y:3473 { yyVAL.expr = yyDollar[2].expr } - case 678: + case 680: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3481 +//line sql.y:3479 { yyVAL.colTuple = yyDollar[1].valTuple } - case 679: + case 681: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3485 +//line sql.y:3483 { yyVAL.colTuple = yyDollar[1].subquery } - case 680: + case 682: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3489 +//line sql.y:3487 { yyVAL.colTuple = ListArg(yyDollar[1].bytes) } - case 681: + case 683: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3495 +//line sql.y:3493 { yyVAL.subquery = &Subquery{yyDollar[2].selStmt} } - case 682: + case 684: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3501 +//line sql.y:3499 { yyVAL.exprs = Exprs{yyDollar[1].expr} } - case 683: + case 685: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3505 +//line sql.y:3503 { yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) } - case 684: + case 686: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3511 +//line sql.y:3509 { yyVAL.expr = yyDollar[1].expr } - case 685: + case 687: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3515 +//line sql.y:3513 { yyVAL.expr = yyDollar[1].boolVal } - case 686: + case 688: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3519 +//line sql.y:3517 { yyVAL.expr = yyDollar[1].colName } - case 687: + case 689: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3523 +//line sql.y:3521 { yyVAL.expr = yyDollar[1].expr } - case 688: + case 690: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3527 +//line sql.y:3525 { yyVAL.expr = yyDollar[1].subquery } - case 689: + case 691: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3531 +//line sql.y:3529 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitAndOp, Right: yyDollar[3].expr} } - case 690: + case 692: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3535 +//line sql.y:3533 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitOrOp, Right: yyDollar[3].expr} } - case 691: + case 693: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3539 +//line sql.y:3537 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: BitXorOp, Right: yyDollar[3].expr} } - case 692: + case 694: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3543 +//line sql.y:3541 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: PlusOp, Right: yyDollar[3].expr} } - case 693: + case 695: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3547 +//line sql.y:3545 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MinusOp, Right: yyDollar[3].expr} } - case 694: + case 696: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3551 +//line sql.y:3549 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: MultOp, Right: yyDollar[3].expr} } - case 695: + case 697: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3555 +//line sql.y:3553 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: DivOp, Right: yyDollar[3].expr} } - case 696: + case 698: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3559 +//line sql.y:3557 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: IntDivOp, Right: yyDollar[3].expr} } - case 697: + case 699: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3563 +//line sql.y:3561 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } - case 698: + case 700: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3567 +//line sql.y:3565 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ModOp, Right: yyDollar[3].expr} } - case 699: + case 701: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3571 +//line sql.y:3569 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftLeftOp, Right: yyDollar[3].expr} } - case 700: + case 702: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3575 +//line sql.y:3573 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].expr, Operator: ShiftRightOp, Right: yyDollar[3].expr} } - case 701: + case 703: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3579 +//line sql.y:3577 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONExtractOp, Right: yyDollar[3].expr} } - case 702: + case 704: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3583 +//line sql.y:3581 { yyVAL.expr = &BinaryExpr{Left: yyDollar[1].colName, Operator: JSONUnquoteExtractOp, Right: yyDollar[3].expr} } - case 703: + case 705: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3587 +//line sql.y:3585 { yyVAL.expr = &CollateExpr{Expr: yyDollar[1].expr, Charset: yyDollar[3].str} } - case 704: + case 706: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3591 +//line sql.y:3589 { yyVAL.expr = &UnaryExpr{Operator: BinaryOp, Expr: yyDollar[2].expr} } - case 705: + case 707: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3595 +//line sql.y:3593 { yyVAL.expr = &UnaryExpr{Operator: UBinaryOp, Expr: yyDollar[2].expr} } - case 706: + case 708: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3599 +//line sql.y:3597 { yyVAL.expr = &UnaryExpr{Operator: Utf8Op, Expr: yyDollar[2].expr} } - case 707: + case 709: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3603 +//line sql.y:3601 { yyVAL.expr = &UnaryExpr{Operator: Utf8mb4Op, Expr: yyDollar[2].expr} } - case 708: + case 710: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3607 +//line sql.y:3605 { yyVAL.expr = &UnaryExpr{Operator: Latin1Op, Expr: yyDollar[2].expr} } - case 709: + case 711: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3611 +//line sql.y:3609 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { yyVAL.expr = num @@ -9480,9 +9524,9 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UPlusOp, Expr: yyDollar[2].expr} } } - case 710: + case 712: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3619 +//line sql.y:3617 { if num, ok := yyDollar[2].expr.(*Literal); ok && num.Type == IntVal { // Handle double negative @@ -9496,21 +9540,21 @@ yydefault: yyVAL.expr = &UnaryExpr{Operator: UMinusOp, Expr: yyDollar[2].expr} } } - case 711: + case 713: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3633 +//line sql.y:3631 { yyVAL.expr = &UnaryExpr{Operator: TildaOp, Expr: yyDollar[2].expr} } - case 712: + case 714: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3637 +//line sql.y:3635 { yyVAL.expr = &UnaryExpr{Operator: BangOp, Expr: yyDollar[2].expr} } - case 713: + case 715: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3641 +//line sql.y:3639 { // This rule prevents the usage of INTERVAL // as a function. If support is needed for that, @@ -9518,503 +9562,503 @@ yydefault: // will be non-trivial because of grammar conflicts. yyVAL.expr = &IntervalExpr{Expr: yyDollar[2].expr, Unit: yyDollar[3].colIdent.String()} } - case 718: + case 720: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3659 +//line sql.y:3657 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Exprs: yyDollar[3].selectExprs} } - case 719: + case 721: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3663 +//line sql.y:3661 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 720: + case 722: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3667 +//line sql.y:3665 { yyVAL.expr = &FuncExpr{Name: yyDollar[1].colIdent, Distinct: true, Exprs: yyDollar[4].selectExprs} } - case 721: + case 723: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3671 +//line sql.y:3669 { yyVAL.expr = &FuncExpr{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].colIdent, Exprs: yyDollar[5].selectExprs} } - case 722: + case 724: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3681 +//line sql.y:3679 { yyVAL.expr = &FuncExpr{Name: NewColIdent("left"), Exprs: yyDollar[3].selectExprs} } - case 723: + case 725: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3685 +//line sql.y:3683 { yyVAL.expr = &FuncExpr{Name: NewColIdent("right"), Exprs: yyDollar[3].selectExprs} } - case 724: + case 726: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3689 +//line sql.y:3687 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 725: + case 727: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3693 +//line sql.y:3691 { yyVAL.expr = &ConvertExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].convertType} } - case 726: + case 728: yyDollar = yyS[yypt-6 : yypt+1] -//line sql.y:3697 +//line sql.y:3695 { yyVAL.expr = &ConvertUsingExpr{Expr: yyDollar[3].expr, Type: yyDollar[5].str} } - case 727: + case 729: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3701 +//line sql.y:3699 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 728: + case 730: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3705 +//line sql.y:3703 { yyVAL.expr = &SubstrExpr{Name: yyDollar[3].colName, From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 729: + case 731: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3709 +//line sql.y:3707 { yyVAL.expr = &SubstrExpr{StrVal: NewStrLiteral(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 730: + case 732: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3713 +//line sql.y:3711 { yyVAL.expr = &SubstrExpr{StrVal: NewStrLiteral(yyDollar[3].bytes), From: yyDollar[5].expr, To: yyDollar[7].expr} } - case 731: + case 733: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:3717 +//line sql.y:3715 { yyVAL.expr = &MatchExpr{Columns: yyDollar[3].selectExprs, Expr: yyDollar[7].expr, Option: yyDollar[8].matchExprOption} } - case 732: + case 734: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3721 +//line sql.y:3719 { yyVAL.expr = &GroupConcatExpr{Distinct: yyDollar[3].boolean, Exprs: yyDollar[4].selectExprs, OrderBy: yyDollar[5].orderBy, Separator: yyDollar[6].str, Limit: yyDollar[7].limit} } - case 733: + case 735: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:3725 +//line sql.y:3723 { yyVAL.expr = &CaseExpr{Expr: yyDollar[2].expr, Whens: yyDollar[3].whens, Else: yyDollar[4].expr} } - case 734: + case 736: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3729 +//line sql.y:3727 { yyVAL.expr = &ValuesFuncExpr{Name: yyDollar[3].colName} } - case 735: + case 737: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3739 +//line sql.y:3737 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_timestamp")} } - case 736: + case 738: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3743 +//line sql.y:3741 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_timestamp")} } - case 737: + case 739: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3747 +//line sql.y:3745 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_time")} } - case 738: + case 740: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3752 +//line sql.y:3750 { yyVAL.expr = &FuncExpr{Name: NewColIdent("utc_date")} } - case 739: + case 741: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3757 +//line sql.y:3755 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtime")} } - case 740: + case 742: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3762 +//line sql.y:3760 { yyVAL.expr = &FuncExpr{Name: NewColIdent("localtimestamp")} } - case 741: + case 743: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3768 +//line sql.y:3766 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_date")} } - case 742: + case 744: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3773 +//line sql.y:3771 { yyVAL.expr = &FuncExpr{Name: NewColIdent("current_time")} } - case 743: + case 745: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3778 +//line sql.y:3776 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_timestamp"), Fsp: yyDollar[2].expr} } - case 744: + case 746: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3782 +//line sql.y:3780 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_timestamp"), Fsp: yyDollar[2].expr} } - case 745: + case 747: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3786 +//line sql.y:3784 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("utc_time"), Fsp: yyDollar[2].expr} } - case 746: + case 748: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3791 +//line sql.y:3789 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtime"), Fsp: yyDollar[2].expr} } - case 747: + case 749: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3796 +//line sql.y:3794 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("localtimestamp"), Fsp: yyDollar[2].expr} } - case 748: + case 750: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3801 +//line sql.y:3799 { yyVAL.expr = &CurTimeFuncExpr{Name: NewColIdent("current_time"), Fsp: yyDollar[2].expr} } - case 749: + case 751: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3805 +//line sql.y:3803 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampadd"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 750: + case 752: yyDollar = yyS[yypt-8 : yypt+1] -//line sql.y:3809 +//line sql.y:3807 { yyVAL.expr = &TimestampFuncExpr{Name: string("timestampdiff"), Unit: yyDollar[3].colIdent.String(), Expr1: yyDollar[5].expr, Expr2: yyDollar[7].expr} } - case 753: + case 755: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3819 +//line sql.y:3817 { yyVAL.expr = yyDollar[2].expr } - case 754: + case 756: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3829 +//line sql.y:3827 { yyVAL.expr = &FuncExpr{Name: NewColIdent("if"), Exprs: yyDollar[3].selectExprs} } - case 755: + case 757: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3833 +//line sql.y:3831 { yyVAL.expr = &FuncExpr{Name: NewColIdent("database"), Exprs: yyDollar[3].selectExprs} } - case 756: + case 758: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3837 +//line sql.y:3835 { yyVAL.expr = &FuncExpr{Name: NewColIdent("schema"), Exprs: yyDollar[3].selectExprs} } - case 757: + case 759: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3841 +//line sql.y:3839 { yyVAL.expr = &FuncExpr{Name: NewColIdent("mod"), Exprs: yyDollar[3].selectExprs} } - case 758: + case 760: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3845 +//line sql.y:3843 { yyVAL.expr = &FuncExpr{Name: NewColIdent("replace"), Exprs: yyDollar[3].selectExprs} } - case 759: + case 761: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3849 +//line sql.y:3847 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 760: + case 762: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3853 +//line sql.y:3851 { yyVAL.expr = &FuncExpr{Name: NewColIdent("substr"), Exprs: yyDollar[3].selectExprs} } - case 761: + case 763: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3859 +//line sql.y:3857 { yyVAL.matchExprOption = NoOption } - case 762: + case 764: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3863 +//line sql.y:3861 { yyVAL.matchExprOption = BooleanModeOpt } - case 763: + case 765: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3867 +//line sql.y:3865 { yyVAL.matchExprOption = NaturalLanguageModeOpt } - case 764: + case 766: yyDollar = yyS[yypt-7 : yypt+1] -//line sql.y:3871 +//line sql.y:3869 { yyVAL.matchExprOption = NaturalLanguageModeWithQueryExpansionOpt } - case 765: + case 767: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3875 +//line sql.y:3873 { yyVAL.matchExprOption = QueryExpansionOpt } - case 766: + case 768: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3881 +//line sql.y:3879 { yyVAL.str = string(yyDollar[1].colIdent.String()) } - case 767: + case 769: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3885 +//line sql.y:3883 { yyVAL.str = string(yyDollar[1].bytes) } - case 768: + case 770: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3889 +//line sql.y:3887 { yyVAL.str = string(yyDollar[1].bytes) } - case 769: + case 771: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3895 +//line sql.y:3893 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } - case 770: + case 772: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3899 +//line sql.y:3897 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: yyDollar[3].str, Operator: CharacterSetOp} } - case 771: + case 773: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3903 +//line sql.y:3901 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal, Charset: string(yyDollar[3].colIdent.String())} } - case 772: + case 774: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3907 +//line sql.y:3905 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 773: + case 775: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3911 +//line sql.y:3909 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } - case 774: + case 776: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3915 +//line sql.y:3913 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} yyVAL.convertType.Length = yyDollar[2].LengthScaleOption.Length yyVAL.convertType.Scale = yyDollar[2].LengthScaleOption.Scale } - case 775: + case 777: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3921 +//line sql.y:3919 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 776: + case 778: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3925 +//line sql.y:3923 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } - case 777: + case 779: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3929 +//line sql.y:3927 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 778: + case 780: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3933 +//line sql.y:3931 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 779: + case 781: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3937 +//line sql.y:3935 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes), Length: yyDollar[2].literal} } - case 780: + case 782: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3941 +//line sql.y:3939 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 781: + case 783: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3945 +//line sql.y:3943 { yyVAL.convertType = &ConvertType{Type: string(yyDollar[1].bytes)} } - case 782: + case 784: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3950 +//line sql.y:3948 { yyVAL.expr = nil } - case 783: + case 785: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3954 +//line sql.y:3952 { yyVAL.expr = yyDollar[1].expr } - case 784: + case 786: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3959 +//line sql.y:3957 { yyVAL.str = string("") } - case 785: + case 787: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3963 +//line sql.y:3961 { yyVAL.str = " separator '" + string(yyDollar[2].bytes) + "'" } - case 786: + case 788: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3969 +//line sql.y:3967 { yyVAL.whens = []*When{yyDollar[1].when} } - case 787: + case 789: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3973 +//line sql.y:3971 { yyVAL.whens = append(yyDollar[1].whens, yyDollar[2].when) } - case 788: + case 790: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:3979 +//line sql.y:3977 { yyVAL.when = &When{Cond: yyDollar[2].expr, Val: yyDollar[4].expr} } - case 789: + case 791: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:3984 +//line sql.y:3982 { yyVAL.expr = nil } - case 790: + case 792: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:3988 +//line sql.y:3986 { yyVAL.expr = yyDollar[2].expr } - case 791: + case 793: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:3994 +//line sql.y:3992 { yyVAL.colName = &ColName{Name: yyDollar[1].colIdent} } - case 792: + case 794: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:3998 +//line sql.y:3996 { yyVAL.colName = &ColName{Qualifier: TableName{Name: yyDollar[1].tableIdent}, Name: yyDollar[3].colIdent} } - case 793: + case 795: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4002 +//line sql.y:4000 { yyVAL.colName = &ColName{Qualifier: TableName{Qualifier: yyDollar[1].tableIdent, Name: yyDollar[3].tableIdent}, Name: yyDollar[5].colIdent} } - case 794: + case 796: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4008 +//line sql.y:4006 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } - case 795: + case 797: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4012 +//line sql.y:4010 { yyVAL.expr = NewHexLiteral(yyDollar[1].bytes) } - case 796: + case 798: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4016 +//line sql.y:4014 { yyVAL.expr = NewBitLiteral(yyDollar[1].bytes) } - case 797: + case 799: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4020 +//line sql.y:4018 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } - case 798: + case 800: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4024 +//line sql.y:4022 { yyVAL.expr = NewFloatLiteral(yyDollar[1].bytes) } - case 799: + case 801: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4028 +//line sql.y:4026 { yyVAL.expr = NewHexNumLiteral(yyDollar[1].bytes) } - case 800: + case 802: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4032 +//line sql.y:4030 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } - case 801: + case 803: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4036 +//line sql.y:4034 { yyVAL.expr = &NullVal{} } - case 802: + case 804: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4042 +//line sql.y:4040 { // TODO(sougou): Deprecate this construct. if yyDollar[1].colIdent.Lowered() != "value" { @@ -10023,597 +10067,597 @@ yydefault: } yyVAL.expr = NewIntLiteral([]byte("1")) } - case 803: + case 805: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4051 +//line sql.y:4049 { yyVAL.expr = NewIntLiteral(yyDollar[1].bytes) } - case 804: + case 806: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4055 +//line sql.y:4053 { yyVAL.expr = NewArgument(yyDollar[1].bytes) } - case 805: + case 807: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4060 +//line sql.y:4058 { yyVAL.exprs = nil } - case 806: + case 808: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4064 +//line sql.y:4062 { yyVAL.exprs = yyDollar[3].exprs } - case 807: + case 809: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4069 +//line sql.y:4067 { yyVAL.expr = nil } - case 808: + case 810: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4073 +//line sql.y:4071 { yyVAL.expr = yyDollar[2].expr } - case 809: + case 811: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4078 +//line sql.y:4076 { yyVAL.orderBy = nil } - case 810: + case 812: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4082 +//line sql.y:4080 { yyVAL.orderBy = yyDollar[3].orderBy } - case 811: + case 813: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4088 +//line sql.y:4086 { yyVAL.orderBy = OrderBy{yyDollar[1].order} } - case 812: + case 814: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4092 +//line sql.y:4090 { yyVAL.orderBy = append(yyDollar[1].orderBy, yyDollar[3].order) } - case 813: + case 815: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4098 +//line sql.y:4096 { yyVAL.order = &Order{Expr: yyDollar[1].expr, Direction: yyDollar[2].orderDirection} } - case 814: + case 816: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4103 +//line sql.y:4101 { yyVAL.orderDirection = AscOrder } - case 815: + case 817: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4107 +//line sql.y:4105 { yyVAL.orderDirection = AscOrder } - case 816: + case 818: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4111 +//line sql.y:4109 { yyVAL.orderDirection = DescOrder } - case 817: + case 819: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4116 +//line sql.y:4114 { yyVAL.limit = nil } - case 818: + case 820: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4120 +//line sql.y:4118 { yyVAL.limit = &Limit{Rowcount: yyDollar[2].expr} } - case 819: + case 821: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4124 +//line sql.y:4122 { yyVAL.limit = &Limit{Offset: yyDollar[2].expr, Rowcount: yyDollar[4].expr} } - case 820: + case 822: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4128 +//line sql.y:4126 { yyVAL.limit = &Limit{Offset: yyDollar[4].expr, Rowcount: yyDollar[2].expr} } - case 821: + case 823: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4133 +//line sql.y:4131 { yyVAL.alterOptions = nil } - case 822: + case 824: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4137 +//line sql.y:4135 { yyVAL.alterOptions = []AlterOption{yyDollar[1].alterOption, yyDollar[2].alterOption} } - case 823: + case 825: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4141 +//line sql.y:4139 { yyVAL.alterOptions = []AlterOption{yyDollar[1].alterOption, yyDollar[2].alterOption} } - case 824: + case 826: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4145 +//line sql.y:4143 { yyVAL.alterOptions = []AlterOption{yyDollar[1].alterOption} } - case 825: + case 827: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4149 +//line sql.y:4147 { yyVAL.alterOptions = []AlterOption{yyDollar[1].alterOption} } - case 826: + case 828: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4156 +//line sql.y:4154 { yyVAL.alterOption = &LockOption{Type: DefaultType} } - case 827: + case 829: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4160 +//line sql.y:4158 { yyVAL.alterOption = &LockOption{Type: NoneType} } - case 828: + case 830: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4164 +//line sql.y:4162 { yyVAL.alterOption = &LockOption{Type: SharedType} } - case 829: + case 831: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4168 +//line sql.y:4166 { yyVAL.alterOption = &LockOption{Type: ExclusiveType} } - case 830: + case 832: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4174 +//line sql.y:4172 { yyVAL.alterOption = AlgorithmValue(yyDollar[3].bytes) } - case 831: + case 833: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4178 +//line sql.y:4176 { yyVAL.alterOption = AlgorithmValue(yyDollar[3].bytes) } - case 832: + case 834: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4182 +//line sql.y:4180 { yyVAL.alterOption = AlgorithmValue(yyDollar[3].bytes) } - case 833: + case 835: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4187 +//line sql.y:4185 { yyVAL.str = "" } - case 834: + case 836: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4191 +//line sql.y:4189 { yyVAL.str = string(yyDollar[3].bytes) } - case 835: + case 837: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4195 +//line sql.y:4193 { yyVAL.str = string(yyDollar[3].bytes) } - case 836: + case 838: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4199 +//line sql.y:4197 { yyVAL.str = string(yyDollar[3].bytes) } - case 837: + case 839: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4204 +//line sql.y:4202 { yyVAL.str = "" } - case 838: + case 840: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4208 +//line sql.y:4206 { yyVAL.str = yyDollar[3].str } - case 839: + case 841: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4214 +//line sql.y:4212 { yyVAL.str = string(yyDollar[1].bytes) } - case 840: + case 842: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4218 +//line sql.y:4216 { yyVAL.str = string(yyDollar[1].bytes) } - case 841: + case 843: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4223 +//line sql.y:4221 { yyVAL.str = "" } - case 842: + case 844: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4227 +//line sql.y:4225 { yyVAL.str = yyDollar[2].str } - case 843: + case 845: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4232 +//line sql.y:4230 { yyVAL.str = "cascaded" } - case 844: + case 846: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4236 +//line sql.y:4234 { yyVAL.str = string(yyDollar[1].bytes) } - case 845: + case 847: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4240 +//line sql.y:4238 { yyVAL.str = string(yyDollar[1].bytes) } - case 846: + case 848: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4245 +//line sql.y:4243 { yyVAL.str = "" } - case 847: + case 849: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4249 +//line sql.y:4247 { yyVAL.str = yyDollar[3].str } - case 848: + case 850: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4255 +//line sql.y:4253 { yyVAL.str = string(yyDollar[1].bytes) } - case 849: + case 851: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4259 +//line sql.y:4257 { yyVAL.str = string(yyDollar[1].bytes) } - case 850: + case 852: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4263 +//line sql.y:4261 { yyVAL.str = "'" + string(yyDollar[1].bytes) + "'@" + string(yyDollar[2].bytes) } - case 851: + case 853: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4267 +//line sql.y:4265 { yyVAL.str = string(yyDollar[1].bytes) } - case 852: + case 854: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4272 +//line sql.y:4270 { yyVAL.lock = NoLock } - case 853: + case 855: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4276 +//line sql.y:4274 { yyVAL.lock = ForUpdateLock } - case 854: + case 856: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4280 +//line sql.y:4278 { yyVAL.lock = ShareModeLock } - case 855: + case 857: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4285 +//line sql.y:4283 { yyVAL.selectInto = nil } - case 856: + case 858: yyDollar = yyS[yypt-9 : yypt+1] -//line sql.y:4289 +//line sql.y:4287 { yyVAL.selectInto = &SelectInto{Type: IntoOutfileS3, FileName: string(yyDollar[4].bytes), Charset: yyDollar[5].str, FormatOption: yyDollar[6].str, ExportOption: yyDollar[7].str, Manifest: yyDollar[8].str, Overwrite: yyDollar[9].str} } - case 857: + case 859: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4293 +//line sql.y:4291 { yyVAL.selectInto = &SelectInto{Type: IntoDumpfile, FileName: string(yyDollar[3].bytes), Charset: "", FormatOption: "", ExportOption: "", Manifest: "", Overwrite: ""} } - case 858: + case 860: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4297 +//line sql.y:4295 { yyVAL.selectInto = &SelectInto{Type: IntoOutfile, FileName: string(yyDollar[3].bytes), Charset: yyDollar[4].str, FormatOption: "", ExportOption: yyDollar[5].str, Manifest: "", Overwrite: ""} } - case 859: + case 861: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4302 +//line sql.y:4300 { yyVAL.str = "" } - case 860: + case 862: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4306 +//line sql.y:4304 { yyVAL.str = " format csv" + yyDollar[3].str } - case 861: + case 863: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4310 +//line sql.y:4308 { yyVAL.str = " format text" + yyDollar[3].str } - case 862: + case 864: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4315 +//line sql.y:4313 { yyVAL.str = "" } - case 863: + case 865: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4319 +//line sql.y:4317 { yyVAL.str = " header" } - case 864: + case 866: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4324 +//line sql.y:4322 { yyVAL.str = "" } - case 865: + case 867: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4328 +//line sql.y:4326 { yyVAL.str = " manifest on" } - case 866: + case 868: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4332 +//line sql.y:4330 { yyVAL.str = " manifest off" } - case 867: + case 869: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4337 +//line sql.y:4335 { yyVAL.str = "" } - case 868: + case 870: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4341 +//line sql.y:4339 { yyVAL.str = " overwrite on" } - case 869: + case 871: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4345 +//line sql.y:4343 { yyVAL.str = " overwrite off" } - case 870: + case 872: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4351 +//line sql.y:4349 { yyVAL.str = yyDollar[1].str + yyDollar[2].str } - case 871: + case 873: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4356 +//line sql.y:4354 { yyVAL.str = "" } - case 872: + case 874: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4360 +//line sql.y:4358 { yyVAL.str = " lines" + yyDollar[2].str + yyDollar[3].str } - case 873: + case 875: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4365 +//line sql.y:4363 { yyVAL.str = "" } - case 874: + case 876: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4369 +//line sql.y:4367 { yyVAL.str = " starting by '" + string(yyDollar[3].bytes) + "'" } - case 875: + case 877: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4374 +//line sql.y:4372 { yyVAL.str = "" } - case 876: + case 878: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4378 +//line sql.y:4376 { yyVAL.str = " terminated by '" + string(yyDollar[3].bytes) + "'" } - case 877: + case 879: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4383 +//line sql.y:4381 { yyVAL.str = "" } - case 878: + case 880: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4387 +//line sql.y:4385 { yyVAL.str = " " + yyDollar[1].str + yyDollar[2].str + yyDollar[3].str + yyDollar[4].str } - case 879: + case 881: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4392 +//line sql.y:4390 { yyVAL.str = "" } - case 880: + case 882: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4396 +//line sql.y:4394 { yyVAL.str = " escaped by '" + string(yyDollar[3].bytes) + "'" } - case 881: + case 883: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4401 +//line sql.y:4399 { yyVAL.str = "" } - case 882: + case 884: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4405 +//line sql.y:4403 { yyVAL.str = yyDollar[1].str + " enclosed by '" + string(yyDollar[4].bytes) + "'" } - case 883: + case 885: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4410 +//line sql.y:4408 { yyVAL.str = "" } - case 884: + case 886: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4414 +//line sql.y:4412 { yyVAL.str = " optionally" } - case 885: + case 887: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4427 +//line sql.y:4425 { yyVAL.ins = &Insert{Rows: yyDollar[2].values} } - case 886: + case 888: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4431 +//line sql.y:4429 { yyVAL.ins = &Insert{Rows: yyDollar[1].selStmt} } - case 887: + case 889: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4435 +//line sql.y:4433 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[5].values} } - case 888: + case 890: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4439 +//line sql.y:4437 { yyVAL.ins = &Insert{Rows: yyDollar[4].values} } - case 889: + case 891: yyDollar = yyS[yypt-4 : yypt+1] -//line sql.y:4443 +//line sql.y:4441 { yyVAL.ins = &Insert{Columns: yyDollar[2].columns, Rows: yyDollar[4].selStmt} } - case 890: + case 892: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4449 +//line sql.y:4447 { yyVAL.columns = Columns{yyDollar[1].colIdent} } - case 891: + case 893: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4453 +//line sql.y:4451 { yyVAL.columns = Columns{yyDollar[3].colIdent} } - case 892: + case 894: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4457 +//line sql.y:4455 { yyVAL.columns = append(yyVAL.columns, yyDollar[3].colIdent) } - case 893: + case 895: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4461 +//line sql.y:4459 { yyVAL.columns = append(yyVAL.columns, yyDollar[5].colIdent) } - case 894: + case 896: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4466 +//line sql.y:4464 { yyVAL.updateExprs = nil } - case 895: + case 897: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4470 +//line sql.y:4468 { yyVAL.updateExprs = yyDollar[5].updateExprs } - case 896: + case 898: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4476 +//line sql.y:4474 { yyVAL.values = Values{yyDollar[1].valTuple} } - case 897: + case 899: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4480 +//line sql.y:4478 { yyVAL.values = append(yyDollar[1].values, yyDollar[3].valTuple) } - case 898: + case 900: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4486 +//line sql.y:4484 { yyVAL.valTuple = yyDollar[1].valTuple } - case 899: + case 901: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4490 +//line sql.y:4488 { yyVAL.valTuple = ValTuple{} } - case 900: + case 902: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4496 +//line sql.y:4494 { yyVAL.valTuple = ValTuple(yyDollar[2].exprs) } - case 901: + case 903: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4502 +//line sql.y:4500 { if len(yyDollar[1].valTuple) == 1 { yyVAL.expr = yyDollar[1].valTuple[0] @@ -10621,265 +10665,265 @@ yydefault: yyVAL.expr = yyDollar[1].valTuple } } - case 902: + case 904: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4512 +//line sql.y:4510 { yyVAL.updateExprs = UpdateExprs{yyDollar[1].updateExpr} } - case 903: + case 905: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4516 +//line sql.y:4514 { yyVAL.updateExprs = append(yyDollar[1].updateExprs, yyDollar[3].updateExpr) } - case 904: + case 906: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4522 +//line sql.y:4520 { yyVAL.updateExpr = &UpdateExpr{Name: yyDollar[1].colName, Expr: yyDollar[3].expr} } - case 905: + case 907: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4528 +//line sql.y:4526 { yyVAL.setExprs = SetExprs{yyDollar[1].setExpr} } - case 906: + case 908: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4532 +//line sql.y:4530 { yyVAL.setExprs = append(yyDollar[1].setExprs, yyDollar[3].setExpr) } - case 907: + case 909: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4538 +//line sql.y:4536 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral([]byte("on"))} } - case 908: + case 910: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4542 +//line sql.y:4540 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: NewStrLiteral([]byte("off"))} } - case 909: + case 911: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4546 +//line sql.y:4544 { yyVAL.setExpr = &SetExpr{Name: yyDollar[1].colIdent, Scope: ImplicitScope, Expr: yyDollar[3].expr} } - case 910: + case 912: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4550 +//line sql.y:4548 { yyVAL.setExpr = &SetExpr{Name: NewColIdent(string(yyDollar[1].bytes)), Scope: ImplicitScope, Expr: yyDollar[2].expr} } - case 911: + case 913: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4554 +//line sql.y:4552 { yyDollar[2].setExpr.Scope = yyDollar[1].scope yyVAL.setExpr = yyDollar[2].setExpr } - case 913: + case 915: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4562 +//line sql.y:4560 { yyVAL.bytes = []byte("charset") } - case 916: + case 918: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4572 +//line sql.y:4570 { yyVAL.expr = NewStrLiteral([]byte(yyDollar[1].colIdent.String())) } - case 917: + case 919: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4576 +//line sql.y:4574 { yyVAL.expr = NewStrLiteral(yyDollar[1].bytes) } - case 918: + case 920: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4580 +//line sql.y:4578 { yyVAL.expr = &Default{} } - case 921: + case 923: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4589 +//line sql.y:4587 { yyVAL.boolean = false } - case 922: + case 924: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4591 +//line sql.y:4589 { yyVAL.boolean = true } - case 923: + case 925: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4594 +//line sql.y:4592 { yyVAL.boolean = false } - case 924: + case 926: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4596 +//line sql.y:4594 { yyVAL.boolean = true } - case 925: + case 927: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4599 +//line sql.y:4597 { yyVAL.boolean = false } - case 926: + case 928: yyDollar = yyS[yypt-3 : yypt+1] -//line sql.y:4601 +//line sql.y:4599 { yyVAL.boolean = true } - case 927: + case 929: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4604 +//line sql.y:4602 { yyVAL.ignore = false } - case 928: + case 930: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4606 +//line sql.y:4604 { yyVAL.ignore = true } - case 929: + case 931: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4609 +//line sql.y:4607 { yyVAL.empty = struct{}{} } - case 930: + case 932: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4611 +//line sql.y:4609 { yyVAL.empty = struct{}{} } - case 931: + case 933: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4613 +//line sql.y:4611 { yyVAL.empty = struct{}{} } - case 932: + case 934: yyDollar = yyS[yypt-5 : yypt+1] -//line sql.y:4617 +//line sql.y:4615 { yyVAL.statement = &CallProc{Name: yyDollar[2].tableName, Params: yyDollar[4].exprs} } - case 933: + case 935: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4622 +//line sql.y:4620 { yyVAL.exprs = nil } - case 934: + case 936: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4626 +//line sql.y:4624 { yyVAL.exprs = yyDollar[1].exprs } - case 935: + case 937: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:4631 +//line sql.y:4629 { yyVAL.indexOptions = nil } - case 936: + case 938: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4633 +//line sql.y:4631 { yyVAL.indexOptions = []*IndexOption{yyDollar[1].indexOption} } - case 937: + case 939: yyDollar = yyS[yypt-2 : yypt+1] -//line sql.y:4637 +//line sql.y:4635 { yyVAL.indexOption = &IndexOption{Name: string(yyDollar[1].bytes), String: string(yyDollar[2].colIdent.String())} } - case 938: + case 940: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4643 +//line sql.y:4641 { yyVAL.colIdent = yyDollar[1].colIdent } - case 939: + case 941: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4647 +//line sql.y:4645 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 941: + case 943: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4654 +//line sql.y:4652 { yyVAL.colIdent = NewColIdent(string(yyDollar[1].bytes)) } - case 942: + case 944: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4660 +//line sql.y:4658 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].colIdent.String())) } - case 943: + case 945: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4664 +//line sql.y:4662 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 945: + case 947: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:4671 +//line sql.y:4669 { yyVAL.tableIdent = NewTableIdent(string(yyDollar[1].bytes)) } - case 1340: + case 1346: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5090 +//line sql.y:5092 { if incNesting(yylex) { yylex.Error("max nesting level reached") return 1 } } - case 1341: + case 1347: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5099 +//line sql.y:5101 { decNesting(yylex) } - case 1342: + case 1348: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5104 +//line sql.y:5106 { skipToEnd(yylex) } - case 1343: + case 1349: yyDollar = yyS[yypt-0 : yypt+1] -//line sql.y:5109 +//line sql.y:5111 { skipToEnd(yylex) } - case 1344: + case 1350: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5113 +//line sql.y:5115 { skipToEnd(yylex) } - case 1345: + case 1351: yyDollar = yyS[yypt-1 : yypt+1] -//line sql.y:5117 +//line sql.y:5119 { skipToEnd(yylex) } diff --git a/go/vt/sqlparser/sql.y b/go/vt/sqlparser/sql.y index b0945212f4f..c06168310fb 100644 --- a/go/vt/sqlparser/sql.y +++ b/go/vt/sqlparser/sql.y @@ -221,7 +221,7 @@ func skipToEnd(yylex interface{}) { // SHOW tokens %token COLLATION DATABASES SCHEMAS TABLES VITESS_METADATA VSCHEMA FULL PROCESSLIST COLUMNS FIELDS ENGINES PLUGINS EXTENDED -%token KEYSPACES VITESS_KEYSPACES VITESS_SHARDS VITESS_TABLETS CODE PRIVILEGES FUNCTION +%token KEYSPACES VITESS_KEYSPACES VITESS_SHARDS VITESS_TABLETS CODE PRIVILEGES FUNCTION OPEN TRIGGERS EVENT USER // SET tokens %token NAMES CHARSET GLOBAL SESSION ISOLATION LEVEL READ WRITE ONLY REPEATABLE COMMITTED UNCOMMITTED SERIALIZABLE @@ -347,9 +347,9 @@ func skipToEnd(yylex interface{}) { %type for_from %type default_opt %type ignore_opt -%type full_opt from_database_opt tables_or_processlist columns_or_fields extended_opt storage_opt +%type from_database_opt columns_or_fields extended_opt storage_opt %type like_or_where_opt like_opt -%type exists_opt not_exists_opt enforced_opt temp_opt +%type exists_opt not_exists_opt enforced_opt temp_opt full_opt %type to_opt %type reserved_keyword non_reserved_keyword %type sql_id reserved_sql_id col_alias as_ci_opt @@ -2320,6 +2320,10 @@ show_statement: { $$ = &Show{&ShowBasic{Command: Collation, Filter: $3}} } +| SHOW full_opt columns_or_fields from_or_in table_name from_database_opt like_or_where_opt + { + $$ = &Show{&ShowBasic{Full: $2, Command: Column, Tbl: $5, DbName: $6, Filter: $7}} + } | SHOW DATABASES like_or_where_opt { $$ = &Show{&ShowBasic{Command: Database, Filter: $3}} @@ -2340,6 +2344,14 @@ show_statement: { $$ = &Show{&ShowBasic{Command: Function, Filter: $4}} } +| SHOW extended_opt index_symbols from_or_in table_name from_database_opt like_or_where_opt + { + $$ = &Show{&ShowBasic{Command: Index, Tbl: $5, DbName: $6, Filter: $7}} + } +| SHOW OPEN TABLES from_database_opt like_or_where_opt + { + $$ = &Show{&ShowBasic{Command: OpenTable, DbName:$4, Filter: $5}} + } | SHOW PRIVILEGES { $$ = &Show{&ShowBasic{Command: Privilege}} @@ -2366,46 +2378,53 @@ show_statement: } | SHOW TABLE STATUS from_database_opt like_or_where_opt { - $$ = &Show{&ShowTableStatus{DatabaseName:$4, Filter:$5}} + $$ = &Show{&ShowBasic{Command: TableStatus, DbName:$4, Filter: $5}} } -| SHOW full_opt columns_or_fields from_or_in table_name from_database_opt like_or_where_opt +| SHOW full_opt TABLES from_database_opt like_or_where_opt { - $$ = &Show{&ShowColumns{Full: $2, Table: $5, DbName: $6, Filter: $7}} + $$ = &Show{&ShowBasic{Command: Table, Full: $2, DbName:$4, Filter: $5}} } -| SHOW BINARY id_or_var ddl_skip_to_end /* SHOW BINARY ... */ +| SHOW TRIGGERS from_database_opt like_or_where_opt { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3.String()), Scope: ImplicitScope}} + $$ = &Show{&ShowBasic{Command: Trigger, DbName:$3, Filter: $4}} } -| SHOW BINARY LOGS ddl_skip_to_end /* SHOW BINARY LOGS */ +| SHOW CREATE DATABASE table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateDb, Op: $4}} } -| SHOW CREATE DATABASE ddl_skip_to_end +| SHOW CREATE EVENT table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateE, Op: $4}} } | SHOW CREATE FUNCTION table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Table: $4, Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateF, Op: $4}} } -/* Rule to handle SHOW CREATE EVENT, SHOW CREATE FUNCTION, etc. */ -| SHOW CREATE id_or_var ddl_skip_to_end +| SHOW CREATE PROCEDURE table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3.String()), Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateProc, Op: $4}} } -| SHOW CREATE PROCEDURE ddl_skip_to_end +| SHOW CREATE TABLE table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateTbl, Op: $4}} } -| SHOW CREATE TABLE table_name +| SHOW CREATE TRIGGER table_name { - $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Table: $4, Scope: ImplicitScope}} + $$ = &Show{&ShowCreate{Command: CreateTr, Op: $4}} + } +| SHOW CREATE VIEW table_name + { + $$ = &Show{&ShowCreate{Command: CreateV, Op: $4}} } -| SHOW CREATE TRIGGER ddl_skip_to_end +| SHOW CREATE USER ddl_skip_to_end { $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Scope: ImplicitScope}} + } +| SHOW BINARY id_or_var ddl_skip_to_end /* SHOW BINARY ... */ + { + $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3.String()), Scope: ImplicitScope}} } -| SHOW CREATE VIEW ddl_skip_to_end +| SHOW BINARY LOGS ddl_skip_to_end /* SHOW BINARY LOGS */ { $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Scope: ImplicitScope}} } @@ -2417,11 +2436,6 @@ show_statement: { $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Table: $4, Scope: ImplicitScope}} } -| SHOW extended_opt index_symbols from_or_in table_name from_database_opt like_or_where_opt - { - showTablesOpt := &ShowTablesOpt{DbName:$6, Filter:$7} - $$ = &Show{&ShowLegacy{Extended: string($2), Type: string($3), ShowTablesOpt: showTablesOpt, OnTable: $5, Scope: ImplicitScope}} - } | SHOW PLUGINS { $$ = &Show{&ShowLegacy{Type: string($2), Scope: ImplicitScope}} @@ -2430,15 +2444,9 @@ show_statement: { $$ = &Show{&ShowLegacy{Type: string($2) + " " + string($3), Table: $4, Scope: ImplicitScope}} } -| SHOW full_opt tables_or_processlist from_database_opt like_or_where_opt +| SHOW full_opt PROCESSLIST from_database_opt like_or_where_opt { - // this is ugly, but I couldn't find a better way for now - if $3 == "processlist" { - $$ = &Show{&ShowLegacy{Type: $3, Scope: ImplicitScope}} - } else { - showTablesOpt := &ShowTablesOpt{Full:$2, DbName:$4, Filter:$5} - $$ = &Show{&ShowLegacy{Type: $3, ShowTablesOpt: showTablesOpt, Scope: ImplicitScope}} - } + $$ = &Show{&ShowLegacy{Type: string($3), Scope: ImplicitScope}} } | SHOW VITESS_METADATA VARIABLES like_opt { @@ -2489,16 +2497,6 @@ show_statement: $$ = &Show{&ShowLegacy{Type: string($2), Scope: ImplicitScope}} } -tables_or_processlist: - TABLES - { - $$ = string($1) - } -| PROCESSLIST - { - $$ = string($1) - } - vitess_topo: VITESS_TABLETS { @@ -2522,11 +2520,11 @@ extended_opt: full_opt: /* empty */ { - $$ = "" + $$ = false } | FULL { - $$ = "full " + $$ = true } columns_or_fields: @@ -4888,6 +4886,7 @@ non_reserved_keyword: | ENUM | ERROR | ESCAPED +| EVENT | EXCHANGE | EXCLUDE | EXCLUSIVE @@ -4969,6 +4968,7 @@ non_reserved_keyword: | OFFSET | OJ | OLD +| OPEN | OPTION | OPTIONAL | OPTIONALLY @@ -5057,6 +5057,7 @@ non_reserved_keyword: | TRANSACTION | TREE | TRIGGER +| TRIGGERS | TRUNCATE | UNBOUNDED | UNCOMMITTED @@ -5064,6 +5065,7 @@ non_reserved_keyword: | UNSIGNED | UNUSED | UPGRADE +| USER | USER_RESOURCES | VALIDATION | VARBINARY diff --git a/go/vt/sqlparser/token.go b/go/vt/sqlparser/token.go index c5ea3b13def..6b24dacd78e 100644 --- a/go/vt/sqlparser/token.go +++ b/go/vt/sqlparser/token.go @@ -201,6 +201,7 @@ var keywords = map[string]int{ "error": ERROR, "escape": ESCAPE, "escaped": ESCAPED, + "event": EVENT, "exchange": EXCHANGE, "exclusive": EXCLUSIVE, "exists": EXISTS, @@ -336,6 +337,7 @@ var keywords = map[string]int{ "offset": OFFSET, "on": ON, "only": ONLY, + "open": OPEN, "optimize": OPTIMIZE, "optimizer_costs": OPTIMIZER_COSTS, "option": OPTION, @@ -452,6 +454,7 @@ var keywords = map[string]int{ "tree": TREE, "traditional": TRADITIONAL, "trigger": TRIGGER, + "triggers": TRIGGERS, "true": TRUE, "truncate": TRUNCATE, "uncommitted": UNCOMMITTED, @@ -465,6 +468,7 @@ var keywords = map[string]int{ "upgrade": UPGRADE, "usage": UNUSED, "use": USE, + "user": USER, "user_resources": USER_RESOURCES, "using": USING, "utc_date": UTC_DATE, diff --git a/go/vt/vtexplain/testdata/multi-output/comments-output.txt b/go/vt/vtexplain/testdata/multi-output/comments-output.txt index 922dec1543a..db6c63b250a 100644 --- a/go/vt/vtexplain/testdata/multi-output/comments-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/comments-output.txt @@ -1,41 +1,41 @@ ---------------------------------------------------------------------- SELECT * from user -1 ks_sharded/-40: select * from user limit 10001 -1 ks_sharded/40-80: select * from user limit 10001 -1 ks_sharded/80-c0: select * from user limit 10001 -1 ks_sharded/c0-: select * from user limit 10001 +1 ks_sharded/-40: select * from `user` limit 10001 +1 ks_sharded/40-80: select * from `user` limit 10001 +1 ks_sharded/80-c0: select * from `user` limit 10001 +1 ks_sharded/c0-: select * from `user` limit 10001 ---------------------------------------------------------------------- select /* ; */ 1 from user -1 ks_sharded/-40: select /* ; */ 1 from user limit 10001 -1 ks_sharded/40-80: select /* ; */ 1 from user limit 10001 -1 ks_sharded/80-c0: select /* ; */ 1 from user limit 10001 -1 ks_sharded/c0-: select /* ; */ 1 from user limit 10001 +1 ks_sharded/-40: select /* ; */ 1 from `user` limit 10001 +1 ks_sharded/40-80: select /* ; */ 1 from `user` limit 10001 +1 ks_sharded/80-c0: select /* ; */ 1 from `user` limit 10001 +1 ks_sharded/c0-: select /* ; */ 1 from `user` limit 10001 ---------------------------------------------------------------------- select 1 from user where x=';' -1 ks_sharded/-40: select 1 from user where x = ';' limit 10001 -1 ks_sharded/40-80: select 1 from user where x = ';' limit 10001 -1 ks_sharded/80-c0: select 1 from user where x = ';' limit 10001 -1 ks_sharded/c0-: select 1 from user where x = ';' limit 10001 +1 ks_sharded/-40: select 1 from `user` where x = ';' limit 10001 +1 ks_sharded/40-80: select 1 from `user` where x = ';' limit 10001 +1 ks_sharded/80-c0: select 1 from `user` where x = ';' limit 10001 +1 ks_sharded/c0-: select 1 from `user` where x = ';' limit 10001 ---------------------------------------------------------------------- select 1 from user where x='/* hello */' -1 ks_sharded/-40: select 1 from user where x = '/* hello */' limit 10001 -1 ks_sharded/40-80: select 1 from user where x = '/* hello */' limit 10001 -1 ks_sharded/80-c0: select 1 from user where x = '/* hello */' limit 10001 -1 ks_sharded/c0-: select 1 from user where x = '/* hello */' limit 10001 +1 ks_sharded/-40: select 1 from `user` where x = '/* hello */' limit 10001 +1 ks_sharded/40-80: select 1 from `user` where x = '/* hello */' limit 10001 +1 ks_sharded/80-c0: select 1 from `user` where x = '/* hello */' limit 10001 +1 ks_sharded/c0-: select 1 from `user` where x = '/* hello */' limit 10001 ---------------------------------------------------------------------- select 1 from user where x='/* ; */' -1 ks_sharded/-40: select 1 from user where x = '/* ; */' limit 10001 -1 ks_sharded/40-80: select 1 from user where x = '/* ; */' limit 10001 -1 ks_sharded/80-c0: select 1 from user where x = '/* ; */' limit 10001 -1 ks_sharded/c0-: select 1 from user where x = '/* ; */' limit 10001 +1 ks_sharded/-40: select 1 from `user` where x = '/* ; */' limit 10001 +1 ks_sharded/40-80: select 1 from `user` where x = '/* ; */' limit 10001 +1 ks_sharded/80-c0: select 1 from `user` where x = '/* ; */' limit 10001 +1 ks_sharded/c0-: select 1 from `user` where x = '/* ; */' limit 10001 ---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/multi-output/deletesharded-output.txt b/go/vt/vtexplain/testdata/multi-output/deletesharded-output.txt index c3b32309a6e..e6edbcdb0d1 100644 --- a/go/vt/vtexplain/testdata/multi-output/deletesharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/deletesharded-output.txt @@ -16,10 +16,10 @@ delete from music_extra where id=1 and extra='abc' delete from user where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: select id, `name` from user where id = 1 limit 10001 for update +1 ks_sharded/-40: select id, `name` from `user` where id = 1 limit 10001 for update 2 ks_sharded/40-80: begin 2 ks_sharded/40-80: delete from name_user_map where `name` = 'name_val_2' and user_id = 1 limit 10001 -3 ks_sharded/-40: delete from user where id = 1 limit 10001 +3 ks_sharded/-40: delete from `user` where id = 1 limit 10001 4 ks_sharded/-40: commit 5 ks_sharded/40-80: commit @@ -29,10 +29,10 @@ delete from user where name='billy' 1 ks_sharded/c0-: begin 1 ks_sharded/c0-: select `name`, user_id from name_user_map where `name` in ('billy') limit 10001 for update 2 ks_sharded/-40: begin -2 ks_sharded/-40: select id, `name` from user where `name` = 'billy' limit 10001 for update +2 ks_sharded/-40: select id, `name` from `user` where `name` = 'billy' limit 10001 for update 3 ks_sharded/40-80: begin 3 ks_sharded/40-80: delete from name_user_map where `name` = 'name_val_2' and user_id = 1 limit 10001 -4 ks_sharded/-40: delete from user where `name` = 'billy' limit 10001 +4 ks_sharded/-40: delete from `user` where `name` = 'billy' limit 10001 5 ks_sharded/c0-: commit 6 ks_sharded/-40: commit 7 ks_sharded/40-80: commit diff --git a/go/vt/vtexplain/testdata/multi-output/insertsharded-output.txt b/go/vt/vtexplain/testdata/multi-output/insertsharded-output.txt index c43ebac4000..16abe1fd424 100644 --- a/go/vt/vtexplain/testdata/multi-output/insertsharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/insertsharded-output.txt @@ -4,7 +4,7 @@ insert into user (id, name) values(1, 'alice') 1 ks_sharded/40-80: begin 1 ks_sharded/40-80: insert into name_user_map(`name`, user_id) values ('alice', 1) 2 ks_sharded/-40: begin -2 ks_sharded/-40: insert into user(id, `name`) values (1, 'alice') +2 ks_sharded/-40: insert into `user`(id, `name`) values (1, 'alice') 3 ks_sharded/40-80: commit 4 ks_sharded/-40: commit @@ -14,7 +14,7 @@ insert into user (id, name) values(2, 'bob') 1 ks_sharded/c0-: begin 1 ks_sharded/c0-: insert into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/-40: begin -2 ks_sharded/-40: insert into user(id, `name`) values (2, 'bob') +2 ks_sharded/-40: insert into `user`(id, `name`) values (2, 'bob') 3 ks_sharded/c0-: commit 4 ks_sharded/-40: commit @@ -25,7 +25,7 @@ insert ignore into user (id, name) values(2, 'bob') 1 ks_sharded/c0-: insert ignore into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/c0-: select `name` from name_user_map where `name` = 'bob' and user_id = 2 limit 10001 3 ks_sharded/-40: begin -3 ks_sharded/-40: insert ignore into user(id, `name`) values (2, 'bob') +3 ks_sharded/-40: insert ignore into `user`(id, `name`) values (2, 'bob') 4 ks_sharded/c0-: commit 5 ks_sharded/-40: commit @@ -36,7 +36,7 @@ insert ignore into user (id, name, nickname) values(2, 'bob', 'bob') 1 ks_sharded/c0-: insert ignore into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/c0-: select `name` from name_user_map where `name` = 'bob' and user_id = 2 limit 10001 3 ks_sharded/-40: begin -3 ks_sharded/-40: insert ignore into user(id, `name`, nickname) values (2, 'bob', 'bob') +3 ks_sharded/-40: insert ignore into `user`(id, `name`, nickname) values (2, 'bob', 'bob') 4 ks_sharded/c0-: commit 5 ks_sharded/-40: commit @@ -47,7 +47,7 @@ insert into user (id, name, nickname) values(2, 'bob', 'bobby') on duplicate key 1 ks_sharded/c0-: insert ignore into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/c0-: select `name` from name_user_map where `name` = 'bob' and user_id = 2 limit 10001 3 ks_sharded/-40: begin -3 ks_sharded/-40: insert into user(id, `name`, nickname) values (2, 'bob', 'bobby') on duplicate key update nickname = 'bobby' +3 ks_sharded/-40: insert into `user`(id, `name`, nickname) values (2, 'bob', 'bobby') on duplicate key update nickname = 'bobby' 4 ks_sharded/c0-: commit 5 ks_sharded/-40: commit @@ -58,7 +58,7 @@ insert into user (id, name, nickname, address) values(2, 'bob', 'bobby', '123 ma 1 ks_sharded/c0-: insert ignore into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/c0-: select `name` from name_user_map where `name` = 'bob' and user_id = 2 limit 10001 3 ks_sharded/-40: begin -3 ks_sharded/-40: insert into user(id, `name`, nickname, address) values (2, 'bob', 'bobby', '123 main st') on duplicate key update nickname = values(nickname), address = values(address) +3 ks_sharded/-40: insert into `user`(id, `name`, nickname, address) values (2, 'bob', 'bobby', '123 main st') on duplicate key update nickname = values(nickname), address = values(address) 4 ks_sharded/c0-: commit 5 ks_sharded/-40: commit diff --git a/go/vt/vtexplain/testdata/multi-output/options-output.txt b/go/vt/vtexplain/testdata/multi-output/options-output.txt index 21db05ab44d..a617e654499 100644 --- a/go/vt/vtexplain/testdata/multi-output/options-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/options-output.txt @@ -1,17 +1,17 @@ ---------------------------------------------------------------------- select * from user where email='null@void.com' -1 ks_sharded/-40: select * from user where email = 'null@void.com' limit 10001 -1 ks_sharded/40-80: select * from user where email = 'null@void.com' limit 10001 -1 ks_sharded/80-c0: select * from user where email = 'null@void.com' limit 10001 -1 ks_sharded/c0-: select * from user where email = 'null@void.com' limit 10001 +1 ks_sharded/-40: select * from `user` where email = 'null@void.com' limit 10001 +1 ks_sharded/40-80: select * from `user` where email = 'null@void.com' limit 10001 +1 ks_sharded/80-c0: select * from `user` where email = 'null@void.com' limit 10001 +1 ks_sharded/c0-: select * from `user` where email = 'null@void.com' limit 10001 ---------------------------------------------------------------------- select * from user where id in (1,2,3,4,5,6,7,8) -1 ks_sharded/-40: select * from user where id in (1, 2) limit 10001 -1 ks_sharded/40-80: select * from user where id in (3, 5) limit 10001 -1 ks_sharded/c0-: select * from user where id in (4, 6, 7, 8) limit 10001 +1 ks_sharded/-40: select * from `user` where id in (1, 2) limit 10001 +1 ks_sharded/40-80: select * from `user` where id in (3, 5) limit 10001 +1 ks_sharded/c0-: select * from `user` where id in (4, 6, 7, 8) limit 10001 ---------------------------------------------------------------------- insert into user (id, name) values (2, 'bob') @@ -19,7 +19,7 @@ insert into user (id, name) values (2, 'bob') 1 ks_sharded/c0-: begin 1 ks_sharded/c0-: insert into name_user_map(`name`, user_id) values ('bob', 2) 2 ks_sharded/-40: begin -2 ks_sharded/-40: insert into user(id, `name`) values (2, 'bob') +2 ks_sharded/-40: insert into `user`(id, `name`) values (2, 'bob') 3 ks_sharded/c0-: commit 4 ks_sharded/-40: commit diff --git a/go/vt/vtexplain/testdata/multi-output/select-sharded-8-output.txt b/go/vt/vtexplain/testdata/multi-output/select-sharded-8-output.txt index a50c6fcb067..baf8152ce7a 100644 --- a/go/vt/vtexplain/testdata/multi-output/select-sharded-8-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/select-sharded-8-output.txt @@ -1,18 +1,18 @@ ---------------------------------------------------------------------- select * from user -1 ks_sharded/-20: select * from user limit 10001 -1 ks_sharded/20-40: select * from user limit 10001 -1 ks_sharded/40-60: select * from user limit 10001 -1 ks_sharded/60-80: select * from user limit 10001 -1 ks_sharded/80-a0: select * from user limit 10001 -1 ks_sharded/a0-c0: select * from user limit 10001 -1 ks_sharded/c0-e0: select * from user limit 10001 -1 ks_sharded/e0-: select * from user limit 10001 +1 ks_sharded/-20: select * from `user` limit 10001 +1 ks_sharded/20-40: select * from `user` limit 10001 +1 ks_sharded/40-60: select * from `user` limit 10001 +1 ks_sharded/60-80: select * from `user` limit 10001 +1 ks_sharded/80-a0: select * from `user` limit 10001 +1 ks_sharded/a0-c0: select * from `user` limit 10001 +1 ks_sharded/c0-e0: select * from `user` limit 10001 +1 ks_sharded/e0-: select * from `user` limit 10001 ---------------------------------------------------------------------- select * from user where id in (1, 2) -1 ks_sharded/-20: select * from user where id in (1, 2) limit 10001 +1 ks_sharded/-20: select * from `user` where id in (1, 2) limit 10001 ---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/multi-output/selectsharded-output.txt b/go/vt/vtexplain/testdata/multi-output/selectsharded-output.txt index ccad1126651..0ee841517cc 100644 --- a/go/vt/vtexplain/testdata/multi-output/selectsharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/selectsharded-output.txt @@ -1,45 +1,45 @@ ---------------------------------------------------------------------- select * from user /* scatter */ -1 ks_sharded/-40: select * from user limit 10001 /* scatter */ -1 ks_sharded/40-80: select * from user limit 10001 /* scatter */ -1 ks_sharded/80-c0: select * from user limit 10001 /* scatter */ -1 ks_sharded/c0-: select * from user limit 10001 /* scatter */ +1 ks_sharded/-40: select * from `user` limit 10001 /* scatter */ +1 ks_sharded/40-80: select * from `user` limit 10001 /* scatter */ +1 ks_sharded/80-c0: select * from `user` limit 10001 /* scatter */ +1 ks_sharded/c0-: select * from `user` limit 10001 /* scatter */ ---------------------------------------------------------------------- select * from user where id = 1 /* equal unique */ -1 ks_sharded/-40: select * from user where id = 1 limit 10001 /* equal unique */ +1 ks_sharded/-40: select * from `user` where id = 1 limit 10001 /* equal unique */ ---------------------------------------------------------------------- select * from user where id > 100 /* scatter range */ -1 ks_sharded/-40: select * from user where id > 100 limit 10001 /* scatter range */ -1 ks_sharded/40-80: select * from user where id > 100 limit 10001 /* scatter range */ -1 ks_sharded/80-c0: select * from user where id > 100 limit 10001 /* scatter range */ -1 ks_sharded/c0-: select * from user where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/-40: select * from `user` where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/40-80: select * from `user` where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/80-c0: select * from `user` where id > 100 limit 10001 /* scatter range */ +1 ks_sharded/c0-: select * from `user` where id > 100 limit 10001 /* scatter range */ ---------------------------------------------------------------------- select * from user where name = 'bob' /* vindex lookup */ 1 ks_sharded/c0-: select `name`, user_id from name_user_map where `name` in ('bob') limit 10001 /* vindex lookup */ -2 ks_sharded/-40: select * from user where `name` = 'bob' limit 10001 /* vindex lookup */ +2 ks_sharded/-40: select * from `user` where `name` = 'bob' limit 10001 /* vindex lookup */ ---------------------------------------------------------------------- select * from user where name = 'bob' or nickname = 'bob' /* vindex lookup */ -1 ks_sharded/-40: select * from user where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ -1 ks_sharded/40-80: select * from user where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ -1 ks_sharded/80-c0: select * from user where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ -1 ks_sharded/c0-: select * from user where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ +1 ks_sharded/-40: select * from `user` where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ +1 ks_sharded/40-80: select * from `user` where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ +1 ks_sharded/80-c0: select * from `user` where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ +1 ks_sharded/c0-: select * from `user` where `name` = 'bob' or nickname = 'bob' limit 10001 /* vindex lookup */ ---------------------------------------------------------------------- select u.id, u.name, u.nickname, n.info from user u join name_info n on u.name = n.name /* join on varchar */ -1 ks_sharded/-40: select u.id, u.`name`, u.nickname from user as u limit 10001 /* join on varchar */ -1 ks_sharded/40-80: select u.id, u.`name`, u.nickname from user as u limit 10001 /* join on varchar */ -1 ks_sharded/80-c0: select u.id, u.`name`, u.nickname from user as u limit 10001 /* join on varchar */ -1 ks_sharded/c0-: select u.id, u.`name`, u.nickname from user as u limit 10001 /* join on varchar */ +1 ks_sharded/-40: select u.id, u.`name`, u.nickname from `user` as u limit 10001 /* join on varchar */ +1 ks_sharded/40-80: select u.id, u.`name`, u.nickname from `user` as u limit 10001 /* join on varchar */ +1 ks_sharded/80-c0: select u.id, u.`name`, u.nickname from `user` as u limit 10001 /* join on varchar */ +1 ks_sharded/c0-: select u.id, u.`name`, u.nickname from `user` as u limit 10001 /* join on varchar */ 2 ks_sharded/40-80: select n.info from name_info as n where n.`name` = 'name_val_2' limit 10001 /* join on varchar */ 3 ks_sharded/40-80: select n.info from name_info as n where n.`name` = 'name_val_2' limit 10001 /* join on varchar */ 4 ks_sharded/40-80: select n.info from name_info as n where n.`name` = 'name_val_2' limit 10001 /* join on varchar */ @@ -54,68 +54,68 @@ select m.id, m.song, e.extra from music m join music_extra e on m.id = e.id wher ---------------------------------------------------------------------- select count(*) from user where id = 1 /* point aggregate */ -1 ks_sharded/-40: select count(*) from user where id = 1 limit 10001 /* point aggregate */ +1 ks_sharded/-40: select count(*) from `user` where id = 1 limit 10001 /* point aggregate */ ---------------------------------------------------------------------- select count(*) from user where name in ('alice','bob') /* scatter aggregate */ 1 ks_sharded/40-80: select `name`, user_id from name_user_map where `name` in ('alice') limit 10001 /* scatter aggregate */ 2 ks_sharded/c0-: select `name`, user_id from name_user_map where `name` in ('bob') limit 10001 /* scatter aggregate */ -3 ks_sharded/-40: select count(*) from user where `name` in ('alice', 'bob') limit 10001 /* scatter aggregate */ +3 ks_sharded/-40: select count(*) from `user` where `name` in ('alice', 'bob') limit 10001 /* scatter aggregate */ ---------------------------------------------------------------------- select name, count(*) from user group by name /* scatter aggregate */ -1 ks_sharded/-40: select `name`, count(*) from user group by `name` limit 10001 /* scatter aggregate */ -1 ks_sharded/40-80: select `name`, count(*) from user group by `name` limit 10001 /* scatter aggregate */ -1 ks_sharded/80-c0: select `name`, count(*) from user group by `name` limit 10001 /* scatter aggregate */ -1 ks_sharded/c0-: select `name`, count(*) from user group by `name` limit 10001 /* scatter aggregate */ +1 ks_sharded/-40: select `name`, count(*) from `user` group by `name` limit 10001 /* scatter aggregate */ +1 ks_sharded/40-80: select `name`, count(*) from `user` group by `name` limit 10001 /* scatter aggregate */ +1 ks_sharded/80-c0: select `name`, count(*) from `user` group by `name` limit 10001 /* scatter aggregate */ +1 ks_sharded/c0-: select `name`, count(*) from `user` group by `name` limit 10001 /* scatter aggregate */ ---------------------------------------------------------------------- select 1, "hello", 3.14, null from user limit 10 /* select constant sql values */ -1 ks_sharded/-40: select 1, 'hello', 3.14, null from user limit 10 /* select constant sql values */ -1 ks_sharded/40-80: select 1, 'hello', 3.14, null from user limit 10 /* select constant sql values */ -1 ks_sharded/80-c0: select 1, 'hello', 3.14, null from user limit 10 /* select constant sql values */ -1 ks_sharded/c0-: select 1, 'hello', 3.14, null from user limit 10 /* select constant sql values */ +1 ks_sharded/-40: select 1, 'hello', 3.14, null from `user` limit 10 /* select constant sql values */ +1 ks_sharded/40-80: select 1, 'hello', 3.14, null from `user` limit 10 /* select constant sql values */ +1 ks_sharded/80-c0: select 1, 'hello', 3.14, null from `user` limit 10 /* select constant sql values */ +1 ks_sharded/c0-: select 1, 'hello', 3.14, null from `user` limit 10 /* select constant sql values */ ---------------------------------------------------------------------- select * from (select id from user) s /* scatter paren select */ -1 ks_sharded/-40: select * from (select id from user) as s limit 10001 /* scatter paren select */ -1 ks_sharded/40-80: select * from (select id from user) as s limit 10001 /* scatter paren select */ -1 ks_sharded/80-c0: select * from (select id from user) as s limit 10001 /* scatter paren select */ -1 ks_sharded/c0-: select * from (select id from user) as s limit 10001 /* scatter paren select */ +1 ks_sharded/-40: select * from (select id from `user`) as s limit 10001 /* scatter paren select */ +1 ks_sharded/40-80: select * from (select id from `user`) as s limit 10001 /* scatter paren select */ +1 ks_sharded/80-c0: select * from (select id from `user`) as s limit 10001 /* scatter paren select */ +1 ks_sharded/c0-: select * from (select id from `user`) as s limit 10001 /* scatter paren select */ ---------------------------------------------------------------------- select name from user where id = (select id from t1) /* non-correlated subquery as value */ 1 ks_unsharded/-: select id from t1 limit 10001 /* non-correlated subquery as value */ -2 ks_sharded/-40: select `name` from user where id = 1 limit 10001 /* non-correlated subquery as value */ +2 ks_sharded/-40: select `name` from `user` where id = 1 limit 10001 /* non-correlated subquery as value */ ---------------------------------------------------------------------- select name from user where id in (select id from t1) /* non-correlated subquery in IN clause */ 1 ks_unsharded/-: select id from t1 limit 10001 /* non-correlated subquery in IN clause */ -2 ks_sharded/-40: select `name` from user where 1 = 1 and id in (1) limit 10001 /* non-correlated subquery in IN clause */ +2 ks_sharded/-40: select `name` from `user` where 1 = 1 and id in (1) limit 10001 /* non-correlated subquery in IN clause */ ---------------------------------------------------------------------- select name from user where id not in (select id from t1) /* non-correlated subquery in NOT IN clause */ 1 ks_unsharded/-: select id from t1 limit 10001 /* non-correlated subquery in NOT IN clause */ -2 ks_sharded/-40: select `name` from user where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ -2 ks_sharded/40-80: select `name` from user where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ -2 ks_sharded/80-c0: select `name` from user where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ -2 ks_sharded/c0-: select `name` from user where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ +2 ks_sharded/-40: select `name` from `user` where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ +2 ks_sharded/40-80: select `name` from `user` where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ +2 ks_sharded/80-c0: select `name` from `user` where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ +2 ks_sharded/c0-: select `name` from `user` where 1 = 0 or id not in (1) limit 10001 /* non-correlated subquery in NOT IN clause */ ---------------------------------------------------------------------- select name from user where exists (select id from t1) /* non-correlated subquery as EXISTS */ 1 ks_unsharded/-: select id from t1 limit 10001 /* non-correlated subquery as EXISTS */ -2 ks_sharded/-40: select `name` from user where 1 limit 10001 /* non-correlated subquery as EXISTS */ -2 ks_sharded/40-80: select `name` from user where 1 limit 10001 /* non-correlated subquery as EXISTS */ -2 ks_sharded/80-c0: select `name` from user where 1 limit 10001 /* non-correlated subquery as EXISTS */ -2 ks_sharded/c0-: select `name` from user where 1 limit 10001 /* non-correlated subquery as EXISTS */ +2 ks_sharded/-40: select `name` from `user` where 1 limit 10001 /* non-correlated subquery as EXISTS */ +2 ks_sharded/40-80: select `name` from `user` where 1 limit 10001 /* non-correlated subquery as EXISTS */ +2 ks_sharded/80-c0: select `name` from `user` where 1 limit 10001 /* non-correlated subquery as EXISTS */ +2 ks_sharded/c0-: select `name` from `user` where 1 limit 10001 /* non-correlated subquery as EXISTS */ ---------------------------------------------------------------------- select * from name_info order by info /* select * and order by varchar column */ @@ -128,41 +128,41 @@ select * from name_info order by info /* select * and order by varchar column */ ---------------------------------------------------------------------- select distinct(name) from user where id = 1 /* select distinct */ -1 ks_sharded/-40: select distinct `name` from user where id = 1 limit 10001 /* select distinct */ +1 ks_sharded/-40: select distinct `name` from `user` where id = 1 limit 10001 /* select distinct */ ---------------------------------------------------------------------- select distinct name from user where id = 1 /* select distinct */ -1 ks_sharded/-40: select distinct `name` from user where id = 1 limit 10001 /* select distinct */ +1 ks_sharded/-40: select distinct `name` from `user` where id = 1 limit 10001 /* select distinct */ ---------------------------------------------------------------------- select id, substring(name, 1, -1) from user where id = 123 /* select substring */ -1 ks_sharded/-40: select id, substr(`name`, 1, -1) from user where id = 123 limit 10001 /* select substring */ +1 ks_sharded/-40: select id, substr(`name`, 1, -1) from `user` where id = 123 limit 10001 /* select substring */ ---------------------------------------------------------------------- select id, substring_index(name, '123456', -1) from user where id = 123 /* select substring_index */ -1 ks_sharded/-40: select id, substring_index(`name`, '123456', -1) from user where id = 123 limit 10001 /* select substring_index */ +1 ks_sharded/-40: select id, substring_index(`name`, '123456', -1) from `user` where id = 123 limit 10001 /* select substring_index */ ---------------------------------------------------------------------- select id, case when name = 'alice' then 'ALICE' when name = 'bob' then 'BOB' end as name from user where id = 1 /* select case */ -1 ks_sharded/-40: select id, case when `name` = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' end as `name` from user where id = 1 limit 10001 /* select case */ +1 ks_sharded/-40: select id, case when `name` = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' end as `name` from `user` where id = 1 limit 10001 /* select case */ ---------------------------------------------------------------------- select id, case when name = 'alice' then 'ALICE' when name = 'bob' then 'BOB' else 'OTHER' end as name from user where id = 1 /* select case */ -1 ks_sharded/-40: select id, case when `name` = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' else 'OTHER' end as `name` from user where id = 1 limit 10001 /* select case */ +1 ks_sharded/-40: select id, case when `name` = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' else 'OTHER' end as `name` from `user` where id = 1 limit 10001 /* select case */ ---------------------------------------------------------------------- select id, case when substr(name, 1, 5) = 'alice' then 'ALICE' when name = 'bob' then 'BOB' else 'OTHER' end as name from user where id = 1 /* select case */ -1 ks_sharded/-40: select id, case when substr(`name`, 1, 5) = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' else 'OTHER' end as `name` from user where id = 1 limit 10001 /* select case */ +1 ks_sharded/-40: select id, case when substr(`name`, 1, 5) = 'alice' then 'ALICE' when `name` = 'bob' then 'BOB' else 'OTHER' end as `name` from `user` where id = 1 limit 10001 /* select case */ ---------------------------------------------------------------------- select id, 'abc' as test from user where id = 1 union all select id, 'def' as test from user where id = 1 union all select id, 'ghi' as test from user where id = 1 /* union all */ -1 ks_sharded/-40: select id, 'abc' as test from user where id = 1 union all select id, 'def' as test from user where id = 1 union all select id, 'ghi' as test from user where id = 1 limit 10001 /* union all */ +1 ks_sharded/-40: select id, 'abc' as test from `user` where id = 1 union all select id, 'def' as test from `user` where id = 1 union all select id, 'ghi' as test from `user` where id = 1 limit 10001 /* union all */ ---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/multi-output/target-output.txt b/go/vt/vtexplain/testdata/multi-output/target-output.txt index 4a99a3485e4..3686b86d055 100644 --- a/go/vt/vtexplain/testdata/multi-output/target-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/target-output.txt @@ -1,16 +1,16 @@ ---------------------------------------------------------------------- select * from user where email='null@void.com' -1 ks_sharded/40-80: select * from user where email = 'null@void.com' limit 10001 +1 ks_sharded/40-80: select * from `user` where email = 'null@void.com' limit 10001 ---------------------------------------------------------------------- select * from user where id in (1,2,3,4,5,6,7,8) -1 ks_sharded/40-80: select * from user where id in (1, 2, 3, 4, 5, 6, 7, 8) limit 10001 +1 ks_sharded/40-80: select * from `user` where id in (1, 2, 3, 4, 5, 6, 7, 8) limit 10001 ---------------------------------------------------------------------- insert into user (id, name) values (2, 'bob') -1 ks_sharded/40-80: insert into user(id, `name`) values (2, 'bob') +1 ks_sharded/40-80: insert into `user`(id, `name`) values (2, 'bob') ---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/multi-output/uneven-keyspace-output.txt b/go/vt/vtexplain/testdata/multi-output/uneven-keyspace-output.txt index 8ed6a239e98..dc74755801e 100644 --- a/go/vt/vtexplain/testdata/multi-output/uneven-keyspace-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/uneven-keyspace-output.txt @@ -1,16 +1,16 @@ ---------------------------------------------------------------------- select * from user -1 ks_sharded/-80: select * from user limit 10001 -1 ks_sharded/80-90: select * from user limit 10001 -1 ks_sharded/90-a0: select * from user limit 10001 -1 ks_sharded/a0-e8: select * from user limit 10001 -1 ks_sharded/e8-: select * from user limit 10001 +1 ks_sharded/-80: select * from `user` limit 10001 +1 ks_sharded/80-90: select * from `user` limit 10001 +1 ks_sharded/90-a0: select * from `user` limit 10001 +1 ks_sharded/a0-e8: select * from `user` limit 10001 +1 ks_sharded/e8-: select * from `user` limit 10001 ---------------------------------------------------------------------- select * from user where id in (10, 17, 42, 100000) -1 ks_sharded/-80: select * from user where id in (10, 17, 42) limit 10001 -1 ks_sharded/80-90: select * from user where id in (100000) limit 10001 +1 ks_sharded/-80: select * from `user` where id in (10, 17, 42) limit 10001 +1 ks_sharded/80-90: select * from `user` where id in (100000) limit 10001 ---------------------------------------------------------------------- diff --git a/go/vt/vtexplain/testdata/multi-output/updatesharded-output.txt b/go/vt/vtexplain/testdata/multi-output/updatesharded-output.txt index 4d952c6ba3e..75a06f0388b 100644 --- a/go/vt/vtexplain/testdata/multi-output/updatesharded-output.txt +++ b/go/vt/vtexplain/testdata/multi-output/updatesharded-output.txt @@ -2,7 +2,7 @@ update user set nickname='alice' where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set nickname = 'alice' where id = 1 limit 10001 +1 ks_sharded/-40: update `user` set nickname = 'alice' where id = 1 limit 10001 1 ks_sharded/-40: commit ---------------------------------------------------------------------- @@ -11,7 +11,7 @@ update user set nickname='alice' where name='alice' 1 ks_sharded/40-80: begin 1 ks_sharded/40-80: select `name`, user_id from name_user_map where `name` in ('alice') limit 10001 for update 2 ks_sharded/-40: begin -2 ks_sharded/-40: update user set nickname = 'alice' where `name` = 'alice' limit 10001 +2 ks_sharded/-40: update `user` set nickname = 'alice' where `name` = 'alice' limit 10001 3 ks_sharded/40-80: commit 4 ks_sharded/-40: commit @@ -19,19 +19,19 @@ update user set nickname='alice' where name='alice' update user set pet='fido' where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set pet = 'fido' where id = 1 limit 10001 +1 ks_sharded/-40: update `user` set pet = 'fido' where id = 1 limit 10001 1 ks_sharded/-40: commit ---------------------------------------------------------------------- update user set name='alicia' where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: select id, `name`, `name` = 'alicia' from user where id = 1 limit 10001 for update +1 ks_sharded/-40: select id, `name`, `name` = 'alicia' from `user` where id = 1 limit 10001 for update 2 ks_sharded/40-80: begin 2 ks_sharded/40-80: delete from name_user_map where `name` = 'name_val_2' and user_id = 1 limit 10001 3 ks_sharded/c0-: begin 3 ks_sharded/c0-: insert into name_user_map(`name`, user_id) values ('alicia', 1) -4 ks_sharded/-40: update user set `name` = 'alicia' where id = 1 limit 10001 +4 ks_sharded/-40: update `user` set `name` = 'alicia' where id = 1 limit 10001 5 ks_sharded/-40: commit 6 ks_sharded/40-80: commit 7 ks_sharded/c0-: commit @@ -42,11 +42,11 @@ update user set name='alicia' where name='alice' 1 ks_sharded/40-80: begin 1 ks_sharded/40-80: select `name`, user_id from name_user_map where `name` in ('alice') limit 10001 for update 2 ks_sharded/-40: begin -2 ks_sharded/-40: select id, `name`, `name` = 'alicia' from user where `name` = 'alice' limit 10001 for update +2 ks_sharded/-40: select id, `name`, `name` = 'alicia' from `user` where `name` = 'alice' limit 10001 for update 3 ks_sharded/40-80: delete from name_user_map where `name` = 'name_val_2' and user_id = 1 limit 10001 4 ks_sharded/c0-: begin 4 ks_sharded/c0-: insert into name_user_map(`name`, user_id) values ('alicia', 1) -5 ks_sharded/-40: update user set `name` = 'alicia' where `name` = 'alice' limit 10001 +5 ks_sharded/-40: update `user` set `name` = 'alicia' where `name` = 'alice' limit 10001 6 ks_sharded/40-80: commit 7 ks_sharded/-40: commit 8 ks_sharded/c0-: commit @@ -73,7 +73,7 @@ update user set pet='rover' where name='alice' 1 ks_sharded/40-80: begin 1 ks_sharded/40-80: select `name`, user_id from name_user_map where `name` in ('alice') limit 10001 for update 2 ks_sharded/-40: begin -2 ks_sharded/-40: update user set pet = 'rover' where `name` = 'alice' limit 10001 +2 ks_sharded/-40: update `user` set pet = 'rover' where `name` = 'alice' limit 10001 3 ks_sharded/40-80: commit 4 ks_sharded/-40: commit @@ -85,12 +85,12 @@ begin update user set nickname='alice' where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set nickname = 'alice' where id = 1 limit 10001 +1 ks_sharded/-40: update `user` set nickname = 'alice' where id = 1 limit 10001 ---------------------------------------------------------------------- update user set nickname='bob' where id=1 -2 ks_sharded/-40: update user set nickname = 'bob' where id = 1 limit 10001 +2 ks_sharded/-40: update `user` set nickname = 'bob' where id = 1 limit 10001 ---------------------------------------------------------------------- commit @@ -105,13 +105,13 @@ begin update user set nickname='alice' where id=1 1 ks_sharded/-40: begin -1 ks_sharded/-40: update user set nickname = 'alice' where id = 1 limit 10001 +1 ks_sharded/-40: update `user` set nickname = 'alice' where id = 1 limit 10001 ---------------------------------------------------------------------- update user set nickname='bob' where id=3 2 ks_sharded/40-80: begin -2 ks_sharded/40-80: update user set nickname = 'bob' where id = 3 limit 10001 +2 ks_sharded/40-80: update `user` set nickname = 'bob' where id = 3 limit 10001 ---------------------------------------------------------------------- commit diff --git a/go/vt/vtexplain/vtexplain_flaky_test.go b/go/vt/vtexplain/vtexplain_flaky_test.go index d2d9262dd1d..f75b49ae924 100644 --- a/go/vt/vtexplain/vtexplain_flaky_test.go +++ b/go/vt/vtexplain/vtexplain_flaky_test.go @@ -224,7 +224,7 @@ func TestJSONOutput(t *testing.T) { "ks_sharded/-40": { "MysqlQueries": [ { - "SQL": "select 1 from user where id = 1 limit 10001", + "SQL": "select 1 from ` + "`user`" + ` where id = 1 limit 10001", "Time": 1 } ], @@ -234,7 +234,7 @@ func TestJSONOutput(t *testing.T) { "#maxLimit": "10001", "vtg1": "1" }, - "SQL": "select :vtg1 from user where id = :vtg1", + "SQL": "select :vtg1 from ` + "`user`" + ` where id = :vtg1", "Time": 1 } ] diff --git a/go/vt/vtgate/autocommit_test.go b/go/vt/vtgate/autocommit_test.go index 87b0c3d3512..519607e800e 100644 --- a/go/vt/vtgate/autocommit_test.go +++ b/go/vt/vtgate/autocommit_test.go @@ -42,7 +42,7 @@ func TestAutocommitUpdateSharded(t *testing.T) { require.NoError(t, err) testQueries(t, "sbc1", sbc1, []*querypb.BoundQuery{{ - Sql: "update user set a = 2 where id = 1", + Sql: "update `user` set a = 2 where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }}) testCommitCount(t, "sbc1", sbc1, 0) @@ -271,7 +271,7 @@ func TestAutocommitInsertLookup(t *testing.T) { testCommitCount(t, "sbclookup", sbclookup, 1) testQueries(t, "sbc1", sbc1, []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 2, :_name_0)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 2, :_name_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname")), @@ -386,7 +386,7 @@ func TestAutocommitTransactionStarted(t *testing.T) { require.NoError(t, err) testQueries(t, "sbc1", sbc1, []*querypb.BoundQuery{{ - Sql: "update user set a = 2 where id = 1", + Sql: "update `user` set a = 2 where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }}) testCommitCount(t, "sbc1", sbc1, 0) diff --git a/go/vt/vtgate/executor.go b/go/vt/vtgate/executor.go index 32ba6ce95d7..6f0ae2ccd00 100644 --- a/go/vt/vtgate/executor.go +++ b/go/vt/vtgate/executor.go @@ -641,55 +641,6 @@ func (e *Executor) handleShow(ctx context.Context, safeSession *SafeSession, sql Fields: buildVarCharFields("Name", "Status", "Type", "Library", "License"), Rows: rows, }, nil - case "create table": - if !show.Table.Qualifier.IsEmpty() { - // Explicit keyspace was passed. Use that for targeting but remove from the query itself. - destKeyspace = show.Table.Qualifier.String() - show.Table.Qualifier = sqlparser.NewTableIdent("") - } else { - // No keyspace was indicated. Try to find one using the vschema. - tbl, err := e.VSchema().FindTable(destKeyspace, show.Table.Name.String()) - if err != nil { - return nil, err - } - destKeyspace = tbl.Keyspace.Name - } - sql = sqlparser.String(show) - case sqlparser.KeywordString(sqlparser.COLUMNS): - if !show.OnTable.Qualifier.IsEmpty() { - destKeyspace = show.OnTable.Qualifier.String() - show.OnTable.Qualifier = sqlparser.NewTableIdent("") - } else if show.ShowTablesOpt != nil { - if show.ShowTablesOpt.DbName != "" { - destKeyspace = show.ShowTablesOpt.DbName - show.ShowTablesOpt.DbName = "" - } - } else { - break - } - sql = sqlparser.String(show) - case sqlparser.KeywordString(sqlparser.INDEX), sqlparser.KeywordString(sqlparser.KEYS), sqlparser.KeywordString(sqlparser.INDEXES): - if !show.OnTable.Qualifier.IsEmpty() { - destKeyspace = show.OnTable.Qualifier.String() - show.OnTable.Qualifier = sqlparser.NewTableIdent("") - } else if show.ShowTablesOpt != nil { - if show.ShowTablesOpt.DbName != "" { - destKeyspace = show.ShowTablesOpt.DbName - show.ShowTablesOpt.DbName = "" - } - } else { - break - } - sql = sqlparser.String(show) - case sqlparser.KeywordString(sqlparser.TABLES): - if show.ShowTablesOpt != nil && show.ShowTablesOpt.DbName != "" { - if destKeyspace == "" { - // Change "show tables from " to "show tables" directed to that keyspace. - destKeyspace = show.ShowTablesOpt.DbName - } - show.ShowTablesOpt.DbName = "" - } - sql = sqlparser.String(show) case sqlparser.KeywordString(sqlparser.VITESS_SHARDS): showVitessShardsFilters := func(show *sqlparser.ShowLegacy) ([]func(string) bool, []func(string, *topodatapb.ShardReference) bool) { keyspaceFilters := []func(string) bool{} diff --git a/go/vt/vtgate/executor_dml_test.go b/go/vt/vtgate/executor_dml_test.go index 90ebf28825b..e4de9524700 100644 --- a/go/vt/vtgate/executor_dml_test.go +++ b/go/vt/vtgate/executor_dml_test.go @@ -48,7 +48,7 @@ func TestUpdateEqual(t *testing.T) { _, err := executorExec(executor, "update user set a=2 where id = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "update user set a = 2 where id = 1", + Sql: "update `user` set a = 2 where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc1.Queries, wantQueries) { @@ -63,7 +63,7 @@ func TestUpdateEqual(t *testing.T) { _, err = executorExec(executor, "update user set a=2 where id = 3", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "update user set a = 2 where id = 3", + Sql: "update `user` set a = 2 where id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc2.Queries, wantQueries) { @@ -223,10 +223,10 @@ func TestUpdateMultiOwned(t *testing.T) { t.Fatal(err) } wantQueries := []*querypb.BoundQuery{{ - Sql: "select id, a, b, c, d, e, f, a = 1 and b = 2, e = 3 and f = 4 from user where id = 1 for update", + Sql: "select id, a, b, c, d, e, f, a = 1 and b = 2, e = 3 and f = 4 from `user` where id = 1 for update", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "update user set a = 1, b = 2, f = 4, e = 3 where id = 1", + Sql: "update `user` set a = 1, b = 2, f = 4, e = 3 where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc1.Queries, wantQueries) { @@ -275,7 +275,7 @@ func TestUpdateComments(t *testing.T) { _, err := executorExec(executor, "update user set a=2 where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "update user set a = 2 where id = 1 /* trailing */", + Sql: "update `user` set a = 2 where id = 1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc1.Queries, wantQueries) { @@ -293,7 +293,7 @@ func TestUpdateNormalize(t *testing.T) { _, err := executorExec(executor, "/* leading */ update user set a=2 where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "/* leading */ update user set a = :vtg1 where id = :vtg2 /* trailing */", + Sql: "/* leading */ update `user` set a = :vtg1 where id = :vtg2 /* trailing */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.TestBindVariable(int64(2)), "vtg2": sqltypes.TestBindVariable(int64(1)), @@ -312,7 +312,7 @@ func TestUpdateNormalize(t *testing.T) { _, err = executorExec(executor, "/* leading */ update user set a=2 where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "/* leading */ update user set a = :vtg1 where id = :vtg2 /* trailing */", + Sql: "/* leading */ update `user` set a = :vtg1 where id = :vtg2 /* trailing */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.TestBindVariable(int64(2)), "vtg2": sqltypes.TestBindVariable(int64(1)), @@ -342,10 +342,10 @@ func TestDeleteEqual(t *testing.T) { _, err := executorExec(executor, "delete from user where id = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select Id, `name` from user where id = 1 for update", + Sql: "select Id, `name` from `user` where id = 1 for update", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "delete from user where id = 1", + Sql: "delete from `user` where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc.Queries, wantQueries) { @@ -369,10 +369,10 @@ func TestDeleteEqual(t *testing.T) { _, err = executorExec(executor, "delete from user where id = 1", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select Id, `name` from user where id = 1 for update", + Sql: "select Id, `name` from `user` where id = 1 for update", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "delete from user where id = 1", + Sql: "delete from `user` where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc.Queries, wantQueries) { @@ -527,10 +527,10 @@ func TestDeleteComments(t *testing.T) { _, err := executorExec(executor, "delete from user where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select Id, `name` from user where id = 1 for update /* trailing */", + Sql: "select Id, `name` from `user` where id = 1 for update /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "delete from user where id = 1 /* trailing */", + Sql: "delete from `user` where id = 1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }} if !reflect.DeepEqual(sbc.Queries, wantQueries) { @@ -558,7 +558,7 @@ func TestInsertSharded(t *testing.T) { _, err := executorExec(executor, "insert into user(id, v, name) values (1, 2, 'myname')", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 2, :_name_0)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 2, :_name_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname")), @@ -590,7 +590,7 @@ func TestInsertSharded(t *testing.T) { _, err = executorExec(executor, "insert into user(id, v, name) values (3, 2, 'myname2')", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 2, :_name_0)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 2, :_name_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(3), "__seq0": sqltypes.Int64BindVariable(3), @@ -692,7 +692,7 @@ func TestInsertShardedAutocommitLookup(t *testing.T) { _, err := executorExec(executor, "insert into user(id, v, name) values (1, 2, 'myname')", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 2, :_name_0)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 2, :_name_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname")), @@ -953,7 +953,7 @@ func TestInsertComments(t *testing.T) { _, err := executorExec(executor, "insert into user(id, v, name) values (1, 2, 'myname') /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 2, :_name_0) /* trailing */", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 2, :_name_0) /* trailing */", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname")), @@ -991,7 +991,7 @@ func TestInsertGeneratorSharded(t *testing.T) { result, err := executorExec(executor, "insert into user(v, `name`) values (2, 'myname')", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "insert into user(v, `name`, id) values (2, :_name_0, :_Id_0)", + Sql: "insert into `user`(v, `name`, id) values (2, :_name_0, :_Id_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "__seq0": sqltypes.Int64BindVariable(1), @@ -1275,7 +1275,7 @@ func TestMultiInsertSharded(t *testing.T) { _, err := executorExec(executor, "insert into user(id, v, name) values (1, 1, 'myname1'),(3, 3, 'myname3')", nil) require.NoError(t, err) wantQueries1 := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 1, :_name_0)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 1, :_name_0)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname1")), @@ -1287,7 +1287,7 @@ func TestMultiInsertSharded(t *testing.T) { }} wantQueries2 := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_1, 3, :_name_1)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_1, 3, :_name_1)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "_name_0": sqltypes.BytesBindVariable([]byte("myname1")), @@ -1324,7 +1324,7 @@ func TestMultiInsertSharded(t *testing.T) { _, err = executorExec(executor, "insert into user(id, v, name) values (1, 1, 'myname1'),(2, 2, 'myname2')", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "insert into user(id, v, `name`) values (:_Id_0, 1, :_name_0),(:_Id_1, 2, :_name_1)", + Sql: "insert into `user`(id, v, `name`) values (:_Id_0, 1, :_name_0),(:_Id_1, 2, :_name_1)", BindVariables: map[string]*querypb.BindVariable{ "_Id_0": sqltypes.Int64BindVariable(1), "__seq0": sqltypes.Int64BindVariable(1), @@ -1702,7 +1702,7 @@ func TestUpdateLastInsertID(t *testing.T) { _, err := executorExec(executor, sql, map[string]*querypb.BindVariable{}) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "update user set a = :__lastInsertId where id = :vtg1", + Sql: "update `user` set a = :__lastInsertId where id = :vtg1", BindVariables: map[string]*querypb.BindVariable{ "__lastInsertId": sqltypes.Uint64BindVariable(43), "vtg1": sqltypes.Int64BindVariable(1)}, diff --git a/go/vt/vtgate/executor_select_test.go b/go/vt/vtgate/executor_select_test.go index 75a9ef5bcce..d4eb3015c82 100644 --- a/go/vt/vtgate/executor_select_test.go +++ b/go/vt/vtgate/executor_select_test.go @@ -594,7 +594,7 @@ func TestSelectBindvars(t *testing.T) { }) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id = :id", + Sql: "select id from `user` where id = :id", BindVariables: map[string]*querypb.BindVariable{"id": sqltypes.Int64BindVariable(1)}, }} utils.MustMatch(t, sbc1.Queries, wantQueries) @@ -610,7 +610,7 @@ func TestSelectBindvars(t *testing.T) { }) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where `name` in ::__vals", + Sql: "select id from `user` where `name` in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "name1": sqltypes.BytesBindVariable([]byte("foo1")), "name2": sqltypes.BytesBindVariable([]byte("foo2")), @@ -631,7 +631,7 @@ func TestSelectBindvars(t *testing.T) { }) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where 1 != 1", + Sql: "select id from `user` where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "name1": sqltypes.BytesBindVariable([]byte("foo1")), "name2": sqltypes.BytesBindVariable([]byte("foo2")), @@ -662,7 +662,7 @@ func TestSelectBindvars(t *testing.T) { // When there are no matching rows in the vindex, vtgate still needs the field info wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where 1 != 1", + Sql: "select id from `user` where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "name": sqltypes.StringBindVariable("nonexistent"), }, @@ -691,7 +691,7 @@ func TestSelectEqual(t *testing.T) { _, err := executorExec(executor, "select id from user where id = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id = 1", + Sql: "select id from `user` where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -703,7 +703,7 @@ func TestSelectEqual(t *testing.T) { _, err = executorExec(executor, "select id from user where id = 3", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id = 3", + Sql: "select id from `user` where id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc2.Queries) @@ -718,7 +718,7 @@ func TestSelectEqual(t *testing.T) { _, err = executorExec(executor, "select id from user where id = '3'", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id = '3'", + Sql: "select id from `user` where id = '3'", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc2.Queries) @@ -737,7 +737,7 @@ func TestSelectEqual(t *testing.T) { _, err = executorExec(executor, "select id from user where name = 'foo'", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where `name` = 'foo'", + Sql: "select id from `user` where `name` = 'foo'", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -774,7 +774,7 @@ func TestSelectComments(t *testing.T) { _, err := executorExec(executor, "/* leading */ select id from user where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "/* leading */ select id from user where id = 1 /* trailing */", + Sql: "/* leading */ select id from `user` where id = 1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -791,7 +791,7 @@ func TestSelectNormalize(t *testing.T) { _, err := executorExec(executor, "/* leading */ select id from user where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "/* leading */ select id from user where id = :vtg1 /* trailing */", + Sql: "/* leading */ select id from `user` where id = :vtg1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.TestBindVariable(int64(1)), }, @@ -807,7 +807,7 @@ func TestSelectNormalize(t *testing.T) { _, err = executorExec(executor, "/* leading */ select id from user where id = 1 /* trailing */", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "/* leading */ select id from user where id = :vtg1 /* trailing */", + Sql: "/* leading */ select id from `user` where id = :vtg1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{ "vtg1": sqltypes.TestBindVariable(int64(1)), }, @@ -824,7 +824,7 @@ func TestSelectCaseSensitivity(t *testing.T) { _, err := executorExec(executor, "select Id from user where iD = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select Id from user where iD = 1", + Sql: "select Id from `user` where iD = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -885,7 +885,7 @@ func TestSelectIN(t *testing.T) { _, err := executorExec(executor, "select id from user where id in (1)", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]interface{}{int64(1)}), }, @@ -902,14 +902,14 @@ func TestSelectIN(t *testing.T) { _, err = executorExec(executor, "select id from user where id in (1, 3)", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]interface{}{int64(1)}), }, }} utils.MustMatch(t, wantQueries, sbc1.Queries) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]interface{}{int64(3)}), }, @@ -925,7 +925,7 @@ func TestSelectIN(t *testing.T) { }) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]interface{}{int64(1)}), "vals": sqltypes.TestBindVariable([]interface{}{int64(1), int64(3)}), @@ -933,7 +933,7 @@ func TestSelectIN(t *testing.T) { }} utils.MustMatch(t, wantQueries, sbc1.Queries) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": sqltypes.TestBindVariable([]interface{}{int64(3)}), "vals": sqltypes.TestBindVariable([]interface{}{int64(1), int64(3)}), @@ -951,7 +951,7 @@ func TestSelectIN(t *testing.T) { _, err = executorExec(executor, "select id from user where name = 'foo'", nil) require.NoError(t, err) wantQueries = []*querypb.BoundQuery{{ - Sql: "select id from user where `name` = 'foo'", + Sql: "select id from `user` where `name` = 'foo'", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -1030,16 +1030,17 @@ func TestSelectScatter(t *testing.T) { logChan := QueryLogger.Subscribe("Test") defer QueryLogger.Unsubscribe(logChan) - _, err := executorExec(executor, "select id from user", nil) + sql := "select id from user" + _, err := executorExec(executor, sql, nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user", + Sql: "select id from `user`", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { utils.MustMatch(t, wantQueries, conn.Queries) } - testQueryLog(t, logChan, "TestExecute", "SELECT", wantQueries[0].Sql, 8) + testQueryLog(t, logChan, "TestExecute", "SELECT", sql, 8) } func TestSelectScatterPartial(t *testing.T) { @@ -1175,7 +1176,7 @@ func TestSelectScatterOrderBy(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: query, + Sql: "select col1, col2 from `user` order by col2 desc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1240,7 +1241,7 @@ func TestSelectScatterOrderByVarChar(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select col1, textcol, weight_string(textcol) from user order by textcol desc", + Sql: "select col1, textcol, weight_string(textcol) from `user` order by textcol desc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1300,7 +1301,7 @@ func TestStreamSelectScatterOrderBy(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: query, + Sql: "select id, col from `user` order by col desc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1357,7 +1358,7 @@ func TestStreamSelectScatterOrderByVarChar(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id, textcol, weight_string(textcol) from user order by textcol desc", + Sql: "select id, textcol, weight_string(textcol) from `user` order by textcol desc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1414,7 +1415,7 @@ func TestSelectScatterAggregate(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: query + " order by col asc", + Sql: "select col, sum(foo) from `user` group by col order by col asc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1471,7 +1472,7 @@ func TestStreamSelectScatterAggregate(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: query + " order by col asc", + Sql: "select col, sum(foo) from `user` group by col order by col asc", BindVariables: map[string]*querypb.BindVariable{}, }} for _, conn := range conns { @@ -1529,7 +1530,7 @@ func TestSelectScatterLimit(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select col1, col2 from user order by col2 desc limit :__upper_limit", + Sql: "select col1, col2 from `user` order by col2 desc limit :__upper_limit", BindVariables: map[string]*querypb.BindVariable{"__upper_limit": sqltypes.Int64BindVariable(3)}, }} for _, conn := range conns { @@ -1595,7 +1596,7 @@ func TestStreamSelectScatterLimit(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select col1, col2 from user order by col2 desc limit :__upper_limit", + Sql: "select col1, col2 from `user` order by col2 desc limit :__upper_limit", BindVariables: map[string]*querypb.BindVariable{"__upper_limit": sqltypes.Int64BindVariable(3)}, }} for _, conn := range conns { @@ -1636,12 +1637,12 @@ func TestSimpleJoin(t *testing.T) { result, err := executorExec(executor, sql, nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id from user as u1 where u1.id = 1", + Sql: "select u1.id from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) wantQueries = []*querypb.BoundQuery{{ - Sql: "select u2.id from user as u2 where u2.id = 3", + Sql: "select u2.id from `user` as u2 where u2.id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc2.Queries) @@ -1673,12 +1674,12 @@ func TestJoinComments(t *testing.T) { _, err := executorExec(executor, sql, nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id from user as u1 where u1.id = 1 /* trailing */", + Sql: "select u1.id from `user` as u1 where u1.id = 1 /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) wantQueries = []*querypb.BoundQuery{{ - Sql: "select u2.id from user as u2 where u2.id = 3 /* trailing */", + Sql: "select u2.id from `user` as u2 where u2.id = 3 /* trailing */", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc2.Queries) @@ -1695,12 +1696,12 @@ func TestSimpleJoinStream(t *testing.T) { result, err := executorStream(executor, sql) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id from user as u1 where u1.id = 1", + Sql: "select u1.id from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) wantQueries = []*querypb.BoundQuery{{ - Sql: "select u2.id from user as u2 where u2.id = 3", + Sql: "select u2.id from `user` as u2 where u2.id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc2.Queries) @@ -1745,13 +1746,13 @@ func TestVarJoin(t *testing.T) { _, err := executorExec(executor, sql, nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) // We have to use string representation because bindvars type is too complex. got := fmt.Sprintf("%+v", sbc2.Queries) - want := `[sql:"select u2.id from user as u2 where u2.id = :u1_col" bind_variables: > ]` + want := `[sql:"select u2.id from ` + "`user`" + ` as u2 where u2.id = :u1_col" bind_variables: > ]` if got != want { t.Errorf("sbc2.Queries: %s, want %s\n", got, want) } @@ -1780,13 +1781,13 @@ func TestVarJoinStream(t *testing.T) { _, err := executorStream(executor, sql) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) // We have to use string representation because bindvars type is too complex. got := fmt.Sprintf("%+v", sbc2.Queries) - want := `[sql:"select u2.id from user as u2 where u2.id = :u1_col" bind_variables: > ]` + want := `[sql:"select u2.id from ` + "`user`" + ` as u2 where u2.id = :u1_col" bind_variables: > ]` if got != want { t.Errorf("sbc2.Queries: %s, want %s\n", got, want) } @@ -1893,10 +1894,10 @@ func TestEmptyJoin(t *testing.T) { result, err := executorExec(executor, "select u1.id, u2.id from user u1 join user u2 on u2.id = u1.col where u1.id = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u2.id from user as u2 where 1 != 1", + Sql: "select u2.id from `user` as u2 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "u1_col": sqltypes.NullBindVariable, }, @@ -1929,10 +1930,10 @@ func TestEmptyJoinStream(t *testing.T) { result, err := executorStream(executor, "select u1.id, u2.id from user u1 join user u2 on u2.id = u1.col where u1.id = 1") require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u2.id from user as u2 where 1 != 1", + Sql: "select u2.id from `user` as u2 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "u1_col": sqltypes.NullBindVariable, }, @@ -1969,13 +1970,13 @@ func TestEmptyJoinRecursive(t *testing.T) { result, err := executorExec(executor, "select u1.id, u2.id, u3.id from user u1 join (user u2 join user u3 on u3.id = u2.col) where u1.id = 1", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id from user as u1 where u1.id = 1", + Sql: "select u1.id from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u2.id, u2.col from user as u2 where 1 != 1", + Sql: "select u2.id, u2.col from `user` as u2 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u3.id from user as u3 where 1 != 1", + Sql: "select u3.id from `user` as u3 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "u2_col": sqltypes.NullBindVariable, }, @@ -2013,13 +2014,13 @@ func TestEmptyJoinRecursiveStream(t *testing.T) { result, err := executorStream(executor, "select u1.id, u2.id, u3.id from user u1 join (user u2 join user u3 on u3.id = u2.col) where u1.id = 1") require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id from user as u1 where u1.id = 1", + Sql: "select u1.id from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u2.id, u2.col from user as u2 where 1 != 1", + Sql: "select u2.id, u2.col from `user` as u2 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u3.id from user as u3 where 1 != 1", + Sql: "select u3.id from `user` as u3 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "u2_col": sqltypes.NullBindVariable, }, @@ -2054,13 +2055,13 @@ func TestCrossShardSubquery(t *testing.T) { result, err := executorExec(executor, "select id1 from (select u1.id id1, u2.id from user u1 join user u2 on u2.id = u1.col where u1.id = 1) as t", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id as id1, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id as id1, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) // We have to use string representation because bindvars type is too complex. got := fmt.Sprintf("%+v", sbc2.Queries) - want := `[sql:"select u2.id from user as u2 where u2.id = :u1_col" bind_variables: > ]` + want := `[sql:"select u2.id from ` + "`user`" + ` as u2 where u2.id = :u1_col" bind_variables: > ]` if got != want { t.Errorf("sbc2.Queries: %s, want %s\n", got, want) } @@ -2095,13 +2096,13 @@ func TestCrossShardSubqueryStream(t *testing.T) { result, err := executorStream(executor, "select id1 from (select u1.id id1, u2.id from user u1 join user u2 on u2.id = u1.col where u1.id = 1) as t") require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id as id1, u1.col from user as u1 where u1.id = 1", + Sql: "select u1.id as id1, u1.col from `user` as u1 where u1.id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) // We have to use string representation because bindvars type is too complex. got := fmt.Sprintf("%+v", sbc2.Queries) - want := `[sql:"select u2.id from user as u2 where u2.id = :u1_col" bind_variables: > ]` + want := `[sql:"select u2.id from ` + "`user`" + ` as u2 where u2.id = :u1_col" bind_variables: > ]` if got != want { t.Errorf("sbc2.Queries:\n%s, want\n%s\n", got, want) } @@ -2136,10 +2137,10 @@ func TestCrossShardSubqueryGetFields(t *testing.T) { result, err := executorExec(executor, "select main1.col, t.id1 from main1 join (select u1.id id1, u2.id from user u1 join user u2 on u2.id = u1.col where u1.id = 1) as t", nil) require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select u1.id as id1, u1.col from user as u1 where 1 != 1", + Sql: "select u1.id as id1, u1.col from `user` as u1 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select u2.id from user as u2 where 1 != 1", + Sql: "select u2.id from `user` as u2 where 1 != 1", BindVariables: map[string]*querypb.BindVariable{ "u1_col": sqltypes.NullBindVariable, }, @@ -2169,7 +2170,7 @@ func TestSelectBindvarswithPrepare(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where 1 != 1", + Sql: "select id from `user` where 1 != 1", BindVariables: map[string]*querypb.BindVariable{"id": sqltypes.Int64BindVariable(1)}, }} utils.MustMatch(t, wantQueries, sbc1.Queries) @@ -2186,14 +2187,14 @@ func TestSelectWithUnionAll(t *testing.T) { bv1, _ := sqltypes.BuildBindVariable([]int64{1, 2}) bv2, _ := sqltypes.BuildBindVariable([]int64{3}) sbc1WantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv1, "vtg1": bv, "vtg2": bv, }, }, { - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv1, "vtg1": bv, @@ -2201,14 +2202,14 @@ func TestSelectWithUnionAll(t *testing.T) { }, }} sbc2WantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv2, "vtg1": bv, "vtg2": bv, }, }, { - Sql: "select id from user where id in ::__vals", + Sql: "select id from `user` where id in ::__vals", BindVariables: map[string]*querypb.BindVariable{ "__vals": bv2, "vtg1": bv, diff --git a/go/vt/vtgate/executor_test.go b/go/vt/vtgate/executor_test.go index a1c7c4819d2..c14b2bc4256 100644 --- a/go/vt/vtgate/executor_test.go +++ b/go/vt/vtgate/executor_test.go @@ -413,7 +413,7 @@ func TestExecutorShowColumns(t *testing.T) { require.NoError(t, err) wantQueries := []*querypb.BoundQuery{{ - Sql: "show columns from user", + Sql: "show columns from `user`", BindVariables: map[string]*querypb.BindVariable{}, }} @@ -460,7 +460,7 @@ func TestExecutorShow(t *testing.T) { require.NoError(t, err) _, err = executor.Execute(ctx, "TestExecute", session, "show tables", nil) - assert.EqualError(t, err, errNoKeyspace.Error(), "'show tables' should fail without a keyspace") + assert.EqualError(t, err, "keyspace not specified", "'show tables' should fail without a keyspace") assert.Empty(t, sbclookup.Queries, "sbclookup unexpectedly has queries already") showResults := &sqltypes.Result{ @@ -509,58 +509,50 @@ func TestExecutorShow(t *testing.T) { _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show keys from %v.unknown", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show keys from unknown" + wantQuery = "show indexes from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show keys from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show keys from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) // SHOW INDEX with two different syntax _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show index from %v.unknown", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show index from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show index from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show index from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) // SHOW INDEXES with two different syntax _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show indexes from %v.unknown", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show indexes from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show indexes from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show indexes from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) // SHOW EXTENDED {INDEX | INDEXES | KEYS} _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show extended index from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show extended index from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show extended indexes from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show extended indexes from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) _, err = executor.Execute(ctx, "TestExecute", session, fmt.Sprintf("show extended keys from unknown from %v", KsTestUnsharded), nil) require.NoError(t, err) lastQuery = sbclookup.Queries[len(sbclookup.Queries)-1].Sql - wantQuery = "show extended keys from unknown" assert.Equal(t, wantQuery, lastQuery, "Got: %v. Want: %v", lastQuery, wantQuery) // Set desitation keyspace in session @@ -2000,7 +1992,7 @@ func TestExecutorExplain(t *testing.T) { require.NoError(t, err) require.Equal(t, - `[[VARCHAR("Route") VARCHAR("SelectScatter") VARCHAR("TestExecutor") VARCHAR("") VARCHAR("UNKNOWN") VARCHAR("select * from user")]]`, + `[[VARCHAR("Route") VARCHAR("SelectScatter") VARCHAR("TestExecutor") VARCHAR("") VARCHAR("UNKNOWN") VARCHAR("select * from `+"`user`"+`")]]`, fmt.Sprintf("%v", result.Rows)) result, err = executorExec(executor, "explain format = vitess select 42", bindVars) @@ -2123,7 +2115,7 @@ func TestExecutorSavepointInTx(t *testing.T) { Sql: "release savepoint a", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select id from user where id = 1", + Sql: "select id from `user` where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }, { Sql: "savepoint b", @@ -2155,7 +2147,7 @@ func TestExecutorSavepointInTx(t *testing.T) { Sql: "release savepoint b", BindVariables: map[string]*querypb.BindVariable{}, }, { - Sql: "select id from user where id = 3", + Sql: "select id from `user` where id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, sbc1WantQueries, sbc1.Queries, "") @@ -2194,12 +2186,12 @@ func TestExecutorSavepointWithoutTx(t *testing.T) { _, err = exec(executor, session, "select id from user where id = 3") require.NoError(t, err) sbc1WantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id = 1", + Sql: "select id from `user` where id = 1", BindVariables: map[string]*querypb.BindVariable{}, }} sbc2WantQueries := []*querypb.BoundQuery{{ - Sql: "select id from user where id = 3", + Sql: "select id from `user` where id = 3", BindVariables: map[string]*querypb.BindVariable{}, }} utils.MustMatch(t, sbc1WantQueries, sbc1.Queries, "") diff --git a/go/vt/vtgate/planbuilder/from.go b/go/vt/vtgate/planbuilder/from.go index 245186a5c59..58080b26a76 100644 --- a/go/vt/vtgate/planbuilder/from.go +++ b/go/vt/vtgate/planbuilder/from.go @@ -259,7 +259,7 @@ func (pb *primitiveBuilder) buildTablePrimitive(tableExpr *sqlparser.AliasedTabl eroute.Vindex, _ = vindex.(vindexes.SingleColumn) eroute.Values = []sqltypes.PlanValue{{Value: sqltypes.MakeTrusted(sqltypes.VarBinary, vschemaTable.Pinned)}} } - eroute.TableName = vschemaTable.Name.String() + eroute.TableName = sqlparser.String(vschemaTable.Name) rb.eroute = eroute return nil diff --git a/go/vt/vtgate/planbuilder/plan_test.go b/go/vt/vtgate/planbuilder/plan_test.go index da769cf8231..100bf6c1959 100644 --- a/go/vt/vtgate/planbuilder/plan_test.go +++ b/go/vt/vtgate/planbuilder/plan_test.go @@ -447,7 +447,7 @@ func testFile(t *testing.T, filename, tempDir string, vschema *vschemaWrapper, c if tcase.output == out { expected.WriteString(samePlanMarker) } else { - expected.WriteString(out) + expected.WriteString(fmt.Sprintf("%s\n", out)) } }) } else { diff --git a/go/vt/vtgate/planbuilder/show.go b/go/vt/vtgate/planbuilder/show.go index 50a1ded109b..2aacc6b47aa 100644 --- a/go/vt/vtgate/planbuilder/show.go +++ b/go/vt/vtgate/planbuilder/show.go @@ -20,6 +20,8 @@ import ( "regexp" "strings" + "vitess.io/vitess/go/vt/vtgate/vindexes" + "vitess.io/vitess/go/mysql" "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/key" @@ -41,10 +43,8 @@ func buildShowPlan(stmt *sqlparser.Show, vschema ContextVSchema) (engine.Primiti switch show := stmt.Internal.(type) { case *sqlparser.ShowBasic: return buildShowBasicPlan(show, vschema) - case *sqlparser.ShowColumns: - return buildShowColumnsPlan(show, vschema) - case *sqlparser.ShowTableStatus: - return buildShowTableStatusPlan(show, vschema) + case *sqlparser.ShowCreate: + return buildShowCreatePlan(show, vschema) default: return nil, ErrPlanNotSupported } @@ -53,43 +53,16 @@ func buildShowPlan(stmt *sqlparser.Show, vschema ContextVSchema) (engine.Primiti func buildShowBasicPlan(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { switch show.Command { case sqlparser.Charset: - return showCharset(show) + return buildCharsetPlan(show) case sqlparser.Collation, sqlparser.Function, sqlparser.Privilege, sqlparser.Procedure, sqlparser.VariableGlobal, sqlparser.VariableSession: - return showSendAnywhere(show, vschema) + return buildSendAnywherePlan(show, vschema) + case sqlparser.Column, sqlparser.Index: + return buildShowTblPlan(show, vschema) case sqlparser.Database, sqlparser.Keyspace: - ks, err := vschema.AllKeyspace() - if err != nil { - return nil, err - } - - var filter *regexp.Regexp - - if show.Filter != nil { - filter = sqlparser.LikeToRegexp(show.Filter.Like) - } - - if filter == nil { - filter = regexp.MustCompile(".*") - } - - //rows := make([][]sqltypes.Value, 0, len(ks)+4) - var rows [][]sqltypes.Value - - if show.Command == sqlparser.Database { - //Hard code default databases - rows = append(rows, buildVarCharRow("information_schema")) - rows = append(rows, buildVarCharRow("mysql")) - rows = append(rows, buildVarCharRow("sys")) - rows = append(rows, buildVarCharRow("performance_schema")) - } - - for _, v := range ks { - if filter.MatchString(v.Name) { - rows = append(rows, buildVarCharRow(v.Name)) - } - } - return engine.NewRowsPrimitive(rows, buildVarCharFields("Database")), nil + return buildDBPlan(show, vschema) + case sqlparser.OpenTable, sqlparser.TableStatus, sqlparser.Table, sqlparser.Trigger: + return buildPlanWithDB(show, vschema) case sqlparser.StatusGlobal, sqlparser.StatusSession: return engine.NewRowsPrimitive(make([][]sqltypes.Value, 0, 2), buildVarCharFields("Variable_name", "Value")), nil } @@ -97,21 +70,7 @@ func buildShowBasicPlan(show *sqlparser.ShowBasic, vschema ContextVSchema) (engi } -func showSendAnywhere(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { - ks, err := vschema.FirstSortedKeyspace() - if err != nil { - return nil, err - } - return &engine.Send{ - Keyspace: ks, - TargetDestination: key.DestinationAnyShard{}, - Query: sqlparser.String(show), - IsDML: false, - SingleShardOnly: true, - }, nil -} - -func showCharset(show *sqlparser.ShowBasic) (engine.Primitive, error) { +func buildCharsetPlan(show *sqlparser.ShowBasic) (engine.Primitive, error) { fields := buildVarCharFields("Charset", "Description", "Default collation") maxLenField := &querypb.Field{Name: "Maxlen", Type: sqltypes.Int32} fields = append(fields, maxLenField) @@ -125,16 +84,30 @@ func showCharset(show *sqlparser.ShowBasic) (engine.Primitive, error) { return engine.NewRowsPrimitive(rows, fields), nil } -func buildShowColumnsPlan(show *sqlparser.ShowColumns, vschema ContextVSchema) (engine.Primitive, error) { +func buildSendAnywherePlan(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { + ks, err := vschema.FirstSortedKeyspace() + if err != nil { + return nil, err + } + return &engine.Send{ + Keyspace: ks, + TargetDestination: key.DestinationAnyShard{}, + Query: sqlparser.String(show), + IsDML: false, + SingleShardOnly: true, + }, nil +} + +func buildShowTblPlan(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { if show.DbName != "" { - show.Table.Qualifier = sqlparser.NewTableIdent(show.DbName) + show.Tbl.Qualifier = sqlparser.NewTableIdent(show.DbName) } - table, _, _, _, destination, err := vschema.FindTableOrVindex(show.Table) + table, _, _, _, destination, err := vschema.FindTableOrVindex(show.Tbl) if err != nil { return nil, err } if table == nil { - return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "table does not exists: %s", show.Table.Name.String()) + return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "table does not exists: %s", show.Tbl.Name.String()) } if destination == nil { destination = key.DestinationAnyShard{} @@ -142,8 +115,8 @@ func buildShowColumnsPlan(show *sqlparser.ShowColumns, vschema ContextVSchema) ( // Remove Database Name from the query. show.DbName = "" - show.Table.Qualifier = sqlparser.NewTableIdent("") - show.Table.Name = table.Name + show.Tbl.Qualifier = sqlparser.NewTableIdent("") + show.Tbl.Name = table.Name return &engine.Send{ Keyspace: table.Keyspace, @@ -152,11 +125,56 @@ func buildShowColumnsPlan(show *sqlparser.ShowColumns, vschema ContextVSchema) ( IsDML: false, SingleShardOnly: true, }, nil +} +func buildDBPlan(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { + ks, err := vschema.AllKeyspace() + if err != nil { + return nil, err + } + + var filter *regexp.Regexp + + if show.Filter != nil { + filter = sqlparser.LikeToRegexp(show.Filter.Like) + } + + if filter == nil { + filter = regexp.MustCompile(".*") + } + + //rows := make([][]sqltypes.Value, 0, len(ks)+4) + var rows [][]sqltypes.Value + + if show.Command == sqlparser.Database { + //Hard code default databases + rows = append(rows, buildVarCharRow("information_schema")) + rows = append(rows, buildVarCharRow("mysql")) + rows = append(rows, buildVarCharRow("sys")) + rows = append(rows, buildVarCharRow("performance_schema")) + } + + for _, v := range ks { + if filter.MatchString(v.Name) { + rows = append(rows, buildVarCharRow(v.Name)) + } + } + return engine.NewRowsPrimitive(rows, buildVarCharFields("Database")), nil } -func buildShowTableStatusPlan(show *sqlparser.ShowTableStatus, vschema ContextVSchema) (engine.Primitive, error) { - destination, keyspace, _, err := vschema.TargetDestination(show.DatabaseName) +func buildPlanWithDB(show *sqlparser.ShowBasic, vschema ContextVSchema) (engine.Primitive, error) { + dbName := show.DbName + if sqlparser.SystemSchema(dbName) { + ks, err := vschema.AnyKeyspace() + if err != nil { + return nil, err + } + dbName = ks.Name + } else { + // Remove Database Name from the query. + show.DbName = "" + } + destination, keyspace, _, err := vschema.TargetDestination(dbName) if err != nil { return nil, err } @@ -164,9 +182,6 @@ func buildShowTableStatusPlan(show *sqlparser.ShowTableStatus, vschema ContextVS destination = key.DestinationAnyShard{} } - // Remove Database Name from the query. - show.DatabaseName = "" - query := sqlparser.String(show) return &engine.Send{ Keyspace: keyspace, @@ -290,3 +305,113 @@ func checkLikeOpt(likeOpt string, colNames []string) (string, error) { return "", nil } + +func buildShowCreatePlan(show *sqlparser.ShowCreate, vschema ContextVSchema) (engine.Primitive, error) { + switch show.Command { + case sqlparser.CreateDb: + return buildCreateDbPlan(show, vschema) + case sqlparser.CreateE, sqlparser.CreateF, sqlparser.CreateProc, sqlparser.CreateTr, sqlparser.CreateV: + return buildCreatePlan(show, vschema) + case sqlparser.CreateTbl: + return buildCreateTblPlan(show, vschema) + } + return nil, vterrors.Errorf(vtrpcpb.Code_INTERNAL, "BUG: unknown show query type %s", show.Command.ToString()) +} + +func buildCreateDbPlan(show *sqlparser.ShowCreate, vschema ContextVSchema) (engine.Primitive, error) { + dbName := show.Op.Name.String() + if sqlparser.SystemSchema(dbName) { + ks, err := vschema.AnyKeyspace() + if err != nil { + return nil, err + } + dbName = ks.Name + } + + dest, ks, _, err := vschema.TargetDestination(dbName) + if err != nil { + return nil, err + } + + if dest == nil { + dest = key.DestinationAnyShard{} + } + + return &engine.Send{ + Keyspace: ks, + TargetDestination: dest, + Query: sqlparser.String(show), + IsDML: false, + SingleShardOnly: true, + }, nil +} + +func buildCreateTblPlan(show *sqlparser.ShowCreate, vschema ContextVSchema) (engine.Primitive, error) { + dest := key.Destination(key.DestinationAnyShard{}) + var ks *vindexes.Keyspace + var err error + + if !show.Op.Qualifier.IsEmpty() && sqlparser.SystemSchema(show.Op.Qualifier.String()) { + ks, err = vschema.AnyKeyspace() + if err != nil { + return nil, err + } + } else { + tbl, _, _, _, destKs, err := vschema.FindTableOrVindex(show.Op) + if err != nil { + return nil, err + } + if tbl == nil { + return nil, vterrors.Errorf(vtrpcpb.Code_NOT_FOUND, "table now found: %v", show.Op) + } + ks = tbl.Keyspace + if destKs != nil { + dest = destKs + } + show.Op.Qualifier = sqlparser.NewTableIdent("") + show.Op.Name = tbl.Name + } + + return &engine.Send{ + Keyspace: ks, + TargetDestination: dest, + Query: sqlparser.String(show), + IsDML: false, + SingleShardOnly: true, + }, nil + +} + +func buildCreatePlan(show *sqlparser.ShowCreate, vschema ContextVSchema) (engine.Primitive, error) { + dbName := "" + if !show.Op.Qualifier.IsEmpty() { + dbName = show.Op.Qualifier.String() + } + + if sqlparser.SystemSchema(dbName) { + ks, err := vschema.AnyKeyspace() + if err != nil { + return nil, err + } + dbName = ks.Name + } else { + show.Op.Qualifier = sqlparser.NewTableIdent("") + } + + dest, ks, _, err := vschema.TargetDestination(dbName) + if err != nil { + return nil, err + } + if dest == nil { + dest = key.DestinationAnyShard{} + } + + return &engine.Send{ + Keyspace: ks, + TargetDestination: dest, + Query: sqlparser.String(show), + IsDML: false, + SingleShardOnly: true, + }, nil + +} diff --git a/go/vt/vtgate/planbuilder/testdata/aggr_cases.txt b/go/vt/vtgate/planbuilder/testdata/aggr_cases.txt index 71980f73254..83b1ae979ea 100644 --- a/go/vt/vtgate/planbuilder/testdata/aggr_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/aggr_cases.txt @@ -31,9 +31,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*), col from user where 1 != 1", - "Query": "select count(*), col from user where id = 1", - "Table": "user", + "FieldQuery": "select count(*), col from `user` where 1 != 1", + "Query": "select count(*), col from `user` where id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -54,9 +54,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select fun(1), col from user where 1 != 1", - "Query": "select fun(1), col from user", - "Table": "user" + "FieldQuery": "select fun(1), col from `user` where 1 != 1", + "Query": "select fun(1), col from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -73,9 +73,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, id from user where 1 != 1", - "Query": "select distinct col1, id from user", - "Table": "user" + "FieldQuery": "select col1, id from `user` where 1 != 1", + "Query": "select distinct col1, id from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -92,9 +92,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, id from user where 1 != 1 group by col1", - "Query": "select distinct col1, id from user group by col1", - "Table": "user" + "FieldQuery": "select col1, id from `user` where 1 != 1 group by col1", + "Query": "select distinct col1, id from `user` group by col1", + "Table": "`user`" } } Gen4 plan same as above @@ -118,10 +118,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*), a, textcol1, b, weight_string(textcol1) from user where 1 != 1 group by a, textcol1, b", + "FieldQuery": "select count(*), a, textcol1, b, weight_string(textcol1) from `user` where 1 != 1 group by a, textcol1, b", "OrderBy": "1 ASC, 4 ASC, 3 ASC", - "Query": "select count(*), a, textcol1, b, weight_string(textcol1) from user group by a, textcol1, b order by a asc, textcol1 asc, b asc", - "Table": "user" + "Query": "select count(*), a, textcol1, b, weight_string(textcol1) from `user` group by a, textcol1, b order by a asc, textcol1 asc, b asc", + "Table": "`user`" } ] } @@ -151,10 +151,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) as k, a, textcol1, b, weight_string(textcol1) from user where 1 != 1 group by a, textcol1, b", + "FieldQuery": "select count(*) as k, a, textcol1, b, weight_string(textcol1) from `user` where 1 != 1 group by a, textcol1, b", "OrderBy": "4 ASC, 1 ASC, 3 ASC", - "Query": "select count(*) as k, a, textcol1, b, weight_string(textcol1) from user group by a, textcol1, b order by textcol1 asc, a asc, b asc", - "Table": "user" + "Query": "select count(*) as k, a, textcol1, b, weight_string(textcol1) from `user` group by a, textcol1, b order by textcol1 asc, a asc, b asc", + "Table": "`user`" } ] } @@ -180,9 +180,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) from user where 1 != 1", - "Query": "select count(*) from user", - "Table": "user" + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user`", + "Table": "`user`" } ] } @@ -206,9 +206,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select sum(col) from user where 1 != 1", - "Query": "select sum(col) from user", - "Table": "user" + "FieldQuery": "select sum(col) from `user` where 1 != 1", + "Query": "select sum(col) from `user`", + "Table": "`user`" } ] } @@ -232,9 +232,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select min(col) from user where 1 != 1", - "Query": "select min(col) from user", - "Table": "user" + "FieldQuery": "select min(col) from `user` where 1 != 1", + "Query": "select min(col) from `user`", + "Table": "`user`" } ] } @@ -258,9 +258,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select max(col) from user where 1 != 1", - "Query": "select max(col) from user", - "Table": "user" + "FieldQuery": "select max(col) from `user` where 1 != 1", + "Query": "select max(col) from `user`", + "Table": "`user`" } ] } @@ -284,10 +284,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 group by col1", + "FieldQuery": "select col1, col2 from `user` where 1 != 1 group by col1", "OrderBy": "0 ASC, 1 ASC, 0 ASC", - "Query": "select distinct col1, col2 from user group by col1 order by col1 asc, col2 asc, col1 asc", - "Table": "user" + "Query": "select distinct col1, col2 from `user` group by col1 order by col1 asc, col2 asc, col1 asc", + "Table": "`user`" } ] } @@ -302,7 +302,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -311,9 +311,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.a from user where 1 != 1", - "Query": "select user.a from user", - "Table": "user" + "FieldQuery": "select `user`.a from `user` where 1 != 1", + "Query": "select `user`.a from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -342,9 +342,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(*) from user where 1 != 1 group by id", - "Query": "select id, count(*) from user group by id", - "Table": "user" + "FieldQuery": "select id, count(*) from `user` where 1 != 1 group by id", + "Query": "select id, count(*) from `user` group by id", + "Table": "`user`" } } Gen4 plan same as above @@ -361,9 +361,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, col, count(*) from user where 1 != 1 group by id, col", - "Query": "select id, col, count(*) from user group by id, col", - "Table": "user" + "FieldQuery": "select id, col, count(*) from `user` where 1 != 1 group by id, col", + "Query": "select id, col, count(*) from `user` group by id, col", + "Table": "`user`" } } Gen4 plan same as above @@ -387,10 +387,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col, count(*) from user where 1 != 1 group by col", + "FieldQuery": "select col, count(*) from `user` where 1 != 1 group by col", "OrderBy": "0 ASC", - "Query": "select col, count(*) from user group by col order by col asc", - "Table": "user" + "Query": "select col, count(*) from `user` group by col order by col asc", + "Table": "`user`" } ] } @@ -419,10 +419,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select `name`, count(*) from user where 1 != 1 group by `name`", + "FieldQuery": "select `name`, count(*) from `user` where 1 != 1 group by `name`", "OrderBy": "0 ASC", - "Query": "select `name`, count(*) from user group by `name` order by `name` asc", - "Table": "user" + "Query": "select `name`, count(*) from `user` group by `name` order by `name` asc", + "Table": "`user`" } ] } @@ -440,9 +440,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, 1 + count(*) from user where 1 != 1 group by id", - "Query": "select id, 1 + count(*) from user group by id", - "Table": "user" + "FieldQuery": "select id, 1 + count(*) from `user` where 1 != 1 group by id", + "Query": "select id, 1 + count(*) from `user` group by id", + "Table": "`user`" } } Gen4 plan same as above @@ -459,9 +459,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id as val, 1 + count(*) from user where 1 != 1 group by val", - "Query": "select id as val, 1 + count(*) from user group by val", - "Table": "user" + "FieldQuery": "select id as val, 1 + count(*) from `user` where 1 != 1 group by val", + "Query": "select id as val, 1 + count(*) from `user` group by val", + "Table": "`user`" } } Gen4 plan same as above @@ -478,9 +478,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select val as id, 1 + count(*) from user where 1 != 1 group by user.id", - "Query": "select val as id, 1 + count(*) from user group by user.id", - "Table": "user" + "FieldQuery": "select val as id, 1 + count(*) from `user` where 1 != 1 group by `user`.id", + "Query": "select val as id, 1 + count(*) from `user` group by `user`.id", + "Table": "`user`" } } Gen4 plan same as above @@ -497,9 +497,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select *, id, 1 + count(*) from user where 1 != 1 group by id", - "Query": "select *, id, 1 + count(*) from user group by id", - "Table": "user" + "FieldQuery": "select *, id, 1 + count(*) from `user` where 1 != 1 group by id", + "Query": "select *, id, 1 + count(*) from `user` group by id", + "Table": "`user`" } } Gen4 plan same as above @@ -516,9 +516,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(*) as c from user where 1 != 1 group by id", - "Query": "select id, count(*) as c from user group by id having id = 1 and c = 10", - "Table": "user", + "FieldQuery": "select id, count(*) as c from `user` where 1 != 1 group by id", + "Query": "select id, count(*) as c from `user` group by id having id = 1 and c = 10", + "Table": "`user`", "Values": [ 1 ], @@ -550,9 +550,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) as a from user where 1 != 1", - "Query": "select count(*) as a from user", - "Table": "user" + "FieldQuery": "select count(*) as a from `user` where 1 != 1", + "Query": "select count(*) as a from `user`", + "Table": "`user`" } ] } @@ -578,9 +578,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(*) from user where 1 != 1", - "Query": "select id, count(*) from user", - "Table": "user" + "FieldQuery": "select id, count(*) from `user` where 1 != 1", + "Query": "select id, count(*) from `user`", + "Table": "`user`" } ] } @@ -604,10 +604,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", + "FieldQuery": "select col from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select distinct col from user order by col asc", - "Table": "user" + "Query": "select distinct col from `user` order by col asc", + "Table": "`user`" } ] } @@ -631,10 +631,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1 group by col", + "FieldQuery": "select col from `user` where 1 != 1 group by col", "OrderBy": "0 ASC", - "Query": "select col from user group by col order by col asc", - "Table": "user" + "Query": "select col from `user` group by col order by col asc", + "Table": "`user`" } ] } @@ -652,9 +652,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id, count(distinct col) from user where 1 != 1 group by id", - "Query": "select id, count(distinct col) from user group by id", - "Table": "user" + "FieldQuery": "select id, count(distinct col) from `user` where 1 != 1 group by id", + "Query": "select id, count(distinct col) from `user` group by id", + "Table": "`user`" } } Gen4 plan same as above @@ -678,10 +678,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col, count(distinct id) from user where 1 != 1 group by col", + "FieldQuery": "select col, count(distinct id) from `user` where 1 != 1 group by col", "OrderBy": "0 ASC", - "Query": "select col, count(distinct id) from user group by col order by col asc", - "Table": "user" + "Query": "select col, count(distinct id) from `user` group by col order by col asc", + "Table": "`user`" } ] } @@ -706,10 +706,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 group by col1, col2", + "FieldQuery": "select col1, col2 from `user` where 1 != 1 group by col1, col2", "OrderBy": "0 ASC, 1 ASC", - "Query": "select col1, col2 from user group by col1, col2 order by col1 asc, col2 asc", - "Table": "user" + "Query": "select col1, col2 from `user` group by col1, col2 order by col1 asc, col2 asc", + "Table": "`user`" } ] } @@ -733,10 +733,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col2 from user where 1 != 1 group by col2", + "FieldQuery": "select col2 from `user` where 1 != 1 group by col2", "OrderBy": "0 ASC", - "Query": "select col2 from user group by col2 order by col2 asc", - "Table": "user" + "Query": "select col2 from `user` group by col2 order by col2 asc", + "Table": "`user`" } ] } @@ -761,10 +761,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 group by col1, col2", + "FieldQuery": "select col1, col2 from `user` where 1 != 1 group by col1, col2", "OrderBy": "0 ASC, 1 ASC", - "Query": "select col1, col2 from user group by col1, col2 order by col1 asc, col2 asc", - "Table": "user" + "Query": "select col1, col2 from `user` group by col1, col2 order by col1 asc, col2 asc", + "Table": "`user`" } ] } @@ -789,10 +789,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 group by col1, col2", + "FieldQuery": "select col1, col2 from `user` where 1 != 1 group by col1, col2", "OrderBy": "0 ASC, 1 ASC", - "Query": "select col1, col2 from user group by col1, col2 order by col1 asc, col2 asc", - "Table": "user" + "Query": "select col1, col2 from `user` group by col1, col2 order by col1 asc, col2 asc", + "Table": "`user`" } ] } @@ -817,10 +817,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, min(distinct col2) from user where 1 != 1 group by col1", + "FieldQuery": "select col1, min(distinct col2) from `user` where 1 != 1 group by col1", "OrderBy": "0 ASC", - "Query": "select col1, min(distinct col2) from user group by col1 order by col1 asc", - "Table": "user" + "Query": "select col1, min(distinct col2) from `user` group by col1 order by col1 asc", + "Table": "`user`" } ] } @@ -850,10 +850,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 group by col1, col2", + "FieldQuery": "select col1, col2 from `user` where 1 != 1 group by col1, col2", "OrderBy": "0 ASC, 1 ASC", - "Query": "select col1, col2 from user group by col1, col2 order by col1 asc, col2 asc", - "Table": "user" + "Query": "select col1, col2 from `user` group by col1, col2 order by col1 asc, col2 asc", + "Table": "`user`" } ] } @@ -884,10 +884,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) from user where 1 != 1 group by b, a", + "FieldQuery": "select a, b, count(*) from `user` where 1 != 1 group by b, a", "OrderBy": "1 ASC, 0 ASC", - "Query": "select a, b, count(*) from user group by b, a order by b asc, a asc", - "Table": "user" + "Query": "select a, b, count(*) from `user` group by b, a order by b asc, a asc", + "Table": "`user`" } ] } @@ -912,10 +912,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) from user where 1 != 1 group by 2, 1", + "FieldQuery": "select a, b, count(*) from `user` where 1 != 1 group by 2, 1", "OrderBy": "1 ASC, 0 ASC", - "Query": "select a, b, count(*) from user group by 2, 1 order by b asc, a asc", - "Table": "user" + "Query": "select a, b, count(*) from `user` group by 2, 1 order by b asc, a asc", + "Table": "`user`" } ] } @@ -940,10 +940,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) from user where 1 != 1 group by b, a", + "FieldQuery": "select a, b, count(*) from `user` where 1 != 1 group by b, a", "OrderBy": "1 ASC, 0 ASC", - "Query": "select a, b, count(*) from user group by b, a order by b asc, a asc", - "Table": "user" + "Query": "select a, b, count(*) from `user` group by b, a order by b asc, a asc", + "Table": "`user`" } ] } @@ -967,10 +967,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1 group by 1", + "FieldQuery": "select col from `user` where 1 != 1 group by 1", "OrderBy": "0 ASC", - "Query": "select col from user group by 1 order by col asc", - "Table": "user" + "Query": "select col from `user` group by 1 order by col asc", + "Table": "`user`" } ] } @@ -998,9 +998,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) from user where 1 != 1", - "Query": "select count(*) from user", - "Table": "user" + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select count(*) from `user`", + "Table": "`user`" } ] } @@ -1029,10 +1029,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, c, d, count(*) from user where 1 != 1 group by 1, 2, 3", + "FieldQuery": "select a, b, c, d, count(*) from `user` where 1 != 1 group by 1, 2, 3", "OrderBy": "0 ASC, 1 ASC, 2 ASC", - "Query": "select a, b, c, d, count(*) from user group by 1, 2, 3 order by 1 asc, 2 asc, 3 asc", - "Table": "user" + "Query": "select a, b, c, d, count(*) from `user` group by 1, 2, 3 order by 1 asc, 2 asc, 3 asc", + "Table": "`user`" } ] } @@ -1057,10 +1057,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, c, d, count(*) from user where 1 != 1 group by 1, 2, 3", + "FieldQuery": "select a, b, c, d, count(*) from `user` where 1 != 1 group by 1, 2, 3", "OrderBy": "0 ASC, 1 ASC, 2 ASC", - "Query": "select a, b, c, d, count(*) from user group by 1, 2, 3 order by a asc, b asc, c asc", - "Table": "user" + "Query": "select a, b, c, d, count(*) from `user` group by 1, 2, 3 order by a asc, b asc, c asc", + "Table": "`user`" } ] } @@ -1085,10 +1085,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, c, d, count(*) from user where 1 != 1 group by 1, 2, 3, 4", + "FieldQuery": "select a, b, c, d, count(*) from `user` where 1 != 1 group by 1, 2, 3, 4", "OrderBy": "3 ASC, 1 ASC, 0 ASC, 2 ASC", - "Query": "select a, b, c, d, count(*) from user group by 1, 2, 3, 4 order by d asc, b asc, a asc, c asc", - "Table": "user" + "Query": "select a, b, c, d, count(*) from `user` group by 1, 2, 3, 4 order by d asc, b asc, a asc, c asc", + "Table": "`user`" } ] } @@ -1113,10 +1113,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, c, d, count(*) from user where 1 != 1 group by 3, 2, 1, 4", + "FieldQuery": "select a, b, c, d, count(*) from `user` where 1 != 1 group by 3, 2, 1, 4", "OrderBy": "3 ASC, 1 ASC, 0 ASC, 2 ASC", - "Query": "select a, b, c, d, count(*) from user group by 3, 2, 1, 4 order by d asc, b asc, a asc, c asc", - "Table": "user" + "Query": "select a, b, c, d, count(*) from `user` group by 3, 2, 1, 4 order by d asc, b asc, a asc, c asc", + "Table": "`user`" } ] } @@ -1141,10 +1141,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, c, count(*) from user where 1 != 1 group by 3, 2, 1", + "FieldQuery": "select a, b, c, count(*) from `user` where 1 != 1 group by 3, 2, 1", "OrderBy": "0 DESC, 2 DESC, 1 ASC", - "Query": "select a, b, c, count(*) from user group by 3, 2, 1 order by 1 desc, 3 desc, b asc", - "Table": "user" + "Query": "select a, b, c, count(*) from `user` group by 3, 2, 1 order by 1 desc, 3 desc, b asc", + "Table": "`user`" } ] } @@ -1177,10 +1177,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col, count(*) from user where 1 != 1 group by col", + "FieldQuery": "select col, count(*) from `user` where 1 != 1 group by col", "OrderBy": "0 ASC", - "Query": "select col, count(*) from user group by col order by col asc limit :__upper_limit", - "Table": "user" + "Query": "select col, count(*) from `user` group by col order by col asc limit :__upper_limit", + "Table": "`user`" } ] } @@ -1200,9 +1200,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a from user where 1 != 1 group by a collate utf8_general_ci", - "Query": "select user.col1 as a from user where user.id = 5 group by a collate utf8_general_ci", - "Table": "user", + "FieldQuery": "select `user`.col1 as a from `user` where 1 != 1 group by a collate utf8_general_ci", + "Query": "select `user`.col1 as a from `user` where `user`.id = 5 group by a collate utf8_general_ci", + "Table": "`user`", "Values": [ 5 ], @@ -1270,10 +1270,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, count(*) from user where 1 != 1", + "FieldQuery": "select a, count(*) from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select a, count(*) from user order by a asc", - "Table": "user" + "Query": "select a, count(*) from `user` order by a asc", + "Table": "`user`" } ] } @@ -1303,10 +1303,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, count(*) from user where 1 != 1 group by a", + "FieldQuery": "select a, count(*) from `user` where 1 != 1 group by a", "OrderBy": "0 ASC, 0 ASC", - "Query": "select a, count(*) from user group by a order by a asc, a asc", - "Table": "user" + "Query": "select a, count(*) from `user` group by a order by a asc, a asc", + "Table": "`user`" } ] } diff --git a/go/vt/vtgate/planbuilder/testdata/alterVschema_cases.txt b/go/vt/vtgate/planbuilder/testdata/alterVschema_cases.txt index 91e071130d9..7fe1469ddfd 100644 --- a/go/vt/vtgate/planbuilder/testdata/alterVschema_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/alterVschema_cases.txt @@ -24,7 +24,7 @@ "Name": "user", "Sharded": true }, - "query": "alter vschema create vindex user.hash_vdx using hash" + "query": "alter vschema create vindex `user`.hash_vdx using hash" } } @@ -84,7 +84,7 @@ "Name": "user", "Sharded": true }, - "query": "alter vschema on user.a add auto_increment id using a_seq" + "query": "alter vschema on `user`.a add auto_increment id using a_seq" } } diff --git a/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt b/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt index c324053b9e8..2ddb626bb6b 100644 --- a/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/bypass_cases.txt @@ -30,7 +30,7 @@ Gen4 plan same as above }, "TargetDestination": "Shard(-80)", "IsDML": true, - "Query": "update user set val = 1 where id = 18446744073709551616 and id = 1", + "Query": "update `user` set val = 1 where id = 18446744073709551616 and id = 1", "SingleShardOnly": false } } @@ -49,7 +49,7 @@ Gen4 plan same as above }, "TargetDestination": "Shard(-80)", "IsDML": true, - "Query": "delete from USER where ID = 42", + "Query": "delete from `USER` where ID = 42", "SingleShardOnly": false } } @@ -68,7 +68,7 @@ Gen4 plan same as above }, "TargetDestination": "Shard(-80)", "IsDML": true, - "Query": "insert into USER(ID, `NAME`) values (42, 'ms X')", + "Query": "insert into `USER`(ID, `NAME`) values (42, 'ms X')", "SingleShardOnly": false } } @@ -87,7 +87,7 @@ Gen4 plan same as above }, "TargetDestination": "Shard(-80)", "IsDML": true, - "Query": "insert into user(nonid) values (2)", + "Query": "insert into `user`(nonid) values (2)", "SingleShardOnly": false } } @@ -112,6 +112,7 @@ Gen4 plan same as above } Gen4 plan same as above +# Select outfile "select * from user into outfile S3 'x.txt'" { "QueryType": "SELECT", @@ -124,7 +125,7 @@ Gen4 plan same as above }, "TargetDestination": "Shard(-80)", "IsDML": false, - "Query": "select * from user into outfile s3 'x.txt'", + "Query": "select * from `user` into outfile s3 'x.txt'", "SingleShardOnly": false } } diff --git a/go/vt/vtgate/planbuilder/testdata/ddl_cases.txt b/go/vt/vtgate/planbuilder/testdata/ddl_cases.txt index f3e0ed41f80..2f7530fb9ea 100644 --- a/go/vt/vtgate/planbuilder/testdata/ddl_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/ddl_cases.txt @@ -73,7 +73,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter table user add column id int" + "Query": "alter table `user` add column id int" } } @@ -155,7 +155,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter table user add index a (id)" + "Query": "alter table `user` add index a (id)" } } @@ -260,7 +260,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter view user_extra as select * from user" + "Query": "alter view user_extra as select * from `user`" } } diff --git a/go/vt/vtgate/planbuilder/testdata/ddl_cases_no_default_keyspace.txt b/go/vt/vtgate/planbuilder/testdata/ddl_cases_no_default_keyspace.txt index ecbb82bd37c..4a95edf3fdb 100644 --- a/go/vt/vtgate/planbuilder/testdata/ddl_cases_no_default_keyspace.txt +++ b/go/vt/vtgate/planbuilder/testdata/ddl_cases_no_default_keyspace.txt @@ -9,7 +9,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view a as select * from user" + "Query": "create view a as select * from `user`" } } @@ -24,7 +24,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view a as select * from user" + "Query": "create view a as select * from `user`" } } @@ -39,7 +39,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select 1 from user" + "Query": "create view view_a as select 1 from `user`" } } @@ -54,7 +54,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.* from user" + "Query": "create view view_a as select `user`.* from `user`" } } @@ -69,7 +69,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user" + "Query": "create view view_a as select * from `user`" } } @@ -84,7 +84,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.* from user" + "Query": "create view view_a as select `user`.* from `user`" } } @@ -144,7 +144,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from authoritative join user on authoritative.user_id = user.id" + "Query": "create view view_a as select * from authoritative join `user` on authoritative.user_id = `user`.id" } } @@ -159,7 +159,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.id, a.*, user.col1 from authoritative as a join user on a.user_id = user.id" + "Query": "create view view_a as select `user`.id, a.*, `user`.col1 from authoritative as a join `user` on a.user_id = `user`.id" } } @@ -174,7 +174,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select col from user join user_extra on user.id = user_extra.user_id" + "Query": "create view view_a as select col from `user` join user_extra on `user`.id = user_extra.user_id" } } @@ -189,7 +189,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.id from user join user_extra on user.id = user_extra.user_id" + "Query": "create view view_a as select `user`.id from `user` join user_extra on `user`.id = user_extra.user_id" } } @@ -234,7 +234,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.col, user_extra.id + user_extra.col from user join user_extra on user.id = user_extra.user_id" + "Query": "create view view_a as select `user`.col, user_extra.id + user_extra.col from `user` join user_extra on `user`.id = user_extra.user_id" } } @@ -249,7 +249,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select /* comment */ user.col from user join user_extra on user.id = user_extra.user_id" + "Query": "create view view_a as select /* comment */ `user`.col from `user` join user_extra on `user`.id = user_extra.user_id" } } @@ -264,7 +264,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.col from user join user_extra on user.id = user_extra.user_id for update" + "Query": "create view view_a as select `user`.col from `user` join user_extra on `user`.id = user_extra.user_id for update" } } @@ -279,7 +279,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user.Col, user_extra.Id from user join user_extra on user.id = user_extra.user_id" + "Query": "create view view_a as select `user`.Col, user_extra.Id from `user` join user_extra on `user`.id = user_extra.user_id" } } @@ -298,7 +298,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user where id = 0x04" + "Query": "create view view_a as select * from `user` where id = 0x04" } } @@ -313,7 +313,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user where `name` = 'abc' and id = 4 limit 5" + "Query": "create view view_a as select * from `user` where `name` = 'abc' and id = 4 limit 5" } } @@ -328,7 +328,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user where id = 4 and `name` = 'abc' limit 5" + "Query": "create view view_a as select * from `user` where id = 4 and `name` = 'abc' limit 5" } } @@ -343,7 +343,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user where id = 4 and `name` = 'abc' limit 5" + "Query": "create view view_a as select * from `user` where id = 4 and `name` = 'abc' limit 5" } } @@ -358,7 +358,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user0_.col as col0_ from user as user0_ where id = 1 order by user0_.col asc" + "Query": "create view view_a as select user0_.col as col0_ from `user` as user0_ where id = 1 order by user0_.col asc" } } @@ -373,7 +373,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select user0_.col as col0_ from user as user0_ where id = 1 order by col0_ desc" + "Query": "create view view_a as select user0_.col as col0_ from `user` as user0_ where id = 1 order by col0_ desc" } } @@ -388,7 +388,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from user where id = 1 and `name` = true" + "Query": "create view view_a as select * from `user` where id = 1 and `name` = true" } } @@ -403,7 +403,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select * from music where user_id = 1 union select * from user where id = 1" + "Query": "create view view_a as select * from music where user_id = 1 union select * from `user` where id = 1" } } @@ -418,7 +418,7 @@ "Name": "user", "Sharded": true }, - "Query": "create view view_a as select 42 from user" + "Query": "create view view_a as select 42 from `user`" } } @@ -448,7 +448,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter table user add index a (id)" + "Query": "alter table `user` add index a (id)" } } @@ -463,7 +463,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter table user add column id int" + "Query": "alter table `user` add column id int" } } @@ -478,7 +478,7 @@ "Name": "user", "Sharded": true }, - "Query": "alter view user_extra as select * from user" + "Query": "alter view user_extra as select * from `user`" } } @@ -497,7 +497,7 @@ "Name": "user", "Sharded": true }, - "Query": "drop table user, user_extra" + "Query": "drop table `user`, user_extra" } } @@ -520,7 +520,7 @@ "Name": "user", "Sharded": true }, - "Query": "drop view user, user_extra" + "Query": "drop view `user`, user_extra" } } diff --git a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt index e8bd2706743..20c91c6c0f8 100644 --- a/go/vt/vtgate/planbuilder/testdata/dml_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/dml_cases.txt @@ -136,7 +136,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user as route1 set a = 1 where id = 1", + "Query": "update `user` as route1 set a = 1 where id = 1", "Table": "user", "Values": [ 1 @@ -198,7 +198,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1 where id = 1", + "Query": "update `user` set val = 1 where id = 1", "Table": "user", "Values": [ 1 @@ -222,7 +222,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user as user_alias set val = 1 where user_alias.id = 1", + "Query": "update `user` as user_alias set val = 1 where user_alias.id = 1", "Table": "user", "Values": [ 1 @@ -246,7 +246,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1 where id = 1", + "Query": "update `user` set val = 1 where id = 1", "Table": "user", "Values": [ 1 @@ -270,7 +270,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1 where `name` = 'foo' and id = 1", + "Query": "update `user` set val = 1 where `name` = 'foo' and id = 1", "Table": "user", "Values": [ 1 @@ -387,7 +387,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1 where id = id2 and id = 1", + "Query": "update `user` set val = 1 where id = id2 and id = 1", "Table": "user", "Values": [ 1 @@ -411,7 +411,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1 where id = 18446744073709551616 and id = 1", + "Query": "update `user` set val = 1 where id = 18446744073709551616 and id = 1", "Table": "user", "Values": [ 1 @@ -436,8 +436,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user where id = 1 for update", - "Query": "delete from user where id = 1", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` where id = 1 for update", + "Query": "delete from `user` where id = 1", "Table": "user", "Values": [ 1 @@ -519,8 +519,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user where id = 1 for update", - "Query": "delete from user as route1 where id = 1", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` where id = 1 for update", + "Query": "delete from `user` as route1 where id = 1", "Table": "user", "Values": [ 1 @@ -940,7 +940,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, val, `Name`, Costly) values (:_Id_0, 1, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, val, `Name`, Costly) values (:_Id_0, 1, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -960,7 +960,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1005,7 +1005,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1025,7 +1025,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1045,7 +1045,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert ignore into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert ignore into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1065,7 +1065,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0) on duplicate key update col = 2", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0) on duplicate key update col = 2", "TableName": "user" } } @@ -1085,7 +1085,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1105,7 +1105,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(nonid, id, `Name`, Costly) values (2, :_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(nonid, id, `Name`, Costly) values (2, :_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1125,7 +1125,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, nonid, `Name`, Costly) values (:_Id_0, 2, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(id, nonid, `Name`, Costly) values (:_Id_0, 2, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1145,7 +1145,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(nonid, id, `Name`, Costly) values (true, :_Id_0, :_Name_0, :_Costly_0)", + "Query": "insert into `user`(nonid, id, `Name`, Costly) values (true, :_Id_0, :_Name_0, :_Costly_0)", "TableName": "user" } } @@ -1165,7 +1165,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(nonid, `name`, id, Costly) values (2, :_Name_0, :_Id_0, :_Costly_0)", + "Query": "insert into `user`(nonid, `name`, id, Costly) values (2, :_Name_0, :_Id_0, :_Costly_0)", "TableName": "user" } } @@ -1265,7 +1265,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", + "Query": "insert into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", "TableName": "user" } } @@ -1285,7 +1285,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "insert /*vt+ QUERY_TIMEOUT_MS=1 */ into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", + "Query": "insert /*vt+ QUERY_TIMEOUT_MS=1 */ into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", "QueryTimeout": 1, "TableName": "user" } @@ -1306,7 +1306,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": true, - "Query": "insert /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ into user(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", + "Query": "insert /*vt+ MULTI_SHARD_AUTOCOMMIT=1 */ into `user`(id, `Name`, Costly) values (:_Id_0, :_Name_0, :_Costly_0), (:_Id_1, :_Name_1, :_Costly_1)", "TableName": "user" } } @@ -1964,8 +1964,8 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from user where id = 1 for update", - "Query": "update user set `name` = null where id = 1", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from `user` where id = 1 for update", + "Query": "update `user` set `name` = null where id = 1", "Table": "user", "Values": [ 1 @@ -2013,8 +2013,8 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from user where id in (1, 2, 3) for update", - "Query": "update user set `name` = null where id in (1, 2, 3)", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from `user` where id in (1, 2, 3) for update", + "Query": "update `user` set `name` = null where id in (1, 2, 3)", "Table": "user", "Values": [ [ @@ -2046,8 +2046,8 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from user for update", - "Query": "update user set `name` = null", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from `user` for update", + "Query": "update `user` set `name` = null", "Table": "user" } } @@ -2071,8 +2071,8 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from user where id + 1 = 2 for update", - "Query": "update user set `name` = null where id + 1 = 2", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = null from `user` where id + 1 = 2 for update", + "Query": "update `user` set `name` = null where id + 1 = 2", "Table": "user" } } @@ -2093,8 +2093,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user where id in (1, 2, 3) for update", - "Query": "delete from user where id in (1, 2, 3)", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` where id in (1, 2, 3) for update", + "Query": "delete from `user` where id in (1, 2, 3)", "Table": "user", "Values": [ [ @@ -2123,8 +2123,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user where id + 1 = 2 for update", - "Query": "delete from user where id + 1 = 2", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` where id + 1 = 2 for update", + "Query": "delete from `user` where id + 1 = 2", "Table": "user" } } @@ -2145,8 +2145,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user for update", - "Query": "delete from user", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` for update", + "Query": "delete from `user`", "Table": "user" } } @@ -2192,7 +2192,7 @@ Gen4 plan same as above }, "TargetTabletType": "MASTER", "MultiShardAutocommit": false, - "Query": "update user set val = 1", + "Query": "update `user` set val = 1", "Table": "user" } } @@ -2213,8 +2213,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user for update", - "Query": "delete from user", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` for update", + "Query": "delete from `user`", "Table": "user" } } @@ -2267,8 +2267,33 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = _binary 'abc' from user where id = 1 for update", - "Query": "update user set `name` = _binary 'abc' where id = 1", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = _binary 'abc' from `user` where id = 1 for update", + "Query": "update `user` set `name` = _binary 'abc' where id = 1", + "Table": "user", + "Values": [ + 1 + ], + "Vindex": "user_index" + } +} +{ + "QueryType": "UPDATE", + "Original": "update user set name = _binary 'abc' where id = 1", + "Instructions": { + "OperatorType": "Update", + "Variant": "Equal", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetTabletType": "MASTER", + "ChangedVindexValues": [ + "name_user_map:3" + ], + "KsidVindex": "user_index", + "MultiShardAutocommit": false, + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = _binary 'abc' from `user` where id = 1 for update", + "Query": "update `user` set `name` = _binary 'abc' where id = 1", "Table": "user", "Values": [ 1 @@ -2276,7 +2301,6 @@ Gen4 plan same as above "Vindex": "user_index" } } -Gen4 plan same as above # delete with binary value "delete from user where name = _binary 'abc'" @@ -2293,8 +2317,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user where `name` = _binary 'abc' for update", - "Query": "delete from user where `name` = _binary 'abc'", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` where `name` = _binary 'abc' for update", + "Query": "delete from `user` where `name` = _binary 'abc'", "Table": "user" } } @@ -2315,8 +2339,8 @@ Gen4 plan same as above "TargetTabletType": "MASTER", "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly from user for update", - "Query": "delete from user", + "OwnedVindexQuery": "select Id, `Name`, Costly from `user` for update", + "Query": "delete from `user`", "Table": "user" } } @@ -2340,8 +2364,8 @@ Gen4 plan same as above ], "KsidVindex": "user_index", "MultiShardAutocommit": false, - "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = 'myname' from user for update", - "Query": "update user set `name` = 'myname'", + "OwnedVindexQuery": "select Id, `Name`, Costly, `name` = 'myname' from `user` for update", + "Query": "update `user` set `name` = 'myname'", "Table": "user" } } diff --git a/go/vt/vtgate/planbuilder/testdata/filter_cases.txt b/go/vt/vtgate/planbuilder/testdata/filter_cases.txt index 9625327dd41..9e1f069f2b5 100644 --- a/go/vt/vtgate/planbuilder/testdata/filter_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/filter_cases.txt @@ -10,12 +10,26 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" } } -Gen4 plan same as above # Query that always return empty "select id from user where someColumn = null" @@ -29,9 +43,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where someColumn = null", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where someColumn = null", + "Table": "`user`" } } { @@ -44,9 +58,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where someColumn = null", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where someColumn = null", + "Table": "`user`" } } @@ -62,16 +76,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.id = 5", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 5", + "Table": "`user`", + "Values": [ + 5 + ], + "Vindex": "user_index" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.id = 5", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], "Vindex": "user_index" } } -Gen4 plan same as above # Single table unique vindex route, but complex expr "select id from user where user.id = 5+5" @@ -85,12 +117,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.id = 5 + 5", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 5 + 5", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.id = 5+5", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 5 + 5", + "Table": "`user`" } } -Gen4 plan same as above # Single table multiple unique vindex match "select id from music where id = 5 and user_id = 4" @@ -127,16 +173,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where costly = 'aa' and `name` = 'bb'", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where costly = 'aa' and `name` = 'bb'", + "Table": "`user`", + "Values": [ + "bb" + ], + "Vindex": "name_user_map" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where costly = 'aa' and name = 'bb'", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where costly = 'aa' and `name` = 'bb'", + "Table": "`user`", "Values": [ "bb" ], "Vindex": "name_user_map" } } -Gen4 plan same as above # Single table multiple non-unique vindex match for IN clause "select id from user where costly in ('aa', 'bb') and name in ('aa', 'bb')" @@ -150,9 +214,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where costly in ('aa', 'bb') and `name` in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where costly in ('aa', 'bb') and `name` in ::__vals", + "Table": "`user`", "Values": [ [ "aa", @@ -175,9 +239,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (`name`, col) in (('aa', 'bb'), ('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (`name`, col) in (('aa', 'bb'), ('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "aa", @@ -200,9 +264,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (col, `name`) in (('aa', 'bb'), ('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col, `name`) in (('aa', 'bb'), ('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "bb", @@ -225,9 +289,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (costly, `name`) in (('aa', 'bb'), ('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (costly, `name`) in (('aa', 'bb'), ('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "bb", @@ -250,9 +314,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (`name`, costly) in (('aa', 'bb'), ('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (`name`, costly) in (('aa', 'bb'), ('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "aa", @@ -275,9 +339,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (col, costly) in (('aa', 'bb')) and (col, `name`) in (('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col, costly) in (('aa', 'bb')) and (col, `name`) in (('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "dd" @@ -299,16 +363,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (col, `name`) in (('aa', 'bb')) and id = 5", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col, `name`) in (('aa', 'bb')) and id = 5", + "Table": "`user`", + "Values": [ + 5 + ], + "Vindex": "user_index" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where (col, name) in (('aa', 'bb')) and id = 5", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col, `name`) in (('aa', 'bb')) and id = 5", + "Table": "`user`", "Values": [ 5 ], "Vindex": "user_index" } } -Gen4 plan same as above # Composite IN: multiple vindex matches "select id from user where (costly, name) in (('aa', 'bb'), ('cc', 'dd'))" @@ -322,9 +404,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (costly, `name`) in (('aa', 'bb'), ('cc', 'dd'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (costly, `name`) in (('aa', 'bb'), ('cc', 'dd'))", + "Table": "`user`", "Values": [ [ "bb", @@ -347,9 +429,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where ((col1, `name`), col2) in ((('aa', 'bb'), 'cc'), (('dd', 'ee'), 'ff'))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where ((col1, `name`), col2) in ((('aa', 'bb'), 'cc'), (('dd', 'ee'), 'ff'))", + "Table": "`user`", "Values": [ [ "bb", @@ -372,9 +454,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (`name`, (col1, col2)) in (('aa', ('bb', 'cc')), ('dd', ('ee', 'ff')))", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (`name`, (col1, col2)) in (('aa', ('bb', 'cc')), ('dd', ('ee', 'ff')))", + "Table": "`user`", "Values": [ [ "aa", @@ -397,12 +479,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where ((col1, `name`), col2) in (('aa', 'bb', 'cc'), (('dd', 'ee'), 'ff'))", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where ((col1, `name`), col2) in (('aa', 'bb', 'cc'), (('dd', 'ee'), 'ff'))", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where ((col1, name), col2) in (('aa', 'bb', 'cc'), (('dd', 'ee'), 'ff'))", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where ((col1, `name`), col2) in (('aa', 'bb', 'cc'), (('dd', 'ee'), 'ff'))", + "Table": "`user`" } } -Gen4 plan same as above # Composite IN: RHS not tuple "select id from user where (col1, name) in (select * from music where music.user_id=user.id)" @@ -416,9 +512,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (col1, `name`) in (select * from music where music.user_id = user.id)", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col1, `name`) in (select * from music where music.user_id = `user`.id)", + "Table": "`user`" } } @@ -434,12 +530,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where (col1, `name`) in (('aa', 1 + 1))", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col1, `name`) in (('aa', 1 + 1))", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where (col1, name) in (('aa', 1+1))", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where (col1, `name`) in (('aa', 1 + 1))", + "Table": "`user`" } } -Gen4 plan same as above # IN clause: LHS is neither column nor composite tuple "select Id from user where 1 in ('aa', 'bb')" @@ -453,9 +563,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select Id from user where 1 != 1", - "Query": "select Id from user where 1 in ('aa', 'bb')", - "Table": "user" + "FieldQuery": "select Id from `user` where 1 != 1", + "Query": "select Id from `user` where 1 in ('aa', 'bb')", + "Table": "`user`" } } @@ -471,12 +581,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where `name` in (col, 'bb')", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` in (col, 'bb')", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where name in (col, 'bb')", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` in (col, 'bb')", + "Table": "`user`" } } -Gen4 plan same as above # Single table equality route with val arg "select id from user where name = :a" @@ -490,16 +614,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where `name` = :a", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` = :a", + "Table": "`user`", + "Values": [ + ":a" + ], + "Vindex": "name_user_map" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where name = :a", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` = :a", + "Table": "`user`", "Values": [ ":a" ], "Vindex": "name_user_map" } } -Gen4 plan same as above # Single table equality route with unsigned value "select id from user where name = 18446744073709551615" @@ -513,16 +655,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where `name` = 18446744073709551615", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` = 18446744073709551615", + "Table": "`user`", + "Values": [ + 18446744073709551615 + ], + "Vindex": "name_user_map" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where name = 18446744073709551615", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` = 18446744073709551615", + "Table": "`user`", "Values": [ 18446744073709551615 ], "Vindex": "name_user_map" } } -Gen4 plan same as above # Single table in clause list arg "select id from user where name in ::list" @@ -536,9 +696,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where `name` in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `name` in ::__vals", + "Table": "`user`", "Values": [ "::list" ], @@ -558,9 +718,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.id from user join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user_extra.id from user join user_extra on user.id = user_extra.user_id where user.id = 5", - "Table": "user", + "FieldQuery": "select user_extra.id from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select user_extra.id from `user` join user_extra on `user`.id = user_extra.user_id where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -580,9 +740,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.id from user join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user_extra.id from user join user_extra on user.id = user_extra.user_id where user_extra.user_id = 5", - "Table": "user", + "FieldQuery": "select user_extra.id from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select user_extra.id from `user` join user_extra on `user`.id = user_extra.user_id where user_extra.user_id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -602,9 +762,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.id from user left join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user_extra.id from user left join user_extra on user.id = user_extra.user_id where user.id = 5", - "Table": "user", + "FieldQuery": "select user_extra.id from `user` left join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select user_extra.id from `user` left join user_extra on `user`.id = user_extra.user_id where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -624,9 +784,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.id from user left join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user_extra.id from user left join user_extra on user.id = user_extra.user_id where user_extra.user_id = 5", - "Table": "user", + "FieldQuery": "select user_extra.id from `user` left join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select user_extra.id from `user` left join user_extra on `user`.id = user_extra.user_id where user_extra.user_id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -643,7 +803,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -652,9 +812,47 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.id = 5", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = 5", + "Table": "`user`", + "Values": [ + 5 + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select user_extra.id from user_extra where 1 != 1", + "Query": "select user_extra.id from user_extra where user_extra.col = :user_col", + "Table": "user_extra" + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select user_extra.id from user join user_extra on user.col = user_extra.col where user.id = 5", + "Instructions": { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "1", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -674,7 +872,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # Multi-route unique vindex route on both routes "select user_extra.id from user join user_extra on user.col = user_extra.col where user.id = 5 and user_extra.user_id = 5" @@ -685,7 +882,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -694,9 +891,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.id = 5", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -730,7 +927,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -739,9 +936,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -771,7 +968,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -780,9 +977,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where 1 = 1", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where 1 = 1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -811,9 +1008,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.col = 5 and user.id in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = 5 and `user`.id in ::__vals", + "Table": "`user`", "Values": [ [ 1, @@ -836,9 +1033,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.col = case user.col when 'foo' then true else false end and user.id in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = case `user`.col when 'foo' then true else false end and `user`.id in ::__vals", + "Table": "`user`", "Values": [ [ 1, @@ -861,16 +1058,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id or col as val from user where 1 != 1", - "Query": "select id or col as val from user where user.col = 5 and user.id in (1, 2) and user.`name` = 'aa'", - "Table": "user", + "FieldQuery": "select id or col as val from `user` where 1 != 1", + "Query": "select id or col as val from `user` where `user`.col = 5 and `user`.id in (1, 2) and `user`.`name` = 'aa'", + "Table": "`user`", + "Values": [ + "aa" + ], + "Vindex": "name_user_map" + } +} +{ + "QueryType": "SELECT", + "Original": "select (id or col) as val from user where user.col = 5 and user.id in (1, 2) and user.name = 'aa'", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id or col as val from `user` where 1 != 1", + "Query": "select id or col as val from `user` where `user`.col = 5 and `user`.id in (1, 2) and `user`.`name` = 'aa'", + "Table": "`user`", "Values": [ "aa" ], "Vindex": "name_user_map" } } -Gen4 plan same as above # Route with multiple route constraints, SelectEqual is the best constraint. "select id from user where user.col = false and user.id in (1, 2) and user.name = 'aa'" @@ -884,16 +1099,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.col = false and user.id in (1, 2) and user.`name` = 'aa'", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = false and `user`.id in (1, 2) and `user`.`name` = 'aa'", + "Table": "`user`", + "Values": [ + "aa" + ], + "Vindex": "name_user_map" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.col = false and user.id in (1, 2) and user.name = 'aa'", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqual", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = false and `user`.id in (1, 2) and `user`.`name` = 'aa'", + "Table": "`user`", "Values": [ "aa" ], "Vindex": "name_user_map" } } -Gen4 plan same as above # Route with multiple route constraints, SelectEqualUnique is the best constraint. "select id from user where user.col = 5 and user.id in (1, 2) and user.name = 'aa' and user.id = 1" @@ -907,16 +1140,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.col = 5 and user.id in (1, 2) and user.`name` = 'aa' and user.id = 1", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = 5 and `user`.id in (1, 2) and `user`.`name` = 'aa' and `user`.id = 1", + "Table": "`user`", + "Values": [ + 1 + ], + "Vindex": "user_index" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.col = 5 and user.id in (1, 2) and user.name = 'aa' and user.id = 1", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col = 5 and `user`.id in (1, 2) and `user`.`name` = 'aa' and `user`.id = 1", + "Table": "`user`", "Values": [ 1 ], "Vindex": "user_index" } } -Gen4 plan same as above # Route with multiple route constraints, SelectEqualUnique is the best constraint, order reversed. "select id from user where user.id = 1 and user.name = 'aa' and user.id in (1, 2) and user.col = 5" @@ -930,16 +1181,34 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.id = 1 and user.`name` = 'aa' and user.id in (1, 2) and user.col = 5", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 1 and `user`.`name` = 'aa' and `user`.id in (1, 2) and `user`.col = 5", + "Table": "`user`", + "Values": [ + 1 + ], + "Vindex": "user_index" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.id = 1 and user.name = 'aa' and user.id in (1, 2) and user.col = 5", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 1 and `user`.`name` = 'aa' and `user`.id in (1, 2) and `user`.col = 5", + "Table": "`user`", "Values": [ 1 ], "Vindex": "user_index" } } -Gen4 plan same as above # Route with OR and AND clause, must parenthesize correctly. "select id from user where user.id = 1 or user.name = 'aa' and user.id in (1, 2)" @@ -953,12 +1222,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.id = 1 or user.`name` = 'aa' and user.id in (1, 2)", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 1 or `user`.`name` = 'aa' and `user`.id in (1, 2)", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where user.id = 1 or user.name = 'aa' and user.id in (1, 2)", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.id = 1 or `user`.`name` = 'aa' and `user`.id in (1, 2)", + "Table": "`user`" } } -Gen4 plan same as above # Unsharded route "select unsharded.id from user join unsharded where unsharded.id = user.id" @@ -969,7 +1252,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -978,9 +1261,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user", - "Table": "user" + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1003,7 +1286,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-2", - "TableName": "unsharded_user", + "TableName": "unsharded_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1023,9 +1306,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user where user.id = :unsharded_id", - "Table": "user", + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where `user`.id = :unsharded_id", + "Table": "`user`", "Values": [ ":unsharded_id" ], @@ -1047,9 +1330,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user as route1 where 1 != 1", - "Query": "select col from user as route1 where id = 1", - "Table": "user", + "FieldQuery": "select col from `user` as route1 where 1 != 1", + "Query": "select col from `user` as route1 where id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -1083,7 +1366,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1103,9 +1386,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.m from user as u where 1 != 1", - "Query": "select u.m from user as u where u.id in ::__vals and u.id in (select m2 from user where user.id = u.id and user.col = :user_extra_col)", - "Table": "user", + "FieldQuery": "select u.m from `user` as u where 1 != 1", + "Query": "select u.m from `user` as u where u.id in ::__vals and u.id in (select m2 from `user` where `user`.id = u.id and `user`.col = :user_extra_col)", + "Table": "`user`", "Values": [ [ ":user_extra_col", @@ -1127,7 +1410,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1147,9 +1430,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.m from user as u where 1 != 1", - "Query": "select u.m from user as u where u.id = 5 and u.id in (select m2 from user where user.id = 5)", - "Table": "user", + "FieldQuery": "select u.m from `user` as u where 1 != 1", + "Query": "select u.m from `user` as u where u.id = 5 and u.id in (select m2 from `user` where `user`.id = 5)", + "Table": "`user`", "Values": [ 5 ], @@ -1168,7 +1451,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1188,9 +1471,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.m from user as u where 1 != 1", - "Query": "select u.m from user as u where u.id in ::__vals and u.id in (select m2 from user where user.id = u.id and user.col = :user_extra_col and user.id in (select m3 from user_extra where user_extra.user_id = user.id))", - "Table": "user", + "FieldQuery": "select u.m from `user` as u where 1 != 1", + "Query": "select u.m from `user` as u where u.id in ::__vals and u.id in (select m2 from `user` where `user`.id = u.id and `user`.col = :user_extra_col and `user`.id in (select m3 from user_extra where user_extra.user_id = `user`.id))", + "Table": "`user`", "Values": [ [ ":user_extra_col", @@ -1215,9 +1498,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where user.col in (select user_extra.col from user_extra where user_extra.user_id = user.id)", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where `user`.col in (select user_extra.col from user_extra where user_extra.user_id = `user`.id)", + "Table": "`user`" } } @@ -1233,9 +1516,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = 5 and user.col in (select user_extra.col from user_extra where user_extra.user_id = 5)", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 5 and `user`.col in (select user_extra.col from user_extra where user_extra.user_id = 5)", + "Table": "`user`", "Values": [ 5 ], @@ -1255,9 +1538,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = 'aa' and user.col in (select user_extra.col from user_extra where user_extra.user_id = 'aa')", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 'aa' and `user`.col in (select user_extra.col from user_extra where user_extra.user_id = 'aa')", + "Table": "`user`", "Values": [ "aa" ], @@ -1277,9 +1560,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = :a and user.col in (select user_extra.col from user_extra where user_extra.user_id = :a)", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = :a and `user`.col in (select user_extra.col from user_extra where user_extra.user_id = :a)", + "Table": "`user`", "Values": [ ":a" ], @@ -1303,9 +1586,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id2 from user as uu where 1 != 1", - "Query": "select id2 from user as uu where id in (select id from user where id = uu.id and user.col in (select user_extra.col from user_extra where user_extra.user_id = uu.id))", - "Table": "user" + "FieldQuery": "select id2 from `user` as uu where 1 != 1", + "Query": "select id2 from `user` as uu where id in (select id from `user` where id = uu.id and `user`.col in (select user_extra.col from user_extra where user_extra.user_id = uu.id))", + "Table": "`user`" } } @@ -1326,9 +1609,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1337,9 +1620,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where :__sq_has_values1 = 1 and id in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where :__sq_has_values1 = 1 and id in ::__vals", + "Table": "`user`", "Values": [ "::__sq1" ], @@ -1365,9 +1648,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1376,9 +1659,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where :__sq_has_values1 = 0 or id not in ::__sq1", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where :__sq_has_values1 = 0 or id not in ::__sq1", + "Table": "`user`" } ] } @@ -1400,9 +1683,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1411,9 +1694,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where :__sq_has_values1", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where :__sq_has_values1", + "Table": "`user`" } ] } @@ -1435,9 +1718,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1446,9 +1729,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = :__sq1", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = :__sq1", + "Table": "`user`", "Values": [ ":__sq1" ], @@ -1478,9 +1761,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id3 from user where 1 != 1", - "Query": "select id3 from user", - "Table": "user" + "FieldQuery": "select id3 from `user` where 1 != 1", + "Query": "select id3 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1489,9 +1772,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id2 from user where 1 != 1", - "Query": "select id2 from user where :__sq_has_values1 = 1 and id2 in ::__sq1", - "Table": "user" + "FieldQuery": "select id2 from `user` where 1 != 1", + "Query": "select id2 from `user` where :__sq_has_values1 = 1 and id2 in ::__sq1", + "Table": "`user`" } ] }, @@ -1502,9 +1785,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id1 from user where 1 != 1", - "Query": "select id1 from user where id = :__sq2", - "Table": "user", + "FieldQuery": "select id1 from `user` where 1 != 1", + "Query": "select id1 from `user` where id = :__sq2", + "Table": "`user`", "Values": [ ":__sq2" ], @@ -1526,9 +1809,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where id = (select id from user as route1 where route1.id = user.id)", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where id = (select id from `user` as route1 where route1.id = `user`.id)", + "Table": "`user`" } } @@ -1559,9 +1842,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where id = :__sq1", - "Table": "user", + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where id = :__sq1", + "Table": "`user`", "Values": [ ":__sq1" ], @@ -1583,9 +1866,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.Id from user join user_extra on user.iD = user_extra.User_Id where 1 != 1", - "Query": "select user_extra.Id from user join user_extra on user.iD = user_extra.User_Id where user.Id = 5", - "Table": "user", + "FieldQuery": "select user_extra.Id from `user` join user_extra on `user`.iD = user_extra.User_Id where 1 != 1", + "Query": "select user_extra.Id from `user` join user_extra on `user`.iD = user_extra.User_Id where `user`.Id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -1602,9 +1885,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user_extra.Id from user, user_extra where 1 != 1", - "Query": "select user_extra.Id from user, user_extra where user.Id = 5 and user.iD = user_extra.User_Id", - "Table": "user, user_extra", + "FieldQuery": "select user_extra.Id from `user`, user_extra where 1 != 1", + "Query": "select user_extra.Id from `user`, user_extra where `user`.Id = 5 and `user`.iD = user_extra.User_Id", + "Table": "`user`, user_extra", "Values": [ 5 ], @@ -1624,9 +1907,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where database()", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where database()", + "Table": "`user`" } } @@ -1653,21 +1936,7 @@ Gen4 plan same as above "Table": "music" } } -{ - "QueryType": "SELECT", - "Original": "select id from music where id = null", - "Instructions": { - "OperatorType": "Route", - "Variant": "SelectNone", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select id from music where 1 != 1", - "Query": "select id from music where id = null", - "Table": "music" - } -} +Gen4 plan same as above # SELECT with IS NULL "select id from music where id is null" @@ -1727,21 +1996,7 @@ Gen4 plan same as above "Table": "music" } } -{ - "QueryType": "SELECT", - "Original": "select id from music where user_id = 4 and id = null", - "Instructions": { - "OperatorType": "Route", - "Variant": "SelectNone", - "Keyspace": { - "Name": "user", - "Sharded": true - }, - "FieldQuery": "select id from music where 1 != 1", - "Query": "select id from music where user_id = 4 and id = null", - "Table": "music" - } -} +Gen4 plan same as above # Single table with unique vindex match and IN (null) "select id from music where user_id = 4 and id IN (null)" diff --git a/go/vt/vtgate/planbuilder/testdata/flush_cases_no_default_keyspace.txt b/go/vt/vtgate/planbuilder/testdata/flush_cases_no_default_keyspace.txt index 2b7605ad436..991b495c36e 100644 --- a/go/vt/vtgate/planbuilder/testdata/flush_cases_no_default_keyspace.txt +++ b/go/vt/vtgate/planbuilder/testdata/flush_cases_no_default_keyspace.txt @@ -25,7 +25,7 @@ }, "TargetDestination": "AllShards()", "IsDML": false, - "Query": "flush local tables user, user_extra with read lock", + "Query": "flush local tables `user`, user_extra with read lock", "SingleShardOnly": false } ] @@ -63,7 +63,7 @@ }, "TargetDestination": "AllShards()", "IsDML": false, - "Query": "flush local tables user", + "Query": "flush local tables `user`", "SingleShardOnly": false } ] @@ -130,7 +130,7 @@ }, "TargetDestination": "AllShards()", "IsDML": false, - "Query": "flush local tables user, user_extra with read lock", + "Query": "flush local tables `user`, user_extra with read lock", "SingleShardOnly": false } ] diff --git a/go/vt/vtgate/planbuilder/testdata/from_cases.txt b/go/vt/vtgate/planbuilder/testdata/from_cases.txt index 4be60942a61..b27a6708761 100644 --- a/go/vt/vtgate/planbuilder/testdata/from_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/from_cases.txt @@ -10,9 +10,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -133,7 +133,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -142,9 +142,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -174,9 +174,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -193,9 +193,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user as a where 1 != 1", - "Query": "select * from user as a", - "Table": "user" + "FieldQuery": "select * from `user` as a where 1 != 1", + "Query": "select * from `user` as a", + "Table": "`user`" } } Gen4 plan same as above @@ -212,9 +212,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user as route1 where 1 != 1", - "Query": "select * from user as route1", - "Table": "user" + "FieldQuery": "select * from `user` as route1 where 1 != 1", + "Query": "select * from `user` as route1", + "Table": "`user`" } } @@ -230,9 +230,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user as a where 1 != 1", - "Query": "select * from user as a", - "Table": "user" + "FieldQuery": "select * from `user` as a where 1 != 1", + "Query": "select * from `user` as a", + "Table": "`user`" } } @@ -248,9 +248,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user as master_redirect where 1 != 1", - "Query": "select * from user as master_redirect", - "Table": "user" + "FieldQuery": "select * from `user` as master_redirect where 1 != 1", + "Query": "select * from `user` as master_redirect", + "Table": "`user`" } } @@ -273,7 +273,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -282,9 +282,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -355,21 +355,7 @@ Gen4 plan same as above "Table": "unsharded" } } -{ - "QueryType": "SELECT", - "Original": "select u1.a, u2.a from unsharded u1, unsharded u2, unsharded u3", - "Instructions": { - "OperatorType": "Route", - "Variant": "SelectUnsharded", - "Keyspace": { - "Name": "main", - "Sharded": false - }, - "FieldQuery": "select u1.a, u2.a from unsharded as u1, unsharded as u2, unsharded as u3 where 1 != 1", - "Query": "select u1.a, u2.a from unsharded as u1, unsharded as u2, unsharded as u3", - "Table": "unsharded" - } -} +Gen4 plan same as above # Left join, single chunk "select m1.col from unsharded as m1 left join unsharded as m2 on m1.a=m2.b" @@ -398,7 +384,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "LeftJoin", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -407,9 +393,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.col, u.a from user as u where 1 != 1", - "Query": "select u.col, u.a from user as u", - "Table": "user" + "FieldQuery": "select u.col, u.a from `user` as u where 1 != 1", + "Query": "select u.col, u.a from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -435,13 +421,13 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "LeftJoin", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded_unsharded", + "TableName": "`user`_unsharded_unsharded", "Inputs": [ { "OperatorType": "Join", "Variant": "LeftJoin", "JoinColumnIndexes": "-1,1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -450,9 +436,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -491,7 +477,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "LeftJoin", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra_unsharded", + "TableName": "`user`_user_extra_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -500,9 +486,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Join", @@ -600,13 +586,13 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded_unsharded", + "TableName": "`user`_unsharded_unsharded", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -615,9 +601,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -653,7 +639,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -662,9 +648,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -690,7 +676,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -699,9 +685,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -724,7 +710,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -733,9 +719,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -761,7 +747,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_unsharded", + "TableName": "`user`_`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -770,14 +756,14 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -786,9 +772,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u1 where 1 != 1", - "Query": "select 1 from user as u1", - "Table": "user" + "FieldQuery": "select 1 from `user` as u1 where 1 != 1", + "Query": "select 1 from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -819,9 +805,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user use index (a) where 1 != 1", - "Query": "select user.col from user use index (a)", - "Table": "user" + "FieldQuery": "select `user`.col from `user` use index (a) where 1 != 1", + "Query": "select `user`.col from `user` use index (a)", + "Table": "`user`" } } @@ -837,9 +823,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user.col from user join user_extra on user.id = user_extra.user_id", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on `user`.id = user_extra.user_id", + "Table": "`user`" } } { @@ -852,9 +838,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user, user_extra where 1 != 1", - "Query": "select user.col from user, user_extra where user.id = user_extra.user_id", - "Table": "user, user_extra" + "FieldQuery": "select `user`.col from `user`, user_extra where 1 != 1", + "Query": "select `user`.col from `user`, user_extra where `user`.id = user_extra.user_id", + "Table": "`user`, user_extra" } } @@ -870,9 +856,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select user.col from user join user_extra on user.id = user_extra.user_id", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on `user`.id = user_extra.user_id", + "Table": "`user`" } } { @@ -885,9 +871,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user, user_extra where 1 != 1", - "Query": "select user.col from user, user_extra where user.id = user_extra.user_id", - "Table": "user, user_extra" + "FieldQuery": "select `user`.col from `user`, user_extra where 1 != 1", + "Query": "select `user`.col from `user`, user_extra where `user`.id = user_extra.user_id", + "Table": "`user`, user_extra" } } @@ -903,9 +889,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user.col between 1 and 2 and user.id = user_extra.user_id where 1 != 1", - "Query": "select user.col from user join user_extra on user.col between 1 and 2 and user.id = user_extra.user_id", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join user_extra on `user`.col between 1 and 2 and `user`.id = user_extra.user_id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on `user`.col between 1 and 2 and `user`.id = user_extra.user_id", + "Table": "`user`" } } { @@ -918,9 +904,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user, user_extra where 1 != 1", - "Query": "select user.col from user, user_extra where user.col between 1 and 2 and user.id = user_extra.user_id", - "Table": "user, user_extra" + "FieldQuery": "select `user`.col from `user`, user_extra where 1 != 1", + "Query": "select `user`.col from `user`, user_extra where `user`.col between 1 and 2 and `user`.id = user_extra.user_id", + "Table": "`user`, user_extra" } } @@ -936,9 +922,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user_extra.user_id = user.id where 1 != 1", - "Query": "select user.col from user join user_extra on user_extra.user_id = user.id", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join user_extra on user_extra.user_id = `user`.id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on user_extra.user_id = `user`.id", + "Table": "`user`" } } { @@ -951,9 +937,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user, user_extra where 1 != 1", - "Query": "select user.col from user, user_extra where user_extra.user_id = user.id", - "Table": "user, user_extra" + "FieldQuery": "select `user`.col from `user`, user_extra where 1 != 1", + "Query": "select `user`.col from `user`, user_extra where user_extra.user_id = `user`.id", + "Table": "`user`, user_extra" } } @@ -969,9 +955,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user.id = 5 and user.id = user_extra.user_id where 1 != 1", - "Query": "select user.col from user join user_extra on user.id = 5 and user.id = user_extra.user_id", - "Table": "user", + "FieldQuery": "select `user`.col from `user` join user_extra on `user`.id = 5 and `user`.id = user_extra.user_id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on `user`.id = 5 and `user`.id = user_extra.user_id", + "Table": "`user`", "Values": [ 5 ], @@ -988,9 +974,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user, user_extra where 1 != 1", - "Query": "select user.col from user, user_extra where user.id = 5 and user.id = user_extra.user_id", - "Table": "user, user_extra", + "FieldQuery": "select `user`.col from `user`, user_extra where 1 != 1", + "Query": "select `user`.col from `user`, user_extra where `user`.id = 5 and `user`.id = user_extra.user_id", + "Table": "`user`, user_extra", "Values": [ 5 ], @@ -1007,7 +993,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1016,9 +1002,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col, user.id from user where 1 != 1", - "Query": "select user.col, user.id from user", - "Table": "user" + "FieldQuery": "select `user`.col, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col, `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1041,7 +1027,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1050,9 +1036,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.col from user where 1 != 1", - "Query": "select user.id, user.col from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.col from `user` where 1 != 1", + "Query": "select `user`.id, `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1078,7 +1064,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1087,9 +1073,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.id = 5", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -1120,7 +1106,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1129,9 +1115,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.id = 5", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -1162,7 +1148,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1171,9 +1157,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col, user.id from user where 1 != 1", - "Query": "select user.col, user.id from user", - "Table": "user" + "FieldQuery": "select `user`.col, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col, `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1196,7 +1182,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1216,9 +1202,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.id = :user_extra_col", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.id = :user_extra_col", + "Table": "`user`", "Values": [ ":user_extra_col" ], @@ -1237,7 +1223,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -1257,9 +1243,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user where user.`name` = :user_extra_user_id", - "Table": "user", + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` where `user`.`name` = :user_extra_user_id", + "Table": "`user`", "Values": [ ":user_extra_user_id" ], @@ -1281,9 +1267,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join ref where 1 != 1", - "Query": "select user.col from user join ref", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join ref where 1 != 1", + "Query": "select `user`.col from `user` join ref", + "Table": "`user`" } } @@ -1332,9 +1318,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select ref.col from ref join user where 1 != 1", - "Query": "select ref.col from ref join user", - "Table": "user" + "FieldQuery": "select ref.col from ref join `user` where 1 != 1", + "Query": "select ref.col from ref join `user`", + "Table": "`user`" } } @@ -1351,9 +1337,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select ref.col from ref join (select aa from user where 1 != 1) as user where 1 != 1", - "Query": "select ref.col from ref join (select aa from user where user.id = 1) as user", - "Table": "user", + "FieldQuery": "select ref.col from ref join (select aa from `user` where 1 != 1) as `user` where 1 != 1", + "Query": "select ref.col from ref join (select aa from `user` where `user`.id = 1) as `user`", + "Table": "`user`", "Values": [ 1 ], @@ -1410,9 +1396,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from (select id, col from user where 1 != 1) as t where 1 != 1", - "Query": "select id from (select id, col from user where id = 5) as t", - "Table": "user", + "FieldQuery": "select id from (select id, col from `user` where 1 != 1) as t where 1 != 1", + "Query": "select id from (select id, col from `user` where id = 5) as t", + "Table": "`user`", "Values": [ 5 ], @@ -1432,9 +1418,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id from (select id from user where 1 != 1) as t join user_extra on t.id = user_extra.user_id where 1 != 1", - "Query": "select t.id from (select id from user where id = 5) as t join user_extra on t.id = user_extra.user_id", - "Table": "user", + "FieldQuery": "select t.id from (select id from `user` where 1 != 1) as t join user_extra on t.id = user_extra.user_id where 1 != 1", + "Query": "select t.id from (select id from `user` where id = 5) as t join user_extra on t.id = user_extra.user_id", + "Table": "`user`", "Values": [ 5 ], @@ -1454,9 +1440,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id from (select user.id from user where 1 != 1) as t join user_extra on t.id = user_extra.user_id where 1 != 1", - "Query": "select t.id from (select user.id from user where user.id = 5) as t join user_extra on t.id = user_extra.user_id", - "Table": "user", + "FieldQuery": "select t.id from (select `user`.id from `user` where 1 != 1) as t join user_extra on t.id = user_extra.user_id where 1 != 1", + "Query": "select t.id from (select `user`.id from `user` where `user`.id = 5) as t join user_extra on t.id = user_extra.user_id", + "Table": "`user`", "Values": [ 5 ], @@ -1480,8 +1466,8 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id from user_extra join (select id from user where 1 != 1) as t on t.id = user_extra.user_id where 1 != 1", - "Query": "select t.id from user_extra join (select id from user where id = 5) as t on t.id = user_extra.user_id", + "FieldQuery": "select t.id from user_extra join (select id from `user` where 1 != 1) as t on t.id = user_extra.user_id where 1 != 1", + "Query": "select t.id from user_extra join (select id from `user` where id = 5) as t on t.id = user_extra.user_id", "Table": "user_extra" } } @@ -1495,7 +1481,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1504,9 +1490,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select t.id from (select id from user where 1 != 1) as t where 1 != 1", - "Query": "select t.id from (select id from user where id = 5) as t", - "Table": "user", + "FieldQuery": "select t.id from (select id from `user` where 1 != 1) as t where 1 != 1", + "Query": "select t.id from (select id from `user` where id = 5) as t", + "Table": "`user`", "Values": [ 5 ], @@ -1539,9 +1525,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from (select id, col from user as route1 where 1 != 1) as t where 1 != 1", - "Query": "select id from (select id, col from user as route1 where id = 5) as t", - "Table": "user", + "FieldQuery": "select id from (select id, col from `user` as route1 where 1 != 1) as t where 1 != 1", + "Query": "select id from (select id, col from `user` as route1 where id = 5) as t", + "Table": "`user`", "Values": [ 5 ], @@ -1561,9 +1547,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from (select id, col from user as route1 where 1 != 1) as t where 1 != 1", - "Query": "select id from (select id, col from user as route1) as t where id = 5", - "Table": "user", + "FieldQuery": "select id from (select id, col from `user` as route1 where 1 != 1) as t where 1 != 1", + "Query": "select id from (select id, col from `user` as route1) as t where id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -1583,9 +1569,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.col, e.col from (select col from user where 1 != 1) as u join (select col from user_extra where 1 != 1) as e where 1 != 1", - "Query": "select u.col, e.col from (select col from user where id = 5) as u join (select col from user_extra where user_id = 5) as e", - "Table": "user", + "FieldQuery": "select u.col, e.col from (select col from `user` where 1 != 1) as u join (select col from user_extra where 1 != 1) as e where 1 != 1", + "Query": "select u.col, e.col from (select col from `user` where id = 5) as u join (select col from user_extra where user_id = 5) as e", + "Table": "`user`", "Values": [ 5 ], @@ -1708,7 +1694,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra_unsharded", + "TableName": "`user`_user_extra_unsharded", "Inputs": [ { "OperatorType": "Subquery", @@ -1721,7 +1707,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1730,9 +1716,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.col1 from user where 1 != 1", - "Query": "select user.id, user.col1 from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.col1 from `user` where 1 != 1", + "Query": "select `user`.id, `user`.col1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1779,7 +1765,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1788,9 +1774,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.col1, user.col from user where 1 != 1", - "Query": "select user.id, user.col1, user.col from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.col1, `user`.col from `user` where 1 != 1", + "Query": "select `user`.id, `user`.col1, `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1818,7 +1804,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "unsharded_a_user_user_extra", + "TableName": "unsharded_a_`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1841,7 +1827,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1850,9 +1836,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.col1 from user where 1 != 1", - "Query": "select user.id, user.col1 from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.col1 from `user` where 1 != 1", + "Query": "select `user`.id, `user`.col1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1889,9 +1875,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1924,9 +1910,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1959,9 +1945,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1994,15 +1980,15 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "unsharded_user", + "TableName": "unsharded_`user`", "Inputs": [ { "OperatorType": "Route", @@ -2022,9 +2008,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user where :__sq_has_values1 = 1 and user.col in ::__sq1", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where :__sq_has_values1 = 1 and `user`.col in ::__sq1", + "Table": "`user`" } ] } @@ -2042,7 +2028,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "LeftJoin", "JoinColumnIndexes": "-1", - "TableName": "unsharded_user", + "TableName": "unsharded_`user`", "Inputs": [ { "OperatorType": "Route", @@ -2066,9 +2052,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -2077,9 +2063,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user where :__sq_has_values1 = 1 and user.col in ::__sq1", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where :__sq_has_values1 = 1 and `user`.col in ::__sq1", + "Table": "`user`" } ] } @@ -2097,7 +2083,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "unsharded_user_unsharded_a", + "TableName": "unsharded_`user`_unsharded_a", "Inputs": [ { "OperatorType": "Subquery", @@ -2110,15 +2096,15 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "unsharded_user", + "TableName": "unsharded_`user`", "Inputs": [ { "OperatorType": "Route", @@ -2138,9 +2124,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user where :__sq_has_values1 = 1 and user.col in ::__sq1", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where :__sq_has_values1 = 1 and `user`.col in ::__sq1", + "Table": "`user`" } ] } @@ -2170,7 +2156,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -2179,9 +2165,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1, user.col2 from user where 1 != 1", - "Query": "select user.col1, user.col2 from user", - "Table": "user" + "FieldQuery": "select `user`.col1, `user`.col2 from `user` where 1 != 1", + "Query": "select `user`.col1, `user`.col2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -2228,9 +2214,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user join user_extra on user.ID = user_extra.User_Id where 1 != 1", - "Query": "select user.col from user join user_extra on user.ID = user_extra.User_Id", - "Table": "user" + "FieldQuery": "select `user`.col from `user` join user_extra on `user`.ID = user_extra.User_Id where 1 != 1", + "Query": "select `user`.col from `user` join user_extra on `user`.ID = user_extra.User_Id", + "Table": "`user`" } } @@ -2250,7 +2236,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -2259,9 +2245,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user", - "Table": "user" + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -2332,9 +2318,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select :__lastInsertId as `last_insert_id()` from user where 1 != 1", - "Query": "select :__lastInsertId as `last_insert_id()` from user", - "Table": "user" + "FieldQuery": "select :__lastInsertId as `last_insert_id()` from `user` where 1 != 1", + "Query": "select :__lastInsertId as `last_insert_id()` from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -2367,7 +2353,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -2376,9 +2362,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user", - "Table": "user" + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -2401,7 +2387,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_extra_user", + "TableName": "user_extra_`user`", "Inputs": [ { "OperatorType": "Route", @@ -2421,9 +2407,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user where user.id = :user_extra_id", - "Table": "user", + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user` where `user`.id = :user_extra_id", + "Table": "`user`", "Values": [ ":user_extra_id" ], @@ -2453,11 +2439,11 @@ Gen4 plan same as above # duplicate symbols "select user.id from user join user" -"duplicate symbol: user" +"duplicate symbol: `user`" # duplicate symbols for merging routes "select user.id from user join user_extra user on user.id = user.user_id" -"duplicate symbol: user" +"duplicate symbol: `user`" # non-existent table "select c from t" diff --git a/go/vt/vtgate/planbuilder/testdata/large_cases.txt b/go/vt/vtgate/planbuilder/testdata/large_cases.txt index 064a60a4792..6db381e46c6 100644 --- a/go/vt/vtgate/planbuilder/testdata/large_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/large_cases.txt @@ -6,7 +6,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra_user_metadata_music_unsharded_unsharded_a_unsharded_b_unsharded_auto_music_extra", + "TableName": "`user`_user_extra_user_metadata_music_unsharded_unsharded_a_unsharded_b_unsharded_auto_music_extra", "Inputs": [ { "OperatorType": "Route", @@ -15,9 +15,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user", - "Table": "user" + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Join", @@ -178,7 +178,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "music, music_extra_user, user_extra, user_metadata_unsharded, unsharded_a, unsharded_auto, unsharded_b", + "TableName": "music, music_extra_`user`, user_extra, user_metadata_unsharded, unsharded_a, unsharded_auto, unsharded_b", "Inputs": [ { "OperatorType": "Route", @@ -195,7 +195,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user, user_extra, user_metadata_unsharded, unsharded_a, unsharded_auto, unsharded_b", + "TableName": "`user`, user_extra, user_metadata_unsharded, unsharded_a, unsharded_auto, unsharded_b", "Inputs": [ { "OperatorType": "Route", @@ -204,9 +204,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user, user_extra, user_metadata where 1 != 1", - "Query": "select user.id from user, user_extra, user_metadata where user.id = user_extra.user_id and user_metadata.user_id = user_extra.user_id", - "Table": "user, user_extra, user_metadata" + "FieldQuery": "select `user`.id from `user`, user_extra, user_metadata where 1 != 1", + "Query": "select `user`.id from `user`, user_extra, user_metadata where `user`.id = user_extra.user_id and user_metadata.user_id = user_extra.user_id", + "Table": "`user`, user_extra, user_metadata" }, { "OperatorType": "Route", diff --git a/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.txt b/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.txt index 1db6f534f56..cb743923963 100644 --- a/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/memory_sort_cases.txt @@ -23,10 +23,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) from user where 1 != 1 group by a", + "FieldQuery": "select a, b, count(*) from `user` where 1 != 1 group by a", "OrderBy": "0 ASC", - "Query": "select a, b, count(*) from user group by a order by a asc", - "Table": "user" + "Query": "select a, b, count(*) from `user` group by a order by a asc", + "Table": "`user`" } ] } @@ -58,10 +58,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) as k from user where 1 != 1 group by a", + "FieldQuery": "select a, b, count(*) as k from `user` where 1 != 1 group by a", "OrderBy": "0 ASC", - "Query": "select a, b, count(*) as k from user group by a order by a asc", - "Table": "user" + "Query": "select a, b, count(*) as k from `user` group by a order by a asc", + "Table": "`user`" } ] } @@ -93,10 +93,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) as k from user where 1 != 1 group by a", + "FieldQuery": "select a, b, count(*) as k from `user` where 1 != 1 group by a", "OrderBy": "0 ASC", - "Query": "select a, b, count(*) as k from user group by a order by a asc", - "Table": "user" + "Query": "select a, b, count(*) as k from `user` group by a order by a asc", + "Table": "`user`" } ] } @@ -132,10 +132,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) as k from user where 1 != 1 group by a", + "FieldQuery": "select a, b, count(*) as k from `user` where 1 != 1 group by a", "OrderBy": "0 ASC", - "Query": "select a, b, count(*) as k from user group by a order by a asc", - "Table": "user" + "Query": "select a, b, count(*) as k from `user` group by a order by a asc", + "Table": "`user`" } ] } @@ -169,10 +169,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a, b, count(*) as k from user where 1 != 1 group by a", + "FieldQuery": "select a, b, count(*) as k from `user` where 1 != 1 group by a", "OrderBy": "0 ASC", - "Query": "select a, b, count(*) as k from user group by a order by 1 asc", - "Table": "user" + "Query": "select a, b, count(*) as k from `user` group by a order by 1 asc", + "Table": "`user`" } ] } @@ -205,10 +205,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select textcol1 as t, count(*) as k, weight_string(textcol1) from user where 1 != 1 group by textcol1", + "FieldQuery": "select textcol1 as t, count(*) as k, weight_string(textcol1) from `user` where 1 != 1 group by textcol1", "OrderBy": "2 ASC, 2 ASC", - "Query": "select textcol1 as t, count(*) as k, weight_string(textcol1) from user group by textcol1 order by textcol1 asc, textcol1 asc", - "Table": "user" + "Query": "select textcol1 as t, count(*) as k, weight_string(textcol1) from `user` group by textcol1 order by textcol1 asc, textcol1 asc", + "Table": "`user`" } ] } @@ -236,7 +236,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -245,9 +245,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.col from user where 1 != 1", - "Query": "select user.id, user.col from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.col from `user` where 1 != 1", + "Query": "select `user`.id, `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -282,7 +282,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -291,9 +291,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2 as b, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2 as b, user.id from user where user.id = 1", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2 as b, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2 as b, `user`.id from `user` where `user`.id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -334,7 +334,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -343,9 +343,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2, user.id from user where user.id = 1", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where `user`.id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -386,7 +386,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1,-3", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -395,9 +395,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.a, u.textcol1, weight_string(u.textcol1) from user as u where 1 != 1", - "Query": "select u.a, u.textcol1, weight_string(u.textcol1) from user as u", - "Table": "user" + "FieldQuery": "select u.a, u.textcol1, weight_string(u.textcol1) from `user` as u where 1 != 1", + "Query": "select u.a, u.textcol1, weight_string(u.textcol1) from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -430,7 +430,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1,2,-1,3", - "TableName": "unsharded_user", + "TableName": "unsharded_`user`", "Inputs": [ { "OperatorType": "Route", @@ -450,9 +450,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.a, u.textcol1, weight_string(u.textcol1) from user as u where 1 != 1", - "Query": "select u.a, u.textcol1, weight_string(u.textcol1) from user as u", - "Table": "user" + "FieldQuery": "select u.a, u.textcol1, weight_string(u.textcol1) from `user` as u where 1 != 1", + "Query": "select u.a, u.textcol1, weight_string(u.textcol1) from `user` as u", + "Table": "`user`" } ] } @@ -504,10 +504,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select a from user where 1 != 1", + "FieldQuery": "select a from `user` where 1 != 1", "OrderBy": "0 DESC", - "Query": "select a from user order by binary a desc", - "Table": "user" + "Query": "select a from `user` order by binary a desc", + "Table": "`user`" } } @@ -520,7 +520,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -529,10 +529,10 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.a from user as u where 1 != 1", + "FieldQuery": "select u.a from `user` as u where 1 != 1", "OrderBy": "0 DESC", - "Query": "select u.a from user as u order by binary a desc", - "Table": "user" + "Query": "select u.a from `user` as u order by binary a desc", + "Table": "`user`" }, { "OperatorType": "Route", diff --git a/go/vt/vtgate/planbuilder/testdata/other_read_cases.txt b/go/vt/vtgate/planbuilder/testdata/other_read_cases.txt index 0d52d47f4e8..3f537118c0e 100644 --- a/go/vt/vtgate/planbuilder/testdata/other_read_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/other_read_cases.txt @@ -11,7 +11,7 @@ }, "TargetDestination": "AnyShard()", "IsDML": false, - "Query": "explain select * from user", + "Query": "explain select * from `user`", "SingleShardOnly": true } } diff --git a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.txt b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.txt index 901b68b2b88..3fd2d164f23 100644 --- a/go/vt/vtgate/planbuilder/testdata/postprocess_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/postprocess_cases.txt @@ -10,9 +10,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 from user where 1 != 1", - "Query": "select user.col1 from user having col2 = 2", - "Table": "user" + "FieldQuery": "select `user`.col1 from `user` where 1 != 1", + "Query": "select `user`.col1 from `user` having col2 = 2", + "Table": "`user`" } } @@ -29,7 +29,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -38,9 +38,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 from user where 1 != 1", - "Query": "select user.col1 from user", - "Table": "user" + "FieldQuery": "select `user`.col1 from `user` where 1 != 1", + "Query": "select `user`.col1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -66,7 +66,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -75,9 +75,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2 from user where 1 != 1", - "Query": "select user.col1 as a, user.col2 from user having 1 = 1 and a = 1 and a = user.col2", - "Table": "user" + "FieldQuery": "select `user`.col1 as a, `user`.col2 from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2 from `user` having 1 = 1 and a = 1 and a = `user`.col2", + "Table": "`user`" }, { "OperatorType": "Route", @@ -110,9 +110,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -121,9 +121,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user having :__sq_has_values1 = 1 and id in ::__vals", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` having :__sq_has_values1 = 1 and id in ::__vals", + "Table": "`user`", "Values": [ "::__sq1" ], @@ -145,9 +145,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where id = 5 order by aa asc", - "Table": "user", + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where id = 5 order by aa asc", + "Table": "`user`", "Values": [ 5 ], @@ -168,9 +168,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where id = 1 order by 1 asc", - "Table": "user", + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where id = 1 order by 1 asc", + "Table": "`user`", "Values": [ 1 ], @@ -191,10 +191,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", + "FieldQuery": "select col from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select col from user order by col asc", - "Table": "user" + "Query": "select col from `user` order by col asc", + "Table": "`user`" } } @@ -248,10 +248,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, textcol1, b, weight_string(textcol1) from user where 1 != 1", + "FieldQuery": "select a, textcol1, b, weight_string(textcol1) from `user` where 1 != 1", "OrderBy": "0 ASC, 3 ASC, 2 ASC", - "Query": "select a, textcol1, b, weight_string(textcol1) from user order by a asc, textcol1 asc, b asc", - "Table": "user" + "Query": "select a, textcol1, b, weight_string(textcol1) from `user` order by a asc, textcol1 asc, b asc", + "Table": "`user`" } } @@ -267,10 +267,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, user.textcol1, b, weight_string(user.textcol1) from user where 1 != 1", + "FieldQuery": "select a, `user`.textcol1, b, weight_string(`user`.textcol1) from `user` where 1 != 1", "OrderBy": "0 ASC, 3 ASC, 2 ASC", - "Query": "select a, user.textcol1, b, weight_string(user.textcol1) from user order by a asc, textcol1 asc, b asc", - "Table": "user" + "Query": "select a, `user`.textcol1, b, weight_string(`user`.textcol1) from `user` order by a asc, textcol1 asc, b asc", + "Table": "`user`" } } @@ -286,10 +286,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select a, textcol1, b, textcol2, weight_string(textcol1), weight_string(textcol2) from user where 1 != 1", + "FieldQuery": "select a, textcol1, b, textcol2, weight_string(textcol1), weight_string(textcol2) from `user` where 1 != 1", "OrderBy": "0 ASC, 4 ASC, 2 ASC, 5 ASC", - "Query": "select a, textcol1, b, textcol2, weight_string(textcol1), weight_string(textcol2) from user order by a asc, textcol1 asc, b asc, textcol2 asc", - "Table": "user" + "Query": "select a, textcol1, b, textcol2, weight_string(textcol1), weight_string(textcol2) from `user` order by a asc, textcol1 asc, b asc, textcol2 asc", + "Table": "`user`" } } @@ -309,9 +309,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user order by null", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` order by null", + "Table": "`user`" } } Gen4 plan same as above @@ -332,9 +332,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col2 from user where 1 != 1", - "Query": "select col2 from user", - "Table": "user" + "FieldQuery": "select col2 from `user` where 1 != 1", + "Query": "select col2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -343,10 +343,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", + "FieldQuery": "select col from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select col from user where :__sq_has_values1 = 1 and col in ::__sq1 order by col asc", - "Table": "user" + "Query": "select col from `user` where :__sq_has_values1 = 1 and col in ::__sq1 order by col asc", + "Table": "`user`" } ] } @@ -361,7 +361,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -370,9 +370,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2, user.id from user where user.id = 1 order by null", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where `user`.id = 1 order by null", + "Table": "`user`", "Values": [ 1 ], @@ -406,7 +406,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -415,9 +415,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2, user.id from user where user.id = 1 order by a asc", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where `user`.id = 1 order by a asc", + "Table": "`user`", "Values": [ 1 ], @@ -451,7 +451,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -460,9 +460,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2, user.id from user where user.id = 1 order by a asc", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where `user`.id = 1 order by a asc", + "Table": "`user`", "Values": [ 1 ], @@ -503,9 +503,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col2 from user where 1 != 1", - "Query": "select col2 from user", - "Table": "user" + "FieldQuery": "select col2 from `user` where 1 != 1", + "Query": "select col2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -514,9 +514,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where :__sq_has_values1 = 1 and col in ::__sq1 order by null", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where :__sq_has_values1 = 1 and col in ::__sq1 order by null", + "Table": "`user`" } ] } @@ -534,9 +534,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user order by RAND()", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` order by RAND()", + "Table": "`user`" } } Gen4 plan same as above @@ -550,7 +550,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2,1", - "TableName": "user_music", + "TableName": "`user`_music", "Inputs": [ { "OperatorType": "Route", @@ -559,9 +559,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col1 as a, user.col2, user.id from user where 1 != 1", - "Query": "select user.col1 as a, user.col2, user.id from user where user.id = 1 order by RAND()", - "Table": "user", + "FieldQuery": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where 1 != 1", + "Query": "select `user`.col1 as a, `user`.col2, `user`.id from `user` where `user`.id = 1 order by RAND()", + "Table": "`user`", "Values": [ 1 ], @@ -602,9 +602,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col2 from user where 1 != 1", - "Query": "select col2 from user", - "Table": "user" + "FieldQuery": "select col2 from `user` where 1 != 1", + "Query": "select col2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -613,9 +613,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where :__sq_has_values1 = 1 and col in ::__sq1 order by rand()", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where :__sq_has_values1 = 1 and col in ::__sq1 order by rand()", + "Table": "`user`" } ] } @@ -633,9 +633,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by col asc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by col asc", + "Table": "`user`", "Values": [ 5 ], @@ -656,9 +656,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.* from user where 1 != 1", - "Query": "select user.* from user where id = 5 order by user.col asc", - "Table": "user", + "FieldQuery": "select `user`.* from `user` where 1 != 1", + "Query": "select `user`.* from `user` where id = 5 order by `user`.col asc", + "Table": "`user`", "Values": [ 5 ], @@ -679,9 +679,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by user.col asc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by `user`.col asc", + "Table": "`user`", "Values": [ 5 ], @@ -699,7 +699,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -708,9 +708,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id, u.col from user as u where 1 != 1", - "Query": "select u.id, u.col from user as u where u.col in (select * from user where user.id = u.id order by col asc)", - "Table": "user" + "FieldQuery": "select u.id, u.col from `user` as u where 1 != 1", + "Query": "select u.id, u.col from `user` as u where u.col in (select * from `user` where `user`.id = u.id order by col asc)", + "Table": "`user`" }, { "OperatorType": "Route", @@ -755,9 +755,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by user.col collate utf8_general_ci asc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by `user`.col collate utf8_general_ci asc", + "Table": "`user`", "Values": [ 5 ], @@ -778,9 +778,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by -col1 asc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by -col1 asc", + "Table": "`user`", "Values": [ 5 ], @@ -801,9 +801,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by concat(col, col1) collate utf8_general_ci desc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by concat(col, col1) collate utf8_general_ci desc", + "Table": "`user`", "Values": [ 5 ], @@ -824,9 +824,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 order by id + col collate utf8_general_ci desc", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 order by id + col collate utf8_general_ci desc", + "Table": "`user`", "Values": [ 5 ], @@ -847,9 +847,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user as u join (select user_id from user_extra where 1 != 1) as eu on u.id = eu.user_id where 1 != 1", - "Query": "select * from user as u join (select user_id from user_extra where user_id = 5) as eu on u.id = eu.user_id where u.id = 5 order by eu.user_id asc", - "Table": "user", + "FieldQuery": "select * from `user` as u join (select user_id from user_extra where 1 != 1) as eu on u.id = eu.user_id where 1 != 1", + "Query": "select * from `user` as u join (select user_id from user_extra where user_id = 5) as eu on u.id = eu.user_id where u.id = 5 order by eu.user_id asc", + "Table": "`user`", "Values": [ 5 ], @@ -869,9 +869,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user as route1 where 1 != 1", - "Query": "select col from user as route1 where id = 1 order by col asc", - "Table": "user", + "FieldQuery": "select col from `user` as route1 where 1 != 1", + "Query": "select col from `user` as route1 where id = 1 order by col asc", + "Table": "`user`", "Values": [ 1 ], @@ -891,9 +891,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1 from user where 1 != 1", - "Query": "select col1 from user where id = 1 limit 1", - "Table": "user", + "FieldQuery": "select col1 from `user` where 1 != 1", + "Query": "select col1 from `user` where id = 1 limit 1", + "Table": "`user`", "Values": [ 1 ], @@ -916,7 +916,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -925,9 +925,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -962,9 +962,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user limit :__upper_limit", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` limit :__upper_limit", + "Table": "`user`" } ] } @@ -987,9 +987,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user limit :__upper_limit", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` limit :__upper_limit", + "Table": "`user`" } ] } @@ -1012,9 +1012,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id1 = 4 and name1 = 'abc' limit :__upper_limit", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id1 = 4 and name1 = 'abc' limit :__upper_limit", + "Table": "`user`" } ] } @@ -1041,9 +1041,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1 from user where 1 != 1", - "Query": "select col1 from user", - "Table": "user" + "FieldQuery": "select col1 from `user` where 1 != 1", + "Query": "select col1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1052,9 +1052,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user where :__sq_has_values1 = 1 and col in ::__sq1 limit :__upper_limit", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user` where :__sq_has_values1 = 1 and col in ::__sq1 limit :__upper_limit", + "Table": "`user`" } ] } diff --git a/go/vt/vtgate/planbuilder/testdata/select_cases.txt b/go/vt/vtgate/planbuilder/testdata/select_cases.txt index 42ef6bf233f..7729510f6d0 100644 --- a/go/vt/vtgate/planbuilder/testdata/select_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/select_cases.txt @@ -10,9 +10,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -29,9 +29,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.* from user where 1 != 1", - "Query": "select user.* from user", - "Table": "user" + "FieldQuery": "select `user`.* from `user` where 1 != 1", + "Query": "select `user`.* from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -48,9 +48,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -67,9 +67,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -92,9 +92,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) from user where 1 != 1", - "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from user", - "Table": "user" + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ count(*) from `user`", + "Table": "`user`" } ] } @@ -116,9 +116,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from user limit :__upper_limit", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select /*vt+ QUERY_TIMEOUT_MS=1000 */ * from `user` limit :__upper_limit", + "Table": "`user`" } ] } @@ -137,9 +137,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from user", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -162,9 +162,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) from user where 1 != 1", - "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", - "Table": "user" + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", + "Table": "`user`" } ] } @@ -188,9 +188,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select count(*) from user where 1 != 1", - "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from user", - "Table": "user" + "FieldQuery": "select count(*) from `user` where 1 != 1", + "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ count(*) from `user`", + "Table": "`user`" } ] } @@ -212,9 +212,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from user limit :__upper_limit", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select /*vt+ SCATTER_ERRORS_AS_WARNINGS=1 */ * from `user` limit :__upper_limit", + "Table": "`user`" } ] } @@ -233,9 +233,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.* from user where 1 != 1", - "Query": "select user.* from user", - "Table": "user" + "FieldQuery": "select `user`.* from `user` where 1 != 1", + "Query": "select `user`.* from `user`", + "Table": "`user`" } } Gen4 plan same as above @@ -252,9 +252,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.* from user where 1 != 1", - "Query": "select user.* from user", - "Table": "user" + "FieldQuery": "select `user`.* from `user` where 1 != 1", + "Query": "select `user`.* from `user`", + "Table": "`user`" } } @@ -328,8 +328,8 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from authoritative join user on authoritative.user_id = user.id where 1 != 1", - "Query": "select * from authoritative join user on authoritative.user_id = user.id", + "FieldQuery": "select * from authoritative join `user` on authoritative.user_id = `user`.id where 1 != 1", + "Query": "select * from authoritative join `user` on authoritative.user_id = `user`.id", "Table": "authoritative" } } @@ -346,8 +346,8 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, a.user_id, a.col1, a.col2, user.col1 from authoritative as a join user on a.user_id = user.id where 1 != 1", - "Query": "select user.id, a.user_id, a.col1, a.col2, user.col1 from authoritative as a join user on a.user_id = user.id", + "FieldQuery": "select `user`.id, a.user_id, a.col1, a.col2, `user`.col1 from authoritative as a join `user` on a.user_id = `user`.id where 1 != 1", + "Query": "select `user`.id, a.user_id, a.col1, a.col2, `user`.col1 from authoritative as a join `user` on a.user_id = `user`.id", "Table": "authoritative" } } @@ -364,9 +364,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user join user_extra on user.id = user_extra.user_id where 1 != 1", - "Query": "select col from user join user_extra on user.id = user_extra.user_id", - "Table": "user" + "FieldQuery": "select col from `user` join user_extra on `user`.id = user_extra.user_id where 1 != 1", + "Query": "select col from `user` join user_extra on `user`.id = user_extra.user_id", + "Table": "`user`" } } @@ -383,7 +383,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -392,9 +392,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -524,7 +524,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -533,9 +533,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user", - "Table": "user" + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -562,7 +562,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -571,9 +571,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -600,7 +600,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -609,9 +609,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -638,7 +638,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -647,9 +647,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col, user.col2 from user where 1 != 1", - "Query": "select user.col, user.col2 from user", - "Table": "user" + "FieldQuery": "select `user`.col, `user`.col2 from `user` where 1 != 1", + "Query": "select `user`.col, `user`.col2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -676,7 +676,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -685,9 +685,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select /* comment */ user.col from user", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select /* comment */ `user`.col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -713,7 +713,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -722,9 +722,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.col from user where 1 != 1", - "Query": "select user.col from user for update", - "Table": "user" + "FieldQuery": "select `user`.col from `user` where 1 != 1", + "Query": "select `user`.col from `user` for update", + "Table": "`user`" }, { "OperatorType": "Route", @@ -750,7 +750,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -759,9 +759,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id from user where 1 != 1", - "Query": "select user.id from user", - "Table": "user" + "FieldQuery": "select `user`.id from `user` where 1 != 1", + "Query": "select `user`.id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -787,7 +787,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -796,9 +796,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.Col from user where 1 != 1", - "Query": "select user.Col from user", - "Table": "user" + "FieldQuery": "select `user`.Col from `user` where 1 != 1", + "Query": "select `user`.Col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -833,9 +833,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 0x04", - "Table": "user" + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 0x04", + "Table": "`user`" } } Gen4 plan same as above @@ -878,9 +878,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where `name` = 'abc' and id = 4 limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where `name` = 'abc' and id = 4 limit 5", + "Table": "`user`", "Values": [ 4 ], @@ -901,9 +901,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 4 and `name` = 'abc' limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", + "Table": "`user`", "Values": [ 4 ], @@ -924,9 +924,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 4 and `name` = 'abc' limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 4 and `name` = 'abc' limit 5", + "Table": "`user`", "Values": [ 4 ], @@ -947,9 +947,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user0_.col as col0_ from user as user0_ where 1 != 1", - "Query": "select user0_.col as col0_ from user as user0_ where id = 1 order by user0_.col desc limit 2", - "Table": "user", + "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", + "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by user0_.col desc limit 2", + "Table": "`user`", "Values": [ 1 ], @@ -970,9 +970,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user0_.col as col0_ from user as user0_ where 1 != 1", - "Query": "select user0_.col as col0_ from user as user0_ where id = 1 order by col0_ desc limit 3", - "Table": "user", + "FieldQuery": "select user0_.col as col0_ from `user` as user0_ where 1 != 1", + "Query": "select user0_.col as col0_ from `user` as user0_ where id = 1 order by col0_ desc limit 3", + "Table": "`user`", "Values": [ 1 ], @@ -993,9 +993,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 1 and `name` = true limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 1 and `name` = true limit 5", + "Table": "`user`", "Values": [ 1 ], @@ -1016,9 +1016,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 1 and `name` limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 1 and `name` limit 5", + "Table": "`user`", "Values": [ 1 ], @@ -1039,9 +1039,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 5 and `name` = true limit 5", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 5 and `name` = true limit 5", + "Table": "`user`", "Values": [ 5 ], @@ -1066,9 +1066,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1101,9 +1101,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1136,7 +1136,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1145,9 +1145,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id as id1 from user where 1 != 1", - "Query": "select user.id as id1 from user", - "Table": "user" + "FieldQuery": "select `user`.id as id1 from `user` where 1 != 1", + "Query": "select `user`.id as id1 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -1204,8 +1204,8 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from music where 1 != 1 union select * from user where 1 != 1", - "Query": "select * from music where user_id = 1 union select * from user where id = 1", + "FieldQuery": "select * from music where 1 != 1 union select * from `user` where 1 != 1", + "Query": "select * from music where user_id = 1 union select * from `user` where id = 1", "Table": "music", "Values": [ 1 @@ -1227,8 +1227,8 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select *, :__lastInsertId as `last_insert_id()` from music where 1 != 1 union select * from user where 1 != 1", - "Query": "select *, :__lastInsertId as `last_insert_id()` from music where user_id = 1 union select * from user where id = 1", + "FieldQuery": "select *, :__lastInsertId as `last_insert_id()` from music where 1 != 1 union select * from `user` where 1 != 1", + "Query": "select *, :__lastInsertId as `last_insert_id()` from music where user_id = 1 union select * from `user` where id = 1", "Table": "music", "Values": [ 1 @@ -1667,7 +1667,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -1676,9 +1676,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.a from user where 1 != 1", - "Query": "select user.a from user", - "Table": "user" + "FieldQuery": "select `user`.a from `user` where 1 != 1", + "Query": "select `user`.a from `user`", + "Table": "`user`" }, { "OperatorType": "Route", diff --git a/go/vt/vtgate/planbuilder/testdata/show_cases.txt b/go/vt/vtgate/planbuilder/testdata/show_cases.txt index 77f8a2b566e..9776864ead2 100644 --- a/go/vt/vtgate/planbuilder/testdata/show_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/show_cases.txt @@ -243,3 +243,206 @@ "OperatorType": "Rows" } } + +# show create database +"show create database user" +{ + "QueryType": "SHOW", + "Original": "show create database user", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create database `user`", + "SingleShardOnly": true + } +} + +# show create database system_schema +"show create database mysql" +{ + "QueryType": "SHOW", + "Original": "show create database mysql", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create database mysql", + "SingleShardOnly": true + } +} + +# show create procedure +"show create procedure proc" +{ + "QueryType": "SHOW", + "Original": "show create procedure proc", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create procedure proc", + "SingleShardOnly": true + } +} + +# show create procedure from system_schema +"show create procedure information_schema.proc" +{ + "QueryType": "SHOW", + "Original": "show create procedure information_schema.proc", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create procedure information_schema.proc", + "SingleShardOnly": true + } +} + +# show create table on table present in sharded but as unsharded is selected it goes to unsharded keyspace +"show create table user_extra" +{ + "QueryType": "SHOW", + "Original": "show create table user_extra", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create table user_extra", + "SingleShardOnly": true + } +} + +# show create table with qualifier +"show create table user.user_extra" +{ + "QueryType": "SHOW", + "Original": "show create table user.user_extra", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create table user_extra", + "SingleShardOnly": true + } +} + +# show create table with unsharded as default keyspace +"show create table unknown" +{ + "QueryType": "SHOW", + "Original": "show create table unknown", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create table unknown", + "SingleShardOnly": true + } +} + +# show create table with table not present with qualifier +"show create table user.unknown" +"table unknown not found" + +# show create table from system_schema +"show create table information_schema.tables" +{ + "QueryType": "SHOW", + "Original": "show create table information_schema.tables", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show create table information_schema.`tables`", + "SingleShardOnly": true + } +} + +# show tables +"show tables" +{ + "QueryType": "SHOW", + "Original": "show tables", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show tables", + "SingleShardOnly": true + } +} + +# show tables from db +"show tables from user" +{ + "QueryType": "SHOW", + "Original": "show tables from user", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show tables", + "SingleShardOnly": true + } +} + +# show tables from system schema +"show tables from performance_schema" +{ + "QueryType": "SHOW", + "Original": "show tables from performance_schema", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "IsDML": false, + "Query": "show tables from performance_schema", + "SingleShardOnly": true + } +} + diff --git a/go/vt/vtgate/planbuilder/testdata/show_cases_no_default_keyspace.txt b/go/vt/vtgate/planbuilder/testdata/show_cases_no_default_keyspace.txt index 899c530bacf..7e5971147a5 100644 --- a/go/vt/vtgate/planbuilder/testdata/show_cases_no_default_keyspace.txt +++ b/go/vt/vtgate/planbuilder/testdata/show_cases_no_default_keyspace.txt @@ -29,7 +29,7 @@ }, "TargetDestination": "AnyShard()", "IsDML": false, - "Query": "show full columns from user", + "Query": "show full columns from `user`", "SingleShardOnly": true } } diff --git a/go/vt/vtgate/planbuilder/testdata/symtab_cases.txt b/go/vt/vtgate/planbuilder/testdata/symtab_cases.txt index 7b07e057f64..24811cbc907 100644 --- a/go/vt/vtgate/planbuilder/testdata/symtab_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/symtab_cases.txt @@ -9,7 +9,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_unsharded", + "TableName": "`user`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -18,9 +18,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select predef2 from user where 1 != 1", - "Query": "select predef2 from user", - "Table": "user" + "FieldQuery": "select predef2 from `user` where 1 != 1", + "Query": "select predef2 from `user`", + "Table": "`user`" }, { "OperatorType": "Route", diff --git a/go/vt/vtgate/planbuilder/testdata/union_cases.txt b/go/vt/vtgate/planbuilder/testdata/union_cases.txt index 49fe6182ac2..bc82ca929f4 100644 --- a/go/vt/vtgate/planbuilder/testdata/union_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/union_cases.txt @@ -10,12 +10,26 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1 union all select id from music where 1 != 1", - "Query": "select id from user union all select id from music", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1 union all select id from music where 1 != 1", + "Query": "select id from `user` union all select id from music", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user union all select id from music", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1 union all select id from music where 1 != 1", + "Query": "select id from `user` union all select id from music", + "Table": "`user`" } } -Gen4 plan same as above # union distinct between two scatter selects "select id from user union select id from music" @@ -35,9 +49,45 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "Query": "select id from music", + "Table": "music" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user union select id from music", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -55,7 +105,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # union all between two SelectEqualUnique "select id from user where id = 1 union all select id from user where id = 5" @@ -72,9 +121,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = 1", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -87,9 +136,48 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user where id = 5", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 5", + "Table": "`user`", + "Values": [ + 5 + ], + "Vindex": "user_index" + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where id = 1 union all select id from user where id = 5", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 1", + "Table": "`user`", + "Values": [ + 1 + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 5", + "Table": "`user`", "Values": [ 5 ], @@ -98,7 +186,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above #almost dereks query - two queries with order by and limit being scattered to two different sets of tablets "(SELECT id FROM user ORDER BY id DESC LIMIT 1) UNION ALL (SELECT id FROM music ORDER BY id DESC LIMIT 1)" @@ -119,10 +206,55 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", + "FieldQuery": "select id from `user` where 1 != 1", "OrderBy": "0 DESC", - "Query": "select id from user order by id desc limit :__upper_limit", - "Table": "user" + "Query": "select id from `user` order by id desc limit :__upper_limit", + "Table": "`user`" + } + ] + }, + { + "OperatorType": "Limit", + "Count": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "OrderBy": "0 DESC", + "Query": "select id from music order by id desc limit :__upper_limit", + "Table": "music" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "(SELECT id FROM user ORDER BY id DESC LIMIT 1) UNION ALL (SELECT id FROM music ORDER BY id DESC LIMIT 1)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Limit", + "Count": 1, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "OrderBy": "0 DESC", + "Query": "select id from `user` order by id desc limit :__upper_limit", + "Table": "`user`" } ] }, @@ -147,7 +279,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # Union all "select col1, col2 from user union all select col1, col2 from user_extra" @@ -161,12 +292,26 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select col1, col2 from user where 1 != 1 union all select col1, col2 from user_extra where 1 != 1", - "Query": "select col1, col2 from user union all select col1, col2 from user_extra", - "Table": "user" + "FieldQuery": "select col1, col2 from `user` where 1 != 1 union all select col1, col2 from user_extra where 1 != 1", + "Query": "select col1, col2 from `user` union all select col1, col2 from user_extra", + "Table": "`user`" + } +} +{ + "QueryType": "SELECT", + "Original": "select col1, col2 from user union all select col1, col2 from user_extra", + "Instructions": { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select col1, col2 from `user` where 1 != 1 union all select col1, col2 from user_extra where 1 != 1", + "Query": "select col1, col2 from `user` union all select col1, col2 from user_extra", + "Table": "`user`" } } -Gen4 plan same as above # union operations in subqueries (FROM) "select * from (select * from user union all select * from user_extra) as t" @@ -180,9 +325,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from (select * from user where 1 != 1 union all select * from user_extra where 1 != 1) as t where 1 != 1", - "Query": "select * from (select * from user union all select * from user_extra) as t", - "Table": "user" + "FieldQuery": "select * from (select * from `user` where 1 != 1 union all select * from user_extra where 1 != 1) as t where 1 != 1", + "Query": "select * from (select * from `user` union all select * from user_extra) as t", + "Table": "`user`" } } @@ -205,10 +350,55 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", + "FieldQuery": "select id from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select id from user order by id asc limit :__upper_limit", - "Table": "user" + "Query": "select id from `user` order by id asc limit :__upper_limit", + "Table": "`user`" + } + ] + }, + { + "OperatorType": "Limit", + "Count": 5, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "OrderBy": "0 DESC", + "Query": "select id from music order by id desc limit :__upper_limit", + "Table": "music" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "(select id from user order by id limit 5) union all (select id from music order by id desc limit 5)", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Limit", + "Count": 5, + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "OrderBy": "0 ASC", + "Query": "select id from `user` order by id asc limit :__upper_limit", + "Table": "`user`" } ] }, @@ -233,7 +423,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # union all on scatter and single route "select id from user where id = 1 union select id from user where id = 1 union all select id from user" @@ -250,9 +439,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1 union select id from user where 1 != 1", - "Query": "select id from user where id = 1 union select id from user where id = 1", - "Table": "user", + "FieldQuery": "select id from `user` where 1 != 1 union select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 1 union select id from `user` where id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -265,14 +454,48 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select id from user where id = 1 union select id from user where id = 1 union all select id from user", + "Instructions": { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1 union select id from `user` where 1 != 1", + "Query": "select id from `user` where id = 1 union select id from `user` where id = 1", + "Table": "`user`", + "Values": [ + 1 + ], + "Vindex": "user_index" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" } ] } } -Gen4 plan same as above # union of information_schema with normal table "select * from information_schema.a union select * from unsharded" @@ -376,9 +599,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -411,31 +634,87 @@ Gen4 plan same as above ] } } -Gen4 plan same as above - -# multi-shard union -"select 1 from music union (select id from user union all select name from unsharded)" { "QueryType": "SELECT", - "Original": "select 1 from music union (select id from user union all select name from unsharded)", + "Original": "(select id from user union select id from music) union select 1 from dual", "Instructions": { "OperatorType": "Distinct", "Inputs": [ { "OperatorType": "Concatenate", "Inputs": [ + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from music where 1 != 1", + "Query": "select id from music", + "Table": "music" + } + ] + } + ] + }, { "OperatorType": "Route", - "Variant": "SelectScatter", + "Variant": "SelectReference", "Keyspace": { - "Name": "user", - "Sharded": true + "Name": "main", + "Sharded": false }, - "FieldQuery": "select 1 from music where 1 != 1", - "Query": "select 1 from music", - "Table": "music" - }, - { + "FieldQuery": "select 1 from dual where 1 != 1", + "Query": "select 1 from dual", + "Table": "dual" + } + ] + } + ] + } +} + +# multi-shard union +"select 1 from music union (select id from user union all select name from unsharded)" +{ + "QueryType": "SELECT", + "Original": "select 1 from music union (select id from user union all select name from unsharded)", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from music where 1 != 1", + "Query": "select 1 from music", + "Table": "music" + }, + { "OperatorType": "Concatenate", "Inputs": [ { @@ -445,9 +724,61 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectUnsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `name` from unsharded where 1 != 1", + "Query": "select `name` from unsharded", + "Table": "unsharded" + } + ] + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select 1 from music union (select id from user union all select name from unsharded)", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from music where 1 != 1", + "Query": "select 1 from music", + "Table": "music" + }, + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -467,7 +798,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # multi-shard union "select 1 from music union (select id from user union select name from unsharded)" @@ -504,9 +834,66 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select id from user where 1 != 1", - "Query": "select id from user", - "Table": "user" + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectUnsharded", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select `name` from unsharded where 1 != 1", + "Query": "select `name` from unsharded", + "Table": "unsharded" + } + ] + } + ] + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select 1 from music union (select id from user union select name from unsharded)", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from music where 1 != 1", + "Query": "select 1 from music", + "Table": "music" + }, + { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select id from `user` where 1 != 1", + "Query": "select id from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -528,7 +915,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # union with the same target shard because of vindex "select * from music where id = 1 union select * from user where id = 1" @@ -563,9 +949,53 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select * from user where 1 != 1", - "Query": "select * from user where id = 1", - "Table": "user", + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 1", + "Table": "`user`", + "Values": [ + 1 + ], + "Vindex": "user_index" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select * from music where id = 1 union select * from user where id = 1", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from music where 1 != 1", + "Query": "select * from music where id = 1", + "Table": "music", + "Values": [ + 1 + ], + "Vindex": "music_user_map" + }, + { + "OperatorType": "Route", + "Variant": "SelectEqualUnique", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select * from `user` where 1 != 1", + "Query": "select * from `user` where id = 1", + "Table": "`user`", "Values": [ 1 ], @@ -576,7 +1006,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # union with different target shards "select 1 from music where id = 1 union select 1 from music where id = 2" @@ -644,10 +1073,10 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", + "FieldQuery": "select 1 from `user` where 1 != 1", "OrderBy": "0 DESC", - "Query": "select 1 from user order by 1 desc", - "Table": "user" + "Query": "select 1 from `user` order by 1 desc", + "Table": "`user`" }, { "OperatorType": "Route", @@ -656,17 +1085,54 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", + "FieldQuery": "select 1 from `user` where 1 != 1", "OrderBy": "0 ASC", - "Query": "select 1 from user order by 1 asc", - "Table": "user" + "Query": "select 1 from `user` order by 1 asc", + "Table": "`user`" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "(select 1 from user order by 1 desc) union (select 1 from user order by 1 asc)", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "OrderBy": "0 DESC", + "Query": "select 1 from `user` order by 1 desc", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from `user` where 1 != 1", + "OrderBy": "0 ASC", + "Query": "select 1 from `user` order by 1 asc", + "Table": "`user`" } ] } ] } } -Gen4 plan same as above # multiple unions "select 1 union select null union select 1.0 union select '1' union select 2 union select 2.0 from user" @@ -697,16 +1163,51 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 2.0 from user where 1 != 1", - "Query": "select 2.0 from user", - "Table": "user" + "FieldQuery": "select 2.0 from `user` where 1 != 1", + "Query": "select 2.0 from `user`", + "Table": "`user`" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select 1 union select null union select 1.0 union select '1' union select 2 union select 2.0 from user", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectReference", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "FieldQuery": "select 1 from dual where 1 != 1 union select null from dual where 1 != 1 union select 1.0 from dual where 1 != 1 union select '1' from dual where 1 != 1 union select 2 from dual where 1 != 1", + "Query": "select 1 from dual union select null from dual union select 1.0 from dual union select '1' from dual union select 2 from dual", + "Table": "dual" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 2.0 from `user` where 1 != 1", + "Query": "select 2.0 from `user`", + "Table": "`user`" } ] } ] } } -Gen4 plan same as above # union distinct between a scatter query and a join (other side) "(select user.id, user.name from user join user_extra where user_extra.extra = 'asdf') union select 'b','c' from user" @@ -723,7 +1224,7 @@ Gen4 plan same as above "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -732,9 +1233,9 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.`name` from user where 1 != 1", - "Query": "select user.id, user.`name` from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.`name` from `user` where 1 != 1", + "Query": "select `user`.id, `user`.`name` from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -756,16 +1257,70 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 'b', 'c' from user where 1 != 1", - "Query": "select 'b', 'c' from user", - "Table": "user" + "FieldQuery": "select 'b', 'c' from `user` where 1 != 1", + "Query": "select 'b', 'c' from `user`", + "Table": "`user`" + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "(select user.id, user.name from user join user_extra where user_extra.extra = 'asdf') union select 'b','c' from user", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "-1,-2", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.id, `user`.`name` from `user` where 1 != 1", + "Query": "select `user`.id, `user`.`name` from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from user_extra where 1 != 1", + "Query": "select 1 from user_extra where user_extra.extra = 'asdf'", + "Table": "user_extra" + } + ] + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 'b', 'c' from `user` where 1 != 1", + "Query": "select 'b', 'c' from `user`", + "Table": "`user`" } ] } ] } } -Gen4 plan same as above # union distinct between a scatter query and a join (other side) "select 'b','c' from user union (select user.id, user.name from user join user_extra where user_extra.extra = 'asdf')" @@ -785,15 +1340,15 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select 'b', 'c' from user where 1 != 1", - "Query": "select 'b', 'c' from user", - "Table": "user" + "FieldQuery": "select 'b', 'c' from `user` where 1 != 1", + "Query": "select 'b', 'c' from `user`", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -802,9 +1357,64 @@ Gen4 plan same as above "Name": "user", "Sharded": true }, - "FieldQuery": "select user.id, user.`name` from user where 1 != 1", - "Query": "select user.id, user.`name` from user", - "Table": "user" + "FieldQuery": "select `user`.id, `user`.`name` from `user` where 1 != 1", + "Query": "select `user`.id, `user`.`name` from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 1 from user_extra where 1 != 1", + "Query": "select 1 from user_extra where user_extra.extra = 'asdf'", + "Table": "user_extra" + } + ] + } + ] + } + ] + } +} +{ + "QueryType": "SELECT", + "Original": "select 'b','c' from user union (select user.id, user.name from user join user_extra where user_extra.extra = 'asdf')", + "Instructions": { + "OperatorType": "Distinct", + "Inputs": [ + { + "OperatorType": "Concatenate", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select 'b', 'c' from `user` where 1 != 1", + "Query": "select 'b', 'c' from `user`", + "Table": "`user`" + }, + { + "OperatorType": "Join", + "Variant": "Join", + "JoinColumnIndexes": "-1,-2", + "TableName": "`user`_user_extra", + "Inputs": [ + { + "OperatorType": "Route", + "Variant": "SelectScatter", + "Keyspace": { + "Name": "user", + "Sharded": true + }, + "FieldQuery": "select `user`.id, `user`.`name` from `user` where 1 != 1", + "Query": "select `user`.id, `user`.`name` from `user`", + "Table": "`user`" }, { "OperatorType": "Route", @@ -824,7 +1434,6 @@ Gen4 plan same as above ] } } -Gen4 plan same as above # ambiguous LIMIT "select id from user limit 1 union all select id from music limit 1" @@ -833,5 +1442,5 @@ Gen4 plan same as above # different number of columns "select id, 42 from user where id = 1 union all select id from user where id = 5" -"The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000) during query: select id, 42 from user where id = 1 union all select id from user where id = 5" +"The used SELECT statements have a different number of columns (errno 1222) (sqlstate 21000) during query: select id, 42 from `user` where id = 1 union all select id from `user` where id = 5" Gen4 plan same as above diff --git a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt index d328c022c4d..bd87592cf46 100644 --- a/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/unsupported_cases.txt @@ -1,8 +1,3 @@ -# SHOW -"show create database" -"plan building not supported" -Gen4 plan same as above - # union operations in subqueries (expressions) "select * from user where id in (select * from user union select * from user_extra)" "unsupported: '*' expression in cross-shard query" diff --git a/go/vt/vtgate/planbuilder/testdata/wireup_cases.txt b/go/vt/vtgate/planbuilder/testdata/wireup_cases.txt index 7bba805ed0c..d4766864a73 100644 --- a/go/vt/vtgate/planbuilder/testdata/wireup_cases.txt +++ b/go/vt/vtgate/planbuilder/testdata/wireup_cases.txt @@ -7,7 +7,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1,-1,2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -16,9 +16,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id as uid from user as u where 1 != 1", - "Query": "select u.id as uid from user as u", - "Table": "user" + "FieldQuery": "select u.id as uid from `user` as u where 1 != 1", + "Query": "select u.id as uid from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -44,7 +44,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1,-1,2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -53,9 +53,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id as uid from user as u where 1 != 1", - "Query": "select u.id as uid from user as u", - "Table": "user" + "FieldQuery": "select u.id as uid from `user` as u where 1 != 1", + "Query": "select u.id as uid from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -81,13 +81,13 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_user", + "TableName": "`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user", + "TableName": "`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -96,9 +96,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u1.id, u1.col from user as u1 where 1 != 1", - "Query": "select u1.id, u1.col from user as u1", - "Table": "user" + "FieldQuery": "select u1.id, u1.col from `user` as u1 where 1 != 1", + "Query": "select u1.id, u1.col from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -107,9 +107,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u2 where 1 != 1", - "Query": "select 1 from user as u2", - "Table": "user" + "FieldQuery": "select 1 from `user` as u2 where 1 != 1", + "Query": "select 1 from `user` as u2", + "Table": "`user`" } ] }, @@ -120,9 +120,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u3 where 1 != 1", - "Query": "select 1 from user as u3 where u3.col = :u1_col", - "Table": "user" + "FieldQuery": "select 1 from `user` as u3 where 1 != 1", + "Query": "select 1 from `user` as u3 where u3.col = :u1_col", + "Table": "`user`" } ] } @@ -137,13 +137,13 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_user", + "TableName": "`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user", + "TableName": "`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -152,9 +152,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u1.id from user as u1 where 1 != 1", - "Query": "select u1.id from user as u1", - "Table": "user" + "FieldQuery": "select u1.id from `user` as u1 where 1 != 1", + "Query": "select u1.id from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -163,9 +163,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u2.col from user as u2 where 1 != 1", - "Query": "select u2.col from user as u2", - "Table": "user" + "FieldQuery": "select u2.col from `user` as u2 where 1 != 1", + "Query": "select u2.col from `user` as u2", + "Table": "`user`" } ] }, @@ -176,9 +176,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u3 where 1 != 1", - "Query": "select 1 from user as u3 where u3.col = :u2_col", - "Table": "user" + "FieldQuery": "select 1 from `user` as u3 where 1 != 1", + "Query": "select 1 from `user` as u3 where u3.col = :u2_col", + "Table": "`user`" } ] } @@ -193,13 +193,13 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_user", + "TableName": "`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user", + "TableName": "`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -208,9 +208,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u1.id, u1.col from user as u1 where 1 != 1", - "Query": "select u1.id, u1.col from user as u1", - "Table": "user" + "FieldQuery": "select u1.id, u1.col from `user` as u1 where 1 != 1", + "Query": "select u1.id, u1.col from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -219,9 +219,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u2 where 1 != 1", - "Query": "select 1 from user as u2 where u2.col = :u1_col", - "Table": "user" + "FieldQuery": "select 1 from `user` as u2 where 1 != 1", + "Query": "select 1 from `user` as u2 where u2.col = :u1_col", + "Table": "`user`" } ] }, @@ -232,9 +232,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u3 where 1 != 1", - "Query": "select 1 from user as u3 where u3.col = :u1_col", - "Table": "user" + "FieldQuery": "select 1 from `user` as u3 where 1 != 1", + "Query": "select 1 from `user` as u3 where u3.col = :u1_col", + "Table": "`user`" } ] } @@ -252,19 +252,19 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_user_user", + "TableName": "`user`_`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user_user", + "TableName": "`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,-2", - "TableName": "user_user", + "TableName": "`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -273,9 +273,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u1.id, u1.col from user as u1 where 1 != 1", - "Query": "select u1.id, u1.col from user as u1", - "Table": "user" + "FieldQuery": "select u1.id, u1.col from `user` as u1 where 1 != 1", + "Query": "select u1.id, u1.col from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Route", @@ -284,9 +284,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u2 where 1 != 1", - "Query": "select 1 from user as u2", - "Table": "user" + "FieldQuery": "select 1 from `user` as u2 where 1 != 1", + "Query": "select 1 from `user` as u2", + "Table": "`user`" } ] }, @@ -297,9 +297,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u3 where 1 != 1", - "Query": "select 1 from user as u3 where u3.id = :u1_col", - "Table": "user", + "FieldQuery": "select 1 from `user` as u3 where 1 != 1", + "Query": "select 1 from `user` as u3 where u3.id = :u1_col", + "Table": "`user`", "Values": [ ":u1_col" ], @@ -314,9 +314,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u4 where 1 != 1", - "Query": "select 1 from user as u4 where u4.col = :u1_col", - "Table": "user" + "FieldQuery": "select 1 from `user` as u4 where 1 != 1", + "Query": "select 1 from `user` as u4 where u4.col = :u1_col", + "Table": "`user`" } ] } @@ -331,7 +331,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1", - "TableName": "user_user_user", + "TableName": "`user`_`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -340,14 +340,14 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u1.id, u1.col from user as u1 where 1 != 1", - "Query": "select u1.id, u1.col from user as u1", - "Table": "user" + "FieldQuery": "select u1.id, u1.col from `user` as u1 where 1 != 1", + "Query": "select u1.id, u1.col from `user` as u1", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", - "TableName": "user_user", + "TableName": "`user`_`user`", "Inputs": [ { "OperatorType": "Route", @@ -356,9 +356,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u2 where 1 != 1", - "Query": "select 1 from user as u2 where u2.id = :u1_col", - "Table": "user", + "FieldQuery": "select 1 from `user` as u2 where 1 != 1", + "Query": "select 1 from `user` as u2 where u2.id = :u1_col", + "Table": "`user`", "Values": [ ":u1_col" ], @@ -371,9 +371,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user as u3 where 1 != 1", - "Query": "select 1 from user as u3 where u3.id = :u1_col", - "Table": "user", + "FieldQuery": "select 1 from `user` as u3 where 1 != 1", + "Query": "select 1 from `user` as u3 where u3.id = :u1_col", + "Table": "`user`", "Values": [ ":u1_col" ], @@ -394,7 +394,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "weird`name_unsharded", + "TableName": "`weird``name`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -405,7 +405,7 @@ }, "FieldQuery": "select `weird``name`.a, `weird``name`.`a``b*c` from `weird``name` where 1 != 1", "Query": "select `weird``name`.a, `weird``name`.`a``b*c` from `weird``name`", - "Table": "weird`name" + "Table": "`weird``name`" }, { "OperatorType": "Route", @@ -431,7 +431,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "1", - "TableName": "weird`name_unsharded", + "TableName": "`weird``name`_unsharded", "Inputs": [ { "OperatorType": "Route", @@ -442,7 +442,7 @@ }, "FieldQuery": "select `weird``name`.`a``b*c` from `weird``name` where 1 != 1", "Query": "select `weird``name`.`a``b*c` from `weird``name`", - "Table": "weird`name" + "Table": "`weird``name`" }, { "OperatorType": "Route", @@ -472,7 +472,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -481,9 +481,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id, u.col from user as u where 1 != 1", - "Query": "select u.id, u.col from user as u", - "Table": "user" + "FieldQuery": "select u.id, u.col from `user` as u where 1 != 1", + "Query": "select u.id, u.col from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -519,7 +519,7 @@ "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -528,9 +528,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id, u.col from user as u where 1 != 1", - "Query": "select u.id, u.col from user as u", - "Table": "user" + "FieldQuery": "select u.id, u.col from `user` as u where 1 != 1", + "Query": "select u.id, u.col from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", @@ -554,9 +554,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select 1 from user where 1 != 1", - "Query": "select 1 from user where :__sq_has_values1 = 1 and id in ::__vals", - "Table": "user", + "FieldQuery": "select 1 from `user` where 1 != 1", + "Query": "select 1 from `user` where :__sq_has_values1 = 1 and id in ::__vals", + "Table": "`user`", "Values": [ "::__sq1" ], @@ -586,15 +586,15 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select col from user where 1 != 1", - "Query": "select col from user", - "Table": "user" + "FieldQuery": "select col from `user` where 1 != 1", + "Query": "select col from `user`", + "Table": "`user`" }, { "OperatorType": "Join", "Variant": "Join", "JoinColumnIndexes": "-1,1,-2", - "TableName": "user_user_extra", + "TableName": "`user`_user_extra", "Inputs": [ { "OperatorType": "Route", @@ -603,9 +603,9 @@ "Name": "user", "Sharded": true }, - "FieldQuery": "select u.id, :__sq1, u.col from user as u where 1 != 1", - "Query": "select u.id, :__sq1, u.col from user as u", - "Table": "user" + "FieldQuery": "select u.id, :__sq1, u.col from `user` as u where 1 != 1", + "Query": "select u.id, :__sq1, u.col from `user` as u", + "Table": "`user`" }, { "OperatorType": "Route", diff --git a/go/vt/vttablet/tabletserver/planbuilder/builder.go b/go/vt/vttablet/tabletserver/planbuilder/builder.go index f2bdbec76ab..747ea2a2659 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/builder.go +++ b/go/vt/vttablet/tabletserver/planbuilder/builder.go @@ -129,33 +129,45 @@ func analyzeInsert(ins *sqlparser.Insert, tables map[string]*schema.Table) (plan func analyzeShow(show *sqlparser.Show, dbName string) (plan *Plan, err error) { switch showInternal := show.Internal.(type) { - case *sqlparser.ShowLegacy: - if showInternal.Type == sqlparser.KeywordString(sqlparser.TABLES) { + case *sqlparser.ShowBasic: + if showInternal.Command == sqlparser.Table { // rewrite WHERE clause if it exists // `where Tables_in_Keyspace` => `where Tables_in_DbName` - if showInternal.ShowTablesOpt != nil && showInternal.ShowTablesOpt.Filter != nil { - filter := showInternal.ShowTablesOpt.Filter.Filter - if filter != nil { - sqlparser.Rewrite(filter, func(cursor *sqlparser.Cursor) bool { - switch n := cursor.Node().(type) { - case *sqlparser.ColName: - if n.Qualifier.IsEmpty() && strings.HasPrefix(n.Name.Lowered(), "tables_in_") { - cursor.Replace(sqlparser.NewColName("Tables_in_" + dbName)) - } - } - return true - }, nil) - } + if showInternal.Filter != nil { + showTableRewrite(showInternal, dbName) } - return &Plan{ - PlanID: PlanShowTables, - FullQuery: GenerateFullQuery(show), - }, nil } + return &Plan{ + PlanID: PlanShow, + FullQuery: GenerateFullQuery(show), + }, nil + case *sqlparser.ShowCreate: + if showInternal.Command == sqlparser.CreateDb && !sqlparser.SystemSchema(showInternal.Op.Name.String()) { + showInternal.Op.Name = sqlparser.NewTableIdent(dbName) + } + return &Plan{ + PlanID: PlanShow, + FullQuery: GenerateFullQuery(show), + }, nil } return &Plan{PlanID: PlanOtherRead}, nil } +func showTableRewrite(show *sqlparser.ShowBasic, dbName string) { + filter := show.Filter.Filter + if filter != nil { + sqlparser.Rewrite(filter, func(cursor *sqlparser.Cursor) bool { + switch n := cursor.Node().(type) { + case *sqlparser.ColName: + if n.Qualifier.IsEmpty() && strings.HasPrefix(n.Name.Lowered(), "tables_in_") { + cursor.Replace(sqlparser.NewColName("Tables_in_" + dbName)) + } + } + return true + }, nil) + } +} + func analyzeSet(set *sqlparser.Set) (plan *Plan) { return &Plan{ PlanID: PlanSet, diff --git a/go/vt/vttablet/tabletserver/planbuilder/plan.go b/go/vt/vttablet/tabletserver/planbuilder/plan.go index 340e7edb014..a248025efc9 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/plan.go +++ b/go/vt/vttablet/tabletserver/planbuilder/plan.go @@ -64,7 +64,7 @@ const ( PlanSavepoint PlanRelease PlanSRollback - PlanShowTables + PlanShow // PlanLoad is for Load data statements PlanLoad // PlanFlush is for FLUSH statements @@ -96,7 +96,7 @@ var planName = []string{ "Savepoint", "Release", "RollbackSavepoint", - "ShowTables", + "Show", "Load", "Flush", "LockTables", diff --git a/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt b/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt index 465d0f1d2ee..0f4f66830ed 100644 --- a/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt +++ b/go/vt/vttablet/tabletserver/planbuilder/testdata/exec_cases.txt @@ -808,7 +808,7 @@ options:PassthroughDMLs # show tables #1 "show tables like 'key%'" { - "PlanID": "ShowTables", + "PlanID": "Show", "TableName":"", "FullQuery": "show tables like 'key%'" } @@ -816,7 +816,7 @@ options:PassthroughDMLs # show tables #2 "show tables where Tables_in_keyspace='apa'" { - "PlanID": "ShowTables", + "PlanID": "Show", "TableName":"", "FullQuery": "show tables where Tables_in_dbName = 'apa'" } @@ -824,15 +824,41 @@ options:PassthroughDMLs # show table status #1 "show table status like 'key%'" { - "PlanID": "OtherRead", - "TableName": "" + "PlanID": "Show", + "TableName":"", + "FullQuery": "show table status like 'key%'" } # show table status #2 "show table status where Name='apa'" { - "PlanID": "OtherRead", - "TableName": "" + "PlanID": "Show", + "TableName":"", + "FullQuery": "show table status where `Name` = 'apa'" +} + +# show create table +"show create table t1" +{ + "PlanID": "Show", + "TableName": "", + "FullQuery": "show create table t1" +} + +# show create database system_schema +"show create database mysql" +{ + "PlanID": "Show", + "TableName": "", + "FullQuery": "show create database mysql" +} + +# show create database +"show create database anything" +{ + "PlanID": "Show", + "TableName": "", + "FullQuery": "show create database dbName" } # load data diff --git a/go/vt/vttablet/tabletserver/query_executor.go b/go/vt/vttablet/tabletserver/query_executor.go index b289c18545e..262826f53a5 100644 --- a/go/vt/vttablet/tabletserver/query_executor.go +++ b/go/vt/vttablet/tabletserver/query_executor.go @@ -121,7 +121,7 @@ func (qre *QueryExecutor) Execute() (reply *sqltypes.Result, err error) { } switch qre.plan.PlanID { - case p.PlanSelect, p.PlanSelectImpossible, p.PlanShowTables: + case p.PlanSelect, p.PlanSelectImpossible, p.PlanShow: maxrows := qre.getSelectLimit() qre.bindVars["#maxLimit"] = sqltypes.Int64BindVariable(maxrows + 1) if qre.bindVars[sqltypes.BvReplaceSchemaName] != nil { @@ -208,7 +208,7 @@ func (qre *QueryExecutor) txConnExec(conn *StatefulConnection) (*sqltypes.Result return qre.execStatefulConn(conn, qre.query, true) case p.PlanSavepoint, p.PlanRelease, p.PlanSRollback: return qre.execStatefulConn(conn, qre.query, true) - case p.PlanSelect, p.PlanSelectLock, p.PlanSelectImpossible, p.PlanShowTables: + case p.PlanSelect, p.PlanSelectLock, p.PlanSelectImpossible, p.PlanShow: maxrows := qre.getSelectLimit() qre.bindVars["#maxLimit"] = sqltypes.Int64BindVariable(maxrows + 1) if qre.bindVars[sqltypes.BvReplaceSchemaName] != nil { diff --git a/go/vt/vttablet/tabletserver/query_executor_test.go b/go/vt/vttablet/tabletserver/query_executor_test.go index a6c5996230e..04c6018fe3f 100644 --- a/go/vt/vttablet/tabletserver/query_executor_test.go +++ b/go/vt/vttablet/tabletserver/query_executor_test.go @@ -214,13 +214,13 @@ func TestQueryExecutorPlans(t *testing.T) { }, { input: "create index a on user(id)", dbResponses: []dbResponse{{ - query: "alter table user add index a (id)", + query: "alter table `user` add index a (id)", result: emptyResult, }}, resultWant: emptyResult, planWant: "DDL", - logWant: "alter table user add index a (id)", - inTxWant: "alter table user add index a (id)", + logWant: "alter table `user` add index a (id)", + inTxWant: "alter table `user` add index a (id)", }, { input: "create index a on user(id1 + id2)", dbResponses: []dbResponse{{ @@ -251,6 +251,33 @@ func TestQueryExecutorPlans(t *testing.T) { planWant: "Release", logWant: "RELEASE savepoint a", inTxWant: "RELEASE savepoint a", + }, { + input: "show create database db_name", + dbResponses: []dbResponse{{ + query: "show create database ks", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "Show", + logWant: "show create database ks", + }, { + input: "show create database mysql", + dbResponses: []dbResponse{{ + query: "show create database mysql", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "Show", + logWant: "show create database mysql", + }, { + input: "show create table mysql.user", + dbResponses: []dbResponse{{ + query: "show create table mysql.`user`", + result: emptyResult, + }}, + resultWant: emptyResult, + planWant: "Show", + logWant: "show create table mysql.`user`", }} for _, tcase := range testcases { t.Run(tcase.input, func(t *testing.T) { @@ -261,6 +288,7 @@ func TestQueryExecutorPlans(t *testing.T) { } ctx := context.Background() tsv := newTestTabletServer(ctx, noFlags, db) + tsv.config.DB.DBName = "ks" defer tsv.StopService() tsv.SetPassthroughDMLs(tcase.passThrough)